mirror of
https://github.com/PHIDIAS0303/ExpCluster.git
synced 2026-09-28 19:24:00 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a524e1f128 | ||
|
|
fb4690c338 | ||
|
|
799a7e5ef6 | ||
|
|
deb0a12be9 | ||
|
|
bae09285f6 | ||
|
|
6eee2be630 | ||
|
|
0cf4a83d0e | ||
|
|
d36d698089 | ||
|
|
fce815bc11 | ||
|
|
b23d57e88f | ||
|
|
f72c7a7deb | ||
|
|
2cad1386db | ||
|
|
ba5f39a471 | ||
|
|
dddadf2b08 | ||
|
|
4c4404c0f7 | ||
|
|
ed6d2526a9 | ||
|
|
3e27d9ed24 | ||
|
|
ca656d5bd1 | ||
|
|
da85e3dbdb | ||
|
|
a1716a9aea | ||
|
|
889f1cefec | ||
|
|
195b280e1c | ||
|
|
4fab391d38 | ||
|
|
595f78f6bd | ||
|
|
d732f5759d | ||
|
|
3b9b160006 | ||
|
|
5a1c53885e | ||
|
|
8be8ab0eab | ||
|
|
e5cf203a68 | ||
|
|
34bdd1a2e4 | ||
|
|
ba88f048ac | ||
|
|
615bfe74e7 | ||
|
|
e0b410d067 | ||
|
|
bd207228ce | ||
|
|
28d5ba3b8d | ||
|
|
05b8689c33 | ||
|
|
3f310e7073 | ||
|
|
4224673b56 | ||
|
|
21cbea0bed | ||
|
|
4bfd9c3b36 | ||
|
|
08328dbb8f | ||
|
|
7a29c2a5ae |
@@ -1,51 +0,0 @@
|
|||||||
name: Node.js CI
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
env:
|
|
||||||
# The packages use workspace:^ and catalog: versions, so they only resolve
|
|
||||||
# inside a clusterio checkout with this repository under external_plugins
|
|
||||||
CLUSTERIO_REPOSITORY: clusterio/clusterio
|
|
||||||
CLUSTERIO_REF: master
|
|
||||||
# Node version to use for the tests. This is used by the setup-node action
|
|
||||||
NODE_VERSION: lts/*
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: external_plugins/ExpCluster
|
|
||||||
steps:
|
|
||||||
- name: Checkout Clusterio
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
repository: ${{ env.CLUSTERIO_REPOSITORY }}
|
|
||||||
ref: ${{ env.CLUSTERIO_REF }}
|
|
||||||
- name: Checkout ExpCluster
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
path: external_plugins/ExpCluster
|
|
||||||
- uses: pnpm/action-setup@v4
|
|
||||||
- uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
|
||||||
- name: Install and build
|
|
||||||
working-directory: .
|
|
||||||
run: pnpm install --no-frozen-lockfile
|
|
||||||
- name: Run tests
|
|
||||||
run: pnpm --filter "@expcluster/*" run test
|
|
||||||
- name: Run reference checks
|
|
||||||
run: |
|
|
||||||
# pnpm install runs prepare in dependency order, which hides missing
|
|
||||||
# project references. Building from an empty dist one package at a time
|
|
||||||
# will fail unless every cross package import is referenced correctly.
|
|
||||||
for pkg in exp_*/; do
|
|
||||||
rm -rf exp_*/dist
|
|
||||||
echo "::group::${pkg%/}"
|
|
||||||
(cd "$pkg" && pnpm exec tsc --build)
|
|
||||||
echo "::endgroup::"
|
|
||||||
done
|
|
||||||
+1
-1
@@ -9,7 +9,7 @@ For developers wanting to add features please follow these guidelines:
|
|||||||
- Lua is checked with [emmylua](https://github.com/EmmyLuaLs/emmylua-analyzer-rust), configured by `.emmyrc.json`. Install the EmmyLua extension rather than sumnekolua / luals, and use factoriomod-debug to generate the factorio api types. Note that an inline cast must be written `--[[@as T]]`, the spaced form is not parsed.
|
- Lua is checked with [emmylua](https://github.com/EmmyLuaLs/emmylua-analyzer-rust), configured by `.emmyrc.json`. Install the EmmyLua extension rather than sumnekolua / luals, and use factoriomod-debug to generate the factorio api types. Note that an inline cast must be written `--[[@as T]]`, the spaced form is not parsed.
|
||||||
- Changes should be made on your own fork and merged into `main` through a pull request.
|
- Changes should be made on your own fork and merged into `main` through a pull request.
|
||||||
- Each pull request should be limited to one feature or a few bug fixes and link to the related issue page.
|
- Each pull request should be limited to one feature or a few bug fixes and link to the related issue page.
|
||||||
- Pull requests are automatically linted, then built and tested against the latest clusterio `master`.
|
- Pull requests are automatically linted and documentation checked.
|
||||||
- Pull requests are manually reviewed to maintain code and language quality.
|
- Pull requests are manually reviewed to maintain code and language quality.
|
||||||
- New features should have the branch names: `feature/feature-name`
|
- New features should have the branch names: `feature/feature-name`
|
||||||
- Bug fixes should have the branch names: `fix/bug-name`
|
- Bug fixes should have the branch names: `fix/bug-name`
|
||||||
|
|||||||
@@ -42,17 +42,10 @@ This module is currently not published and therefore can not be installed via `n
|
|||||||
|
|
||||||
See [Contributing](CONTRIBUTING.md) for how to make pull requests and issues.
|
See [Contributing](CONTRIBUTING.md) for how to make pull requests and issues.
|
||||||
|
|
||||||
Details of the scenario can also be seen on [Wiki](https://wiki.aperx.org/game/factorio/scenario).
|
|
||||||
|
|
||||||
For the locale, access to [Translation](https://translate.aperx.org).
|
|
||||||
|
|
||||||
<p align="center"><a href="https://translate.aperx.org/engage/expcluster/"><img src="https://translate.aperx.org/widget/expcluster/multi-auto.svg" alt="translation status"></a></p>
|
|
||||||
|
|
||||||
## Releases
|
## Releases
|
||||||
|
|
||||||
| Release* | Release Name | Factorio Version** |
|
| Release* | Release Name | Factorio Version** |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| [7.0][s7.0] | Clusterio Plugin (Beta) | [2.1.7][f2.1.7] |
|
|
||||||
| [6.4][s6.4] | Farewell Factorio 1.1 | [1.1.110][f1.1.110] |
|
| [6.4][s6.4] | Farewell Factorio 1.1 | [1.1.110][f1.1.110] |
|
||||||
| [6.3][s6.3] | Feature Bundle 2: Electric Boogaloo | [1.1.101][f1.1.101] |
|
| [6.3][s6.3] | Feature Bundle 2: Electric Boogaloo | [1.1.101][f1.1.101] |
|
||||||
| [6.2][s6.2] | Mega Feature Bundle | [1.1.32][f1.1.32] |
|
| [6.2][s6.2] | Mega Feature Bundle | [1.1.32][f1.1.32] |
|
||||||
@@ -79,7 +72,6 @@ For the locale, access to [Translation](https://translate.aperx.org).
|
|||||||
|
|
||||||
\*\* Factorio versions show the version they were made for, often the minimum requirement to run the scenario.
|
\*\* Factorio versions show the version they were made for, often the minimum requirement to run the scenario.
|
||||||
|
|
||||||
[s7.0]: https://github.com/explosivegaming/scenario/releases/tag/7.0.0
|
|
||||||
[s6.4]: https://github.com/explosivegaming/scenario/releases/tag/6.4.0
|
[s6.4]: https://github.com/explosivegaming/scenario/releases/tag/6.4.0
|
||||||
[s6.3]: https://github.com/explosivegaming/scenario/releases/tag/6.3.0
|
[s6.3]: https://github.com/explosivegaming/scenario/releases/tag/6.3.0
|
||||||
[s6.2]: https://github.com/explosivegaming/scenario/releases/tag/6.2.0
|
[s6.2]: https://github.com/explosivegaming/scenario/releases/tag/6.2.0
|
||||||
@@ -102,7 +94,6 @@ For the locale, access to [Translation](https://translate.aperx.org).
|
|||||||
[s1.0]: https://github.com/explosivegaming/scenario/releases/tag/v1.0
|
[s1.0]: https://github.com/explosivegaming/scenario/releases/tag/v1.0
|
||||||
[s0.1]: https://github.com/explosivegaming/scenario/releases/tag/v0.1
|
[s0.1]: https://github.com/explosivegaming/scenario/releases/tag/v0.1
|
||||||
|
|
||||||
[f2.1.7]: https://wiki.factorio.com/Version_history/2.1.0#2.1.7
|
|
||||||
[f1.1.110]: https://wiki.factorio.com/Version_history/1.1.0#1.1.110
|
[f1.1.110]: https://wiki.factorio.com/Version_history/1.1.0#1.1.110
|
||||||
[f1.1.101]: https://wiki.factorio.com/Version_history/1.1.0#1.1.101
|
[f1.1.101]: https://wiki.factorio.com/Version_history/1.1.0#1.1.101
|
||||||
[f1.1.32]: https://wiki.factorio.com/Version_history/1.1.0#1.1.32
|
[f1.1.32]: https://wiki.factorio.com/Version_history/1.1.0#1.1.32
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
name: "exp_commands",
|
name: "exp_commands",
|
||||||
title: "exp_commands",
|
title: "exp_commands",
|
||||||
description: "Example Description. Plugin. Change me in index.ts",
|
description: "Example Description. Plugin. Change me in index.ts",
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production"
|
"prepare": "tsc --build && webpack-cli --env production"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { BaseControllerPlugin } from "@clusterio/controller";
|
import { BaseControllerPlugin } from "@clusterio/controller";
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
|
|
||||||
export class ControllerPlugin extends BaseControllerPlugin {
|
export class ControllerPlugin extends BaseControllerPlugin {
|
||||||
|
|||||||
+120
-125
@@ -1,8 +1,5 @@
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
|
|
||||||
export * from "./messages.js";
|
|
||||||
export type { ControllerPlugin } from "./controller.js";
|
|
||||||
|
|
||||||
declare module "@clusterio/lib" {
|
declare module "@clusterio/lib" {
|
||||||
export interface InstanceConfigFields {
|
export interface InstanceConfigFields {
|
||||||
@@ -12,6 +9,123 @@ declare module "@clusterio/lib" {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Group permissions
|
||||||
|
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.get",
|
||||||
|
title: "Get Groups",
|
||||||
|
description: "Retrieve a specific Factorio permission group by ID.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.list",
|
||||||
|
title: "List Groups",
|
||||||
|
description: "List all Factorio permission groups.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.subscribe",
|
||||||
|
title: "Subscribe to Group Updates",
|
||||||
|
description: "Receive updates when Factorio permission groups change.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.create",
|
||||||
|
title: "Create Groups",
|
||||||
|
description: "Create new Factorio permission groups.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.update",
|
||||||
|
title: "Update Groups",
|
||||||
|
description: "Modify existing Factorio permission groups.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.group.delete",
|
||||||
|
title: "Delete Groups",
|
||||||
|
description: "Delete Factorio permission groups.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assignment permissions
|
||||||
|
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.get",
|
||||||
|
title: "Get Assignments",
|
||||||
|
description: "Retrieve a specific manual group assignment for a player.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.list",
|
||||||
|
title: "List Assignments",
|
||||||
|
description: "List all manual group assignments.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.subscribe",
|
||||||
|
title: "Subscribe to Assignment Updates",
|
||||||
|
description: "Receive updates when manual group assignments change.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.create",
|
||||||
|
title: "Create Assignments",
|
||||||
|
description: "Manually assign players to groups, overriding role mappings.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.update",
|
||||||
|
title: "Update Assignments",
|
||||||
|
description: "Modify existing manual group assignments.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.assignment.delete",
|
||||||
|
title: "Delete Assignments",
|
||||||
|
description: "Remove manual group assignments.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// Role mapping permissions
|
||||||
|
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.get",
|
||||||
|
title: "Get Role Mappings",
|
||||||
|
description: "Retrieve a specific role mapping rule.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.list",
|
||||||
|
title: "List Role Mappings",
|
||||||
|
description: "List all role mapping rules.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.subscribe",
|
||||||
|
title: "Subscribe to Role Mapping Updates",
|
||||||
|
description: "Receive updates when role mapping rules change.",
|
||||||
|
grantByDefault: true,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.create",
|
||||||
|
title: "Create Role Mappings",
|
||||||
|
description: "Create rules that map user roles to Factorio permission groups.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.update",
|
||||||
|
title: "Update Role Mappings",
|
||||||
|
description: "Modify existing role mapping rules.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_groups.role_mapping.delete",
|
||||||
|
title: "Delete Role Mappings",
|
||||||
|
description: "Delete role mapping rules.",
|
||||||
|
grantByDefault: false,
|
||||||
|
});
|
||||||
|
|
||||||
export const plugin: lib.PluginDeclaration = {
|
export const plugin: lib.PluginDeclaration = {
|
||||||
name: "exp_groups",
|
name: "exp_groups",
|
||||||
title: "ExpGaming - Permission Groups",
|
title: "ExpGaming - Permission Groups",
|
||||||
@@ -47,126 +161,7 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
messages.RoleMappingListRequest,
|
messages.RoleMappingListRequest,
|
||||||
],
|
],
|
||||||
|
|
||||||
permissions: [
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
// Group permissions
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.get",
|
|
||||||
title: "Get Groups",
|
|
||||||
description: "Retrieve a specific Factorio permission group by ID.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.list",
|
|
||||||
title: "List Groups",
|
|
||||||
description: "List all Factorio permission groups.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.subscribe",
|
|
||||||
title: "Subscribe to Group Updates",
|
|
||||||
description: "Receive updates when Factorio permission groups change.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.create",
|
|
||||||
title: "Create Groups",
|
|
||||||
description: "Create new Factorio permission groups.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.update",
|
|
||||||
title: "Update Groups",
|
|
||||||
description: "Modify existing Factorio permission groups.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.group.delete",
|
|
||||||
title: "Delete Groups",
|
|
||||||
description: "Delete Factorio permission groups.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Assignment permissions
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.get",
|
|
||||||
title: "Get Assignments",
|
|
||||||
description: "Retrieve a specific manual group assignment for a player.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.list",
|
|
||||||
title: "List Assignments",
|
|
||||||
description: "List all manual group assignments.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.subscribe",
|
|
||||||
title: "Subscribe to Assignment Updates",
|
|
||||||
description: "Receive updates when manual group assignments change.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.create",
|
|
||||||
title: "Create Assignments",
|
|
||||||
description: "Manually assign players to groups, overriding role mappings.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.update",
|
|
||||||
title: "Update Assignments",
|
|
||||||
description: "Modify existing manual group assignments.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.assignment.delete",
|
|
||||||
title: "Delete Assignments",
|
|
||||||
description: "Remove manual group assignments.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
// Role mapping permissions
|
|
||||||
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.get",
|
|
||||||
title: "Get Role Mappings",
|
|
||||||
description: "Retrieve a specific role mapping rule.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.list",
|
|
||||||
title: "List Role Mappings",
|
|
||||||
description: "List all role mapping rules.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.subscribe",
|
|
||||||
title: "Subscribe to Role Mapping Updates",
|
|
||||||
description: "Receive updates when role mapping rules change.",
|
|
||||||
grantByDefault: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.create",
|
|
||||||
title: "Create Role Mappings",
|
|
||||||
description: "Create rules that map user roles to Factorio permission groups.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.update",
|
|
||||||
title: "Update Role Mappings",
|
|
||||||
description: "Modify existing role mapping rules.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_groups.role_mapping.delete",
|
|
||||||
title: "Delete Role Mappings",
|
|
||||||
description: "Delete role mapping rules.",
|
|
||||||
grantByDefault: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
|
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
|
||||||
instanceConfigFields: {
|
instanceConfigFields: {
|
||||||
"exp_groups.sync_mode": {
|
"exp_groups.sync_mode": {
|
||||||
description: "Synchronize permission groups with the controller",
|
description: "Synchronize permission groups with the controller",
|
||||||
@@ -176,7 +171,7 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
controllerEntrypoint: "./dist/node/controller.js",
|
controllerEntrypoint: "./dist/node/controller",
|
||||||
controllerConfigFields: {
|
controllerConfigFields: {
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { BaseInstancePlugin } from "@clusterio/host";
|
import { BaseInstancePlugin } from "@clusterio/host";
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
|
|
||||||
export type IpcGroupUpdated = {
|
export type IpcGroupUpdated = {
|
||||||
group_name: string,
|
group_name: string,
|
||||||
|
|||||||
@@ -1,30 +1,6 @@
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import { Type, Static } from "@sinclair/typebox";
|
import { Type, Static } from "@sinclair/typebox";
|
||||||
|
|
||||||
// Declared here rather than in index.ts because the browser project cannot include index.ts, which re-exports controller.ts
|
|
||||||
declare module "@clusterio/lib" {
|
|
||||||
export interface Permissions {
|
|
||||||
"exp_groups.group.get": never;
|
|
||||||
"exp_groups.group.list": never;
|
|
||||||
"exp_groups.group.subscribe": never;
|
|
||||||
"exp_groups.group.create": never;
|
|
||||||
"exp_groups.group.update": never;
|
|
||||||
"exp_groups.group.delete": never;
|
|
||||||
"exp_groups.assignment.get": never;
|
|
||||||
"exp_groups.assignment.list": never;
|
|
||||||
"exp_groups.assignment.subscribe": never;
|
|
||||||
"exp_groups.assignment.create": never;
|
|
||||||
"exp_groups.assignment.update": never;
|
|
||||||
"exp_groups.assignment.delete": never;
|
|
||||||
"exp_groups.role_mapping.get": never;
|
|
||||||
"exp_groups.role_mapping.list": never;
|
|
||||||
"exp_groups.role_mapping.subscribe": never;
|
|
||||||
"exp_groups.role_mapping.create": never;
|
|
||||||
"exp_groups.role_mapping.update": never;
|
|
||||||
"exp_groups.role_mapping.delete": never;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Data records
|
Data records
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -102,11 +102,11 @@ local function encode_group_permissions(group)
|
|||||||
local allows_action = group.allows_action
|
local allows_action = group.allows_action
|
||||||
for input_action_name, input_action in pairs(defines.input_action) do
|
for input_action_name, input_action in pairs(defines.input_action) do
|
||||||
if allows_action(input_action) then
|
if allows_action(input_action) then
|
||||||
whitelist_index = whitelist_index + 1
|
|
||||||
whitelist[whitelist_index] = input_action_name
|
whitelist[whitelist_index] = input_action_name
|
||||||
|
whitelist_index = whitelist_index + 1
|
||||||
else
|
else
|
||||||
blacklist_index = blacklist_index + 1
|
|
||||||
blacklist[blacklist_index] = input_action_name
|
blacklist[blacklist_index] = input_action_name
|
||||||
|
blacklist_index = blacklist_index + 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production"
|
"prepare": "tsc --build && webpack-cli --env production"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { useContext, useEffect } from "react";
|
|||||||
import { Modal, Form, Select } from "antd";
|
import { Modal, Form, Select } from "antd";
|
||||||
|
|
||||||
import { ControlContext, useUsers } from "@clusterio/web_ui";
|
import { ControlContext, useUsers } from "@clusterio/web_ui";
|
||||||
import * as messages from "../../messages.js";
|
import * as messages from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
export default function AssignmentForm({ open, setOpen, initial }: {
|
export default function AssignmentForm({ open, setOpen, initial }: {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Table, Button, Space, Input, InputRef } from "antd";
|
|||||||
import { EditOutlined, SearchOutlined } from "@ant-design/icons";
|
import { EditOutlined, SearchOutlined } from "@ant-design/icons";
|
||||||
|
|
||||||
import { ControlContext, useAccount } from "@clusterio/web_ui";
|
import { ControlContext, useAccount } from "@clusterio/web_ui";
|
||||||
import { AssignmentDeleteRequest, AssignmentRecord } from "../../messages.js";
|
import { AssignmentDeleteRequest, AssignmentRecord } from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
import AssignmentForm from "./AssignmentForm";
|
import AssignmentForm from "./AssignmentForm";
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Modal, Form, Input, Switch } from "antd";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
import { ControlContext } from "@clusterio/web_ui";
|
import { ControlContext } from "@clusterio/web_ui";
|
||||||
import * as messages from "../../messages.js";
|
import * as messages from "../../messages";
|
||||||
|
|
||||||
export default function GroupForm({ open, setOpen }: {
|
export default function GroupForm({ open, setOpen }: {
|
||||||
open: boolean,
|
open: boolean,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { Button, Checkbox, Input, Space, Spin, Alert } from "antd";
|
|||||||
import { ControlContext, useAccount, useDefaultModPack, PageLayout, PageHeader, notifyErrorHandler } from "@clusterio/web_ui";
|
import { ControlContext, useAccount, useDefaultModPack, PageLayout, PageHeader, notifyErrorHandler } from "@clusterio/web_ui";
|
||||||
import DeletedConfirm from "./DeleteConfirm";
|
import DeletedConfirm from "./DeleteConfirm";
|
||||||
|
|
||||||
import * as messages from "../../messages.js";
|
import * as messages from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
const DOMAIN_MAPPING = {
|
const DOMAIN_MAPPING = {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Table } from "antd";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
|
||||||
import { ControlContext } from "@clusterio/web_ui";
|
import { ControlContext } from "@clusterio/web_ui";
|
||||||
import { GroupRecord } from "../../messages.js";
|
import { GroupRecord } from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
import GroupForm from "./GroupForm";
|
import GroupForm from "./GroupForm";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { useContext, useEffect } from "react";
|
|||||||
import { Modal, Form, Select, InputNumber, Switch, Alert } from "antd";
|
import { Modal, Form, Select, InputNumber, Switch, Alert } from "antd";
|
||||||
|
|
||||||
import { ControlContext, useRoles } from "@clusterio/web_ui";
|
import { ControlContext, useRoles } from "@clusterio/web_ui";
|
||||||
import { RoleMappingRecord, RoleMappingCreateRequest, RoleMappingUpdateRequest } from "../../messages.js";
|
import { RoleMappingRecord, RoleMappingCreateRequest, RoleMappingUpdateRequest } from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
export default function RoleMappingForm({ open, setOpen, initial }: {
|
export default function RoleMappingForm({ open, setOpen, initial }: {
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import { Table, Button, Space, Tag } from "antd";
|
|||||||
import { EditOutlined } from "@ant-design/icons";
|
import { EditOutlined } from "@ant-design/icons";
|
||||||
|
|
||||||
import { ControlContext, useAccount, useRoles } from "@clusterio/web_ui";
|
import { ControlContext, useAccount, useRoles } from "@clusterio/web_ui";
|
||||||
import { RoleMappingRecord, RoleMappingDeleteRequest } from "../../messages.js";
|
import { RoleMappingRecord, RoleMappingDeleteRequest } from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
import RoleMappingForm from "./RoleMappingForm";
|
import RoleMappingForm from "./RoleMappingForm";
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import React, { useState, useCallback, useSyncExternalStore } from "react";
|
|||||||
import { BaseWebPlugin, PageLayout, PageHeader, useAccount, SectionHeader } from "@clusterio/web_ui";
|
import { BaseWebPlugin, PageLayout, PageHeader, useAccount, SectionHeader } from "@clusterio/web_ui";
|
||||||
import { Button } from "antd";
|
import { Button } from "antd";
|
||||||
|
|
||||||
import * as messages from "../messages.js";
|
import * as messages from "../messages";
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
|
|
||||||
import GroupsTable from "./components/GroupsTable";
|
import GroupsTable from "./components/GroupsTable";
|
||||||
|
|||||||
+1
-1
@@ -4,5 +4,5 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
name: "exp_gui",
|
name: "exp_gui",
|
||||||
title: "exp_gui",
|
title: "exp_gui",
|
||||||
description: "Example Description. Plugin. Change me in index.ts",
|
description: "Example Description. Plugin. Change me in index.ts",
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production"
|
"prepare": "tsc --build && webpack-cli --env production"
|
||||||
|
|||||||
+1
-1
@@ -4,5 +4,5 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
name: "exp_legacy",
|
name: "exp_legacy",
|
||||||
title: "exp_legacy",
|
title: "exp_legacy",
|
||||||
description: "Example Description. Plugin. Change me in index.ts",
|
description: "Example Description. Plugin. Change me in index.ts",
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -24,4 +24,6 @@ return {
|
|||||||
"modules.gui.vlayer",
|
"modules.gui.vlayer",
|
||||||
|
|
||||||
"modules.graftorio.require", -- graftorio
|
"modules.graftorio.require", -- graftorio
|
||||||
|
--- Config Files
|
||||||
|
"config.expcore.permission_groups", -- loads some predefined permission groups
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,33 +80,28 @@ return {
|
|||||||
enemy_expansion = false, --- @setting enemy_expansion a catch all for in case the map settings file fails to load
|
enemy_expansion = false, --- @setting enemy_expansion a catch all for in case the map settings file fails to load
|
||||||
chart_radius = 10 * 32, --- @setting chart_radius the number of tiles that will be charted when the map starts
|
chart_radius = 10 * 32, --- @setting chart_radius the number of tiles that will be charted when the map starts
|
||||||
items = { --- @setting items items and there condition for being given
|
items = { --- @setting items items and there condition for being given
|
||||||
-- ['item-name'] = function(amount_made, production_stats, player) return <Number> end -- 0 means no items given
|
["iron-ore"] = cutoff_time(20 * minutes, 80, 0),
|
||||||
-- Plates
|
["stone"] = cutoff_time(20 * minutes, 20, 0),
|
||||||
["iron-plate"] = scale_amount_made(100, 10, 10),
|
["coal"] = cutoff_time(20 * minutes, 20, 0),
|
||||||
["copper-plate"] = scale_amount_made(100, 0, 8),
|
-- ["burner-mining-drill"]=cutoff_time(20 * minutes, 8, 0),
|
||||||
["steel-plate"] = scale_amount_made(100, 0, 4),
|
-- ["stone-furnace"]=cutoff_time(20 * minutes, 8, 0),
|
||||||
-- Secondary Items
|
["submachine-gun"] = 1,
|
||||||
["electronic-circuit"] = scale_amount_made(1000, 0, 6),
|
["piercing-rounds-magazine"] = 20,
|
||||||
["iron-gear-wheel"] = scale_amount_made(1000, 0, 6),
|
["construction-robot"] = 10,
|
||||||
-- Starting Items
|
["modular-armor"] = 1,
|
||||||
["burner-mining-drill"] = cutoff_time(10 * minutes, 4, 0),
|
["solar-panel-equipment"] = 16,
|
||||||
["stone-furnace"] = cutoff_time(10 * minutes, 4, 0),
|
["belt-immunity-equipment"] = 1,
|
||||||
-- Armor
|
["battery-equipment"] = 2,
|
||||||
["light-armor"] = cutoff_amount_made_unless(5, 0, 1, "heavy-armor", 5),
|
["personal-roboport-equipment"] = 1
|
||||||
["heavy-armor"] = cutoff_amount_made(5, 0, 1),
|
|
||||||
-- Weapon
|
|
||||||
["pistol"] = cutoff_amount_made_unless(0, 1, 1, "submachine-gun", 5),
|
|
||||||
["submachine-gun"] = cutoff_amount_made(5, 0, 1),
|
|
||||||
-- Ammo
|
|
||||||
["firearm-magazine"] = cutoff_amount_made_unless(100, 10, 0, "piercing-rounds-magazine", 100),
|
|
||||||
["piercing-rounds-magazine"] = cutoff_amount_made(100, 0, 10),
|
|
||||||
--[[
|
--[[
|
||||||
['construction-robot'] = 10,
|
["construction-robot"] = 50,
|
||||||
['modular-armor'] = 1,
|
["spidertron"] = 1,
|
||||||
['solar-panel-equipment'] = 16,
|
["spidertron-remote"] = 1,
|
||||||
['belt-immunity-equipment'] = 1,
|
["modular-armor"] = 1,
|
||||||
['battery-equipment'] = 2,
|
["solar-panel-equipment"] = 60,
|
||||||
['personal-roboport-equipment'] = 1
|
["belt-immunity-equipment"] = 1,
|
||||||
|
["battery-equipment"] = 6,
|
||||||
|
["personal-roboport-equipment"] = 5
|
||||||
]]
|
]]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
local ExpUtil = require("modules/exp_util")
|
local ExpUtil = require("modules/exp_util")
|
||||||
local Async = require("modules/exp_util/async")
|
local Async = require("modules/exp_util/async")
|
||||||
local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail
|
|
||||||
|
|
||||||
local floor = math.floor
|
local floor = math.floor
|
||||||
local random = math.random
|
local random = math.random
|
||||||
@@ -27,13 +26,13 @@ local afk_time_units = {
|
|||||||
return {
|
return {
|
||||||
--- @type table<string, LocalisedString | fun(player: LuaPlayer, is_command: boolean): LocalisedString>
|
--- @type table<string, LocalisedString | fun(player: LuaPlayer, is_command: boolean): LocalisedString>
|
||||||
messages = { --- @setting messages will trigger when ever the word is said
|
messages = { --- @setting messages will trigger when ever the word is said
|
||||||
["discord"] = { "info.discord", config_server_detail["discord"] },
|
["discord"] = { "info.discord" },
|
||||||
["expgaming"] = { "info.website", config_server_detail["website"] },
|
["expgaming"] = { "info.website" },
|
||||||
["website"] = { "info.website", config_server_detail["website"] },
|
["website"] = { "info.website" },
|
||||||
["status"] = { "info.status", config_server_detail["status"] },
|
["status"] = { "info.status" },
|
||||||
["github"] = { "info.github", config_server_detail["github"] },
|
["github"] = { "info.github" },
|
||||||
["patreon"] = { "info.patreon", config_server_detail["patreon"] },
|
["patreon"] = { "info.patreon" },
|
||||||
["donate"] = { "info.patreon", config_server_detail["patreon"] },
|
["donate"] = { "info.patreon" },
|
||||||
["command"] = { "info.custom-commands" },
|
["command"] = { "info.custom-commands" },
|
||||||
["commands"] = { "info.custom-commands" },
|
["commands"] = { "info.custom-commands" },
|
||||||
["softmod"] = { "info.softmod" },
|
["softmod"] = { "info.softmod" },
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
--- Config file for the compliatrons including where they spawn and what messages they show
|
--- Config file for the compliatrons including where they spawn and what messages they show
|
||||||
-- @config Compilatron
|
-- @config Compilatron
|
||||||
local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
message_cycle = 60 * 15, --- @setting message_cycle 15 seconds default, how often (in ticks) the messages will cycle
|
message_cycle = 60 * 15, --- @setting message_cycle 15 seconds default, how often (in ticks) the messages will cycle
|
||||||
@@ -8,18 +7,18 @@ return {
|
|||||||
["Spawn"] = {
|
["Spawn"] = {
|
||||||
spawn_position = { x = 0, y = 0 },
|
spawn_position = { x = 0, y = 0 },
|
||||||
spawn_surface = "nauvis",
|
spawn_surface = "nauvis",
|
||||||
entity_name = "small-biter",
|
entity_name = "behemoth-biter",
|
||||||
messages = {
|
messages = {
|
||||||
{ "info.website", config_server_detail["website"] },
|
{ "info.website" },
|
||||||
{ "info.read-readme" },
|
{ "info.read-readme" },
|
||||||
{ "info.discord", config_server_detail["discord"] },
|
{ "info.discord" },
|
||||||
{ "info.softmod" },
|
{ "info.softmod" },
|
||||||
{ "info.redmew" },
|
{ "info.redmew" },
|
||||||
{ "info.custom-commands" },
|
{ "info.custom-commands" },
|
||||||
{ "info.status", config_server_detail["status"] },
|
{ "info.status" },
|
||||||
{ "info.lhd" },
|
{ "info.lhd" },
|
||||||
{ "info.github", config_server_detail["github"] },
|
{ "info.github" },
|
||||||
{ "info.patreon", config_server_detail["patreon"] },
|
{ "info.patreon" },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,15 +10,16 @@ return {
|
|||||||
player_kicks = true,
|
player_kicks = true,
|
||||||
player_promotes = false,
|
player_promotes = false,
|
||||||
player_jail = true,
|
player_jail = true,
|
||||||
["config"] = true,
|
['config']=false,
|
||||||
["purge"] = true,
|
['purge']=false,
|
||||||
["c"] = true,
|
['c']=false,
|
||||||
["command"] = true,
|
['sc']=false,
|
||||||
["silent-command"] = true,
|
['command']=false,
|
||||||
["measured-command"] = true,
|
['silent-command']=false,
|
||||||
["banlist"] = true,
|
['measured-command']=false,
|
||||||
["permissions"] = true,
|
['banlist']=false,
|
||||||
["editor"] = true,
|
['permissions']=false,
|
||||||
["cheat"] = true,
|
['editor']=false,
|
||||||
["open"] = false,
|
['cheat']=false,
|
||||||
|
['open']=false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,134 @@
|
|||||||
|
--- Use this file to add new permission groups to the game;
|
||||||
|
-- start with Permission_Groups.new_group('name');
|
||||||
|
-- then use either :allow_all() or :disallow_all() to set the default for non specified actions;
|
||||||
|
-- then use :allow{} and :disallow{} to specify certain actions to allow/disallow
|
||||||
|
-- @config Permission-Groups
|
||||||
|
|
||||||
|
-- local Event = require("modules/exp_legacy/utils/event") -- @dep utils.event
|
||||||
|
local Groups = require("modules.exp_legacy.expcore.permission_groups") --- @dep expcore.permission_groups
|
||||||
|
|
||||||
|
Groups.new_group("Admin")
|
||||||
|
:allow_all()
|
||||||
|
|
||||||
|
Groups.new_group("Mod")
|
||||||
|
:allow_all()
|
||||||
|
:disallow{
|
||||||
|
"add_permission_group",
|
||||||
|
"delete_permission_group",
|
||||||
|
"edit_permission_group",
|
||||||
|
"import_permissions_string",
|
||||||
|
"map_editor_action",
|
||||||
|
"toggle_map_editor",
|
||||||
|
"change_multiplayer_config",
|
||||||
|
}
|
||||||
|
|
||||||
|
Groups.new_group("Trusted")
|
||||||
|
:allow_all()
|
||||||
|
:disallow{
|
||||||
|
"add_permission_group", -- mod
|
||||||
|
"delete_permission_group",
|
||||||
|
"edit_permission_group",
|
||||||
|
"import_permissions_string",
|
||||||
|
"map_editor_action",
|
||||||
|
"toggle_map_editor",
|
||||||
|
"change_multiplayer_config",
|
||||||
|
"set_heat_interface_mode", -- trusted
|
||||||
|
"set_heat_interface_temperature",
|
||||||
|
"set_infinity_container_filter_item",
|
||||||
|
"set_infinity_container_remove_unfiltered_items",
|
||||||
|
"set_infinity_pipe_filter",
|
||||||
|
"admin_action",
|
||||||
|
}
|
||||||
|
|
||||||
|
Groups.new_group("Standard")
|
||||||
|
:allow_all()
|
||||||
|
:disallow{
|
||||||
|
"add_permission_group", -- mod
|
||||||
|
"delete_permission_group",
|
||||||
|
"edit_permission_group",
|
||||||
|
"import_permissions_string",
|
||||||
|
"map_editor_action",
|
||||||
|
"toggle_map_editor",
|
||||||
|
"change_multiplayer_config",
|
||||||
|
"set_heat_interface_mode", -- trusted
|
||||||
|
"set_heat_interface_temperature",
|
||||||
|
"set_infinity_container_filter_item",
|
||||||
|
"set_infinity_container_remove_unfiltered_items",
|
||||||
|
"set_infinity_pipe_filter",
|
||||||
|
"admin_action",
|
||||||
|
"change_programmable_speaker_alert_parameters", -- standard
|
||||||
|
}
|
||||||
|
|
||||||
|
Groups.new_group("Guest")
|
||||||
|
:allow_all()
|
||||||
|
:disallow{
|
||||||
|
"add_permission_group", -- mod
|
||||||
|
"delete_permission_group",
|
||||||
|
"edit_permission_group",
|
||||||
|
"import_permissions_string",
|
||||||
|
"map_editor_action",
|
||||||
|
"toggle_map_editor",
|
||||||
|
"change_multiplayer_config",
|
||||||
|
"set_heat_interface_mode", -- trusted
|
||||||
|
"set_heat_interface_temperature",
|
||||||
|
"set_infinity_container_filter_item",
|
||||||
|
"set_infinity_container_remove_unfiltered_items",
|
||||||
|
"set_infinity_pipe_filter",
|
||||||
|
"admin_action",
|
||||||
|
"change_programmable_speaker_alert_parameters", -- standard
|
||||||
|
"change_programmable_speaker_parameters", -- guest
|
||||||
|
"drop_item",
|
||||||
|
"open_new_platform_button_from_rocket_silo",
|
||||||
|
"set_rocket_silo_send_to_orbit_automated_mode",
|
||||||
|
"change_train_stop_station",
|
||||||
|
"remove_cables",
|
||||||
|
"remove_train_station",
|
||||||
|
"reset_assembling_machine",
|
||||||
|
"rotate_entity",
|
||||||
|
"cancel_research",
|
||||||
|
"flush_opened_entity_fluid",
|
||||||
|
"flush_opened_entity_specific_fluid",
|
||||||
|
}
|
||||||
|
|
||||||
|
Groups.new_group("Restricted")
|
||||||
|
:disallow_all()
|
||||||
|
:allow("write_to_console")
|
||||||
|
|
||||||
|
--[[ These events are used until a role system is added to make it easier for our admins
|
||||||
|
|
||||||
|
local trusted_time = 60*60*60*10 -- 10 hour
|
||||||
|
local standard_time = 60*60*60*3 -- 3 hour
|
||||||
|
local function assign_group(player)
|
||||||
|
local current_group_name = player.permission_group and player.permission_group.name or 'None'
|
||||||
|
if player.admin then
|
||||||
|
Permission_Groups.set_player_group(player,'Admin')
|
||||||
|
elseif player.online_time > trusted_time or current_group_name == 'Trusted' then
|
||||||
|
Permission_Groups.set_player_group(player,'Trusted')
|
||||||
|
elseif player.online_time > standard_time or current_group_name == 'Standard' then
|
||||||
|
Permission_Groups.set_player_group(player,'Standard')
|
||||||
|
else
|
||||||
|
Permission_Groups.set_player_group(player,'Guest')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Event.add(defines.events.on_player_joined_game,function(event)
|
||||||
|
local player = game.players[event.player_index]
|
||||||
|
assign_group(player)
|
||||||
|
end)
|
||||||
|
|
||||||
|
Event.add(defines.events.on_player_promoted,function(event)
|
||||||
|
local player = game.players[event.player_index]
|
||||||
|
assign_group(player)
|
||||||
|
end)
|
||||||
|
|
||||||
|
Event.add(defines.events.on_player_demoted,function(event)
|
||||||
|
local player = game.players[event.player_index]
|
||||||
|
assign_group(player)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local check_interval = 60*60*15 -- 15 minutes
|
||||||
|
Event.on_nth_tick(check_interval,function(event)
|
||||||
|
for _,player in pairs(game.connected_players) do
|
||||||
|
assign_group(player)
|
||||||
|
end
|
||||||
|
end)]]
|
||||||
@@ -0,0 +1,351 @@
|
|||||||
|
--- This is the main config file for the role system; file includes defines for roles and role flags and default values
|
||||||
|
-- @config Roles
|
||||||
|
|
||||||
|
local Roles = require("modules.exp_legacy.expcore.roles") --- @dep expcore.roles
|
||||||
|
local PlayerData = require("modules.exp_legacy.expcore.player_data") --- @dep expcore.player_data
|
||||||
|
local Statistics = PlayerData.Statistics
|
||||||
|
|
||||||
|
--- Role flags that will run when a player changes roles
|
||||||
|
Roles.define_flag_trigger("is_admin", function(player, state)
|
||||||
|
player.admin = state
|
||||||
|
end)
|
||||||
|
Roles.define_flag_trigger("is_spectator", function(player, state)
|
||||||
|
player.spectator = state
|
||||||
|
end)
|
||||||
|
Roles.define_flag_trigger("is_jail", function(player, state)
|
||||||
|
if player.character then
|
||||||
|
player.character.disabled_by_script = not state
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--- Admin Roles
|
||||||
|
Roles.new_role("System", "SYS")
|
||||||
|
:set_permission_group("Default", true)
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_system")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_allow_all()
|
||||||
|
|
||||||
|
Roles.new_role("Senior Administrator", "SAdmin")
|
||||||
|
:set_permission_group("Admin")
|
||||||
|
:set_custom_color{ r = 233, g = 63, b = 233 }
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_system")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_parent("Administrator")
|
||||||
|
:set_allow_all()
|
||||||
|
|
||||||
|
Roles.new_role("Administrator", "Admin")
|
||||||
|
:set_permission_group("Admin")
|
||||||
|
:set_custom_color{ r = 233, g = 63, b = 233 }
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_parent("Senior Moderator")
|
||||||
|
:allow{
|
||||||
|
"command/_rcon",
|
||||||
|
"command/debug",
|
||||||
|
"command/set-cheat-mode",
|
||||||
|
"command/research-all"
|
||||||
|
}
|
||||||
|
|
||||||
|
Roles.new_role("Senior Moderator", "SMod")
|
||||||
|
:set_permission_group("Mod")
|
||||||
|
:set_custom_color{ r = 0, g = 170, b = 0 }
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_parent("Moderator")
|
||||||
|
:allow{
|
||||||
|
"gui/warp-list/bypass-proximity",
|
||||||
|
"gui/warp-list/bypass-cooldown",
|
||||||
|
"command/connect-all",
|
||||||
|
}
|
||||||
|
|
||||||
|
Roles.new_role("Moderator", "Mod")
|
||||||
|
:set_permission_group("Mod")
|
||||||
|
:set_custom_color{ r = 0, g = 170, b = 0 }
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_parent("Trainee Moderator")
|
||||||
|
|
||||||
|
Roles.new_role("Trainee Moderator", "TrMod")
|
||||||
|
:set_permission_group("Mod")
|
||||||
|
:set_custom_color{ r = 0, g = 170, b = 0 }
|
||||||
|
:set_flag("is_admin")
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_parent("Board Member")
|
||||||
|
:allow{
|
||||||
|
"command/assign-role",
|
||||||
|
"command/unassign-role",
|
||||||
|
"command/admin-chat",
|
||||||
|
"command/kill/always",
|
||||||
|
"command/clear-tag/always",
|
||||||
|
"command/spawn/always",
|
||||||
|
"command/clear-reports",
|
||||||
|
"command/clear-warnings",
|
||||||
|
"command/clear-script-warnings",
|
||||||
|
"command/clear-last-warnings",
|
||||||
|
"command/clear-inventory",
|
||||||
|
"command/kill-enemies",
|
||||||
|
"command/remove-enemies",
|
||||||
|
"command/connect-player",
|
||||||
|
"command/set-bot-queue",
|
||||||
|
"command/set-game-speed",
|
||||||
|
"command/set-friendly-fire",
|
||||||
|
"command/set-always-day",
|
||||||
|
"command/set-pollution-enabled",
|
||||||
|
"command/clear-pollution",
|
||||||
|
"command/create-warning",
|
||||||
|
"command/get-warnings",
|
||||||
|
"command/get-reports",
|
||||||
|
"command/protect-entity",
|
||||||
|
"command/protect-area",
|
||||||
|
"command/protect-tag",
|
||||||
|
"command/kick",
|
||||||
|
"command/ban",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Trusted Roles
|
||||||
|
Roles.new_role("Board Member", "Board")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 247, g = 246, b = 54 }
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_flag("report-immune")
|
||||||
|
:set_flag("instant-respawn")
|
||||||
|
:set_parent("Supporter")
|
||||||
|
:allow{
|
||||||
|
"gui/playerdata",
|
||||||
|
"command/teleport",
|
||||||
|
"command/bring",
|
||||||
|
"command/search",
|
||||||
|
"command/search-online",
|
||||||
|
"command/search-amount",
|
||||||
|
"command/search-recent",
|
||||||
|
"command/spectate",
|
||||||
|
"command/follow",
|
||||||
|
"command/clear-blueprints-surface",
|
||||||
|
}
|
||||||
|
|
||||||
|
Roles.new_role("Supporter", "Sup")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 230, g = 99, b = 34 }
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_parent("Partner")
|
||||||
|
|
||||||
|
Roles.new_role("Partner", "Part")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 140, g = 120, b = 200 }
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_parent("Senior Member")
|
||||||
|
|
||||||
|
Roles.new_role("Senior Member", "SMem")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 140, g = 120, b = 200 }
|
||||||
|
:set_flag("is_spectator")
|
||||||
|
:set_parent("Member")
|
||||||
|
|
||||||
|
Roles.new_role("Member", "Mem")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 24, g = 172, b = 188 }
|
||||||
|
:set_flag("deconlog-bypass")
|
||||||
|
:set_parent("Veteran")
|
||||||
|
:allow{
|
||||||
|
"fast-tree-decon",
|
||||||
|
"gui/bonus",
|
||||||
|
--"command/tag-color",
|
||||||
|
"command/set-join-message",
|
||||||
|
"command/remove-join-message",
|
||||||
|
"command/home",
|
||||||
|
"command/set-home",
|
||||||
|
"command/get-home",
|
||||||
|
"command/return",
|
||||||
|
"command/goto",
|
||||||
|
"command/jail",
|
||||||
|
"command/unjail",
|
||||||
|
"command/repair",
|
||||||
|
"command/spectate",
|
||||||
|
"command/follow",
|
||||||
|
}
|
||||||
|
|
||||||
|
local hours6, hours250 = 6 * 216000, 250 * 60
|
||||||
|
Roles.new_role("Veteran", "Vet")
|
||||||
|
:set_permission_group("Trusted")
|
||||||
|
:set_custom_color{ r = 140, g = 120, b = 200 }
|
||||||
|
:set_parent("Regular")
|
||||||
|
:allow{
|
||||||
|
"gui/surveillance",
|
||||||
|
"gui/warp-list/add",
|
||||||
|
"gui/warp-list/edit",
|
||||||
|
"gui/tool",
|
||||||
|
"gui/vlayer-edit",
|
||||||
|
"gui/rocket-info/toggle-active",
|
||||||
|
"gui/rocket-info/remote_launch",
|
||||||
|
"command/chat-commands",
|
||||||
|
"command/clear-ground-items",
|
||||||
|
"command/clear-blueprints",
|
||||||
|
"command/set-trains-to-automatic",
|
||||||
|
"command/lawnmower",
|
||||||
|
"command/waterfill",
|
||||||
|
"command/artillery",
|
||||||
|
"command/save-quickbar",
|
||||||
|
"command/personal-logistic",
|
||||||
|
}
|
||||||
|
:set_auto_assign_condition(function(player)
|
||||||
|
if player.online_time >= hours6 then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
local stats = Statistics:get(player, {})
|
||||||
|
local playtime, afk_time, map_count = stats.Playtime or 0, stats.AfkTime or 0, stats.MapsPlayed or 0
|
||||||
|
return playtime - afk_time >= hours250 and map_count >= 25
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--- Standard User Roles
|
||||||
|
local hours1, hours15 = 1 * 216000, 15 * 60
|
||||||
|
Roles.new_role("Regular", "Reg")
|
||||||
|
:set_permission_group("Standard")
|
||||||
|
:set_custom_color{ r = 79, g = 155, b = 163 }
|
||||||
|
:set_parent("Guest")
|
||||||
|
:allow{
|
||||||
|
"standard-decon",
|
||||||
|
"bypass-entity-protection",
|
||||||
|
"bypass-nukeprotect",
|
||||||
|
"gui/task-list/add",
|
||||||
|
"gui/task-list/edit",
|
||||||
|
"command/kill",
|
||||||
|
"command/rainbow",
|
||||||
|
"command/spawn",
|
||||||
|
"command/me",
|
||||||
|
"command/vlayer-info",
|
||||||
|
}
|
||||||
|
:set_auto_assign_condition(function(player)
|
||||||
|
if player.online_time >= hours1 then
|
||||||
|
return true
|
||||||
|
else
|
||||||
|
local stats = Statistics:get(player, {})
|
||||||
|
local playtime, afk_time, map_count = stats.Playtime or 0, stats.AfkTime or 0, stats.MapsPlayed or 0
|
||||||
|
return playtime - afk_time >= hours15 and map_count >= 5
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
--- Guest/Default role
|
||||||
|
local default = Roles.new_role("Guest", "")
|
||||||
|
:set_permission_group("Guest")
|
||||||
|
:set_custom_color{ r = 185, g = 187, b = 160 }
|
||||||
|
:allow{
|
||||||
|
"gui/player-list",
|
||||||
|
"gui/rocket-info",
|
||||||
|
"gui/science-info",
|
||||||
|
"gui/task-list",
|
||||||
|
"gui/warp-list",
|
||||||
|
"gui/readme",
|
||||||
|
"gui/vlayer",
|
||||||
|
"gui/research",
|
||||||
|
"gui/autofill",
|
||||||
|
"gui/module",
|
||||||
|
"gui/production",
|
||||||
|
-- "command/tag",
|
||||||
|
-- "command/tag-clear",
|
||||||
|
"command/commands",
|
||||||
|
"command/get-roles",
|
||||||
|
"command/locate",
|
||||||
|
"command/create-report",
|
||||||
|
"command/ratio",
|
||||||
|
"command/server-ups",
|
||||||
|
"command/save-data",
|
||||||
|
"command/data-preference",
|
||||||
|
"command/connect",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Jail role
|
||||||
|
Roles.new_role("Jail")
|
||||||
|
:set_permission_group("Restricted")
|
||||||
|
:set_custom_color{ r = 50, g = 50, b = 50 }
|
||||||
|
:set_block_auto_assign(true)
|
||||||
|
:set_flag("defer_role_changes")
|
||||||
|
:disallow(default.allowed)
|
||||||
|
|
||||||
|
--- System defaults which are required to be set
|
||||||
|
Roles.set_root("System")
|
||||||
|
Roles.set_default("Guest")
|
||||||
|
|
||||||
|
Roles.define_role_order{
|
||||||
|
"System", -- Best to keep root at top
|
||||||
|
"Senior Administrator",
|
||||||
|
"Administrator",
|
||||||
|
"Senior Moderator",
|
||||||
|
"Moderator",
|
||||||
|
"Trainee Moderator",
|
||||||
|
"Board Member",
|
||||||
|
"Supporter",
|
||||||
|
"Partner",
|
||||||
|
"Senior Member",
|
||||||
|
"Member",
|
||||||
|
"Veteran",
|
||||||
|
"Regular",
|
||||||
|
"Jail",
|
||||||
|
"Guest", -- Default must be last if you want to apply restrictions to other roles
|
||||||
|
}
|
||||||
|
|
||||||
|
Roles.override_player_roles{
|
||||||
|
["PHIDIAS0303"] = { "Senior Administrator" },
|
||||||
|
["7h3w1z4rd"] = { "Moderator" },
|
||||||
|
["aldldl"] = { "Moderator" },
|
||||||
|
["arty714"] = { "Moderator" },
|
||||||
|
["AssemblyStorm"] = { "Moderator" },
|
||||||
|
["banakeg"] = { "Moderator" },
|
||||||
|
["connormkii"] = { "Moderator" },
|
||||||
|
["cydes"] = { "Moderator" },
|
||||||
|
["Cooldude2606"] = { "Moderator" },
|
||||||
|
["darklich14"] = { "Moderator" },
|
||||||
|
["Drahc_pro"] = { "Moderator" },
|
||||||
|
["facere"] = { "Moderator" },
|
||||||
|
["freek18"] = { "Moderator" },
|
||||||
|
["FlipHalfling90"] = { "Moderator" },
|
||||||
|
["Gizan"] = { "Moderator" },
|
||||||
|
["hamsterbryan"] = { "Moderator" },
|
||||||
|
["hidden_relic"] = { "Moderator" },
|
||||||
|
["Hova"] = { "Moderator" },
|
||||||
|
["HunterOfGames"] = { "Moderator" },
|
||||||
|
["LoicB"] = { "Moderator" },
|
||||||
|
["M74132"] = { "Moderator" },
|
||||||
|
["MadKatz"] = { "Moderator" },
|
||||||
|
["mafisch3"] = { "Moderator" },
|
||||||
|
["maplesyrup01"] = { "Moderator" },
|
||||||
|
["mark9064"] = { "Moderator" },
|
||||||
|
["nallaj"] = { "Moderator" },
|
||||||
|
["NextIdea"] = { "Moderator" },
|
||||||
|
["oof2win2"] = { "Moderator" },
|
||||||
|
["ookl"] = { "Moderator" },
|
||||||
|
["Phoenix27833"] = { "Moderator" },
|
||||||
|
["porelos"] = { "Moderator" },
|
||||||
|
["Ruuyji"] = { "Moderator" },
|
||||||
|
["samy115"] = { "Moderator" },
|
||||||
|
["SilentLog"] = { "Moderator" },
|
||||||
|
["Tcheko"] = { "Moderator" },
|
||||||
|
["thadius856"] = { "Moderator" },
|
||||||
|
["TheKernel32"] = { "Moderator" },
|
||||||
|
["TheKernel64"] = { "Moderator" },
|
||||||
|
["tovernaar123"] = { "Moderator" },
|
||||||
|
["UUBlueFire"] = { "Moderator" },
|
||||||
|
["whoami32"] = { "Moderator" },
|
||||||
|
["Windbomb"] = { "Moderator" },
|
||||||
|
["Windsinger"] = { "Moderator" },
|
||||||
|
["XenoCyber"] = { "Moderator" },
|
||||||
|
["Athenaa"] = { "Trainee Moderator" },
|
||||||
|
["hihicome3"] = { "Trainee Moderator" },
|
||||||
|
["JamesJung"] = { "Trainee Moderator" },
|
||||||
|
["konohaScarlet_"] = { "Trainee Moderator" },
|
||||||
|
["majoro"] = { "Trainee Moderator" },
|
||||||
|
["rongli"] = { "Trainee Moderator" },
|
||||||
|
}
|
||||||
@@ -4,6 +4,6 @@
|
|||||||
local events = defines.events
|
local events = defines.events
|
||||||
return {
|
return {
|
||||||
events.on_player_banned,
|
events.on_player_banned,
|
||||||
events.on_player_kicked,
|
-- events.on_player_kicked,
|
||||||
-- events.on_player_left_game
|
-- events.on_player_left_game
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,2 @@
|
|||||||
return {
|
return {
|
||||||
Cooldude2606 = "Lua lets you set metatables on numbers, did you know that? Cooldude2606 knows this.",
|
|
||||||
samy115 = "Tremble in fear as the banhammer is now here, its owner: samy115",
|
|
||||||
XenoCyber = '"Fire Fire Fire" oops wrong game, have no fear XenoCyber is here',
|
|
||||||
HunterOfGames = "Unable to support HunterOfGames. You must construct additional miners.",
|
|
||||||
ookl = 'ookl says: "Pineapples are amazing, hello everyone!"',
|
|
||||||
arty714 = "Arty\'s Potato made it!",
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
--- Config file for the server detail
|
|
||||||
-- @config Server
|
|
||||||
|
|
||||||
return {
|
|
||||||
community_name = "Explosive Gaming",
|
|
||||||
discord = "https://discord.explosivegaming.nl",
|
|
||||||
website = "https://www.explosivegaming.nl",
|
|
||||||
status = "https://status.explosivegaming.nl",
|
|
||||||
github = "https://github.com/explosivegaming/ExpCluster",
|
|
||||||
patreon = "https://www.patreon.com/ExpGaming"
|
|
||||||
}
|
|
||||||
@@ -4,10 +4,10 @@
|
|||||||
return {
|
return {
|
||||||
spawn_area = { --- @setting spawn_area Settings relating to the whole spawn area
|
spawn_area = { --- @setting spawn_area Settings relating to the whole spawn area
|
||||||
-- Enable predefined patches: 128, else: 32
|
-- Enable predefined patches: 128, else: 32
|
||||||
deconstruction_radius = 20, -- @setting deconstruction_radius All entities within this radius will be removed
|
deconstruction_radius = 12, -- @setting deconstruction_radius All entities within this radius will be removed
|
||||||
tile_radius = 20,
|
tile_radius = 14,
|
||||||
deconstruction_tile = "concrete", --- @setting deconstruction_tile Tile to be placed in the deconstruction radius, use nil for map gen
|
deconstruction_tile = "refined-concrete", --- @setting deconstruction_tile Tile to be placed in the deconstruction radius, use nil for map gen
|
||||||
landfill_radius = 50, --- @setting pattern_radius All water within this radius will be land filled
|
landfill_radius = 16, --- @setting pattern_radius All water within this radius will be land filled
|
||||||
},
|
},
|
||||||
turrets = { --- @setting turrets Settings relating to adding turrets to spawn
|
turrets = { --- @setting turrets Settings relating to adding turrets to spawn
|
||||||
enabled = true, --- @setting enabled Whether turrets will be added to spawn
|
enabled = true, --- @setting enabled Whether turrets will be added to spawn
|
||||||
@@ -15,10 +15,10 @@ return {
|
|||||||
refill_time = 60 * 60 * 5, --- @setting refill_time The time in ticks between each refill of the turrets, only change if having lag issues
|
refill_time = 60 * 60 * 5, --- @setting refill_time The time in ticks between each refill of the turrets, only change if having lag issues
|
||||||
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to turrets
|
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to turrets
|
||||||
locations = { --- @setting locations The locations of all turrets, this list can change during runtime
|
locations = { --- @setting locations The locations of all turrets, this list can change during runtime
|
||||||
{ -3, -3 },
|
{ -2, -2 },
|
||||||
{ 3, -3 },
|
{ 2, -2 },
|
||||||
{ -3, 3 },
|
{ -2, 2 },
|
||||||
{ 3, 3 },
|
{ 2, 2 },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
afk_belts = { --- @setting afk_belts Settings relating to adding afk belts to spawn
|
afk_belts = { --- @setting afk_belts Settings relating to adding afk belts to spawn
|
||||||
@@ -27,8 +27,10 @@ return {
|
|||||||
protected = true, --- @setting protected Whether belts will be protected from player interaction
|
protected = true, --- @setting protected Whether belts will be protected from player interaction
|
||||||
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to afk belts
|
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to afk belts
|
||||||
locations = { --- @setting locations The locations to spawn afk belts at, given as the top left position
|
locations = { --- @setting locations The locations to spawn afk belts at, given as the top left position
|
||||||
{ -5, -5 }, { 5, -5 },
|
{ 4, 4 },
|
||||||
{ -5, 5 }, { 5, 5 },
|
{ 4, -4 },
|
||||||
|
{ -4, 4 },
|
||||||
|
{ -4, -4 }
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
water = { --- @setting water Settings relating to adding water to spawn
|
water = { --- @setting water Settings relating to adding water to spawn
|
||||||
@@ -36,147 +38,44 @@ return {
|
|||||||
water_tile = "water-mud", --- @setting water_tile The tile to be used as the water tile
|
water_tile = "water-mud", --- @setting water_tile The tile to be used as the water tile
|
||||||
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to water tiles
|
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to water tiles
|
||||||
locations = { --- @setting locations The location of the water tiles {x,y}
|
locations = { --- @setting locations The location of the water tiles {x,y}
|
||||||
-- Each is a 3x3 with the closest tile to 0,0 removed
|
{ 5, 6 }, { 5, 7 }, { 6, 5 }, { 6, 6 }, { 6, 7 }, { 7, 5 }, { 7, 6 }, { 7, 7 },
|
||||||
{ 7, 8 }, { 7, 9 }, { 8, 7 }, { 8, 8 }, { 8, 9 }, { 9, 7 }, { 9, 8 }, { 9, 9 }, -- Bottom Right
|
{ 5, -7 }, { 5, -8 }, { 6, -6 }, { 6, -7 }, { 6, -8 }, { 7, -6 }, { 7, -7 }, { 7, -8 },
|
||||||
{ 7, -9 }, { 7, -10 }, { 8, -8 }, { 8, -9 }, { 8, -10 }, { 9, -8 }, { 9, -9 }, { 9, -10 }, -- Top Right
|
{ -6, 6 }, { -6, 7 }, { -7, 5 }, { -7, 6 }, { -7, 7 }, { -8, 5 }, { -8, 6 }, { -8, 7 },
|
||||||
{ -8, -9 }, { -8, -10 }, { -9, -8 }, { -9, -9 }, { -9, -10 }, { -10, -8 }, { -10, -9 }, { -10, -10 }, -- Top Left
|
{ -6, -7 }, { -6, -8 }, { -7, -6 }, { -7, -7 }, { -7, -8 }, { -8, -6 }, { -8, -7 }, { -8, -8 },
|
||||||
{ -8, 8 }, { -8, 9 }, { -9, 7 }, { -9, 8 }, { -9, 9 }, { -10, 7 }, { -10, 8 }, { -10, 9 }, -- Bottom Left
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
entities = { --- @setting entities Settings relating to adding entities to spawn
|
entities = { --- @setting entities Settings relating to adding entities to spawn
|
||||||
enabled = true, --- @setting enabled Whether entities will be added to spawn
|
enabled = true, --- @setting enabled Whether entities will be added to spawn
|
||||||
protected = true, --- @setting protected Whether entities will be protected from player interaction
|
protected = true, --- @setting protected Whether entities will be protected from player interaction
|
||||||
operable = true, --- @setting operable Whether entities can be opened by players, must be true if chests are used
|
operable = true, --- @setting operable Whether entities can be opened by players, must be true if chests are used
|
||||||
offset = { x = 0, y = -2 }, --- @setting offset The position offset to apply to entities
|
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to entities
|
||||||
locations = { --- @setting locations The location and names of entities {name,x,y}
|
locations = { --- @setting locations The location and names of entities {name,x,y}
|
||||||
{ "stone-wall", -10, -5 }, { "stone-wall", -10, -4 }, { "stone-wall", -10, -3 }, { "stone-wall", -10, -2 }, { "stone-wall", -10, -1 }, { "stone-wall", -10, 0 }, { "stone-wall", -10, 3 }, { "stone-wall", -10, 4 }, { "stone-wall", -10, 5 },
|
{ "steel-chest", 1, 3 }, { "steel-chest", 1, 4 }, { "steel-chest", 1, 5 },
|
||||||
{ "stone-wall", -10, 6 }, { "stone-wall", -10, 7 }, { "stone-wall", -10, 8 }, { "small-lamp", -8, -4 }, { "small-lamp", -8, -1 }, { "iron-chest", -8, 0 }, { "iron-chest", -8, 3 }, { "small-lamp", -8, 4 },
|
{ "steel-chest", 3, 1 }, { "steel-chest", 4, 1 }, { "steel-chest", 5, 1 },
|
||||||
{ "small-lamp", -8, 7 }, { "stone-wall", -7, -8 }, { "small-electric-pole", -7, -2 }, { "iron-chest", -7, 0 }, { "iron-chest", -7, 3 }, { "small-electric-pole", -7, 5 }, { "stone-wall", -7, 11 }, { "stone-wall", -6, -8 }, { "small-lamp", -6, -6 },
|
{ "steel-chest", 1, -4 }, { "steel-chest", 1, -5 }, { "steel-chest", 1, -6 },
|
||||||
{ "iron-chest", -6, 0 }, { "iron-chest", -6, 3 }, { "small-lamp", -6, 9 }, { "stone-wall", -6, 11 }, { "stone-wall", -5, -8 }, { "small-lamp", -5, -1 }, { "iron-chest", -5, 0 }, { "iron-chest", -5, 3 }, { "small-lamp", -5, 4 }, { "stone-wall", -5, 11 },
|
{ "steel-chest", 3, -2 }, { "steel-chest", 4, -2 }, { "steel-chest", 5, -2 },
|
||||||
{ "stone-wall", -4, -8 }, { "small-electric-pole", -4, -5 }, { "iron-chest", -4, 0 }, { "iron-chest", -4, 3 }, { "small-electric-pole", -4, 8 }, { "stone-wall", -4, 11 }, { "stone-wall", -3, -8 }, { "small-lamp", -3, -6 }, { "small-lamp", -3, -3 }, { "small-lamp", -3, 6 },
|
{ "steel-chest", -2, 3 }, { "steel-chest", -2, 4 }, { "steel-chest", -2, 5 },
|
||||||
{ "small-lamp", -3, 9 }, { "stone-wall", -3, 11 }, { "stone-wall", -2, -8 }, { "iron-chest", -2, -6 }, { "iron-chest", -2, -5 }, { "iron-chest", -2, -4 }, { "iron-chest", -2, -3 }, { "iron-chest", -2, -2 }, { "iron-chest", -2, 5 }, { "iron-chest", -2, 6 },
|
{ "steel-chest", -4, 1 }, { "steel-chest", -5, 1 }, { "steel-chest", -6, 1 },
|
||||||
{ "iron-chest", -2, 7 }, { "iron-chest", -2, 8 }, { "iron-chest", -2, 9 }, { "stone-wall", -2, 11 }, { "stone-wall", 1, -8 }, { "iron-chest", 1, -6 },
|
{ "steel-chest", -2, -4 }, { "steel-chest", -2, -5 }, { "steel-chest", -2, -6 },
|
||||||
{ "iron-chest", 1, -5 }, { "iron-chest", 1, -4 }, { "iron-chest", 1, -3 }, { "iron-chest", 1, -2 }, { "iron-chest", 1, 5 }, { "iron-chest", 1, 6 }, { "iron-chest", 1, 7 }, { "iron-chest", 1, 8 }, { "iron-chest", 1, 9 }, { "stone-wall", 1, 11 },
|
{ "steel-chest", -4, -2 }, { "steel-chest", -5, -2 }, { "steel-chest", -6, -2 },
|
||||||
{ "stone-wall", 2, -8 }, { "small-lamp", 2, -6 }, { "small-lamp", 2, -3 }, { "small-lamp", 2, 6 }, { "small-lamp", 2, 9 }, { "stone-wall", 2, 11 }, { "stone-wall", 3, -8 }, { "small-electric-pole", 3, -5 }, { "iron-chest", 3, 0 }, { "iron-chest", 3, 3 },
|
{ "medium-electric-pole", 2, 3 }, { "medium-electric-pole", 2, -4 }, { "medium-electric-pole", -3, 3 }, { "medium-electric-pole", -3, -4 },
|
||||||
{ "small-electric-pole", 3, 8 }, { "stone-wall", 3, 11 }, { "stone-wall", 4, -8 }, { "small-lamp", 4, -1 }, { "iron-chest", 4, 0 }, { "iron-chest", 4, 3 }, { "small-lamp", 4, 4 }, { "stone-wall", 4, 11 }, { "stone-wall", 5, -8 }, { "small-lamp", 5, -6 },
|
{ "small-lamp", 2, 4 }, { "small-lamp", 2, -5 }, { "small-lamp", -3, 4 }, { "small-lamp", -3, -5 },
|
||||||
{ "iron-chest", 5, 0 }, { "iron-chest", 5, 3 }, { "small-lamp", 5, 9 }, { "stone-wall", 5, 11 }, { "stone-wall", 6, -8 }, { "small-electric-pole", 6, -2 }, { "iron-chest", 6, 0 }, { "iron-chest", 6, 3 }, { "small-electric-pole", 6, 5 }, { "stone-wall", 6, 11 },
|
{ "small-lamp", 4, 2 }, { "small-lamp", 4, -3 }, { "small-lamp", -5, 2 }, { "small-lamp", -5, -3 },
|
||||||
{ "small-lamp", 7, -4 }, { "small-lamp", 7, -1 }, { "iron-chest", 7, 0 }, { "iron-chest", 7, 3 }, { "small-lamp", 7, 4 }, { "small-lamp", 7, 7 }, { "stone-wall", 9, -5 },
|
{ "stone-wall", 1, 7 }, { "stone-wall", 2, 7 }, { "stone-wall", 3, 7 }, { "stone-wall", 4, 7 },
|
||||||
{ "stone-wall", 9, -4 }, { "stone-wall", 9, -3 }, { "stone-wall", 9, -2 }, { "stone-wall", 9, -1 }, { "stone-wall", 9, 0 }, { "stone-wall", 9, 3 }, { "stone-wall", 9, 4 }, { "stone-wall", 9, 5 }, { "stone-wall", 9, 6 }, { "stone-wall", 9, 7 },
|
{ "stone-wall", 7, 1 }, { "stone-wall", 7, 2 }, { "stone-wall", 7, 3 }, { "stone-wall", 7, 4 },
|
||||||
{ "stone-wall", 9, 8 },
|
{ "stone-wall", 1, -8 }, { "stone-wall", 2, -8 }, { "stone-wall", 3, -8 }, { "stone-wall", 4, -8 },
|
||||||
|
{ "stone-wall", 7, -2 }, { "stone-wall", 7, -3 }, { "stone-wall", 7, -4 }, { "stone-wall", 7, -5 },
|
||||||
|
{ "stone-wall", -2, 7 }, { "stone-wall", -3, 7 }, { "stone-wall", -4, 7 }, { "stone-wall", -5, 7 },
|
||||||
|
{ "stone-wall", -8, 1 }, { "stone-wall", -8, 2 }, { "stone-wall", -8, 3 }, { "stone-wall", -8, 4 },
|
||||||
|
{ "stone-wall", -2, -8 }, { "stone-wall", -3, -8 }, { "stone-wall", -4, -8 }, { "stone-wall", -5, -8 },
|
||||||
|
{ "stone-wall", -8, -2 }, { "stone-wall", -8, -3 }, { "stone-wall", -8, -4 }, { "stone-wall", -8, -5 },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
pattern = {
|
pattern = {
|
||||||
enabled = true, --- @setting enabled Whether pattern tiles will be added to spawn
|
enabled = false, --- @setting enabled Whether pattern tiles will be added to spawn
|
||||||
pattern_tile = "stone-path", --- @setting pattern_tile The tile to be used for the pattern
|
pattern_tile = "refined-concrete", --- @setting pattern_tile The tile to be used for the pattern
|
||||||
offset = { x = 0, y = -2 }, --- @setting offset The position offset to apply to pattern tiles
|
offset = { x = 0, y = 0 }, --- @setting offset The position offset to apply to pattern tiles
|
||||||
locations = { --- @setting locations The location of the pattern tiles {x,y}
|
locations = { --- @setting locations The location of the pattern tiles {x,y}
|
||||||
{ -49, -3 }, { -49, -2 }, { -49, 1 }, { -49, 2 }, { -49, 5 }, { -49, 6 }, { -48, -4 }, { -48, -3 }, { -48, -2 }, { -48, 1 }, { -48, 2 }, { -48, 5 }, { -48, 6 }, { -48, 7 }, { -47, -7 }, { -47, -6 }, { -47, -5 }, { -47, -4 }, { -47, -3 }, { -47, -2 }, { -47, 5 }, { -47, 6 }, { -47, 7 }, { -47, 8 }, { -47, 9 }, { -47, 10 }, { -46, -8 }, { -46, -7 }, { -46, -6 }, { -46, -5 },
|
|
||||||
{ -46, -4 }, { -46, -3 }, { -46, -2 }, { -46, -1 }, { -46, 4 }, { -46, 5 }, { -46, 6 }, { -46, 7 }, { -46, 8 }, { -46, 9 }, { -46, 10 }, { -46, 11 }, { -45, -17 }, { -45, -16 }, { -45, -15 }, { -45, -14 }, { -45, -13 }, { -45, -12 }, { -45, -9 }, { -45, -8 }, { -45, -7 }, { -45, -2 }, { -45, -1 }, { -45, 0 }, { -45, 1 }, { -45, 2 }, { -45, 3 }, { -45, 4 }, { -45, 5 }, { -45, 10 },
|
|
||||||
{ -45, 11 }, { -45, 12 }, { -45, 15 }, { -45, 16 }, { -45, 17 }, { -45, 18 }, { -45, 19 }, { -45, 20 }, { -44, -18 }, { -44, -17 }, { -44, -16 }, { -44, -15 }, { -44, -14 }, { -44, -13 }, { -44, -12 }, { -44, -9 }, { -44, -8 }, { -44, -1 }, { -44, 0 }, { -44, 1 }, { -44, 2 }, { -44, 3 }, { -44, 4 }, { -44, 11 }, { -44, 12 }, { -44, 15 }, { -44, 16 }, { -44, 17 }, { -44, 18 }, { -44, 19 },
|
|
||||||
{ -44, 20 }, { -44, 21 }, { -43, -19 }, { -43, -18 }, { -43, -17 }, { -43, -1 }, { -43, 0 }, { -43, 1 }, { -43, 2 }, { -43, 3 }, { -43, 4 }, { -43, 20 }, { -43, 21 }, { -43, 22 }, { -42, -19 }, { -42, -18 }, { -42, -1 }, { -42, 0 }, { -42, 1 }, { -42, 2 }, { -42, 3 }, { -42, 4 }, { -42, 21 }, { -42, 22 }, { -41, -25 }, { -41, -24 }, { -41, -19 }, { -41, -18 }, { -41, -13 }, { -41, -12 },
|
|
||||||
{ -41, -11 }, { -41, -10 }, { -41, -5 }, { -41, -4 }, { -41, 7 }, { -41, 8 }, { -41, 13 }, { -41, 14 }, { -41, 15 }, { -41, 16 }, { -41, 21 }, { -41, 22 }, { -41, 27 }, { -41, 28 }, { -40, -26 }, { -40, -25 }, { -40, -24 }, { -40, -20 }, { -40, -19 }, { -40, -18 }, { -40, -13 }, { -40, -12 }, { -40, -11 }, { -40, -10 }, { -40, -5 }, { -40, -4 }, { -40, 7 }, { -40, 8 }, { -40, 13 }, { -40, 14 },
|
|
||||||
{ -40, 15 }, { -40, 16 }, { -40, 21 }, { -40, 22 }, { -40, 23 }, { -40, 27 }, { -40, 28 }, { -40, 29 }, { -39, -27 }, { -39, -26 }, { -39, -25 }, { -39, -24 }, { -39, -21 }, { -39, -20 }, { -39, -19 }, { -39, -13 }, { -39, -12 }, { -39, -5 }, { -39, -4 }, { -39, -3 }, { -39, -2 }, { -39, -1 }, { -39, 0 }, { -39, 1 }, { -39, 2 }, { -39, 3 }, { -39, 4 }, { -39, 5 }, { -39, 6 }, { -39, 7 },
|
|
||||||
{ -39, 8 }, { -39, 15 }, { -39, 16 }, { -39, 22 }, { -39, 23 }, { -39, 24 }, { -39, 27 }, { -39, 28 }, { -39, 29 }, { -39, 30 }, { -38, -27 }, { -38, -26 }, { -38, -25 }, { -38, -24 }, { -38, -21 }, { -38, -20 }, { -38, -13 }, { -38, -12 }, { -38, -5 }, { -38, -4 }, { -38, -3 }, { -38, -2 }, { -38, -1 }, { -38, 0 }, { -38, 1 }, { -38, 2 }, { -38, 3 }, { -38, 4 }, { -38, 5 }, { -38, 6 },
|
|
||||||
{ -38, 7 }, { -38, 8 }, { -38, 15 }, { -38, 16 }, { -38, 23 }, { -38, 24 }, { -38, 27 }, { -38, 28 }, { -38, 29 }, { -38, 30 }, { -37, -17 }, { -37, -16 }, { -37, -13 }, { -37, -12 }, { -37, -11 }, { -37, -10 }, { -37, -4 }, { -37, -3 }, { -37, -2 }, { -37, -1 }, { -37, 0 }, { -37, 3 }, { -37, 4 }, { -37, 5 }, { -37, 6 }, { -37, 7 }, { -37, 13 }, { -37, 14 }, { -37, 15 }, { -37, 16 },
|
|
||||||
{ -37, 19 }, { -37, 20 }, { -36, -17 }, { -36, -16 }, { -36, -13 }, { -36, -12 }, { -36, -11 }, { -36, -10 }, { -36, -9 }, { -36, -3 }, { -36, -2 }, { -36, -1 }, { -36, 0 }, { -36, 3 }, { -36, 4 }, { -36, 5 }, { -36, 6 }, { -36, 12 }, { -36, 13 }, { -36, 14 }, { -36, 15 }, { -36, 16 }, { -36, 19 }, { -36, 20 }, { -35, -29 }, { -35, -28 }, { -35, -23 }, { -35, -22 }, { -35, -17 }, { -35, -16 },
|
|
||||||
{ -35, -12 }, { -35, -11 }, { -35, -10 }, { -35, -9 }, { -35, -8 }, { -35, 11 }, { -35, 12 }, { -35, 13 }, { -35, 14 }, { -35, 15 }, { -35, 19 }, { -35, 20 }, { -35, 25 }, { -35, 26 }, { -35, 31 }, { -35, 32 }, { -34, -30 }, { -34, -29 }, { -34, -28 }, { -34, -23 }, { -34, -22 }, { -34, -17 }, { -34, -16 }, { -34, -15 }, { -34, -11 }, { -34, -10 }, { -34, -9 }, { -34, -8 }, { -34, 11 }, { -34, 12 },
|
|
||||||
{ -34, 13 }, { -34, 14 }, { -34, 18 }, { -34, 19 }, { -34, 20 }, { -34, 25 }, { -34, 26 }, { -34, 31 }, { -34, 32 }, { -34, 33 }, { -33, -31 }, { -33, -30 }, { -33, -29 }, { -33, -28 }, { -33, -23 }, { -33, -22 }, { -33, -16 }, { -33, -15 }, { -33, -14 }, { -33, -5 }, { -33, -4 }, { -33, -1 }, { -33, 0 }, { -33, 3 }, { -33, 4 }, { -33, 7 }, { -33, 8 }, { -33, 17 }, { -33, 18 }, { -33, 19 },
|
|
||||||
{ -33, 25 }, { -33, 26 }, { -33, 31 }, { -33, 32 }, { -33, 33 }, { -33, 34 }, { -32, -32 }, { -32, -31 }, { -32, -30 }, { -32, -29 }, { -32, -28 }, { -32, -27 }, { -32, -23 }, { -32, -22 }, { -32, -21 }, { -32, -15 }, { -32, -14 }, { -32, -6 }, { -32, -5 }, { -32, -4 }, { -32, -1 }, { -32, 0 }, { -32, 3 }, { -32, 4 }, { -32, 7 }, { -32, 8 }, { -32, 9 }, { -32, 17 }, { -32, 18 }, { -32, 24 },
|
|
||||||
{ -32, 25 }, { -32, 26 }, { -32, 30 }, { -32, 31 }, { -32, 32 }, { -32, 33 }, { -32, 34 }, { -32, 35 }, { -31, -33 }, { -31, -32 }, { -31, -31 }, { -31, -30 }, { -31, -29 }, { -31, -28 }, { -31, -27 }, { -31, -26 }, { -31, -22 }, { -31, -21 }, { -31, -20 }, { -31, -19 }, { -31, -18 }, { -31, -11 }, { -31, -10 }, { -31, -9 }, { -31, -8 }, { -31, -7 }, { -31, -6 }, { -31, -5 }, { -31, -1 }, { -31, 0 },
|
|
||||||
{ -31, 1 }, { -31, 2 }, { -31, 3 }, { -31, 4 }, { -31, 8 }, { -31, 9 }, { -31, 10 }, { -31, 11 }, { -31, 12 }, { -31, 13 }, { -31, 14 }, { -31, 21 }, { -31, 22 }, { -31, 23 }, { -31, 24 }, { -31, 25 }, { -31, 29 }, { -31, 30 }, { -31, 31 }, { -31, 32 }, { -31, 33 }, { -31, 34 }, { -31, 35 }, { -31, 36 }, { -30, -33 }, { -30, -32 }, { -30, -31 }, { -30, -30 }, { -30, -29 }, { -30, -28 },
|
|
||||||
{ -30, -27 }, { -30, -26 }, { -30, -21 }, { -30, -20 }, { -30, -19 }, { -30, -18 }, { -30, -11 }, { -30, -10 }, { -30, -9 }, { -30, -8 }, { -30, -7 }, { -30, -6 }, { -30, -1 }, { -30, 0 }, { -30, 1 }, { -30, 2 }, { -30, 3 }, { -30, 4 }, { -30, 9 }, { -30, 10 }, { -30, 11 }, { -30, 12 }, { -30, 13 }, { -30, 14 }, { -30, 21 }, { -30, 22 }, { -30, 23 }, { -30, 24 }, { -30, 29 }, { -30, 30 },
|
|
||||||
{ -30, 31 }, { -30, 32 }, { -30, 33 }, { -30, 34 }, { -30, 35 }, { -30, 36 }, { -29, -37 }, { -29, -36 }, { -29, -30 }, { -29, -29 }, { -29, -28 }, { -29, -27 }, { -29, -26 }, { -29, -15 }, { -29, -14 }, { -29, -10 }, { -29, -9 }, { -29, -8 }, { -29, -7 }, { -29, 10 }, { -29, 11 }, { -29, 12 }, { -29, 13 }, { -29, 17 }, { -29, 18 }, { -29, 29 }, { -29, 30 }, { -29, 31 }, { -29, 32 }, { -29, 33 },
|
|
||||||
{ -29, 39 }, { -29, 40 }, { -28, -38 }, { -28, -37 }, { -28, -36 }, { -28, -29 }, { -28, -28 }, { -28, -27 }, { -28, -26 }, { -28, -16 }, { -28, -15 }, { -28, -14 }, { -28, -9 }, { -28, -8 }, { -28, 11 }, { -28, 12 }, { -28, 17 }, { -28, 18 }, { -28, 19 }, { -28, 29 }, { -28, 30 }, { -28, 31 }, { -28, 32 }, { -28, 39 }, { -28, 40 }, { -28, 41 }, { -27, -39 }, { -27, -38 }, { -27, -37 }, { -27, -36 },
|
|
||||||
{ -27, -23 }, { -27, -22 }, { -27, -19 }, { -27, -18 }, { -27, -17 }, { -27, -16 }, { -27, -15 }, { -27, -5 }, { -27, -4 }, { -27, -1 }, { -27, 0 }, { -27, 1 }, { -27, 2 }, { -27, 3 }, { -27, 4 }, { -27, 7 }, { -27, 8 }, { -27, 18 }, { -27, 19 }, { -27, 20 }, { -27, 21 }, { -27, 22 }, { -27, 25 }, { -27, 26 }, { -27, 39 }, { -27, 40 }, { -27, 41 }, { -27, 42 }, { -26, -39 }, { -26, -38 },
|
|
||||||
{ -26, -37 }, { -26, -36 }, { -26, -24 }, { -26, -23 }, { -26, -22 }, { -26, -19 }, { -26, -18 }, { -26, -17 }, { -26, -16 }, { -26, -6 }, { -26, -5 }, { -26, -4 }, { -26, -1 }, { -26, 0 }, { -26, 1 }, { -26, 2 }, { -26, 3 }, { -26, 4 }, { -26, 7 }, { -26, 8 }, { -26, 9 }, { -26, 19 }, { -26, 20 }, { -26, 21 }, { -26, 22 }, { -26, 25 }, { -26, 26 }, { -26, 27 }, { -26, 39 }, { -26, 40 },
|
|
||||||
{ -26, 41 }, { -26, 42 }, { -25, -33 }, { -25, -32 }, { -25, -31 }, { -25, -30 }, { -25, -25 }, { -25, -24 }, { -25, -23 }, { -25, -22 }, { -25, -19 }, { -25, -18 }, { -25, -17 }, { -25, -9 }, { -25, -8 }, { -25, -7 }, { -25, -6 }, { -25, -5 }, { -25, -4 }, { -25, -1 }, { -25, 0 }, { -25, 1 }, { -25, 2 }, { -25, 3 }, { -25, 4 }, { -25, 7 }, { -25, 8 }, { -25, 9 }, { -25, 10 }, { -25, 11 },
|
|
||||||
{ -25, 12 }, { -25, 20 }, { -25, 21 }, { -25, 22 }, { -25, 25 }, { -25, 26 }, { -25, 27 }, { -25, 28 }, { -25, 33 }, { -25, 34 }, { -25, 35 }, { -25, 36 }, { -24, -33 }, { -24, -32 }, { -24, -31 }, { -24, -30 }, { -24, -29 }, { -24, -25 }, { -24, -24 }, { -24, -23 }, { -24, -22 }, { -24, -19 }, { -24, -18 }, { -24, -9 }, { -24, -8 }, { -24, -7 }, { -24, -6 }, { -24, -5 }, { -24, -4 }, { -24, -1 },
|
|
||||||
{ -24, 0 }, { -24, 1 }, { -24, 2 }, { -24, 3 }, { -24, 4 }, { -24, 7 }, { -24, 8 }, { -24, 9 }, { -24, 10 }, { -24, 11 }, { -24, 12 }, { -24, 21 }, { -24, 22 }, { -24, 25 }, { -24, 26 }, { -24, 27 }, { -24, 28 }, { -24, 32 }, { -24, 33 }, { -24, 34 }, { -24, 35 }, { -24, 36 }, { -23, -37 }, { -23, -36 }, { -23, -30 }, { -23, -29 }, { -23, -28 }, { -23, -19 }, { -23, -18 }, { -23, -15 },
|
|
||||||
{ -23, -14 }, { -23, -9 }, { -23, -8 }, { -23, -7 }, { -23, -6 }, { -23, -5 }, { -23, 0 }, { -23, 1 }, { -23, 2 }, { -23, 3 }, { -23, 8 }, { -23, 9 }, { -23, 10 }, { -23, 11 }, { -23, 12 }, { -23, 17 }, { -23, 18 }, { -23, 21 }, { -23, 22 }, { -23, 31 }, { -23, 32 }, { -23, 33 }, { -23, 39 }, { -23, 40 }, { -22, -38 }, { -22, -37 }, { -22, -36 }, { -22, -29 }, { -22, -28 }, { -22, -19 },
|
|
||||||
{ -22, -18 }, { -22, -15 }, { -22, -14 }, { -22, -13 }, { -22, -9 }, { -22, -8 }, { -22, -7 }, { -22, -6 }, { -22, 1 }, { -22, 2 }, { -22, 9 }, { -22, 10 }, { -22, 11 }, { -22, 12 }, { -22, 16 }, { -22, 17 }, { -22, 18 }, { -22, 21 }, { -22, 22 }, { -22, 31 }, { -22, 32 }, { -22, 39 }, { -22, 40 }, { -22, 41 }, { -21, -41 }, { -21, -40 }, { -21, -39 }, { -21, -38 }, { -21, -37 }, { -21, -29 },
|
|
||||||
{ -21, -28 }, { -21, -25 }, { -21, -24 }, { -21, -23 }, { -21, -22 }, { -21, -21 }, { -21, -20 }, { -21, -19 }, { -21, -18 }, { -21, -15 }, { -21, -14 }, { -21, -13 }, { -21, -12 }, { -21, -3 }, { -21, -2 }, { -21, 5 }, { -21, 6 }, { -21, 15 }, { -21, 16 }, { -21, 17 }, { -21, 18 }, { -21, 21 }, { -21, 22 }, { -21, 23 }, { -21, 24 }, { -21, 25 }, { -21, 26 }, { -21, 27 }, { -21, 28 }, { -21, 31 },
|
|
||||||
{ -21, 32 }, { -21, 40 }, { -21, 41 }, { -21, 42 }, { -21, 43 }, { -21, 44 }, { -20, -42 }, { -20, -41 }, { -20, -40 }, { -20, -39 }, { -20, -38 }, { -20, -29 }, { -20, -28 }, { -20, -25 }, { -20, -24 }, { -20, -23 }, { -20, -22 }, { -20, -21 }, { -20, -20 }, { -20, -19 }, { -20, -18 }, { -20, -15 }, { -20, -14 }, { -20, -13 }, { -20, -12 }, { -20, -3 }, { -20, -2 }, { -20, -1 }, { -20, 4 }, { -20, 5 },
|
|
||||||
{ -20, 6 }, { -20, 15 }, { -20, 16 }, { -20, 17 }, { -20, 18 }, { -20, 21 }, { -20, 22 }, { -20, 23 }, { -20, 24 }, { -20, 25 }, { -20, 26 }, { -20, 27 }, { -20, 28 }, { -20, 31 }, { -20, 32 }, { -20, 41 }, { -20, 42 }, { -20, 43 }, { -20, 44 }, { -20, 45 }, { -19, -43 }, { -19, -42 }, { -19, -41 }, { -19, -35 }, { -19, -34 }, { -19, -33 }, { -19, -32 }, { -19, -25 }, { -19, -24 }, { -19, -23 },
|
|
||||||
{ -19, -15 }, { -19, -14 }, { -19, -13 }, { -19, -9 }, { -19, -8 }, { -19, -7 }, { -19, -6 }, { -19, -2 }, { -19, -1 }, { -19, 0 }, { -19, 1 }, { -19, 2 }, { -19, 3 }, { -19, 4 }, { -19, 5 }, { -19, 9 }, { -19, 10 }, { -19, 11 }, { -19, 12 }, { -19, 16 }, { -19, 17 }, { -19, 18 }, { -19, 26 }, { -19, 27 }, { -19, 28 }, { -19, 35 }, { -19, 36 }, { -19, 37 }, { -19, 38 }, { -19, 44 },
|
|
||||||
{ -19, 45 }, { -19, 46 }, { -18, -43 }, { -18, -42 }, { -18, -35 }, { -18, -34 }, { -18, -33 }, { -18, -32 }, { -18, -31 }, { -18, -26 }, { -18, -25 }, { -18, -24 }, { -18, -15 }, { -18, -14 }, { -18, -10 }, { -18, -9 }, { -18, -8 }, { -18, -7 }, { -18, -6 }, { -18, -1 }, { -18, 0 }, { -18, 1 }, { -18, 2 }, { -18, 3 }, { -18, 4 }, { -18, 9 }, { -18, 10 }, { -18, 11 }, { -18, 12 }, { -18, 13 },
|
|
||||||
{ -18, 17 }, { -18, 18 }, { -18, 27 }, { -18, 28 }, { -18, 29 }, { -18, 34 }, { -18, 35 }, { -18, 36 }, { -18, 37 }, { -18, 38 }, { -18, 45 }, { -18, 46 }, { -17, -43 }, { -17, -42 }, { -17, -32 }, { -17, -31 }, { -17, -30 }, { -17, -27 }, { -17, -26 }, { -17, -25 }, { -17, -21 }, { -17, -20 }, { -17, -19 }, { -17, -18 }, { -17, -17 }, { -17, -16 }, { -17, -15 }, { -17, -14 }, { -17, -11 }, { -17, -10 },
|
|
||||||
{ -17, -9 }, { -17, -8 }, { -17, -7 }, { -17, -6 }, { -17, 0 }, { -17, 1 }, { -17, 2 }, { -17, 3 }, { -17, 9 }, { -17, 10 }, { -17, 11 }, { -17, 12 }, { -17, 13 }, { -17, 14 }, { -17, 17 }, { -17, 18 }, { -17, 19 }, { -17, 20 }, { -17, 21 }, { -17, 22 }, { -17, 23 }, { -17, 24 }, { -17, 28 }, { -17, 29 }, { -17, 30 }, { -17, 33 }, { -17, 34 }, { -17, 35 }, { -17, 45 }, { -17, 46 },
|
|
||||||
{ -16, -43 }, { -16, -42 }, { -16, -31 }, { -16, -30 }, { -16, -27 }, { -16, -26 }, { -16, -21 }, { -16, -20 }, { -16, -19 }, { -16, -18 }, { -16, -17 }, { -16, -16 }, { -16, -15 }, { -16, -14 }, { -16, -11 }, { -16, -10 }, { -16, -9 }, { -16, -8 }, { -16, -7 }, { -16, -6 }, { -16, 1 }, { -16, 2 }, { -16, 9 }, { -16, 10 }, { -16, 11 }, { -16, 12 }, { -16, 13 }, { -16, 14 }, { -16, 17 }, { -16, 18 },
|
|
||||||
{ -16, 19 }, { -16, 20 }, { -16, 21 }, { -16, 22 }, { -16, 23 }, { -16, 24 }, { -16, 29 }, { -16, 30 }, { -16, 33 }, { -16, 34 }, { -16, 45 }, { -16, 46 }, { -15, -43 }, { -15, -42 }, { -15, -39 }, { -15, -38 }, { -15, -37 }, { -15, -36 }, { -15, -35 }, { -15, -34 }, { -15, -20 }, { -15, -19 }, { -15, -18 }, { -15, -17 }, { -15, -10 }, { -15, -9 }, { -15, -8 }, { -15, -7 }, { -15, -3 }, { -15, -2 },
|
|
||||||
{ -15, 1 }, { -15, 2 }, { -15, 5 }, { -15, 6 }, { -15, 10 }, { -15, 11 }, { -15, 12 }, { -15, 13 }, { -15, 20 }, { -15, 21 }, { -15, 22 }, { -15, 23 }, { -15, 37 }, { -15, 38 }, { -15, 39 }, { -15, 40 }, { -15, 41 }, { -15, 42 }, { -15, 45 }, { -15, 46 }, { -14, -43 }, { -14, -42 }, { -14, -39 }, { -14, -38 }, { -14, -37 }, { -14, -36 }, { -14, -35 }, { -14, -34 }, { -14, -33 }, { -14, -19 },
|
|
||||||
{ -14, -18 }, { -14, -9 }, { -14, -8 }, { -14, -4 }, { -14, -3 }, { -14, -2 }, { -14, 1 }, { -14, 2 }, { -14, 5 }, { -14, 6 }, { -14, 7 }, { -14, 11 }, { -14, 12 }, { -14, 21 }, { -14, 22 }, { -14, 36 }, { -14, 37 }, { -14, 38 }, { -14, 39 }, { -14, 40 }, { -14, 41 }, { -14, 42 }, { -14, 45 }, { -14, 46 }, { -13, -39 }, { -13, -38 }, { -13, -35 }, { -13, -34 }, { -13, -33 }, { -13, -32 },
|
|
||||||
{ -13, -29 }, { -13, -28 }, { -13, -15 }, { -13, -14 }, { -13, -5 }, { -13, -4 }, { -13, -3 }, { -13, -2 }, { -13, 5 }, { -13, 6 }, { -13, 7 }, { -13, 8 }, { -13, 17 }, { -13, 18 }, { -13, 31 }, { -13, 32 }, { -13, 35 }, { -13, 36 }, { -13, 37 }, { -13, 38 }, { -13, 41 }, { -13, 42 }, { -12, -39 }, { -12, -38 }, { -12, -35 }, { -12, -34 }, { -12, -33 }, { -12, -32 }, { -12, -29 }, { -12, -28 },
|
|
||||||
{ -12, -27 }, { -12, -16 }, { -12, -15 }, { -12, -14 }, { -12, -13 }, { -12, -5 }, { -12, -4 }, { -12, -3 }, { -12, -2 }, { -12, 5 }, { -12, 6 }, { -12, 7 }, { -12, 8 }, { -12, 16 }, { -12, 17 }, { -12, 18 }, { -12, 19 }, { -12, 30 }, { -12, 31 }, { -12, 32 }, { -12, 35 }, { -12, 36 }, { -12, 37 }, { -12, 38 }, { -12, 41 }, { -12, 42 }, { -11, -43 }, { -11, -42 }, { -11, -34 }, { -11, -33 },
|
|
||||||
{ -11, -32 }, { -11, -29 }, { -11, -28 }, { -11, -27 }, { -11, -26 }, { -11, -23 }, { -11, -22 }, { -11, -21 }, { -11, -20 }, { -11, -17 }, { -11, -16 }, { -11, -15 }, { -11, -14 }, { -11, -13 }, { -11, -12 }, { -11, -9 }, { -11, -8 }, { -11, 1 }, { -11, 2 }, { -11, 11 }, { -11, 12 }, { -11, 15 }, { -11, 16 }, { -11, 17 }, { -11, 18 }, { -11, 19 }, { -11, 20 }, { -11, 23 }, { -11, 24 }, { -11, 25 },
|
|
||||||
{ -11, 26 }, { -11, 29 }, { -11, 30 }, { -11, 31 }, { -11, 32 }, { -11, 35 }, { -11, 36 }, { -11, 37 }, { -11, 45 }, { -11, 46 }, { -10, -44 }, { -10, -43 }, { -10, -42 }, { -10, -33 }, { -10, -32 }, { -10, -29 }, { -10, -28 }, { -10, -27 }, { -10, -26 }, { -10, -23 }, { -10, -22 }, { -10, -21 }, { -10, -20 }, { -10, -17 }, { -10, -16 }, { -10, -15 }, { -10, -14 }, { -10, -13 }, { -10, -12 }, { -10, -9 },
|
|
||||||
{ -10, -8 }, { -10, -7 }, { -10, 0 }, { -10, 1 }, { -10, 2 }, { -10, 3 }, { -10, 10 }, { -10, 11 }, { -10, 12 }, { -10, 15 }, { -10, 16 }, { -10, 17 }, { -10, 18 }, { -10, 19 }, { -10, 20 }, { -10, 23 }, { -10, 24 }, { -10, 25 }, { -10, 26 }, { -10, 29 }, { -10, 30 }, { -10, 31 }, { -10, 32 }, { -10, 35 }, { -10, 36 }, { -10, 45 }, { -10, 46 }, { -10, 47 }, { -9, -45 }, { -9, -44 },
|
|
||||||
{ -9, -43 }, { -9, -29 }, { -9, -28 }, { -9, -27 }, { -9, -23 }, { -9, -22 }, { -9, -21 }, { -9, -20 }, { -9, -17 }, { -9, -16 }, { -9, -15 }, { -9, -14 }, { -9, -13 }, { -9, -8 }, { -9, -7 }, { -9, -6 }, { -9, -5 }, { -9, -1 }, { -9, 0 }, { -9, 1 }, { -9, 2 }, { -9, 3 }, { -9, 4 }, { -9, 8 }, { -9, 9 }, { -9, 10 }, { -9, 11 }, { -9, 16 }, { -9, 17 }, { -9, 18 },
|
|
||||||
{ -9, 19 }, { -9, 20 }, { -9, 23 }, { -9, 24 }, { -9, 25 }, { -9, 26 }, { -9, 30 }, { -9, 31 }, { -9, 32 }, { -9, 46 }, { -9, 47 }, { -9, 48 }, { -8, -45 }, { -8, -44 }, { -8, -30 }, { -8, -29 }, { -8, -28 }, { -8, -24 }, { -8, -23 }, { -8, -22 }, { -8, -21 }, { -8, -20 }, { -8, -17 }, { -8, -16 }, { -8, -15 }, { -8, -14 }, { -8, -7 }, { -8, -6 }, { -8, -5 }, { -8, -4 },
|
|
||||||
{ -8, -1 }, { -8, 0 }, { -8, 1 }, { -8, 2 }, { -8, 3 }, { -8, 4 }, { -8, 7 }, { -8, 8 }, { -8, 9 }, { -8, 10 }, { -8, 17 }, { -8, 18 }, { -8, 19 }, { -8, 20 }, { -8, 23 }, { -8, 24 }, { -8, 25 }, { -8, 26 }, { -8, 27 }, { -8, 31 }, { -8, 32 }, { -8, 33 }, { -8, 47 }, { -8, 48 }, { -7, -45 }, { -7, -44 }, { -7, -39 }, { -7, -38 }, { -7, -37 }, { -7, -36 },
|
|
||||||
{ -7, -31 }, { -7, -30 }, { -7, -29 }, { -7, -25 }, { -7, -24 }, { -7, -23 }, { -7, -22 }, { -7, -21 }, { -7, -11 }, { -7, -10 }, { -7, -7 }, { -7, -6 }, { -7, -5 }, { -7, -4 }, { -7, 7 }, { -7, 8 }, { -7, 9 }, { -7, 10 }, { -7, 13 }, { -7, 14 }, { -7, 24 }, { -7, 25 }, { -7, 26 }, { -7, 27 }, { -7, 28 }, { -7, 32 }, { -7, 33 }, { -7, 34 }, { -7, 39 }, { -7, 40 },
|
|
||||||
{ -7, 41 }, { -7, 42 }, { -7, 47 }, { -7, 48 }, { -6, -46 }, { -6, -45 }, { -6, -44 }, { -6, -39 }, { -6, -38 }, { -6, -37 }, { -6, -36 }, { -6, -35 }, { -6, -31 }, { -6, -30 }, { -6, -25 }, { -6, -24 }, { -6, -23 }, { -6, -22 }, { -6, -12 }, { -6, -11 }, { -6, -10 }, { -6, -6 }, { -6, -5 }, { -6, 8 }, { -6, 9 }, { -6, 13 }, { -6, 14 }, { -6, 15 }, { -6, 25 }, { -6, 26 },
|
|
||||||
{ -6, 27 }, { -6, 28 }, { -6, 33 }, { -6, 34 }, { -6, 38 }, { -6, 39 }, { -6, 40 }, { -6, 41 }, { -6, 42 }, { -6, 47 }, { -6, 48 }, { -6, 49 }, { -5, -47 }, { -5, -46 }, { -5, -45 }, { -5, -44 }, { -5, -37 }, { -5, -36 }, { -5, -35 }, { -5, -34 }, { -5, -19 }, { -5, -18 }, { -5, -13 }, { -5, -12 }, { -5, -11 }, { -5, -10 }, { -5, -1 }, { -5, 0 }, { -5, 1 }, { -5, 2 },
|
|
||||||
{ -5, 3 }, { -5, 4 }, { -5, 13 }, { -5, 14 }, { -5, 15 }, { -5, 16 }, { -5, 21 }, { -5, 22 }, { -5, 37 }, { -5, 38 }, { -5, 39 }, { -5, 40 }, { -5, 47 }, { -5, 48 }, { -5, 49 }, { -5, 50 }, { -4, -47 }, { -4, -46 }, { -4, -45 }, { -4, -44 }, { -4, -43 }, { -4, -37 }, { -4, -36 }, { -4, -35 }, { -4, -34 }, { -4, -19 }, { -4, -18 }, { -4, -17 }, { -4, -13 }, { -4, -12 },
|
|
||||||
{ -4, -11 }, { -4, -10 }, { -4, -2 }, { -4, -1 }, { -4, 0 }, { -4, 1 }, { -4, 2 }, { -4, 3 }, { -4, 4 }, { -4, 5 }, { -4, 13 }, { -4, 14 }, { -4, 15 }, { -4, 16 }, { -4, 20 }, { -4, 21 }, { -4, 22 }, { -4, 37 }, { -4, 38 }, { -4, 39 }, { -4, 40 }, { -4, 46 }, { -4, 47 }, { -4, 48 }, { -4, 49 }, { -4, 50 }, { -3, -44 }, { -3, -43 }, { -3, -42 }, { -3, -41 },
|
|
||||||
{ -3, -40 }, { -3, -37 }, { -3, -36 }, { -3, -35 }, { -3, -34 }, { -3, -31 }, { -3, -30 }, { -3, -29 }, { -3, -28 }, { -3, -25 }, { -3, -24 }, { -3, -23 }, { -3, -22 }, { -3, -18 }, { -3, -17 }, { -3, -16 }, { -3, -7 }, { -3, -6 }, { -3, -3 }, { -3, -2 }, { -3, -1 }, { -3, 0 }, { -3, 3 }, { -3, 4 }, { -3, 5 }, { -3, 6 }, { -3, 9 }, { -3, 10 }, { -3, 19 }, { -3, 20 },
|
|
||||||
{ -3, 21 }, { -3, 25 }, { -3, 26 }, { -3, 27 }, { -3, 28 }, { -3, 31 }, { -3, 32 }, { -3, 33 }, { -3, 34 }, { -3, 37 }, { -3, 38 }, { -3, 39 }, { -3, 40 }, { -3, 43 }, { -3, 44 }, { -3, 45 }, { -3, 46 }, { -3, 47 }, { -2, -43 }, { -2, -42 }, { -2, -41 }, { -2, -40 }, { -2, -37 }, { -2, -36 }, { -2, -35 }, { -2, -34 }, { -2, -31 }, { -2, -30 }, { -2, -29 }, { -2, -28 },
|
|
||||||
{ -2, -25 }, { -2, -24 }, { -2, -23 }, { -2, -22 }, { -2, -21 }, { -2, -17 }, { -2, -16 }, { -2, -15 }, { -2, -8 }, { -2, -7 }, { -2, -6 }, { -2, -3 }, { -2, -2 }, { -2, -1 }, { -2, 0 }, { -2, 3 }, { -2, 4 }, { -2, 5 }, { -2, 6 }, { -2, 9 }, { -2, 10 }, { -2, 11 }, { -2, 18 }, { -2, 19 }, { -2, 20 }, { -2, 24 }, { -2, 25 }, { -2, 26 }, { -2, 27 }, { -2, 28 },
|
|
||||||
{ -2, 31 }, { -2, 32 }, { -2, 33 }, { -2, 34 }, { -2, 37 }, { -2, 38 }, { -2, 39 }, { -2, 40 }, { -2, 43 }, { -2, 44 }, { -2, 45 }, { -2, 46 }, { -1, -47 }, { -1, -46 }, { -1, -43 }, { -1, -42 }, { -1, -41 }, { -1, -40 }, { -1, -37 }, { -1, -36 }, { -1, -29 }, { -1, -28 }, { -1, -25 }, { -1, -24 }, { -1, -23 }, { -1, -22 }, { -1, -21 }, { -1, -20 }, { -1, -17 }, { -1, -16 },
|
|
||||||
{ -1, -15 }, { -1, -14 }, { -1, -13 }, { -1, -12 }, { -1, -9 }, { -1, -8 }, { -1, -7 }, { -1, -6 }, { -1, -3 }, { -1, -2 }, { -1, 5 }, { -1, 6 }, { -1, 9 }, { -1, 10 }, { -1, 11 }, { -1, 12 }, { -1, 15 }, { -1, 16 }, { -1, 17 }, { -1, 18 }, { -1, 19 }, { -1, 20 }, { -1, 23 }, { -1, 24 }, { -1, 25 }, { -1, 26 }, { -1, 27 }, { -1, 28 }, { -1, 31 }, { -1, 32 },
|
|
||||||
{ -1, 39 }, { -1, 40 }, { -1, 43 }, { -1, 44 }, { -1, 45 }, { -1, 46 }, { -1, 49 }, { -1, 50 }, { 0, -47 }, { 0, -46 }, { 0, -43 }, { 0, -42 }, { 0, -41 }, { 0, -40 }, { 0, -37 }, { 0, -36 }, { 0, -29 }, { 0, -28 }, { 0, -25 }, { 0, -24 }, { 0, -23 }, { 0, -22 }, { 0, -21 }, { 0, -20 }, { 0, -17 }, { 0, -16 }, { 0, -15 }, { 0, -14 }, { 0, -13 }, { 0, -12 },
|
|
||||||
{ 0, -9 }, { 0, -8 }, { 0, -7 }, { 0, -6 }, { 0, -3 }, { 0, -2 }, { 0, 5 }, { 0, 6 }, { 0, 9 }, { 0, 10 }, { 0, 11 }, { 0, 12 }, { 0, 15 }, { 0, 16 }, { 0, 17 }, { 0, 18 }, { 0, 19 }, { 0, 20 }, { 0, 23 }, { 0, 24 }, { 0, 25 }, { 0, 26 }, { 0, 27 }, { 0, 28 }, { 0, 31 }, { 0, 32 }, { 0, 39 }, { 0, 40 }, { 0, 43 }, { 0, 44 },
|
|
||||||
{ 0, 45 }, { 0, 46 }, { 0, 49 }, { 0, 50 }, { 1, -43 }, { 1, -42 }, { 1, -41 }, { 1, -40 }, { 1, -37 }, { 1, -36 }, { 1, -35 }, { 1, -34 }, { 1, -31 }, { 1, -30 }, { 1, -29 }, { 1, -28 }, { 1, -25 }, { 1, -24 }, { 1, -23 }, { 1, -22 }, { 1, -21 }, { 1, -17 }, { 1, -16 }, { 1, -15 }, { 1, -8 }, { 1, -7 }, { 1, -6 }, { 1, -3 }, { 1, -2 }, { 1, -1 },
|
|
||||||
{ 1, 0 }, { 1, 3 }, { 1, 4 }, { 1, 5 }, { 1, 6 }, { 1, 9 }, { 1, 10 }, { 1, 11 }, { 1, 18 }, { 1, 19 }, { 1, 20 }, { 1, 24 }, { 1, 25 }, { 1, 26 }, { 1, 27 }, { 1, 28 }, { 1, 31 }, { 1, 32 }, { 1, 33 }, { 1, 34 }, { 1, 37 }, { 1, 38 }, { 1, 39 }, { 1, 40 }, { 1, 43 }, { 1, 44 }, { 1, 45 }, { 1, 46 }, { 2, -44 }, { 2, -43 },
|
|
||||||
{ 2, -42 }, { 2, -41 }, { 2, -40 }, { 2, -37 }, { 2, -36 }, { 2, -35 }, { 2, -34 }, { 2, -31 }, { 2, -30 }, { 2, -29 }, { 2, -28 }, { 2, -25 }, { 2, -24 }, { 2, -23 }, { 2, -22 }, { 2, -18 }, { 2, -17 }, { 2, -16 }, { 2, -7 }, { 2, -6 }, { 2, -3 }, { 2, -2 }, { 2, -1 }, { 2, 0 }, { 2, 3 }, { 2, 4 }, { 2, 5 }, { 2, 6 }, { 2, 9 }, { 2, 10 },
|
|
||||||
{ 2, 19 }, { 2, 20 }, { 2, 21 }, { 2, 25 }, { 2, 26 }, { 2, 27 }, { 2, 28 }, { 2, 31 }, { 2, 32 }, { 2, 33 }, { 2, 34 }, { 2, 37 }, { 2, 38 }, { 2, 39 }, { 2, 40 }, { 2, 43 }, { 2, 44 }, { 2, 45 }, { 2, 46 }, { 2, 47 }, { 3, -47 }, { 3, -46 }, { 3, -45 }, { 3, -44 }, { 3, -43 }, { 3, -37 }, { 3, -36 }, { 3, -35 }, { 3, -34 }, { 3, -19 },
|
|
||||||
{ 3, -18 }, { 3, -17 }, { 3, -13 }, { 3, -12 }, { 3, -11 }, { 3, -10 }, { 3, -2 }, { 3, -1 }, { 3, 0 }, { 3, 1 }, { 3, 2 }, { 3, 3 }, { 3, 4 }, { 3, 5 }, { 3, 13 }, { 3, 14 }, { 3, 15 }, { 3, 16 }, { 3, 20 }, { 3, 21 }, { 3, 22 }, { 3, 37 }, { 3, 38 }, { 3, 39 }, { 3, 40 }, { 3, 46 }, { 3, 47 }, { 3, 48 }, { 3, 49 }, { 3, 50 },
|
|
||||||
{ 4, -47 }, { 4, -46 }, { 4, -45 }, { 4, -44 }, { 4, -37 }, { 4, -36 }, { 4, -35 }, { 4, -34 }, { 4, -19 }, { 4, -18 }, { 4, -13 }, { 4, -12 }, { 4, -11 }, { 4, -10 }, { 4, -1 }, { 4, 0 }, { 4, 1 }, { 4, 2 }, { 4, 3 }, { 4, 4 }, { 4, 13 }, { 4, 14 }, { 4, 15 }, { 4, 16 }, { 4, 21 }, { 4, 22 }, { 4, 37 }, { 4, 38 }, { 4, 39 }, { 4, 40 },
|
|
||||||
{ 4, 47 }, { 4, 48 }, { 4, 49 }, { 4, 50 }, { 5, -46 }, { 5, -45 }, { 5, -44 }, { 5, -39 }, { 5, -38 }, { 5, -37 }, { 5, -36 }, { 5, -35 }, { 5, -31 }, { 5, -30 }, { 5, -25 }, { 5, -24 }, { 5, -23 }, { 5, -22 }, { 5, -12 }, { 5, -11 }, { 5, -10 }, { 5, -6 }, { 5, -5 }, { 5, 8 }, { 5, 9 }, { 5, 13 }, { 5, 14 }, { 5, 15 }, { 5, 25 }, { 5, 26 },
|
|
||||||
{ 5, 27 }, { 5, 28 }, { 5, 33 }, { 5, 34 }, { 5, 38 }, { 5, 39 }, { 5, 40 }, { 5, 41 }, { 5, 42 }, { 5, 47 }, { 5, 48 }, { 5, 49 }, { 6, -45 }, { 6, -44 }, { 6, -39 }, { 6, -38 }, { 6, -37 }, { 6, -36 }, { 6, -31 }, { 6, -30 }, { 6, -29 }, { 6, -25 }, { 6, -24 }, { 6, -23 }, { 6, -22 }, { 6, -21 }, { 6, -11 }, { 6, -10 }, { 6, -7 }, { 6, -6 },
|
|
||||||
{ 6, -5 }, { 6, -4 }, { 6, 7 }, { 6, 8 }, { 6, 9 }, { 6, 10 }, { 6, 13 }, { 6, 14 }, { 6, 24 }, { 6, 25 }, { 6, 26 }, { 6, 27 }, { 6, 28 }, { 6, 32 }, { 6, 33 }, { 6, 34 }, { 6, 39 }, { 6, 40 }, { 6, 41 }, { 6, 42 }, { 6, 47 }, { 6, 48 }, { 7, -45 }, { 7, -44 }, { 7, -30 }, { 7, -29 }, { 7, -28 }, { 7, -24 }, { 7, -23 }, { 7, -22 },
|
|
||||||
{ 7, -21 }, { 7, -20 }, { 7, -17 }, { 7, -16 }, { 7, -15 }, { 7, -14 }, { 7, -7 }, { 7, -6 }, { 7, -5 }, { 7, -4 }, { 7, -1 }, { 7, 0 }, { 7, 1 }, { 7, 2 }, { 7, 3 }, { 7, 4 }, { 7, 7 }, { 7, 8 }, { 7, 9 }, { 7, 10 }, { 7, 17 }, { 7, 18 }, { 7, 19 }, { 7, 20 }, { 7, 23 }, { 7, 24 }, { 7, 25 }, { 7, 26 }, { 7, 27 }, { 7, 31 },
|
|
||||||
{ 7, 32 }, { 7, 33 }, { 7, 47 }, { 7, 48 }, { 8, -45 }, { 8, -44 }, { 8, -43 }, { 8, -29 }, { 8, -28 }, { 8, -27 }, { 8, -23 }, { 8, -22 }, { 8, -21 }, { 8, -20 }, { 8, -17 }, { 8, -16 }, { 8, -15 }, { 8, -14 }, { 8, -13 }, { 8, -8 }, { 8, -7 }, { 8, -6 }, { 8, -5 }, { 8, -1 }, { 8, 0 }, { 8, 1 }, { 8, 2 }, { 8, 3 }, { 8, 4 }, { 8, 8 },
|
|
||||||
{ 8, 9 }, { 8, 10 }, { 8, 11 }, { 8, 16 }, { 8, 17 }, { 8, 18 }, { 8, 19 }, { 8, 20 }, { 8, 23 }, { 8, 24 }, { 8, 25 }, { 8, 26 }, { 8, 30 }, { 8, 31 }, { 8, 32 }, { 8, 46 }, { 8, 47 }, { 8, 48 }, { 9, -44 }, { 9, -43 }, { 9, -42 }, { 9, -33 }, { 9, -32 }, { 9, -29 }, { 9, -28 }, { 9, -27 }, { 9, -26 }, { 9, -23 }, { 9, -22 }, { 9, -21 },
|
|
||||||
{ 9, -20 }, { 9, -17 }, { 9, -16 }, { 9, -15 }, { 9, -14 }, { 9, -13 }, { 9, -12 }, { 9, -9 }, { 9, -8 }, { 9, -7 }, { 9, 0 }, { 9, 1 }, { 9, 2 }, { 9, 3 }, { 9, 10 }, { 9, 11 }, { 9, 12 }, { 9, 15 }, { 9, 16 }, { 9, 17 }, { 9, 18 }, { 9, 19 }, { 9, 20 }, { 9, 23 }, { 9, 24 }, { 9, 25 }, { 9, 26 }, { 9, 29 }, { 9, 30 }, { 9, 31 },
|
|
||||||
{ 9, 32 }, { 9, 35 }, { 9, 36 }, { 9, 45 }, { 9, 46 }, { 9, 47 }, { 10, -43 }, { 10, -42 }, { 10, -34 }, { 10, -33 }, { 10, -32 }, { 10, -29 }, { 10, -28 }, { 10, -27 }, { 10, -26 }, { 10, -23 }, { 10, -22 }, { 10, -21 }, { 10, -20 }, { 10, -17 }, { 10, -16 }, { 10, -15 }, { 10, -14 }, { 10, -13 }, { 10, -12 }, { 10, -9 }, { 10, -8 }, { 10, 1 }, { 10, 2 }, { 10, 11 },
|
|
||||||
{ 10, 12 }, { 10, 15 }, { 10, 16 }, { 10, 17 }, { 10, 18 }, { 10, 19 }, { 10, 20 }, { 10, 23 }, { 10, 24 }, { 10, 25 }, { 10, 26 }, { 10, 29 }, { 10, 30 }, { 10, 31 }, { 10, 32 }, { 10, 35 }, { 10, 36 }, { 10, 37 }, { 10, 45 }, { 10, 46 }, { 11, -39 }, { 11, -38 }, { 11, -35 }, { 11, -34 }, { 11, -33 }, { 11, -32 }, { 11, -29 }, { 11, -28 }, { 11, -27 }, { 11, -16 },
|
|
||||||
{ 11, -15 }, { 11, -14 }, { 11, -13 }, { 11, -5 }, { 11, -4 }, { 11, -3 }, { 11, -2 }, { 11, 5 }, { 11, 6 }, { 11, 7 }, { 11, 8 }, { 11, 16 }, { 11, 17 }, { 11, 18 }, { 11, 19 }, { 11, 30 }, { 11, 31 }, { 11, 32 }, { 11, 35 }, { 11, 36 }, { 11, 37 }, { 11, 38 }, { 11, 41 }, { 11, 42 }, { 12, -39 }, { 12, -38 }, { 12, -35 }, { 12, -34 }, { 12, -33 }, { 12, -32 },
|
|
||||||
{ 12, -29 }, { 12, -28 }, { 12, -15 }, { 12, -14 }, { 12, -5 }, { 12, -4 }, { 12, -3 }, { 12, -2 }, { 12, 5 }, { 12, 6 }, { 12, 7 }, { 12, 8 }, { 12, 17 }, { 12, 18 }, { 12, 31 }, { 12, 32 }, { 12, 35 }, { 12, 36 }, { 12, 37 }, { 12, 38 }, { 12, 41 }, { 12, 42 }, { 13, -43 }, { 13, -42 }, { 13, -39 }, { 13, -38 }, { 13, -37 }, { 13, -36 }, { 13, -35 }, { 13, -34 },
|
|
||||||
{ 13, -33 }, { 13, -19 }, { 13, -18 }, { 13, -9 }, { 13, -8 }, { 13, -4 }, { 13, -3 }, { 13, -2 }, { 13, 1 }, { 13, 2 }, { 13, 5 }, { 13, 6 }, { 13, 7 }, { 13, 11 }, { 13, 12 }, { 13, 21 }, { 13, 22 }, { 13, 36 }, { 13, 37 }, { 13, 38 }, { 13, 39 }, { 13, 40 }, { 13, 41 }, { 13, 42 }, { 13, 45 }, { 13, 46 }, { 14, -43 }, { 14, -42 }, { 14, -39 }, { 14, -38 },
|
|
||||||
{ 14, -37 }, { 14, -36 }, { 14, -35 }, { 14, -34 }, { 14, -20 }, { 14, -19 }, { 14, -18 }, { 14, -17 }, { 14, -10 }, { 14, -9 }, { 14, -8 }, { 14, -7 }, { 14, -3 }, { 14, -2 }, { 14, 1 }, { 14, 2 }, { 14, 5 }, { 14, 6 }, { 14, 10 }, { 14, 11 }, { 14, 12 }, { 14, 13 }, { 14, 20 }, { 14, 21 }, { 14, 22 }, { 14, 23 }, { 14, 37 }, { 14, 38 }, { 14, 39 }, { 14, 40 },
|
|
||||||
{ 14, 41 }, { 14, 42 }, { 14, 45 }, { 14, 46 }, { 15, -43 }, { 15, -42 }, { 15, -31 }, { 15, -30 }, { 15, -27 }, { 15, -26 }, { 15, -21 }, { 15, -20 }, { 15, -19 }, { 15, -18 }, { 15, -17 }, { 15, -16 }, { 15, -15 }, { 15, -14 }, { 15, -11 }, { 15, -10 }, { 15, -9 }, { 15, -8 }, { 15, -7 }, { 15, -6 }, { 15, 1 }, { 15, 2 }, { 15, 9 }, { 15, 10 }, { 15, 11 }, { 15, 12 },
|
|
||||||
{ 15, 13 }, { 15, 14 }, { 15, 17 }, { 15, 18 }, { 15, 19 }, { 15, 20 }, { 15, 21 }, { 15, 22 }, { 15, 23 }, { 15, 24 }, { 15, 29 }, { 15, 30 }, { 15, 33 }, { 15, 34 }, { 15, 45 }, { 15, 46 }, { 16, -43 }, { 16, -42 }, { 16, -32 }, { 16, -31 }, { 16, -30 }, { 16, -27 }, { 16, -26 }, { 16, -25 }, { 16, -21 }, { 16, -20 }, { 16, -19 }, { 16, -18 }, { 16, -17 }, { 16, -16 },
|
|
||||||
{ 16, -15 }, { 16, -14 }, { 16, -11 }, { 16, -10 }, { 16, -9 }, { 16, -8 }, { 16, -7 }, { 16, -6 }, { 16, 0 }, { 16, 1 }, { 16, 2 }, { 16, 3 }, { 16, 9 }, { 16, 10 }, { 16, 11 }, { 16, 12 }, { 16, 13 }, { 16, 14 }, { 16, 17 }, { 16, 18 }, { 16, 19 }, { 16, 20 }, { 16, 21 }, { 16, 22 }, { 16, 23 }, { 16, 24 }, { 16, 28 }, { 16, 29 }, { 16, 30 }, { 16, 33 },
|
|
||||||
{ 16, 34 }, { 16, 35 }, { 16, 45 }, { 16, 46 }, { 17, -43 }, { 17, -42 }, { 17, -35 }, { 17, -34 }, { 17, -33 }, { 17, -32 }, { 17, -31 }, { 17, -26 }, { 17, -25 }, { 17, -24 }, { 17, -15 }, { 17, -14 }, { 17, -10 }, { 17, -9 }, { 17, -8 }, { 17, -7 }, { 17, -6 }, { 17, -1 }, { 17, 0 }, { 17, 1 }, { 17, 2 }, { 17, 3 }, { 17, 4 }, { 17, 9 }, { 17, 10 }, { 17, 11 },
|
|
||||||
{ 17, 12 }, { 17, 13 }, { 17, 17 }, { 17, 18 }, { 17, 27 }, { 17, 28 }, { 17, 29 }, { 17, 34 }, { 17, 35 }, { 17, 36 }, { 17, 37 }, { 17, 38 }, { 17, 45 }, { 17, 46 }, { 18, -43 }, { 18, -42 }, { 18, -41 }, { 18, -35 }, { 18, -34 }, { 18, -33 }, { 18, -32 }, { 18, -25 }, { 18, -24 }, { 18, -23 }, { 18, -15 }, { 18, -14 }, { 18, -13 }, { 18, -9 }, { 18, -8 }, { 18, -7 },
|
|
||||||
{ 18, -6 }, { 18, -2 }, { 18, -1 }, { 18, 0 }, { 18, 1 }, { 18, 2 }, { 18, 3 }, { 18, 4 }, { 18, 5 }, { 18, 9 }, { 18, 10 }, { 18, 11 }, { 18, 12 }, { 18, 16 }, { 18, 17 }, { 18, 18 }, { 18, 26 }, { 18, 27 }, { 18, 28 }, { 18, 35 }, { 18, 36 }, { 18, 37 }, { 18, 38 }, { 18, 44 }, { 18, 45 }, { 18, 46 }, { 19, -42 }, { 19, -41 }, { 19, -40 }, { 19, -39 },
|
|
||||||
{ 19, -38 }, { 19, -29 }, { 19, -28 }, { 19, -25 }, { 19, -24 }, { 19, -23 }, { 19, -22 }, { 19, -21 }, { 19, -20 }, { 19, -19 }, { 19, -18 }, { 19, -15 }, { 19, -14 }, { 19, -13 }, { 19, -12 }, { 19, -3 }, { 19, -2 }, { 19, -1 }, { 19, 4 }, { 19, 5 }, { 19, 6 }, { 19, 15 }, { 19, 16 }, { 19, 17 }, { 19, 18 }, { 19, 21 }, { 19, 22 }, { 19, 23 }, { 19, 24 }, { 19, 25 },
|
|
||||||
{ 19, 26 }, { 19, 27 }, { 19, 28 }, { 19, 31 }, { 19, 32 }, { 19, 41 }, { 19, 42 }, { 19, 43 }, { 19, 44 }, { 19, 45 }, { 20, -41 }, { 20, -40 }, { 20, -39 }, { 20, -38 }, { 20, -37 }, { 20, -29 }, { 20, -28 }, { 20, -25 }, { 20, -24 }, { 20, -23 }, { 20, -22 }, { 20, -21 }, { 20, -20 }, { 20, -19 }, { 20, -18 }, { 20, -15 }, { 20, -14 }, { 20, -13 }, { 20, -12 }, { 20, -3 },
|
|
||||||
{ 20, -2 }, { 20, 5 }, { 20, 6 }, { 20, 15 }, { 20, 16 }, { 20, 17 }, { 20, 18 }, { 20, 21 }, { 20, 22 }, { 20, 23 }, { 20, 24 }, { 20, 25 }, { 20, 26 }, { 20, 27 }, { 20, 28 }, { 20, 31 }, { 20, 32 }, { 20, 40 }, { 20, 41 }, { 20, 42 }, { 20, 43 }, { 20, 44 }, { 21, -38 }, { 21, -37 }, { 21, -36 }, { 21, -29 }, { 21, -28 }, { 21, -19 }, { 21, -18 }, { 21, -15 },
|
|
||||||
{ 21, -14 }, { 21, -13 }, { 21, -9 }, { 21, -8 }, { 21, -7 }, { 21, -6 }, { 21, 1 }, { 21, 2 }, { 21, 9 }, { 21, 10 }, { 21, 11 }, { 21, 12 }, { 21, 16 }, { 21, 17 }, { 21, 18 }, { 21, 21 }, { 21, 22 }, { 21, 31 }, { 21, 32 }, { 21, 39 }, { 21, 40 }, { 21, 41 }, { 22, -37 }, { 22, -36 }, { 22, -30 }, { 22, -29 }, { 22, -28 }, { 22, -19 }, { 22, -18 }, { 22, -15 },
|
|
||||||
{ 22, -14 }, { 22, -9 }, { 22, -8 }, { 22, -7 }, { 22, -6 }, { 22, -5 }, { 22, 0 }, { 22, 1 }, { 22, 2 }, { 22, 3 }, { 22, 8 }, { 22, 9 }, { 22, 10 }, { 22, 11 }, { 22, 12 }, { 22, 17 }, { 22, 18 }, { 22, 21 }, { 22, 22 }, { 22, 31 }, { 22, 32 }, { 22, 33 }, { 22, 39 }, { 22, 40 }, { 23, -33 }, { 23, -32 }, { 23, -31 }, { 23, -30 }, { 23, -29 }, { 23, -25 },
|
|
||||||
{ 23, -24 }, { 23, -23 }, { 23, -22 }, { 23, -19 }, { 23, -18 }, { 23, -9 }, { 23, -8 }, { 23, -7 }, { 23, -6 }, { 23, -5 }, { 23, -4 }, { 23, -1 }, { 23, 0 }, { 23, 1 }, { 23, 2 }, { 23, 3 }, { 23, 4 }, { 23, 7 }, { 23, 8 }, { 23, 9 }, { 23, 10 }, { 23, 11 }, { 23, 12 }, { 23, 21 }, { 23, 22 }, { 23, 25 }, { 23, 26 }, { 23, 27 }, { 23, 28 }, { 23, 32 },
|
|
||||||
{ 23, 33 }, { 23, 34 }, { 23, 35 }, { 23, 36 }, { 24, -33 }, { 24, -32 }, { 24, -31 }, { 24, -30 }, { 24, -25 }, { 24, -24 }, { 24, -23 }, { 24, -22 }, { 24, -19 }, { 24, -18 }, { 24, -17 }, { 24, -9 }, { 24, -8 }, { 24, -7 }, { 24, -6 }, { 24, -5 }, { 24, -4 }, { 24, -1 }, { 24, 0 }, { 24, 1 }, { 24, 2 }, { 24, 3 }, { 24, 4 }, { 24, 7 }, { 24, 8 }, { 24, 9 },
|
|
||||||
{ 24, 10 }, { 24, 11 }, { 24, 12 }, { 24, 20 }, { 24, 21 }, { 24, 22 }, { 24, 25 }, { 24, 26 }, { 24, 27 }, { 24, 28 }, { 24, 33 }, { 24, 34 }, { 24, 35 }, { 24, 36 }, { 25, -39 }, { 25, -38 }, { 25, -37 }, { 25, -36 }, { 25, -24 }, { 25, -23 }, { 25, -22 }, { 25, -19 }, { 25, -18 }, { 25, -17 }, { 25, -16 }, { 25, -6 }, { 25, -5 }, { 25, -4 }, { 25, -1 }, { 25, 0 },
|
|
||||||
{ 25, 1 }, { 25, 2 }, { 25, 3 }, { 25, 4 }, { 25, 7 }, { 25, 8 }, { 25, 9 }, { 25, 19 }, { 25, 20 }, { 25, 21 }, { 25, 22 }, { 25, 25 }, { 25, 26 }, { 25, 27 }, { 25, 39 }, { 25, 40 }, { 25, 41 }, { 25, 42 }, { 26, -39 }, { 26, -38 }, { 26, -37 }, { 26, -36 }, { 26, -23 }, { 26, -22 }, { 26, -19 }, { 26, -18 }, { 26, -17 }, { 26, -16 }, { 26, -15 }, { 26, -5 },
|
|
||||||
{ 26, -4 }, { 26, -1 }, { 26, 0 }, { 26, 1 }, { 26, 2 }, { 26, 3 }, { 26, 4 }, { 26, 7 }, { 26, 8 }, { 26, 18 }, { 26, 19 }, { 26, 20 }, { 26, 21 }, { 26, 22 }, { 26, 25 }, { 26, 26 }, { 26, 39 }, { 26, 40 }, { 26, 41 }, { 26, 42 }, { 27, -38 }, { 27, -37 }, { 27, -36 }, { 27, -29 }, { 27, -28 }, { 27, -27 }, { 27, -26 }, { 27, -16 }, { 27, -15 }, { 27, -14 },
|
|
||||||
{ 27, -9 }, { 27, -8 }, { 27, 11 }, { 27, 12 }, { 27, 17 }, { 27, 18 }, { 27, 19 }, { 27, 29 }, { 27, 30 }, { 27, 31 }, { 27, 32 }, { 27, 39 }, { 27, 40 }, { 27, 41 }, { 28, -37 }, { 28, -36 }, { 28, -30 }, { 28, -29 }, { 28, -28 }, { 28, -27 }, { 28, -26 }, { 28, -15 }, { 28, -14 }, { 28, -10 }, { 28, -9 }, { 28, -8 }, { 28, -7 }, { 28, 10 }, { 28, 11 }, { 28, 12 },
|
|
||||||
{ 28, 13 }, { 28, 17 }, { 28, 18 }, { 28, 29 }, { 28, 30 }, { 28, 31 }, { 28, 32 }, { 28, 33 }, { 28, 39 }, { 28, 40 }, { 29, -33 }, { 29, -32 }, { 29, -31 }, { 29, -30 }, { 29, -29 }, { 29, -28 }, { 29, -27 }, { 29, -26 }, { 29, -21 }, { 29, -20 }, { 29, -19 }, { 29, -18 }, { 29, -11 }, { 29, -10 }, { 29, -9 }, { 29, -8 }, { 29, -7 }, { 29, -6 }, { 29, -1 }, { 29, 0 },
|
|
||||||
{ 29, 1 }, { 29, 2 }, { 29, 3 }, { 29, 4 }, { 29, 9 }, { 29, 10 }, { 29, 11 }, { 29, 12 }, { 29, 13 }, { 29, 14 }, { 29, 21 }, { 29, 22 }, { 29, 23 }, { 29, 24 }, { 29, 29 }, { 29, 30 }, { 29, 31 }, { 29, 32 }, { 29, 33 }, { 29, 34 }, { 29, 35 }, { 29, 36 }, { 30, -33 }, { 30, -32 }, { 30, -31 }, { 30, -30 }, { 30, -29 }, { 30, -28 }, { 30, -27 }, { 30, -26 },
|
|
||||||
{ 30, -22 }, { 30, -21 }, { 30, -20 }, { 30, -19 }, { 30, -18 }, { 30, -11 }, { 30, -10 }, { 30, -9 }, { 30, -8 }, { 30, -7 }, { 30, -6 }, { 30, -5 }, { 30, -1 }, { 30, 0 }, { 30, 1 }, { 30, 2 }, { 30, 3 }, { 30, 4 }, { 30, 8 }, { 30, 9 }, { 30, 10 }, { 30, 11 }, { 30, 12 }, { 30, 13 }, { 30, 14 }, { 30, 21 }, { 30, 22 }, { 30, 23 }, { 30, 24 }, { 30, 25 },
|
|
||||||
{ 30, 29 }, { 30, 30 }, { 30, 31 }, { 30, 32 }, { 30, 33 }, { 30, 34 }, { 30, 35 }, { 30, 36 }, { 31, -32 }, { 31, -31 }, { 31, -30 }, { 31, -29 }, { 31, -28 }, { 31, -27 }, { 31, -23 }, { 31, -22 }, { 31, -21 }, { 31, -15 }, { 31, -14 }, { 31, -6 }, { 31, -5 }, { 31, -4 }, { 31, -1 }, { 31, 0 }, { 31, 3 }, { 31, 4 }, { 31, 7 }, { 31, 8 }, { 31, 9 }, { 31, 17 },
|
|
||||||
{ 31, 18 }, { 31, 24 }, { 31, 25 }, { 31, 26 }, { 31, 30 }, { 31, 31 }, { 31, 32 }, { 31, 33 }, { 31, 34 }, { 31, 35 }, { 32, -31 }, { 32, -30 }, { 32, -29 }, { 32, -28 }, { 32, -23 }, { 32, -22 }, { 32, -16 }, { 32, -15 }, { 32, -14 }, { 32, -5 }, { 32, -4 }, { 32, -1 }, { 32, 0 }, { 32, 3 }, { 32, 4 }, { 32, 7 }, { 32, 8 }, { 32, 17 }, { 32, 18 }, { 32, 19 },
|
|
||||||
{ 32, 25 }, { 32, 26 }, { 32, 31 }, { 32, 32 }, { 32, 33 }, { 32, 34 }, { 33, -30 }, { 33, -29 }, { 33, -28 }, { 33, -23 }, { 33, -22 }, { 33, -17 }, { 33, -16 }, { 33, -15 }, { 33, -11 }, { 33, -10 }, { 33, -9 }, { 33, -8 }, { 33, 11 }, { 33, 12 }, { 33, 13 }, { 33, 14 }, { 33, 18 }, { 33, 19 }, { 33, 20 }, { 33, 25 }, { 33, 26 }, { 33, 31 }, { 33, 32 }, { 33, 33 },
|
|
||||||
{ 34, -29 }, { 34, -28 }, { 34, -23 }, { 34, -22 }, { 34, -17 }, { 34, -16 }, { 34, -12 }, { 34, -11 }, { 34, -10 }, { 34, -9 }, { 34, -8 }, { 34, 11 }, { 34, 12 }, { 34, 13 }, { 34, 14 }, { 34, 15 }, { 34, 19 }, { 34, 20 }, { 34, 25 }, { 34, 26 }, { 34, 31 }, { 34, 32 }, { 35, -17 }, { 35, -16 }, { 35, -13 }, { 35, -12 }, { 35, -11 }, { 35, -10 }, { 35, -9 }, { 35, -3 },
|
|
||||||
{ 35, -2 }, { 35, -1 }, { 35, 0 }, { 35, 3 }, { 35, 4 }, { 35, 5 }, { 35, 6 }, { 35, 12 }, { 35, 13 }, { 35, 14 }, { 35, 15 }, { 35, 16 }, { 35, 19 }, { 35, 20 }, { 36, -17 }, { 36, -16 }, { 36, -13 }, { 36, -12 }, { 36, -11 }, { 36, -10 }, { 36, -4 }, { 36, -3 }, { 36, -2 }, { 36, -1 }, { 36, 0 }, { 36, 3 }, { 36, 4 }, { 36, 5 }, { 36, 6 }, { 36, 7 },
|
|
||||||
{ 36, 13 }, { 36, 14 }, { 36, 15 }, { 36, 16 }, { 36, 19 }, { 36, 20 }, { 37, -27 }, { 37, -26 }, { 37, -25 }, { 37, -24 }, { 37, -21 }, { 37, -20 }, { 37, -13 }, { 37, -12 }, { 37, -5 }, { 37, -4 }, { 37, -3 }, { 37, -2 }, { 37, -1 }, { 37, 0 }, { 37, 1 }, { 37, 2 }, { 37, 3 }, { 37, 4 }, { 37, 5 }, { 37, 6 }, { 37, 7 }, { 37, 8 }, { 37, 15 }, { 37, 16 },
|
|
||||||
{ 37, 23 }, { 37, 24 }, { 37, 27 }, { 37, 28 }, { 37, 29 }, { 37, 30 }, { 38, -27 }, { 38, -26 }, { 38, -25 }, { 38, -24 }, { 38, -21 }, { 38, -20 }, { 38, -19 }, { 38, -13 }, { 38, -12 }, { 38, -5 }, { 38, -4 }, { 38, -3 }, { 38, -2 }, { 38, -1 }, { 38, 0 }, { 38, 1 }, { 38, 2 }, { 38, 3 }, { 38, 4 }, { 38, 5 }, { 38, 6 }, { 38, 7 }, { 38, 8 }, { 38, 15 },
|
|
||||||
{ 38, 16 }, { 38, 22 }, { 38, 23 }, { 38, 24 }, { 38, 27 }, { 38, 28 }, { 38, 29 }, { 38, 30 }, { 39, -26 }, { 39, -25 }, { 39, -24 }, { 39, -20 }, { 39, -19 }, { 39, -18 }, { 39, -13 }, { 39, -12 }, { 39, -11 }, { 39, -10 }, { 39, -5 }, { 39, -4 }, { 39, 7 }, { 39, 8 }, { 39, 13 }, { 39, 14 }, { 39, 15 }, { 39, 16 }, { 39, 21 }, { 39, 22 }, { 39, 23 }, { 39, 27 },
|
|
||||||
{ 39, 28 }, { 39, 29 }, { 40, -25 }, { 40, -24 }, { 40, -19 }, { 40, -18 }, { 40, -13 }, { 40, -12 }, { 40, -11 }, { 40, -10 }, { 40, -5 }, { 40, -4 }, { 40, 7 }, { 40, 8 }, { 40, 13 }, { 40, 14 }, { 40, 15 }, { 40, 16 }, { 40, 21 }, { 40, 22 }, { 40, 27 }, { 40, 28 }, { 41, -19 }, { 41, -18 }, { 41, -1 }, { 41, 0 }, { 41, 1 }, { 41, 2 }, { 41, 3 }, { 41, 4 },
|
|
||||||
{ 41, 21 }, { 41, 22 }, { 42, -19 }, { 42, -18 }, { 42, -17 }, { 42, -1 }, { 42, 0 }, { 42, 1 }, { 42, 2 }, { 42, 3 }, { 42, 4 }, { 42, 20 }, { 42, 21 }, { 42, 22 }, { 43, -18 }, { 43, -17 }, { 43, -16 }, { 43, -15 }, { 43, -14 }, { 43, -13 }, { 43, -12 }, { 43, -9 }, { 43, -8 }, { 43, -1 }, { 43, 0 }, { 43, 1 }, { 43, 2 }, { 43, 3 }, { 43, 4 }, { 43, 11 },
|
|
||||||
{ 43, 12 }, { 43, 15 }, { 43, 16 }, { 43, 17 }, { 43, 18 }, { 43, 19 }, { 43, 20 }, { 43, 21 }, { 44, -17 }, { 44, -16 }, { 44, -15 }, { 44, -14 }, { 44, -13 }, { 44, -12 }, { 44, -9 }, { 44, -8 }, { 44, -7 }, { 44, -2 }, { 44, -1 }, { 44, 0 }, { 44, 1 }, { 44, 2 }, { 44, 3 }, { 44, 4 }, { 44, 5 }, { 44, 10 }, { 44, 11 }, { 44, 12 }, { 44, 15 }, { 44, 16 },
|
|
||||||
{ 44, 17 }, { 44, 18 }, { 44, 19 }, { 44, 20 }, { 45, -8 }, { 45, -7 }, { 45, -6 }, { 45, -5 }, { 45, -4 }, { 45, -3 }, { 45, -2 }, { 45, -1 }, { 45, 4 }, { 45, 5 }, { 45, 6 }, { 45, 7 }, { 45, 8 }, { 45, 9 }, { 45, 10 }, { 45, 11 }, { 46, -7 }, { 46, -6 }, { 46, -5 }, { 46, -4 }, { 46, -3 }, { 46, -2 }, { 46, 5 }, { 46, 6 }, { 46, 7 }, { 46, 8 },
|
|
||||||
{ 46, 9 }, { 46, 10 }, { 47, -4 }, { 47, -3 }, { 47, -2 }, { 47, 1 }, { 47, 2 }, { 47, 5 }, { 47, 6 }, { 47, 7 }, { 48, -3 }, { 48, -2 }, { 48, 1 }, { 48, 2 }, { 48, 5 }, { 48, 6 },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
resource_tiles = {
|
resource_tiles = {
|
||||||
|
|||||||
@@ -0,0 +1,357 @@
|
|||||||
|
--[[-- Core Module - Permission Groups
|
||||||
|
- Permission group making for factorio so you never have to make one by hand again
|
||||||
|
@core Groups
|
||||||
|
@alias Permissions_Groups
|
||||||
|
|
||||||
|
@usage--- Example Group (Allow All)
|
||||||
|
-- here we will create an admin group however we do not want them to use the map editor or mess with the permission groups
|
||||||
|
Permission_Groups.new_group('Admin') -- this defines a new group called "Admin"
|
||||||
|
:allow_all() -- this makes the default to allow any input action unless set other wise
|
||||||
|
:disallow{ -- here we disallow the input action we don't want them to use
|
||||||
|
'add_permission_group',
|
||||||
|
'delete_permission_group',
|
||||||
|
'import_permissions_string',
|
||||||
|
'map_editor_action',
|
||||||
|
'toggle_map_editor'
|
||||||
|
}
|
||||||
|
|
||||||
|
@usage--- Example Group (Disallow All)
|
||||||
|
-- here we will create a group that cant do anything but talk in chat
|
||||||
|
Permission_Groups.new_group('Restricted') -- this defines a new group called "Restricted"
|
||||||
|
:disallow_all() -- this makes the default to disallow any input action unless set other wise
|
||||||
|
:allow('write_to_console') -- here we allow them to chat, {} can be used here if we had more than one action
|
||||||
|
|
||||||
|
]]
|
||||||
|
|
||||||
|
local Event = require("modules/exp_legacy/utils/event")
|
||||||
|
local Async = require("modules/exp_util/async")
|
||||||
|
|
||||||
|
local PermissionsGroups = {
|
||||||
|
groups = {}, -- store for the different groups that are created
|
||||||
|
_prototype = {}, -- stores functions that are used on group instances
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Async function to add players to permission groups
|
||||||
|
local add_to_permission_group_async =
|
||||||
|
Async.register(function(permission_group, player)
|
||||||
|
permission_group.add_player(player)
|
||||||
|
end)
|
||||||
|
PermissionsGroups.add_to_permission_group_async = add_to_permission_group_async
|
||||||
|
|
||||||
|
-- Async function to remove players from permission groups
|
||||||
|
local remove_from_permission_group_async =
|
||||||
|
Async.register(function(permission_group, player)
|
||||||
|
permission_group.remove_player(player)
|
||||||
|
end)
|
||||||
|
PermissionsGroups.remove_from_permission_group_async = remove_from_permission_group_async
|
||||||
|
|
||||||
|
--- Getters.
|
||||||
|
-- Functions that get permission groups
|
||||||
|
-- @section getters
|
||||||
|
|
||||||
|
--[[-- Defines a new permission group that can have it actions set in the config
|
||||||
|
@tparam string name the name of the new group
|
||||||
|
@treturn Permissions_Groups._prototype the new group made with function to allow and disallow actions
|
||||||
|
|
||||||
|
@usage-- Defining a new permission group
|
||||||
|
Groups.new_group('Admin')
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups.new_group(name)
|
||||||
|
local group = setmetatable({
|
||||||
|
name = name,
|
||||||
|
actions = {},
|
||||||
|
allow_all_actions = true,
|
||||||
|
}, {
|
||||||
|
__index = PermissionsGroups._prototype,
|
||||||
|
})
|
||||||
|
PermissionsGroups.groups[name] = group
|
||||||
|
return group
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Returns the group with the given name, case sensitive
|
||||||
|
@tparam string name the name of the group to get
|
||||||
|
@treturn ?Permissions_Groups._prototype|nil the group with that name or nil if non found
|
||||||
|
|
||||||
|
@usage-- Getting a permision group
|
||||||
|
local admin_group = Groups.get_group_by_name('Admin')
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups.get_group_by_name(name)
|
||||||
|
return PermissionsGroups.groups[name]
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Returns the group that a player is in
|
||||||
|
@tparam LuaPlayer player the player to get the group of can be name index etc
|
||||||
|
@treturn ?Permissions_Groups._prototype|nil the group with that player or nil if non found
|
||||||
|
|
||||||
|
@usage-- Get your permission group
|
||||||
|
local group = Groups.get_group_from_player(game.player)
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups.get_group_from_player(player)
|
||||||
|
local group = player.permission_group
|
||||||
|
if group then
|
||||||
|
return PermissionsGroups.groups[group.name]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Setters.
|
||||||
|
-- Functions that control all groups
|
||||||
|
-- @section players
|
||||||
|
|
||||||
|
--[[-- Reloads/creates all permission groups and sets them to they configured state
|
||||||
|
|
||||||
|
@usage-- Reload the permission groups, used internally
|
||||||
|
Groups.reload_permissions()
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups.reload_permissions()
|
||||||
|
for _, group in pairs(PermissionsGroups.groups) do
|
||||||
|
group:create()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Sets a player's group to the one given, a player can only have one group at a time
|
||||||
|
@tparam LuaPlayer player the player to effect can be name index etc
|
||||||
|
@tparam string group the name of the group to give to the player
|
||||||
|
@treturn boolean true if the player was added successfully, false other wise
|
||||||
|
|
||||||
|
@usage-- Set your permission group
|
||||||
|
Groups.set_player_group(game.player, 'Admin')
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups.set_player_group(player, group)
|
||||||
|
group = PermissionsGroups.get_group_by_name(group)
|
||||||
|
if not group or not player then return false end
|
||||||
|
group:add_player(player)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Actions.
|
||||||
|
-- Functions that control group actions
|
||||||
|
-- @section actions
|
||||||
|
|
||||||
|
--[[-- Sets the allow state of an action for this group, used internally but is safe to use else where
|
||||||
|
@tparam ?string|defines.input_action action the action that you want to set the state of
|
||||||
|
@tparam boolean state the state that you want to set it to, true = allow, false = disallow
|
||||||
|
@treturn Permissions_Groups._prototype returns self so function can be chained
|
||||||
|
|
||||||
|
@usage-- Set an action to be disallowed
|
||||||
|
group:set_action('toggle_map_editor', false)
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:set_action(action, state)
|
||||||
|
local input_action = defines.input_action[action] --[[@as defines.input_action?]]
|
||||||
|
if input_action == nil then input_action = action end
|
||||||
|
assert(type(input_action) == "number", tostring(action) .. " is not a valid input action")
|
||||||
|
self.actions[input_action] = state
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Sets an action or actions to be allowed for this group even with disallow_all triggered, Do not use in runtime
|
||||||
|
@tparam string|Array<string> actions the action or actions that you want to allow for this group
|
||||||
|
@treturn Permissions_Groups._prototype returns self so function can be chained
|
||||||
|
|
||||||
|
@usage-- Allow some actions
|
||||||
|
group:allow{
|
||||||
|
'write_to_console'
|
||||||
|
}
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:allow(actions)
|
||||||
|
if type(actions) ~= "table" then
|
||||||
|
actions = { actions }
|
||||||
|
end
|
||||||
|
for _, action in pairs(actions) do
|
||||||
|
self:set_action(action, true)
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Sets an action or actions to be disallowed for this group even with allow_all triggered, Do not use in runtime
|
||||||
|
@tparam string|Array<string> actions the action or actions that you want to disallow for this group
|
||||||
|
@treturn Permissions_Groups._prototype returns self so function can be chained
|
||||||
|
|
||||||
|
@usage-- Disalow some actions
|
||||||
|
group:disallow{
|
||||||
|
'add_permission_group',
|
||||||
|
'delete_permission_group',
|
||||||
|
'import_permissions_string',
|
||||||
|
'map_editor_action',
|
||||||
|
'toggle_map_editor'
|
||||||
|
}
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:disallow(actions)
|
||||||
|
if type(actions) ~= "table" then
|
||||||
|
actions = { actions }
|
||||||
|
end
|
||||||
|
for _, action in pairs(actions) do
|
||||||
|
self:set_action(action, false)
|
||||||
|
end
|
||||||
|
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Sets the default state for any actions not given to be allowed, useful with :disallow
|
||||||
|
@treturn Permissions_Groups._prototype returns self so function can be chained
|
||||||
|
|
||||||
|
@usage-- Allow all actions unless given by disallow
|
||||||
|
group:allow_all()
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:allow_all()
|
||||||
|
self.allow_all_actions = true
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Sets the default state for any action not given to be disallowed, useful with :allow
|
||||||
|
@treturn Permissions_Groups._prototype returns self so function can be chained
|
||||||
|
|
||||||
|
@usage-- Disallow all actions unless given by allow
|
||||||
|
group:disallow_all()
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:disallow_all()
|
||||||
|
self.allow_all_actions = false
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Returns if an input action is allowed for this group
|
||||||
|
@tparam ?string|defines.input_action action the action that you want to test for
|
||||||
|
@treturn boolean true if the group is allowed the action, false other wise
|
||||||
|
|
||||||
|
@usage-- Test if a group is allowed an action
|
||||||
|
local allowed = group:is_allowed('write_to_console')
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:is_allowed(action)
|
||||||
|
if type(action) == "string" then
|
||||||
|
action = defines.input_action[action]
|
||||||
|
end
|
||||||
|
local state = self.actions[action]
|
||||||
|
if state == nil then
|
||||||
|
state = self.allow_all_actions
|
||||||
|
end
|
||||||
|
return state
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Players.
|
||||||
|
-- Functions that control group players
|
||||||
|
-- @section players
|
||||||
|
|
||||||
|
--[[-- Creates or updates the permission group with the configured actions, used internally
|
||||||
|
@treturn LuaPermissionGroup the permission group that was created
|
||||||
|
|
||||||
|
@usage-- Create the permission group so players can be added, used internally
|
||||||
|
group:create()
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:create()
|
||||||
|
local group = self:get_raw()
|
||||||
|
if not group then
|
||||||
|
group = game.permissions.create_group(self.name) --[[@as LuaPermissionGroup]]
|
||||||
|
end
|
||||||
|
for _, action in pairs(defines.input_action) do
|
||||||
|
group.set_allows_action(action, self:is_allowed(action))
|
||||||
|
end
|
||||||
|
|
||||||
|
return group
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Returns the LuaPermissionGroup that was created with this group object, used internally
|
||||||
|
@treturn LuaPermissionGroup the raw lua permission group
|
||||||
|
|
||||||
|
@usage-- Get the factorio api permision group, used internally
|
||||||
|
local permission_group = group:get_raw()
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:get_raw()
|
||||||
|
return game.permissions.get_group(self.name)
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Adds a player to this group
|
||||||
|
@tparam LuaPlayer player LuaPlayer the player you want to add to this group can be name or index etc
|
||||||
|
@treturn boolean true if the player was added successfully, false other wise
|
||||||
|
|
||||||
|
@usage-- Add a player to this permission group
|
||||||
|
group:add_player(game.player)
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:add_player(player)
|
||||||
|
local group = self:get_raw()
|
||||||
|
if not group or not player then return false end
|
||||||
|
add_to_permission_group_async(group, player)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Removes a player from this group
|
||||||
|
@tparam LuaPlayer player LuaPlayer the player you want to remove from this group can be name or index etc
|
||||||
|
@treturn boolean true if the player was removed successfully, false other wise
|
||||||
|
|
||||||
|
@usage-- Remove a player from this permission group
|
||||||
|
group:remove_player(game.player)
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:remove_player(player)
|
||||||
|
local group = self:get_raw()
|
||||||
|
if not group or not player then return false end
|
||||||
|
remove_from_permission_group_async(group, player)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Returns all player that are in this group with the option to filter to online/offline only
|
||||||
|
@tparam[opt] boolean online if nil returns all players, if true online players only, if false returns online players only
|
||||||
|
@treturn table a table of players that are in this group; filtered if online param is given
|
||||||
|
|
||||||
|
@usage-- Get all players in this group
|
||||||
|
local online_players = group:get_players()
|
||||||
|
|
||||||
|
@usage-- Get all online players in this group
|
||||||
|
local online_players = group:get_players(true)
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:get_players(online)
|
||||||
|
local players = {}
|
||||||
|
local group = self:get_raw()
|
||||||
|
if group then
|
||||||
|
if online == nil then
|
||||||
|
return group.players
|
||||||
|
else
|
||||||
|
for _, player in pairs(group.players) do
|
||||||
|
if player.connected == online then
|
||||||
|
table.insert(player, player)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return players
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[-- Prints a message to every player in this group
|
||||||
|
@tparam string message the message that you want to send to the players
|
||||||
|
@treturn number the number of players that received the message
|
||||||
|
|
||||||
|
@usage-- Print a message to all players in thie group
|
||||||
|
group:print('Hello, World!')
|
||||||
|
|
||||||
|
]]
|
||||||
|
function PermissionsGroups._prototype:print(message)
|
||||||
|
local players = self:get_players(true)
|
||||||
|
for _, player in pairs(players) do
|
||||||
|
player.print(message)
|
||||||
|
end
|
||||||
|
|
||||||
|
return #players
|
||||||
|
end
|
||||||
|
|
||||||
|
-- when the game starts it will make the permission groups
|
||||||
|
--[[
|
||||||
|
Event.on_init(function()
|
||||||
|
PermissionsGroups.reload_permissions()
|
||||||
|
end)
|
||||||
|
]]
|
||||||
|
|
||||||
|
return PermissionsGroups
|
||||||
@@ -1,256 +0,0 @@
|
|||||||
# addons
|
|
||||||
[info]
|
|
||||||
players-online=There are __1__ players online
|
|
||||||
total-map-time=This map has been on for __1__
|
|
||||||
discord=Join us on our discord at: __1__
|
|
||||||
website=Please visit our website at: __1__
|
|
||||||
status=Want to check if out servers are down? Visit: __1__
|
|
||||||
github=Want to help improve our server with some extra features? Help us at: __1__
|
|
||||||
patreon=Consider supporting our server at: __1__
|
|
||||||
custom-commands=We use custom commands, such as /tag and /me, use /chelp for more info.
|
|
||||||
read-readme=Make sure you have read the information gui (It can be found through the info mark on the top left)
|
|
||||||
softmod=We run a softmod on our servers. A softmod is a custom scenario that runs on this server, an example is the player list.
|
|
||||||
redmew=We don't talk about redmew here; they beat us to 1000 members ;-;
|
|
||||||
lhd=All trains must be LHD! This is a long standing rule on our servers, please respect this.
|
|
||||||
|
|
||||||
# data
|
|
||||||
[join-message]
|
|
||||||
description-add=Sets / Gets your custom join message.
|
|
||||||
description-remove=Removes you custom join message.
|
|
||||||
arg-message=Your custom join message.
|
|
||||||
greet=[color=0,1,0] Welcome to __1__ community server! If you like the server join our discord: __2__ [/color]
|
|
||||||
message-set=Your join message has been updated.
|
|
||||||
message-get=Your join message is: __1__
|
|
||||||
message-cleared=Your join message has been cleared.
|
|
||||||
|
|
||||||
[quickbar]
|
|
||||||
saved=Your quickbar filters have been saved.
|
|
||||||
|
|
||||||
[exp-settings]
|
|
||||||
Colour=Colour
|
|
||||||
Colour-tooltip=Your player colour
|
|
||||||
Colour-value-tooltip=Change by using /color
|
|
||||||
JoinMessage=Join Message
|
|
||||||
JoinMessage-tooltip=The message displayed when you join
|
|
||||||
JoinMessage-value-tooltip=Change by using /join-message
|
|
||||||
QuickbarFilters=Quickbar Filters
|
|
||||||
QuickbarFilters-tooltip=The filters on your quickbar
|
|
||||||
QuickbarFilters-value-tooltip=Change by using /save-quickbar
|
|
||||||
UsesAlt=Alt View
|
|
||||||
UsesAlt-tooltip=Whether you use alt view when you play
|
|
||||||
UsesAlt-value-tooltip=Change by pressing __CONTROL__show-info__
|
|
||||||
UsesServerUps=Server UPS
|
|
||||||
UsesServerUps-tooltip=Whether the current server UPS is shown
|
|
||||||
UsesServerUps-value-tooltip=Change by using /server-ups
|
|
||||||
Tag=Player Tag
|
|
||||||
Tag-tooltip=The tag shown after your name
|
|
||||||
Tag-value-tooltip=Change by using /tag
|
|
||||||
TagColor=Player Tag color
|
|
||||||
TagColor-tooltip=The color of the tag shown after your name
|
|
||||||
TagColor-value-tooltip=Change by using /tag-color
|
|
||||||
Bonus=Player Bonus
|
|
||||||
Bonus-tooltip=The bonus given to your character
|
|
||||||
Bonus-value-tooltip=Change by using /bonus
|
|
||||||
HasEnabledDecon=Quick Tree Decon
|
|
||||||
ToolbarState=Toolbox
|
|
||||||
ToolbarState-tooltip=The order and favourites in your toolbox
|
|
||||||
ToolbarState-value-tooltip=This value is calculated automatically when you leave the game
|
|
||||||
|
|
||||||
[exp-statistics]
|
|
||||||
MapsPlayed=Maps Played
|
|
||||||
MapsPlayed-tooltip=The number of unique maps you have played on
|
|
||||||
JoinCount=Join Count
|
|
||||||
JoinCount-tooltip=The number of times you have joined our servers
|
|
||||||
Playtime=Playtime
|
|
||||||
Playtime-tooltip=The amount of time you have spent on our servers
|
|
||||||
AfkTime=AFK Time
|
|
||||||
AfkTime-tooltip=The amount of time you have been AFK on our servers
|
|
||||||
ChatMessages=Messages
|
|
||||||
ChatMessages-tooltip=The number of messages you have sent in chat
|
|
||||||
CommandsUsed=Commands
|
|
||||||
CommandsUsed-tooltip=The number of commands you have used
|
|
||||||
RocketsLaunched=Rockets Launched
|
|
||||||
RocketsLaunched-tooltip=The number of rockets launched while you were online
|
|
||||||
ResearchCompleted=Research Completed
|
|
||||||
ResearchCompleted-tooltip=The number of research projects completed while you were online
|
|
||||||
MachinesBuilt=Machines Built
|
|
||||||
MachinesBuilt-tooltip=The number of machines you have built
|
|
||||||
MachinesRemoved=Machines Removed
|
|
||||||
MachinesRemoved-tooltip=The number of machines you have removed
|
|
||||||
TilesBuilt=Tiles Placed
|
|
||||||
TilesBuilt-tooltip=The number of tiles you have placed
|
|
||||||
TilesRemoved=Tiles Removed
|
|
||||||
TilesRemoved-tooltip=The number of tiles you have removed
|
|
||||||
TreesDestroyed=Trees Destroyed
|
|
||||||
TreesDestroyed-tooltip=The number of trees you have destroyed
|
|
||||||
OreMined=Ore Mined
|
|
||||||
OreMined-tooltip=The amount of ore you have mined
|
|
||||||
ItemsCrafted=Items Crafted
|
|
||||||
ItemsCrafted-tooltip=The number of items you have crafted
|
|
||||||
ItemsPickedUp=Items Picked Up
|
|
||||||
ItemsPickedUp-tooltip=The number of items you have picked up
|
|
||||||
Kills=Kills
|
|
||||||
Kills-tooltip=The number of biters and biter bases you have squished
|
|
||||||
Deaths=Deaths
|
|
||||||
Deaths-tooltip=The number of times you have died
|
|
||||||
DamageDealt=Damage Dealt
|
|
||||||
DamageDealt-tooltip=The amount of damage you have dealt to other forces
|
|
||||||
DistanceTravelled=Distance Travelled
|
|
||||||
DistanceTravelled-tooltip=The total distance in tiles that you have travelled
|
|
||||||
CapsulesUsed=Capsules Used
|
|
||||||
CapsulesUsed-tooltip=The number of capsules you have used
|
|
||||||
EntityRepaired=Machines Repaired
|
|
||||||
EntityRepaired-tooltip=The number of machines which you have repaired
|
|
||||||
DeconstructionPlannerUsed=Decon Planner Used
|
|
||||||
DeconstructionPlannerUsed-tooltip=The number of times you have used the deconstruction planner
|
|
||||||
MapTagsMade=Map Tags Created
|
|
||||||
MapTagsMade-tooltip=The number of map tags you have created
|
|
||||||
DamageDeathRatio=Damage Death Ratio
|
|
||||||
DamageDeathRatio-tooltip=Damage over Death
|
|
||||||
KillDeathRatio=Kill Death Ratio
|
|
||||||
KillDeathRatio-tooltip=Kill over Death
|
|
||||||
SessionTime=Session Time
|
|
||||||
SessionTime-tooltip=Session Time
|
|
||||||
BuildRatio=Build Ratio
|
|
||||||
BuildRatio-tooltip=Build over Remove
|
|
||||||
RocketPerHour=Rocket Per Hour
|
|
||||||
RocketPerHour-tooltip=Rocket Launched Over Play Time in Hour
|
|
||||||
TreeKillPerMinute=Tree Kill Per Minute
|
|
||||||
TreeKillPerMinute-tooltip=Tree Destroyed Per Minute
|
|
||||||
NetPlayTime=Net Play Time
|
|
||||||
NetPlayTime-tooltip=Net Play Time
|
|
||||||
AFKTimeRatio=AFK Time Ratio
|
|
||||||
AFKTimeRatio-tooltip=AFK Time over Play Time
|
|
||||||
Locale=Locale
|
|
||||||
Locale-tooltip=The language of player interface
|
|
||||||
|
|
||||||
# expcore
|
|
||||||
[expcore-data]
|
|
||||||
description-preference=Allows you to set/get your data saving preference.
|
|
||||||
description-data=Writes all your player data to a file on your computer.
|
|
||||||
arg-option=One of "All", "Statistics", "Settings", "Required"
|
|
||||||
set-preference=You data saving preference has been set to __1__. Existing data will not be effected until you rejoin.
|
|
||||||
get-preference=You data saving preference is __1__. Use /set-preference to change this. Use /save-data to get a local copy of your data.
|
|
||||||
get-data=Your player data has been writen to file, location: factorio/script_output/expgaming_player_data.json
|
|
||||||
data-failed=Your player data has failed to load. Any changes to your data will not be saved.
|
|
||||||
data-restore=Your player data has been restored and changes will now save when you leave.
|
|
||||||
preference=Saving Preference
|
|
||||||
preference-tooltip=Which categories will be saved when you leave the game
|
|
||||||
preference-value-tooltip=Change by using /set-preference
|
|
||||||
preference-All=All data will be saved
|
|
||||||
preference-Statistics=Only statistics, settings, and required data will be saved
|
|
||||||
preference-Settings=Only settings and required data will be saved
|
|
||||||
preference-Required=Only required data will be saved
|
|
||||||
|
|
||||||
# gui
|
|
||||||
[player-list]
|
|
||||||
main-tooltip=Player List
|
|
||||||
open-action-bar=Options
|
|
||||||
close-action-bar=Close Options
|
|
||||||
reason-confirm=Confirm Reason
|
|
||||||
reason-entry=Enter Reason
|
|
||||||
goto-player=Goto player
|
|
||||||
bring-player=Bring player
|
|
||||||
report-player=Report player
|
|
||||||
jail-player=Jail player
|
|
||||||
kick-player=Kick player
|
|
||||||
ban-player=Ban player
|
|
||||||
afk-time=__1__% of total map time\nLast moved __2__ ago
|
|
||||||
open-map=__1__ __2__\n__3__\nClick to open map
|
|
||||||
|
|
||||||
[warp-list]
|
|
||||||
main-caption=Warp List [img=info]
|
|
||||||
main-tooltip=Warp List
|
|
||||||
sub-tooltip=Warps can only be used every __1__ seconds and when within __2__ tiles\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
|
||||||
sub-tooltip-current= - __1__ This is your current warp point;
|
|
||||||
sub-tooltip-connected= - __1__ You can travel to this warp point;
|
|
||||||
sub-tooltip-different= - __1__ This warp is on a different network;
|
|
||||||
sub-tooltip-cooldown= - __1__ You are currently on cooldown;
|
|
||||||
sub-tooltip-not_available= - __1__ You are not in range of a warp point;
|
|
||||||
sub-tooltip-bypass= - __1__ Your role allows you to travel here;
|
|
||||||
too-close=Cannot create warp; too close to existing warp point: __1__
|
|
||||||
too-close-to-water=Cannot create warp; too close to water, please move __1__ tiles away from the water body or landfill it
|
|
||||||
too-close-to-entities=Cannot create warp; too close to other entities, please move __1__ tiles away from the entities or remove them
|
|
||||||
last-edit=Last edited by __1__ at __2__\nClick to view on map
|
|
||||||
add-tooltip=Add new warp
|
|
||||||
confirm-tooltip=Save changes
|
|
||||||
cancel-tooltip=Discard changes
|
|
||||||
edit-tooltip=Currently being edited by: __1__
|
|
||||||
edit-tooltip-none=Currently being edited by: Nobody
|
|
||||||
remove-tooltip=Remove warp
|
|
||||||
timer-tooltip=Please wait __1__ seconds before you can warp
|
|
||||||
timer-tooltip-zero=After each warp you will need to wait __1__ seconds before you can warp again
|
|
||||||
goto-tooltip=Go to x __1__ y __2__
|
|
||||||
goto-bypass=Go to x __1__ y __2__, bypass mode
|
|
||||||
goto-bypass-different-network=Go to x __1__ y __2__, bypass mode different network
|
|
||||||
goto-same-warp=You are already on this warp
|
|
||||||
goto-different-network=This warp is on a different network, use power poles to connect it
|
|
||||||
goto-cooldown=You are on cooldown, wait for your cooldown to recharge
|
|
||||||
goto-disabled=You are not on a warp point, walk to a warp point
|
|
||||||
goto-edit=Edit warp icon
|
|
||||||
|
|
||||||
[bonus]
|
|
||||||
description=Get / Set the amount of bonus you receive.
|
|
||||||
arg-amount=Amount to set your bonus to, 0 will disable bonus.
|
|
||||||
set=Your bonus has been set to __1__.
|
|
||||||
get=Your bonus is __1__.
|
|
||||||
perm=You dont have enough permission to set more than __1__.
|
|
||||||
display-fmms=Mining
|
|
||||||
display-fmms-tooltip=Force manual mining speed
|
|
||||||
display-frs=Running
|
|
||||||
display-frs-tooltip=Force running speed
|
|
||||||
display-fcs=Crafting
|
|
||||||
display-fcs-tooltip=Force crafting speed
|
|
||||||
display-fisb=Inventory
|
|
||||||
display-fisb-tooltip=Force inventory slots bonus
|
|
||||||
display-fhb=Health
|
|
||||||
display-fhb-tooltip=Force health bonus
|
|
||||||
display-frdb=Reach
|
|
||||||
display-frdb-tooltip=Force reach distance bonus
|
|
||||||
display-fwrsm=Robot Speed
|
|
||||||
display-fwrsm-tooltip=Force worker robots speed modifier
|
|
||||||
display-fwrbm=Robot Battery
|
|
||||||
display-fwrbm-tooltip=Force worker robots battery modifier
|
|
||||||
display-fwrsb=Robot Storage
|
|
||||||
display-fwrsb-tooltip=Force worker robots storage bonus
|
|
||||||
display-ffrlm=Robot Lifetime
|
|
||||||
display-ffrlm-tooltip=Force following robots lifetime modifier
|
|
||||||
|
|
||||||
[vlayer]
|
|
||||||
main-tooltip=vlayer
|
|
||||||
description-pbr=Recharge Player Battery upto a portion with vlayer
|
|
||||||
description-vi=Vlayer Info
|
|
||||||
pbr-not-running=vlayer need to be running
|
|
||||||
display-item-solar=[img=entity/solar-panel] Solar Panel
|
|
||||||
display-item-accumulator=[img=entity/accumulator] Accumulator
|
|
||||||
display-current-production=[virtual-signal=signal-P] Current Production
|
|
||||||
display-sustained-production=[virtual-signal=signal-S] Sustained Production
|
|
||||||
display-max-capacity=[virtual-signal=signal-C] Battery Capacity
|
|
||||||
display-current-capacity=[virtual-signal=signal-E] Battery Charge
|
|
||||||
display-remaining-surface-area=[virtual-signal=signal-R] Remaining Surface
|
|
||||||
display-item-solar-tooltip=The amount of Solar Panel
|
|
||||||
display-item-accumulator-tooltip=The amount of Accumulator
|
|
||||||
display-current-production-tooltip=Current Power Production
|
|
||||||
display-sustained-production-tooltip=Sustained Power Production
|
|
||||||
display-max-capacity-tooltip=Battery Max Capacity
|
|
||||||
display-current-capacity-tooltip=Battery Current Charge
|
|
||||||
display-remaining-surface-area-tooltip=Remaining Surface. Insert Landfill to increase
|
|
||||||
steel-chest-detect=No steel chest detected
|
|
||||||
steel-chest-empty=Chest is not emptied
|
|
||||||
control-refresh=Refresh List
|
|
||||||
control-see=See Interface
|
|
||||||
control-build=Build Interface
|
|
||||||
control-remove=Remove Interface
|
|
||||||
result-build=built
|
|
||||||
result-remove=removed
|
|
||||||
result-interface-location=__1__ interface was located at __2__
|
|
||||||
interface-result=__1__ __2__ __4__ interface at __3__
|
|
||||||
result-unable=Unable to build __1__ interface, because of __2__
|
|
||||||
result-multiple=Multiple steel chest detected
|
|
||||||
result-limit=Max limit exceeded
|
|
||||||
result-space=Not enough space
|
|
||||||
control-type-energy=Energy
|
|
||||||
control-type-circuit=Circuit
|
|
||||||
control-type-storage-input=Storage Input
|
|
||||||
control-type-storage-output=Storage Output
|
|
||||||
power-on-space-research=You need to research [technology=__1__] at __2__ level for the space platform vlayer feature.
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[links]
|
||||||
|
discord=https://discord.aperx.org
|
||||||
|
website=https://aperx.org
|
||||||
|
status=https://aperx.org
|
||||||
|
github=https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=https://aperx.org
|
||||||
|
|
||||||
|
[info]
|
||||||
|
players-online=There are __1__ players online
|
||||||
|
total-map-time=This map has been on for __1__
|
||||||
|
discord=Join us on our discord at: https://discord.aperx.org
|
||||||
|
website=Please visit our website at: https://aperx.org
|
||||||
|
status=Want to check if out servers are down? Visit: https://aperx.org
|
||||||
|
github=Want to help improve our server with some extra features? Help us at: https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=Consider supporting our server at: https://aperx.org
|
||||||
|
custom-commands=We use custom commands, such as /tag and /me, use /chelp for more info.
|
||||||
|
read-readme=Make sure you have read the information gui (It can be found through the info mark on the top left)
|
||||||
|
softmod=We run a softmod on our servers. A softmod is a custom scenario that runs on this server, an example is the player list.
|
||||||
|
redmew=We don't talk about redmew here; they beat us to 1000 members ;-;
|
||||||
|
lhd=All trains must be LHD! This is a long standing rule on our servers, please respect this.
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
[join-message]
|
||||||
|
description-add=Sets / Gets your custom join message.
|
||||||
|
description-remove=Removes you custom join message.
|
||||||
|
arg-message=Your custom join message.
|
||||||
|
greet=[color=0,1,0] Welcome to explosive gaming community server! If you like the server join our discord: __1__ [/color]
|
||||||
|
message-set=Your join message has been updated.
|
||||||
|
message-get=Your join message is: __1__
|
||||||
|
message-cleared=Your join message has been cleared.
|
||||||
|
|
||||||
|
[quickbar]
|
||||||
|
saved=Your quickbar filters have been saved.
|
||||||
|
|
||||||
|
[exp-settings]
|
||||||
|
Colour=Colour
|
||||||
|
Colour-tooltip=Your player colour
|
||||||
|
Colour-value-tooltip=Change by using /color
|
||||||
|
JoinMessage=Join Message
|
||||||
|
JoinMessage-tooltip=The message displayed when you join
|
||||||
|
JoinMessage-value-tooltip=Change by using /join-message
|
||||||
|
QuickbarFilters=Quickbar Filters
|
||||||
|
QuickbarFilters-tooltip=The filters on your quickbar
|
||||||
|
QuickbarFilters-value-tooltip=Change by using /save-quickbar
|
||||||
|
UsesAlt=Alt View
|
||||||
|
UsesAlt-tooltip=Whether you use alt view when you play
|
||||||
|
UsesAlt-value-tooltip=Change by pressing __CONTROL__show-info__
|
||||||
|
UsesServerUps=Server UPS
|
||||||
|
UsesServerUps-tooltip=Whether the current server UPS is shown
|
||||||
|
UsesServerUps-value-tooltip=Change by using /server-ups
|
||||||
|
Tag=Player Tag
|
||||||
|
Tag-tooltip=The tag shown after your name
|
||||||
|
Tag-value-tooltip=Change by using /tag
|
||||||
|
TagColor=Player Tag color
|
||||||
|
TagColor-tooltip=The color of the tag shown after your name
|
||||||
|
TagColor-value-tooltip=Change by using /tag-color
|
||||||
|
Bonus=Player Bonus
|
||||||
|
Bonus-tooltip=The bonus given to your character
|
||||||
|
Bonus-value-tooltip=Change by using /bonus
|
||||||
|
HasEnabledDecon=Quick Tree Decon
|
||||||
|
ToolbarState=Toolbox
|
||||||
|
ToolbarState-tooltip=The order and favourites in your toolbox
|
||||||
|
ToolbarState-value-tooltip=This value is calculated automatically when you leave the game
|
||||||
|
|
||||||
|
[exp-statistics]
|
||||||
|
MapsPlayed=Maps Played
|
||||||
|
MapsPlayed-tooltip=The number of unique maps you have played on
|
||||||
|
JoinCount=Join Count
|
||||||
|
JoinCount-tooltip=The number of times you have joined our servers
|
||||||
|
Playtime=Playtime
|
||||||
|
Playtime-tooltip=The amount of time you have spent on our servers
|
||||||
|
AfkTime=AFK Time
|
||||||
|
AfkTime-tooltip=The amount of time you have been AFK on our servers
|
||||||
|
ChatMessages=Messages
|
||||||
|
ChatMessages-tooltip=The number of messages you have sent in chat
|
||||||
|
CommandsUsed=Commands
|
||||||
|
CommandsUsed-tooltip=The number of commands you have used
|
||||||
|
RocketsLaunched=Rockets Launched
|
||||||
|
RocketsLaunched-tooltip=The number of rockets launched while you were online
|
||||||
|
ResearchCompleted=Research Completed
|
||||||
|
ResearchCompleted-tooltip=The number of research projects completed while you were online
|
||||||
|
MachinesBuilt=Machines Built
|
||||||
|
MachinesBuilt-tooltip=The number of machines you have built
|
||||||
|
MachinesRemoved=Machines Removed
|
||||||
|
MachinesRemoved-tooltip=The number of machines you have removed
|
||||||
|
TilesBuilt=Tiles Placed
|
||||||
|
TilesBuilt-tooltip=The number of tiles you have placed
|
||||||
|
TilesRemoved=Tiles Removed
|
||||||
|
TilesRemoved-tooltip=The number of tiles you have removed
|
||||||
|
TreesDestroyed=Trees Destroyed
|
||||||
|
TreesDestroyed-tooltip=The number of trees you have destroyed
|
||||||
|
OreMined=Ore Mined
|
||||||
|
OreMined-tooltip=The amount of ore you have mined
|
||||||
|
ItemsCrafted=Items Crafted
|
||||||
|
ItemsCrafted-tooltip=The number of items you have crafted
|
||||||
|
ItemsPickedUp=Items Picked Up
|
||||||
|
ItemsPickedUp-tooltip=The number of items you have picked up
|
||||||
|
Kills=Kills
|
||||||
|
Kills-tooltip=The number of biters and biter bases you have squished
|
||||||
|
Deaths=Deaths
|
||||||
|
Deaths-tooltip=The number of times you have died
|
||||||
|
DamageDealt=Damage Dealt
|
||||||
|
DamageDealt-tooltip=The amount of damage you have dealt to other forces
|
||||||
|
DistanceTravelled=Distance Travelled
|
||||||
|
DistanceTravelled-tooltip=The total distance in tiles that you have travelled
|
||||||
|
CapsulesUsed=Capsules Used
|
||||||
|
CapsulesUsed-tooltip=The number of capsules you have used
|
||||||
|
EntityRepaired=Machines Repaired
|
||||||
|
EntityRepaired-tooltip=The number of machines which you have repaired
|
||||||
|
DeconstructionPlannerUsed=Decon Planner Used
|
||||||
|
DeconstructionPlannerUsed-tooltip=The number of times you have used the deconstruction planner
|
||||||
|
MapTagsMade=Map Tags Created
|
||||||
|
MapTagsMade-tooltip=The number of map tags you have created
|
||||||
|
DamageDeathRatio=Damage Death Ratio
|
||||||
|
DamageDeathRatio-tooltip=Damage over Death
|
||||||
|
KillDeathRatio=Kill Death Ratio
|
||||||
|
KillDeathRatio-tooltip=Kill over Death
|
||||||
|
SessionTime=Session Time
|
||||||
|
SessionTime-tooltip=Session Time
|
||||||
|
BuildRatio=Build Ratio
|
||||||
|
BuildRatio-tooltip=Build over Remove
|
||||||
|
RocketPerHour=Rocket Per Hour
|
||||||
|
RocketPerHour-tooltip=Rocket Launched Over Play Time in Hour
|
||||||
|
TreeKillPerMinute=Tree Kill Per Minute
|
||||||
|
TreeKillPerMinute-tooltip=Tree Destroyed Per Minute
|
||||||
|
NetPlayTime=Net Play Time
|
||||||
|
NetPlayTime-tooltip=Net Play Time
|
||||||
|
AFKTimeRatio=AFK Time Ratio
|
||||||
|
AFKTimeRatio-tooltip=AFK Time over Play Time
|
||||||
|
Locale=Locale
|
||||||
|
Locale-tooltip=The language of player interface
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[expcore-data]
|
||||||
|
description-preference=Allows you to set/get your data saving preference.
|
||||||
|
description-data=Writes all your player data to a file on your computer.
|
||||||
|
arg-option=One of "All", "Statistics", "Settings", "Required"
|
||||||
|
set-preference=You data saving preference has been set to __1__. Existing data will not be effected until you rejoin.
|
||||||
|
get-preference=You data saving preference is __1__. Use /set-preference to change this. Use /save-data to get a local copy of your data.
|
||||||
|
get-data=Your player data has been writen to file, location: factorio/script_output/expgaming_player_data.json
|
||||||
|
data-failed=Your player data has failed to load. Any changes to your data will not be saved.
|
||||||
|
data-restore=Your player data has been restored and changes will now save when you leave.
|
||||||
|
preference=Saving Preference
|
||||||
|
preference-tooltip=Which categories will be saved when you leave the game
|
||||||
|
preference-value-tooltip=Change by using /set-preference
|
||||||
|
preference-All=All data will be saved
|
||||||
|
preference-Statistics=Only statistics, settings, and required data will be saved
|
||||||
|
preference-Settings=Only settings and required data will be saved
|
||||||
|
preference-Required=Only required data will be saved
|
||||||
@@ -0,0 +1,113 @@
|
|||||||
|
[player-list]
|
||||||
|
main-tooltip=Player List
|
||||||
|
open-action-bar=Options
|
||||||
|
close-action-bar=Close Options
|
||||||
|
reason-confirm=Confirm Reason
|
||||||
|
reason-entry=Enter Reason
|
||||||
|
goto-player=Goto player
|
||||||
|
bring-player=Bring player
|
||||||
|
report-player=Report player
|
||||||
|
jail-player=Jail player
|
||||||
|
kick-player=Kick player
|
||||||
|
ban-player=Ban player
|
||||||
|
afk-time=__1__% of total map time\nLast moved __2__ ago
|
||||||
|
open-map=__1__ __2__\n__3__\nClick to open map
|
||||||
|
|
||||||
|
[warp-list]
|
||||||
|
main-caption=Warp List [img=info]
|
||||||
|
main-tooltip=Warp List
|
||||||
|
sub-tooltip=Warps can only be used every __1__ seconds and when within __2__ tiles\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
||||||
|
sub-tooltip-current= - __1__ This is your current warp point;
|
||||||
|
sub-tooltip-connected= - __1__ You can travel to this warp point;
|
||||||
|
sub-tooltip-different= - __1__ This warp is on a different network;
|
||||||
|
sub-tooltip-cooldown= - __1__ You are currently on cooldown;
|
||||||
|
sub-tooltip-not_available= - __1__ You are not in range of a warp point;
|
||||||
|
sub-tooltip-bypass= - __1__ Your role allows you to travel here;
|
||||||
|
too-close=Cannot create warp; too close to existing warp point: __1__
|
||||||
|
too-close-to-water=Cannot create warp; too close to water, please move __1__ tiles away from the water body or landfill it
|
||||||
|
too-close-to-entities=Cannot create warp; too close to other entities, please move __1__ tiles away from the entities or remove them
|
||||||
|
last-edit=Last edited by __1__ at __2__\nClick to view on map
|
||||||
|
add-tooltip=Add new warp
|
||||||
|
confirm-tooltip=Save changes
|
||||||
|
cancel-tooltip=Discard changes
|
||||||
|
edit-tooltip=Currently being edited by: __1__
|
||||||
|
edit-tooltip-none=Currently being edited by: Nobody
|
||||||
|
remove-tooltip=Remove warp
|
||||||
|
timer-tooltip=Please wait __1__ seconds before you can warp
|
||||||
|
timer-tooltip-zero=After each warp you will need to wait __1__ seconds before you can warp again
|
||||||
|
goto-tooltip=Go to x __1__ y __2__
|
||||||
|
goto-bypass=Go to x __1__ y __2__, bypass mode
|
||||||
|
goto-bypass-different-network=Go to x __1__ y __2__, bypass mode different network
|
||||||
|
goto-same-warp=You are already on this warp
|
||||||
|
goto-different-network=This warp is on a different network, use power poles to connect it
|
||||||
|
goto-cooldown=You are on cooldown, wait for your cooldown to recharge
|
||||||
|
goto-disabled=You are not on a warp point, walk to a warp point
|
||||||
|
goto-edit=Edit warp icon
|
||||||
|
|
||||||
|
[bonus]
|
||||||
|
description=Get / Set the amount of bonus you receive.
|
||||||
|
arg-amount=Amount to set your bonus to, 0 will disable bonus.
|
||||||
|
set=Your bonus has been set to __1__.
|
||||||
|
get=Your bonus is __1__.
|
||||||
|
perm=You dont have enough permission to set more than __1__.
|
||||||
|
display-fmms=Mining
|
||||||
|
display-fmms-tooltip=Force manual mining speed
|
||||||
|
display-frs=Running
|
||||||
|
display-frs-tooltip=Force running speed
|
||||||
|
display-fcs=Crafting
|
||||||
|
display-fcs-tooltip=Force crafting speed
|
||||||
|
display-fisb=Inventory
|
||||||
|
display-fisb-tooltip=Force inventory slots bonus
|
||||||
|
display-fhb=Health
|
||||||
|
display-fhb-tooltip=Force health bonus
|
||||||
|
display-frdb=Reach
|
||||||
|
display-frdb-tooltip=Force reach distance bonus
|
||||||
|
display-fwrsm=Robot Speed
|
||||||
|
display-fwrsm-tooltip=Force worker robots speed modifier
|
||||||
|
display-fwrbm=Robot Battery
|
||||||
|
display-fwrbm-tooltip=Force worker robots battery modifier
|
||||||
|
display-fwrsb=Robot Storage
|
||||||
|
display-fwrsb-tooltip=Force worker robots storage bonus
|
||||||
|
display-ffrlm=Robot Lifetime
|
||||||
|
display-ffrlm-tooltip=Force following robots lifetime modifier
|
||||||
|
|
||||||
|
[vlayer]
|
||||||
|
main-tooltip=Vlayer GUI
|
||||||
|
description-pbr=Recharge Player Battery upto a portion with vlayer
|
||||||
|
description-vi=Vlayer Info
|
||||||
|
pbr-not-running=vlayer need to be running
|
||||||
|
display-item-solar=[img=entity/solar-panel] Solar Panel
|
||||||
|
display-item-accumulator=[img=entity/accumulator] Accumulator
|
||||||
|
display-current-production=[virtual-signal=signal-P] Current Production
|
||||||
|
display-sustained-production=[virtual-signal=signal-S] Sustained Production
|
||||||
|
display-max-capacity=[virtual-signal=signal-C] Battery Capacity
|
||||||
|
display-current-capacity=[virtual-signal=signal-E] Battery Charge
|
||||||
|
display-remaining-surface-area=[virtual-signal=signal-R] Remaining Surface
|
||||||
|
display-item-solar-tooltip=The amount of Solar Panel
|
||||||
|
display-item-accumulator-tooltip=The amount of Accumulator
|
||||||
|
display-current-production-tooltip=Current Power Production
|
||||||
|
display-sustained-production-tooltip=Sustained Power Production
|
||||||
|
display-max-capacity-tooltip=Battery Max Capacity
|
||||||
|
display-current-capacity-tooltip=Battery Current Charge
|
||||||
|
display-remaining-surface-area-tooltip=Remaining Surface. Insert Landfill to increase
|
||||||
|
steel-chest-detect=No steel chest detected
|
||||||
|
steel-chest-empty=Chest is not emptied
|
||||||
|
control-refresh=Refresh List
|
||||||
|
control-see=See Interface
|
||||||
|
control-build=Build Interface
|
||||||
|
control-remove=Remove Interface
|
||||||
|
result-build=built
|
||||||
|
result-remove=removed
|
||||||
|
result-interface-location=__1__ interface was located at __2__
|
||||||
|
interface-result=__1__ __2__ __4__ interface at __3__
|
||||||
|
result-unable=Unable to build __1__ interface, because of __2__
|
||||||
|
result-multiple=Multiple steel chest detected
|
||||||
|
result-limit=Max limit exceeded
|
||||||
|
result-space=Not enough space
|
||||||
|
control-type-energy=Energy
|
||||||
|
control-type-circuit=Circuit
|
||||||
|
control-type-storage-input=Storage Input
|
||||||
|
control-type-storage-output=Storage Output
|
||||||
|
power-on-space-research=You need to research [technology=__1__] at __2__ level for the space platform vlayer feature.
|
||||||
|
enter=Entered vlayer selection mode.
|
||||||
|
exit=Exited vlayer selection mode.
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
# addons
|
|
||||||
[info]
|
|
||||||
players-online=現在有 __1__ 人在線
|
|
||||||
total-map-time=地圖時間為 __1__
|
|
||||||
discord=加入社群: __1__
|
|
||||||
website=訪問網站: __1__
|
|
||||||
status=伺服器狀態: __1__
|
|
||||||
github=增加功能或回報錯誤: __1__
|
|
||||||
patreon=支持我們: __1__
|
|
||||||
custom-commands=這裹使用了自制指令,如 /tag 和 /me。可使用 /chelp 查看更多。
|
|
||||||
read-readme=確保你已閱讀相關資訊。按左上 i 圖標可再次查看。
|
|
||||||
softmod=這裹用了自設情境,是一種軟裝模組。
|
|
||||||
redmew=We don't talk about redmew here; they beat us to 1000 members ;-;
|
|
||||||
lhd=列車必須是左則通行。這是本服務器長久以來的規則。
|
|
||||||
|
|
||||||
# data
|
|
||||||
[join-message]
|
|
||||||
description-add=設定 / 取得你的加入信息。
|
|
||||||
description-remove=移除你的加入信息。
|
|
||||||
arg-message=你的加入信息。
|
|
||||||
greet=[color=0,1,0] 歡迎來到 __1__ 的服務器! 若果你喜歡本服務器可加入 DISCORD: __2__ [/color]
|
|
||||||
message-set=你的加入信息已更新。
|
|
||||||
message-get=你的加入信息為: __1__
|
|
||||||
message-cleared=你的加入信息已清除。
|
|
||||||
|
|
||||||
[quickbar]
|
|
||||||
saved=你的工具列已儲存。
|
|
||||||
|
|
||||||
[exp-settings]
|
|
||||||
Colour=顏色
|
|
||||||
Colour-tooltip=你的人物顏色
|
|
||||||
Colour-value-tooltip=使用 /color 來更換你的人物顏色
|
|
||||||
JoinMessage=加入信息
|
|
||||||
JoinMessage-tooltip=你加入時所顯示的信息
|
|
||||||
JoinMessage-value-tooltip=使用 /join-message 來更換加入信息
|
|
||||||
QuickbarFilters=快捷欄
|
|
||||||
QuickbarFilters-tooltip=快捷欄的選項
|
|
||||||
QuickbarFilters-value-tooltip=使用 /save-quickbar 來更換快捷欄的選項
|
|
||||||
UsesAlt=細節模式
|
|
||||||
UsesAlt-tooltip=你加入時是否使用細節模式
|
|
||||||
UsesAlt-value-tooltip=按下 __CONTROL__show-info__ 來更改
|
|
||||||
UsesServerUps=服務器更新數 (SUPS)
|
|
||||||
UsesServerUps-tooltip=現在是否顯示服務器更新數 (SUPS)
|
|
||||||
UsesServerUps-value-tooltip=使用 /server-ups 來更換顯示
|
|
||||||
Tag=你的人物標籤
|
|
||||||
Tag-tooltip=你的人物標籤
|
|
||||||
Tag-value-tooltip=使用 /tag 來更換你的人物標籤
|
|
||||||
TagColor=人物標籤顏色
|
|
||||||
TagColor-tooltip=你的人物標籤顏色
|
|
||||||
TagColor-value-tooltip=使用 /tag-color 來更換你的人物標籤顏色
|
|
||||||
Bonus=人物附加屬性
|
|
||||||
Bonus-tooltip=你的人物附加屬性
|
|
||||||
Bonus-value-tooltip=使用 /bonus 來更改
|
|
||||||
HasEnabledDecon=快速拆除樹木
|
|
||||||
ToolbarState=工具箱
|
|
||||||
ToolbarState-tooltip=次序和喜愛項目
|
|
||||||
ToolbarState-value-tooltip=此值在離開時自動計算
|
|
||||||
|
|
||||||
[exp-statistics]
|
|
||||||
MapsPlayed=地圖遊玩次數
|
|
||||||
MapsPlayed-tooltip=你在本服務器遊玩過的地圖數
|
|
||||||
JoinCount=登入次數
|
|
||||||
JoinCount-tooltip=你在本服務器遊玩的次數
|
|
||||||
Playtime=遊玩時間
|
|
||||||
Playtime-tooltip=你在本服務器遊玩的時間
|
|
||||||
AfkTime=掛機時間
|
|
||||||
AfkTime-tooltip=你在本服務器掛機的時間
|
|
||||||
ChatMessages=傳送信息次數
|
|
||||||
ChatMessages-tooltip=你在本服務器發送信息的次數
|
|
||||||
CommandsUsed=使用指令次數
|
|
||||||
CommandsUsed-tooltip=你在本服務器使用指令的次數
|
|
||||||
RocketsLaunched=火箭發射次數
|
|
||||||
RocketsLaunched-tooltip=你在本服務器在線時所發射過火箭的次數
|
|
||||||
ResearchCompleted=研究次數
|
|
||||||
ResearchCompleted-tooltip=你在本服務器在線時完成研究的次數
|
|
||||||
MachinesBuilt=機器建造次數
|
|
||||||
MachinesBuilt-tooltip=你在本服務器建造過機器的次數
|
|
||||||
MachinesRemoved=機器拆除次數
|
|
||||||
MachinesRemoved-tooltip=你在本服務器拆除過機器的次數
|
|
||||||
TilesBuilt=地磚建造次數
|
|
||||||
TilesBuilt-tooltip=你在本服務器建造過地磚的次數
|
|
||||||
TilesRemoved=地磚拆除次數
|
|
||||||
TilesRemoved-tooltip=你在本服務器拆除過地磚的次數
|
|
||||||
TreesDestroyed=樹木拆除次數
|
|
||||||
TreesDestroyed-tooltip=你在本服務器拆除過樹木的次數
|
|
||||||
OreMined=挖礦次數
|
|
||||||
OreMined-tooltip=你在本服務器挖掘礦的次數
|
|
||||||
ItemsCrafted=物品合成數
|
|
||||||
ItemsCrafted-tooltip=你在本服務器合成過物品的次數
|
|
||||||
ItemsPickedUp=物品拾起數
|
|
||||||
ItemsPickedUp-tooltip=你在本服務器起過物品的次數
|
|
||||||
Kills=撃殺數
|
|
||||||
Kills-tooltip=你在本服務器殺過的敵人數量
|
|
||||||
Deaths=死亡次數
|
|
||||||
Deaths-tooltip=你在本服務器死過的數量
|
|
||||||
DamageDealt=傷害量
|
|
||||||
DamageDealt-tooltip=你在本伺服器對敵人所造成的傷害量
|
|
||||||
DistanceTravelled=移動距離
|
|
||||||
DistanceTravelled-tooltip=你在本服務器的總移動距離
|
|
||||||
CapsulesUsed=膠囊使用次數
|
|
||||||
CapsulesUsed-tooltip=你在本服務器使用過膠囊的次數
|
|
||||||
EntityRepaired=機器維修次數
|
|
||||||
EntityRepaired-tooltip=你在本服務器維修過機器的次數
|
|
||||||
DeconstructionPlannerUsed=拆除規劃器使用次數
|
|
||||||
DeconstructionPlannerUsed-tooltip=你在本服務器使用過拆除規劃器的次數
|
|
||||||
MapTagsMade=地圖標籤數量
|
|
||||||
MapTagsMade-tooltip=你在本服務器放過的地圖標籤數量
|
|
||||||
DamageDeathRatio=傷害死亡比
|
|
||||||
DamageDeathRatio-tooltip=傷害除以死亡
|
|
||||||
KillDeathRatio=撃殺死亡比
|
|
||||||
KillDeathRatio-tooltip=撃殺除以死亡
|
|
||||||
SessionTime=平均遊玩時間
|
|
||||||
SessionTime-tooltip=平均遊玩時間
|
|
||||||
BuildRatio=建築比
|
|
||||||
BuildRatio-tooltip=建築次數除以拆除次數
|
|
||||||
RocketPerHour=每小時火箭發射次數
|
|
||||||
RocketPerHour-tooltip=火箭發射次數除以遊玩時間
|
|
||||||
TreeKillPerMinute=每分鐘樹木拆除數
|
|
||||||
TreeKillPerMinute-tooltip=樹木拆除數除以遊玩時間
|
|
||||||
NetPlayTime=淨遊玩時間
|
|
||||||
NetPlayTime-tooltip=遊玩時間減掛機時間
|
|
||||||
AFKTimeRatio=掛機時間比
|
|
||||||
AFKTimeRatio-tooltip=掛機時間除以遊玩時間
|
|
||||||
Locale=語言
|
|
||||||
Locale-tooltip=用戶介面語言
|
|
||||||
|
|
||||||
# expcore
|
|
||||||
[expcore-data]
|
|
||||||
description-preference=允許寫入資料。
|
|
||||||
description-data=把用戶資料寫入電腦
|
|
||||||
arg-option="All", "Statistics", "Settings", "Required" 之中
|
|
||||||
set-preference=你的喜好已設定為 __1__ 。在你重新加入前將不會有任何改動。
|
|
||||||
get-preference=你的喜好為 __1__ 。使用 /set-preference 來更改,使用 /save-data 來獲得一份資料副本。
|
|
||||||
get-data=你的個人資料已寫入: factorio/script_output/expgaming_player_data.json
|
|
||||||
data-failed=無法載入你的個人資料,任何改動將不會保存。
|
|
||||||
data-restore=已載入你的個人資料,所有改動將會被保存。
|
|
||||||
preference=儲存喜好
|
|
||||||
preference-tooltip=那種資料將在退出時保存
|
|
||||||
preference-value-tooltip=使用 /set-preference 來更換儲存喜好
|
|
||||||
preference-All=所有資料都會被儲存
|
|
||||||
preference-Statistics=只有數據, 設定和資料會被儲存
|
|
||||||
preference-Settings=只有設定和資料會被儲存
|
|
||||||
preference-Required=只有需要的資料會被儲存
|
|
||||||
|
|
||||||
# gui
|
|
||||||
[player-list]
|
|
||||||
main-tooltip=用戶名單
|
|
||||||
open-action-bar=選項
|
|
||||||
close-action-bar=關閉選項
|
|
||||||
reason-confirm=確認原因
|
|
||||||
reason-entry=輸入原因
|
|
||||||
goto-player=傳送到用戶
|
|
||||||
bring-player=傳送用戶到自己
|
|
||||||
report-player=舉報用戶
|
|
||||||
jail-player=監禁用戶
|
|
||||||
kick-player=踢除用戶
|
|
||||||
ban-player=封禁用戶
|
|
||||||
afk-time=__1__% 地圖時間\n上次移動: __2__
|
|
||||||
open-map=__1__ __2__\n__3__\n按下打開地圖
|
|
||||||
|
|
||||||
[warp-list]
|
|
||||||
main-caption=傳送陣清單 [img=info]
|
|
||||||
main-tooltip=傳送陣清單
|
|
||||||
sub-tooltip=傳送陣在 __1__ 秒內只能使用一次。 亦需在 __2__ 格之內使用\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
|
||||||
sub-tooltip-current= - __1__ 你目前的傳送陣;
|
|
||||||
sub-tooltip-connected= - __1__ 你可以到本傳送陣;
|
|
||||||
sub-tooltip-different= - __1__ 該傳送陣未連接;
|
|
||||||
sub-tooltip-cooldown= - __1__ 傳送冷卻中;
|
|
||||||
sub-tooltip-not_available= - __1__ 你不在傳送陣範圍;
|
|
||||||
sub-tooltip-bypass= - __1__ 你可以傳送到這裏;
|
|
||||||
too-close=無法新建傳送陣; 太接近 __1__ 了
|
|
||||||
too-close-to-water=無法新建傳送陣; 太接近水源了, 請移動 __1__ 格又或者填平該地方
|
|
||||||
too-close-to-entities=無法新建傳送陣; 太接近其他東西, 請移動 __1__ 格又或者拆除該東西
|
|
||||||
last-edit=最後由 __1__ 在 __2__ 更改\n按這在地圖上看
|
|
||||||
add-tooltip=新建傳送陣
|
|
||||||
confirm-tooltip=儲存更改
|
|
||||||
cancel-tooltip=放棄更改
|
|
||||||
edit-tooltip=現被 __1__ 修改中
|
|
||||||
edit-tooltip-none=現沒有被人修改
|
|
||||||
remove-tooltip=拆除傳送陣
|
|
||||||
timer-tooltip=請等 __1__ 秒才再次傳送
|
|
||||||
timer-tooltip-zero=你要等 __1__ 秒才可以再次傳送
|
|
||||||
goto-tooltip=到 X __1__ Y __2__
|
|
||||||
goto-bypass=到 X __1__ Y __2__, 繞行模式
|
|
||||||
goto-bypass-different-network=到 X __1__ Y __2__, 繞行模式 (不同網絡)
|
|
||||||
goto-same-warp=你已在該傳送陣
|
|
||||||
goto-different-network=該傳送陣未連接, 你可使用電纜連接
|
|
||||||
goto-cooldown=傳送冷卻中, 請等候冷卻
|
|
||||||
goto-disabled=你不在傳送陣, 請移至任意傳送陣
|
|
||||||
goto-edit=修改傳送陣圖案
|
|
||||||
|
|
||||||
[bonus]
|
|
||||||
description=取得 / 設定 Bonus 量。
|
|
||||||
arg-amount=Bonus 數量, 0 來停用。
|
|
||||||
set=你的 Bonus 已設為 __1__。
|
|
||||||
get=你的 Bonus 為 __1__。
|
|
||||||
perm=你沒有足夠權限設多過 __1__。
|
|
||||||
display-fmms=挖掘速度
|
|
||||||
display-fmms-tooltip=勢力挖掘速度
|
|
||||||
display-frs=跑步速度
|
|
||||||
display-frs-tooltip=勢力跑步速度
|
|
||||||
display-fcs=合成速度
|
|
||||||
display-fcs-tooltip=勢力合成速度
|
|
||||||
display-fisb=儲存位
|
|
||||||
display-fisb-tooltip=勢力儲存位
|
|
||||||
display-fhb=生命
|
|
||||||
display-fhb-tooltip=勢力生命
|
|
||||||
display-frdb=到達距離
|
|
||||||
display-frdb-tooltip=勢力到達距離
|
|
||||||
display-fwrsm=機械人速度
|
|
||||||
display-fwrsm-tooltip=勢力機械人速度
|
|
||||||
display-fwrbm=機械人電力
|
|
||||||
display-fwrbm-tooltip=勢力機械人電力
|
|
||||||
display-fwrsb=械人儲存
|
|
||||||
display-fwrsb-tooltip=勢力機械人儲存
|
|
||||||
display-ffrlm=機械人生命
|
|
||||||
display-ffrlm-tooltip=勢力戰鬥機械人生命時間
|
|
||||||
|
|
||||||
[vlayer]
|
|
||||||
main-tooltip=vlayer
|
|
||||||
description-pbr=使用 Vlayer 為玩家電池充電
|
|
||||||
description-vi=Vlayer 資訊
|
|
||||||
pbr-not-running=vlayer 沒有運行
|
|
||||||
display-item-solar=[img=entity/solar-panel] 太陽能板
|
|
||||||
display-item-accumulator=[img=entity/accumulator] 蓄電池
|
|
||||||
display-current-production=[virtual-signal=signal-P] 現時產能
|
|
||||||
display-sustained-production=[virtual-signal=signal-S] 持續產能
|
|
||||||
display-max-capacity=[virtual-signal=signal-C] 電池容量
|
|
||||||
display-current-capacity=[virtual-signal=signal-E] 電池電量
|
|
||||||
display-remaining-surface-area=[virtual-signal=signal-R] 餘下土地
|
|
||||||
display-item-solar-tooltip=太陽能板數量
|
|
||||||
display-item-accumulator-tooltip=蓄電池數量
|
|
||||||
display-current-production-tooltip=現時電力產能
|
|
||||||
display-sustained-production-tooltip=持續電力產能
|
|
||||||
display-max-capacity-tooltip=電池最大容量
|
|
||||||
display-current-capacity-tooltip=現時電池電量
|
|
||||||
display-remaining-surface-area-tooltip=餘下土地。 放入堆填來增加
|
|
||||||
steel-chest-detect=沒檢測到鋼箱
|
|
||||||
steel-chest-empty=鋼箱不是空的
|
|
||||||
control-refresh=刷新列表
|
|
||||||
control-see=查看介面
|
|
||||||
control-build=建造介面
|
|
||||||
control-remove=拆除介面
|
|
||||||
result-build=建造了
|
|
||||||
result-remove=拆除了
|
|
||||||
result-interface-location=__1__ 介面在 __2__
|
|
||||||
interface-result=__1__ 在 __2__ __3__ __4__ 介面
|
|
||||||
result-unable=無法建造 __1__ 介面,因 __2__
|
|
||||||
result-multiple=檢測到多個鋼箱
|
|
||||||
result-limit=超出最大限制
|
|
||||||
result-space=空間不足
|
|
||||||
control-type-energy=電力
|
|
||||||
control-type-circuit=回路
|
|
||||||
control-type-storage-input=放入箱
|
|
||||||
control-type-storage-output=提取箱
|
|
||||||
power-on-space-research=你要研究 [technology=__1__] 在 __2__ 級 才可使用太空平台 vlayer 功能。
|
|
||||||
|
|
||||||
[toolbar]
|
|
||||||
main-caption=工具箱
|
|
||||||
main-tooltip=工具箱設定\n選上來設定喜好
|
|
||||||
reset=重設
|
|
||||||
toggle=啟用喜好
|
|
||||||
move-up=向上
|
|
||||||
move-down=向下
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[links]
|
||||||
|
discord=https://discord.aperx.org
|
||||||
|
website=https://aperx.org
|
||||||
|
status=https://aperx.org
|
||||||
|
github=https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=https://aperx.org
|
||||||
|
|
||||||
|
[info]
|
||||||
|
players-online=現在有 __1__ 人在線
|
||||||
|
total-map-time=地圖時間為 __1__
|
||||||
|
discord=加入社群: https://discord.aperx.org
|
||||||
|
website=訪問網站: https://aperx.org
|
||||||
|
status=伺服器狀態: https://aperx.org
|
||||||
|
github=增加功能或回報錯誤: https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=支持我們: https://aperx.org
|
||||||
|
custom-commands=這裹使用了自制指令,如 /tag 和 /me。可使用 /chelp 查看更多。
|
||||||
|
read-readme=確保你已閱讀相關資訊。按左上 i 圖標可再次查看。
|
||||||
|
softmod=這裹用了自設情境,是一種軟裝模組。
|
||||||
|
redmew=
|
||||||
|
lhd=列車必須是左則通行。這是本服務器長久以來的規則。
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
[join-message]
|
||||||
|
description-add=設定 / 取得你的加入信息。
|
||||||
|
description-remove=移除你的加入信息。
|
||||||
|
arg-message=你的加入信息。
|
||||||
|
greet=[color=0,1,0] 歡迎來到 EXP 的服務器! 若果你喜歡本服務器可加入 DISCORD: __1__ [/color]
|
||||||
|
message-set=你的加入信息已更新。
|
||||||
|
message-get=你的加入信息為: __1__
|
||||||
|
message-cleared=你的加入信息已清除。
|
||||||
|
|
||||||
|
[quickbar]
|
||||||
|
saved=你的工具列已儲存。
|
||||||
|
|
||||||
|
[exp-settings]
|
||||||
|
Colour=顏色
|
||||||
|
Colour-tooltip=你的人物顏色
|
||||||
|
Colour-value-tooltip=使用 /color 來更換你的人物顏色
|
||||||
|
JoinMessage=加入信息
|
||||||
|
JoinMessage-tooltip=你加入時所顯示的信息
|
||||||
|
JoinMessage-value-tooltip=使用 /join-message 來更換加入信息
|
||||||
|
QuickbarFilters=快捷欄
|
||||||
|
QuickbarFilters-tooltip=快捷欄的選項
|
||||||
|
QuickbarFilters-value-tooltip=使用 /save-quickbar 來更換快捷欄的選項
|
||||||
|
UsesAlt=細節模式
|
||||||
|
UsesAlt-tooltip=你加入時是否使用細節模式
|
||||||
|
UsesAlt-value-tooltip=按下 __CONTROL__show-info__ 來更改
|
||||||
|
UsesServerUps=服務器更新數 (SUPS)
|
||||||
|
UsesServerUps-tooltip=現在是否顯示服務器更新數 (SUPS)
|
||||||
|
UsesServerUps-value-tooltip=使用 /server-ups 來更換顯示
|
||||||
|
Tag=你的人物標籤
|
||||||
|
Tag-tooltip=你的人物標籤
|
||||||
|
Tag-value-tooltip=使用 /tag 來更換你的人物標籤
|
||||||
|
TagColor=人物標籤顏色
|
||||||
|
TagColor-tooltip=你的人物標籤顏色
|
||||||
|
TagColor-value-tooltip=使用 /tag-color 來更換你的人物標籤顏色
|
||||||
|
Bonus=人物附加屬性
|
||||||
|
Bonus-tooltip=你的人物附加屬性
|
||||||
|
Bonus-value-tooltip=使用 /bonus 來更改
|
||||||
|
HasEnabledDecon=快速拆除樹木
|
||||||
|
ToolbarState=工具箱
|
||||||
|
ToolbarState-tooltip=次序和喜愛項目
|
||||||
|
ToolbarState-value-tooltip=此值在離開時自動計算
|
||||||
|
|
||||||
|
[exp-statistics]
|
||||||
|
MapsPlayed=地圖遊玩次數
|
||||||
|
MapsPlayed-tooltip=你在本服務器遊玩過的地圖數
|
||||||
|
JoinCount=登入次數
|
||||||
|
JoinCount-tooltip=你在本服務器遊玩的次數
|
||||||
|
Playtime=遊玩時間
|
||||||
|
Playtime-tooltip=你在本服務器遊玩的時間
|
||||||
|
AfkTime=掛機時間
|
||||||
|
AfkTime-tooltip=你在本服務器掛機的時間
|
||||||
|
ChatMessages=傳送信息次數
|
||||||
|
ChatMessages-tooltip=你在本服務器發送信息的次數
|
||||||
|
CommandsUsed=使用指令次數
|
||||||
|
CommandsUsed-tooltip=你在本服務器使用指令的次數
|
||||||
|
RocketsLaunched=火箭發射次數
|
||||||
|
RocketsLaunched-tooltip=你在本服務器在線時所發射過火箭的次數
|
||||||
|
ResearchCompleted=研究次數
|
||||||
|
ResearchCompleted-tooltip=你在本服務器在線時完成研究的次數
|
||||||
|
MachinesBuilt=機器建造次數
|
||||||
|
MachinesBuilt-tooltip=你在本服務器建造過機器的次數
|
||||||
|
MachinesRemoved=機器拆除次數
|
||||||
|
MachinesRemoved-tooltip=你在本服務器拆除過機器的次數
|
||||||
|
TilesBuilt=地磚建造次數
|
||||||
|
TilesBuilt-tooltip=你在本服務器建造過地磚的次數
|
||||||
|
TilesRemoved=地磚拆除次數
|
||||||
|
TilesRemoved-tooltip=你在本服務器拆除過地磚的次數
|
||||||
|
TreesDestroyed=樹木拆除次數
|
||||||
|
TreesDestroyed-tooltip=你在本服務器拆除過樹木的次數
|
||||||
|
OreMined=挖礦次數
|
||||||
|
OreMined-tooltip=你在本服務器挖掘礦的次數
|
||||||
|
ItemsCrafted=物品合成數
|
||||||
|
ItemsCrafted-tooltip=你在本服務器合成過物品的次數
|
||||||
|
ItemsPickedUp=物品拾起數
|
||||||
|
ItemsPickedUp-tooltip=你在本服務器起過物品的次數
|
||||||
|
Kills=撃殺數
|
||||||
|
Kills-tooltip=你在本服務器殺過的敵人數量
|
||||||
|
Deaths=死亡次數
|
||||||
|
Deaths-tooltip=你在本服務器死過的數量
|
||||||
|
DamageDealt=傷害量
|
||||||
|
DamageDealt-tooltip=你在本伺服器對敵人所造成的傷害量
|
||||||
|
DistanceTravelled=移動距離
|
||||||
|
DistanceTravelled-tooltip=你在本服務器的總移動距離
|
||||||
|
CapsulesUsed=膠囊使用次數
|
||||||
|
CapsulesUsed-tooltip=你在本服務器使用過膠囊的次數
|
||||||
|
EntityRepaired=機器維修次數
|
||||||
|
EntityRepaired-tooltip=你在本服務器維修過機器的次數
|
||||||
|
DeconstructionPlannerUsed=拆除規劃器使用次數
|
||||||
|
DeconstructionPlannerUsed-tooltip=你在本服務器使用過拆除規劃器的次數
|
||||||
|
MapTagsMade=地圖標籤數量
|
||||||
|
MapTagsMade-tooltip=你在本服務器放過的地圖標籤數量
|
||||||
|
DamageDeathRatio=傷害死亡比
|
||||||
|
DamageDeathRatio-tooltip=傷害除以死亡
|
||||||
|
KillDeathRatio=撃殺死亡比
|
||||||
|
KillDeathRatio-tooltip=撃殺除以死亡
|
||||||
|
SessionTime=平均遊玩時間
|
||||||
|
SessionTime-tooltip=平均遊玩時間
|
||||||
|
BuildRatio=建築比
|
||||||
|
BuildRatio-tooltip=建築次數除以拆除次數
|
||||||
|
RocketPerHour=每小時火箭發射次數
|
||||||
|
RocketPerHour-tooltip=火箭發射次數除以遊玩時間
|
||||||
|
TreeKillPerMinute=每分鐘樹木拆除數
|
||||||
|
TreeKillPerMinute-tooltip=樹木拆除數除以遊玩時間
|
||||||
|
NetPlayTime=淨遊玩時間
|
||||||
|
NetPlayTime-tooltip=遊玩時間減掛機時間
|
||||||
|
AFKTimeRatio=掛機時間比
|
||||||
|
AFKTimeRatio-tooltip=掛機時間除以遊玩時間
|
||||||
|
Locale=語言
|
||||||
|
Locale-tooltip=用戶介面語言
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[expcore-data]
|
||||||
|
description-preference=允許寫入資料。
|
||||||
|
description-data=把用戶資料寫入電腦
|
||||||
|
arg-option="All", "Statistics", "Settings", "Required" 之中
|
||||||
|
set-preference=你的喜好已設定為 __1__ 。在你重新加入前將不會有任何改動。
|
||||||
|
get-preference=你的喜好為 __1__ 。使用 /set-preference 來更改,使用 /save-data 來獲得一份資料副本。
|
||||||
|
get-data=你的個人資料已寫入: factorio/script_output/expgaming_player_data.json
|
||||||
|
data-failed=無法載入你的個人資料,任何改動將不會保存。
|
||||||
|
data-restore=已載入你的個人資料,所有改動將會被保存。
|
||||||
|
preference=儲存喜好
|
||||||
|
preference-tooltip=那種資料將在退出時保存
|
||||||
|
preference-value-tooltip=使用 /set-preference 來更換儲存喜好
|
||||||
|
preference-All=所有資料都會被儲存
|
||||||
|
preference-Statistics=只有數據, 設定和資料會被儲存
|
||||||
|
preference-Settings=只有設定和資料會被儲存
|
||||||
|
preference-Required=只有需要的資料會被儲存
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
[player-list]
|
||||||
|
main-tooltip=用戶名單
|
||||||
|
open-action-bar=選項
|
||||||
|
close-action-bar=關閉選項
|
||||||
|
reason-confirm=確認原因
|
||||||
|
reason-entry=輸入原因
|
||||||
|
goto-player=傳送到用戶
|
||||||
|
bring-player=傳送用戶到自己
|
||||||
|
report-player=舉報用戶
|
||||||
|
jail-player=監禁用戶
|
||||||
|
kick-player=踢除用戶
|
||||||
|
ban-player=封禁用戶
|
||||||
|
afk-time=__1__% 地圖時間\n上次移動: __2__
|
||||||
|
open-map=__1__ __2__\n__3__\n按下打開地圖
|
||||||
|
|
||||||
|
[warp-list]
|
||||||
|
main-caption=傳送陣清單 [img=info]
|
||||||
|
main-tooltip=傳送陣清單
|
||||||
|
sub-tooltip=傳送陣在 __1__ 秒內只能使用一次。 亦需在 __2__ 格之內使用\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
||||||
|
sub-tooltip-current= - __1__ 你目前的傳送陣;
|
||||||
|
sub-tooltip-connected= - __1__ 你可以到本傳送陣;
|
||||||
|
sub-tooltip-different= - __1__ 該傳送陣未連接;
|
||||||
|
sub-tooltip-cooldown= - __1__ 傳送冷卻中;
|
||||||
|
sub-tooltip-not_available= - __1__ 你不在傳送陣範圍;
|
||||||
|
sub-tooltip-bypass= - __1__ 你可以傳送到這裏;
|
||||||
|
too-close=無法新建傳送陣; 太接近 __1__ 了
|
||||||
|
too-close-to-water=無法新建傳送陣; 太接近水源了, 請移動 __1__ 格又或者填平該地方
|
||||||
|
too-close-to-entities=無法新建傳送陣; 太接近其他東西, 請移動 __1__ 格又或者拆除該東西
|
||||||
|
last-edit=最後由 __1__ 在 __2__ 更改\n按這在地圖上看
|
||||||
|
add-tooltip=新建傳送陣
|
||||||
|
confirm-tooltip=儲存更改
|
||||||
|
cancel-tooltip=放棄更改
|
||||||
|
edit-tooltip=現被 __1__ 修改中
|
||||||
|
edit-tooltip-none=現沒有被人修改
|
||||||
|
remove-tooltip=拆除傳送陣
|
||||||
|
timer-tooltip=請等 __1__ 秒才再次傳送
|
||||||
|
timer-tooltip-zero=你要等 __1__ 秒才可以再次傳送
|
||||||
|
goto-tooltip=到 X __1__ Y __2__
|
||||||
|
goto-bypass=到 X __1__ Y __2__, 繞行模式
|
||||||
|
goto-bypass-different-network=到 X __1__ Y __2__, 繞行模式 (不同網絡)
|
||||||
|
goto-same-warp=你已在該傳送陣
|
||||||
|
goto-different-network=該傳送陣未連接, 你可使用電纜連接
|
||||||
|
goto-cooldown=傳送冷卻中, 請等候冷卻
|
||||||
|
goto-disabled=你不在傳送陣, 請移至任意傳送陣
|
||||||
|
goto-edit=修改傳送陣圖案
|
||||||
|
|
||||||
|
[bonus]
|
||||||
|
description=取得 / 設定 Bonus 量。
|
||||||
|
arg-amount=Bonus 數量, 0 來停用。
|
||||||
|
set=你的 Bonus 已設為 __1__。
|
||||||
|
get=你的 Bonus 為 __1__。
|
||||||
|
perm=你沒有足夠權限設多過 __1__。
|
||||||
|
display-fmms=挖掘速度
|
||||||
|
display-fmms-tooltip=勢力挖掘速度
|
||||||
|
display-frs=跑步速度
|
||||||
|
display-frs-tooltip=勢力跑步速度
|
||||||
|
display-fcs=合成速度
|
||||||
|
display-fcs-tooltip=勢力合成速度
|
||||||
|
display-fisb=儲存位
|
||||||
|
display-fisb-tooltip=勢力儲存位
|
||||||
|
display-fhb=生命
|
||||||
|
display-fhb-tooltip=勢力生命
|
||||||
|
display-frdb=到達距離
|
||||||
|
display-frdb-tooltip=勢力到達距離
|
||||||
|
display-fwrsm=機械人速度
|
||||||
|
display-fwrsm-tooltip=勢力機械人速度
|
||||||
|
display-fwrbm=機械人電力
|
||||||
|
display-fwrbm-tooltip=勢力機械人電力
|
||||||
|
display-fwrsb=械人儲存
|
||||||
|
display-fwrsb-tooltip=勢力機械人儲存
|
||||||
|
display-ffrlm=機械人生命
|
||||||
|
display-ffrlm-tooltip=勢力戰鬥機械人生命時間
|
||||||
|
|
||||||
|
[vlayer]
|
||||||
|
main-tooltip=Vlayer 介面
|
||||||
|
description-pbr=使用 Vlayer 為玩家電池充電
|
||||||
|
description-vi=Vlayer 資訊
|
||||||
|
pbr-not-running=vlayer 沒有運行
|
||||||
|
display-item-solar=[img=entity/solar-panel] 太陽能板
|
||||||
|
display-item-accumulator=[img=entity/accumulator] 蓄電池
|
||||||
|
display-current-production=[virtual-signal=signal-P] 現時產能
|
||||||
|
display-sustained-production=[virtual-signal=signal-S] 持續產能
|
||||||
|
display-max-capacity=[virtual-signal=signal-C] 電池容量
|
||||||
|
display-current-capacity=[virtual-signal=signal-E] 電池電量
|
||||||
|
display-remaining-surface-area=[virtual-signal=signal-R] 餘下土地
|
||||||
|
display-item-solar-tooltip=太陽能板數量
|
||||||
|
display-item-accumulator-tooltip=蓄電池數量
|
||||||
|
display-current-production-tooltip=現時電力產能
|
||||||
|
display-sustained-production-tooltip=持續電力產能
|
||||||
|
display-max-capacity-tooltip=電池最大容量
|
||||||
|
display-current-capacity-tooltip=現時電池電量
|
||||||
|
display-remaining-surface-area-tooltip=餘下土地。 放入堆填來增加
|
||||||
|
steel-chest-detect=沒檢測到鋼箱
|
||||||
|
steel-chest-empty=鋼箱不是空的
|
||||||
|
control-refresh=刷新列表
|
||||||
|
control-see=查看介面
|
||||||
|
control-build=建造介面
|
||||||
|
control-remove=拆除介面
|
||||||
|
result-build=建造了
|
||||||
|
result-remove=拆除了
|
||||||
|
result-interface-location=__1__ 介面在 __2__
|
||||||
|
interface-result=__1__ 在 __2__ __3__ __4__ 介面
|
||||||
|
result-unable=無法建造 __1__ 介面,因 __2__
|
||||||
|
result-multiple=檢測到多個鋼箱
|
||||||
|
result-limit=超出最大限制
|
||||||
|
result-space=空間不足
|
||||||
|
control-type-energy=電力
|
||||||
|
control-type-circuit=回路
|
||||||
|
control-type-storage-input=放入箱
|
||||||
|
control-type-storage-output=提取箱
|
||||||
|
power-on-space-research=你要研究 [technology=__1__] 在 __2__ 級 才可使用太空平台 vlayer 功能。
|
||||||
|
enter=現在進入 vlayer 區域選擇
|
||||||
|
exit=已進入 vlayer 區域選擇
|
||||||
|
|
||||||
|
[toolbar]
|
||||||
|
main-caption=工具箱
|
||||||
|
main-tooltip=工具箱設定\n選上來設定喜好
|
||||||
|
reset=重設
|
||||||
|
toggle=啟用喜好
|
||||||
|
move-up=向上
|
||||||
|
move-down=向下
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
# addons
|
|
||||||
[info]
|
|
||||||
players-online=現在有 __1__ 人在線
|
|
||||||
total-map-time=地圖時間為 __1__
|
|
||||||
discord=加入社群: __1__
|
|
||||||
website=訪問網站: __1__
|
|
||||||
status=伺服器狀態: __1__
|
|
||||||
github=增加功能或回報錯誤: __1__
|
|
||||||
patreon=支持我們: __1__
|
|
||||||
custom-commands=這裹使用了自制指令,如 /tag 和 /me。可使用 /chelp 查看更多。
|
|
||||||
read-readme=確保你已閱讀相關資訊。按左上 i 圖標可再次查看。
|
|
||||||
softmod=這裹用了自設情境,是一種軟裝模組。
|
|
||||||
redmew=We don't talk about redmew here; they beat us to 1000 members ;-;
|
|
||||||
lhd=列車必須是左則通行。這是本服務器長久以來的規則。
|
|
||||||
|
|
||||||
# data
|
|
||||||
[join-message]
|
|
||||||
description-add=設定 / 取得你的加入信息。
|
|
||||||
description-remove=移除你的加入信息。
|
|
||||||
arg-message=你的加入信息。
|
|
||||||
greet=[color=0,1,0] 歡迎來到 __1__ 的服務器! 若果你喜歡本服務器可加入 DISCORD: __2__ [/color]
|
|
||||||
message-set=你的加入信息已更新。
|
|
||||||
message-get=你的加入信息為: __1__
|
|
||||||
message-cleared=你的加入信息已清除。
|
|
||||||
|
|
||||||
[quickbar]
|
|
||||||
saved=你的工具列已儲存。
|
|
||||||
|
|
||||||
[exp-settings]
|
|
||||||
Colour=顏色
|
|
||||||
Colour-tooltip=你的人物顏色
|
|
||||||
Colour-value-tooltip=使用 /color 來更換你的人物顏色
|
|
||||||
JoinMessage=加入信息
|
|
||||||
JoinMessage-tooltip=你加入時所顯示的信息
|
|
||||||
JoinMessage-value-tooltip=使用 /join-message 來更換加入信息
|
|
||||||
QuickbarFilters=快捷欄
|
|
||||||
QuickbarFilters-tooltip=快捷欄的選項
|
|
||||||
QuickbarFilters-value-tooltip=使用 /save-quickbar 來更換快捷欄的選項
|
|
||||||
UsesAlt=細節模式
|
|
||||||
UsesAlt-tooltip=你加入時是否使用細節模式
|
|
||||||
UsesAlt-value-tooltip=按下 __CONTROL__show-info__ 來更改
|
|
||||||
UsesServerUps=服務器更新數 (SUPS)
|
|
||||||
UsesServerUps-tooltip=現在是否顯示服務器更新數 (SUPS)
|
|
||||||
UsesServerUps-value-tooltip=使用 /server-ups 來更換顯示
|
|
||||||
Tag=你的人物標籤
|
|
||||||
Tag-tooltip=你的人物標籤
|
|
||||||
Tag-value-tooltip=使用 /tag 來更換你的人物標籤
|
|
||||||
TagColor=人物標籤顏色
|
|
||||||
TagColor-tooltip=你的人物標籤顏色
|
|
||||||
TagColor-value-tooltip=使用 /tag-color 來更換你的人物標籤顏色
|
|
||||||
Bonus=人物附加屬性
|
|
||||||
Bonus-tooltip=你的人物附加屬性
|
|
||||||
Bonus-value-tooltip=使用 /bonus 來更改
|
|
||||||
HasEnabledDecon=快速拆除樹木
|
|
||||||
ToolbarState=工具箱
|
|
||||||
ToolbarState-tooltip=次序和喜愛項目
|
|
||||||
ToolbarState-value-tooltip=此值在離開時自動計算
|
|
||||||
|
|
||||||
[exp-statistics]
|
|
||||||
MapsPlayed=地圖遊玩次數
|
|
||||||
MapsPlayed-tooltip=你在本服務器遊玩過的地圖數
|
|
||||||
JoinCount=登入次數
|
|
||||||
JoinCount-tooltip=你在本服務器遊玩的次數
|
|
||||||
Playtime=遊玩時間
|
|
||||||
Playtime-tooltip=你在本服務器遊玩的時間
|
|
||||||
AfkTime=掛機時間
|
|
||||||
AfkTime-tooltip=你在本服務器掛機的時間
|
|
||||||
ChatMessages=傳送信息次數
|
|
||||||
ChatMessages-tooltip=你在本服務器發送信息的次數
|
|
||||||
CommandsUsed=使用指令次數
|
|
||||||
CommandsUsed-tooltip=你在本服務器使用指令的次數
|
|
||||||
RocketsLaunched=火箭發射次數
|
|
||||||
RocketsLaunched-tooltip=你在本服務器在線時所發射過火箭的次數
|
|
||||||
ResearchCompleted=研究次數
|
|
||||||
ResearchCompleted-tooltip=你在本服務器在線時完成研究的次數
|
|
||||||
MachinesBuilt=機器建造次數
|
|
||||||
MachinesBuilt-tooltip=你在本服務器建造過機器的次數
|
|
||||||
MachinesRemoved=機器拆除次數
|
|
||||||
MachinesRemoved-tooltip=你在本服務器拆除過機器的次數
|
|
||||||
TilesBuilt=地磚建造次數
|
|
||||||
TilesBuilt-tooltip=你在本服務器建造過地磚的次數
|
|
||||||
TilesRemoved=地磚拆除次數
|
|
||||||
TilesRemoved-tooltip=你在本服務器拆除過地磚的次數
|
|
||||||
TreesDestroyed=樹木拆除次數
|
|
||||||
TreesDestroyed-tooltip=你在本服務器拆除過樹木的次數
|
|
||||||
OreMined=挖礦次數
|
|
||||||
OreMined-tooltip=你在本服務器挖掘礦的次數
|
|
||||||
ItemsCrafted=物品合成數
|
|
||||||
ItemsCrafted-tooltip=你在本服務器合成過物品的次數
|
|
||||||
ItemsPickedUp=物品拾起數
|
|
||||||
ItemsPickedUp-tooltip=你在本服務器起過物品的次數
|
|
||||||
Kills=撃殺數
|
|
||||||
Kills-tooltip=你在本服務器殺過的敵人數量
|
|
||||||
Deaths=死亡次數
|
|
||||||
Deaths-tooltip=你在本服務器死過的數量
|
|
||||||
DamageDealt=傷害量
|
|
||||||
DamageDealt-tooltip=你在本伺服器對敵人所造成的傷害量
|
|
||||||
DistanceTravelled=移動距離
|
|
||||||
DistanceTravelled-tooltip=你在本服務器的總移動距離
|
|
||||||
CapsulesUsed=膠囊使用次數
|
|
||||||
CapsulesUsed-tooltip=你在本服務器使用過膠囊的次數
|
|
||||||
EntityRepaired=機器維修次數
|
|
||||||
EntityRepaired-tooltip=你在本服務器維修過機器的次數
|
|
||||||
DeconstructionPlannerUsed=拆除規劃器使用次數
|
|
||||||
DeconstructionPlannerUsed-tooltip=你在本服務器使用過拆除規劃器的次數
|
|
||||||
MapTagsMade=地圖標籤數量
|
|
||||||
MapTagsMade-tooltip=你在本服務器放過的地圖標籤數量
|
|
||||||
DamageDeathRatio=傷害死亡比
|
|
||||||
DamageDeathRatio-tooltip=傷害除以死亡
|
|
||||||
KillDeathRatio=撃殺死亡比
|
|
||||||
KillDeathRatio-tooltip=撃殺除以死亡
|
|
||||||
SessionTime=平均遊玩時間
|
|
||||||
SessionTime-tooltip=平均遊玩時間
|
|
||||||
BuildRatio=建築比
|
|
||||||
BuildRatio-tooltip=建築次數除以拆除次數
|
|
||||||
RocketPerHour=每小時火箭發射次數
|
|
||||||
RocketPerHour-tooltip=火箭發射次數除以遊玩時間
|
|
||||||
TreeKillPerMinute=每分鐘樹木拆除數
|
|
||||||
TreeKillPerMinute-tooltip=樹木拆除數除以遊玩時間
|
|
||||||
NetPlayTime=淨遊玩時間
|
|
||||||
NetPlayTime-tooltip=遊玩時間減掛機時間
|
|
||||||
AFKTimeRatio=掛機時間比
|
|
||||||
AFKTimeRatio-tooltip=掛機時間除以遊玩時間
|
|
||||||
Locale=語言
|
|
||||||
Locale-tooltip=用戶介面語言
|
|
||||||
|
|
||||||
# expcore
|
|
||||||
[expcore-data]
|
|
||||||
description-preference=允許寫入資料。
|
|
||||||
description-data=把用戶資料寫入電腦
|
|
||||||
arg-option="All", "Statistics", "Settings", "Required" 之中
|
|
||||||
set-preference=你的喜好已設定為 __1__ 。在你重新加入前將不會有任何改動。
|
|
||||||
get-preference=你的喜好為 __1__ 。使用 /set-preference 來更改,使用 /save-data 來獲得一份資料副本。
|
|
||||||
get-data=你的個人資料已寫入: factorio/script_output/expgaming_player_data.json
|
|
||||||
data-failed=無法載入你的個人資料,任何改動將不會保存。
|
|
||||||
data-restore=已載入你的個人資料,所有改動將會被保存。
|
|
||||||
preference=儲存喜好
|
|
||||||
preference-tooltip=那種資料將在退出時保存
|
|
||||||
preference-value-tooltip=使用 /set-preference 來更換儲存喜好
|
|
||||||
preference-All=所有資料都會被儲存
|
|
||||||
preference-Statistics=只有數據, 設定和資料會被儲存
|
|
||||||
preference-Settings=只有設定和資料會被儲存
|
|
||||||
preference-Required=只有需要的資料會被儲存
|
|
||||||
|
|
||||||
# gui
|
|
||||||
[player-list]
|
|
||||||
main-tooltip=用戶名單
|
|
||||||
open-action-bar=選項
|
|
||||||
close-action-bar=關閉選項
|
|
||||||
reason-confirm=確認原因
|
|
||||||
reason-entry=輸入原因
|
|
||||||
goto-player=傳送到用戶
|
|
||||||
bring-player=傳送用戶到自己
|
|
||||||
report-player=舉報用戶
|
|
||||||
jail-player=監禁用戶
|
|
||||||
kick-player=踢除用戶
|
|
||||||
ban-player=封禁用戶
|
|
||||||
afk-time=__1__% 地圖時間\n上次移動: __2__
|
|
||||||
open-map=__1__ __2__\n__3__\n按下打開地圖
|
|
||||||
|
|
||||||
[warp-list]
|
|
||||||
main-caption=傳送陣清單 [img=info]
|
|
||||||
main-tooltip=傳送陣清單
|
|
||||||
sub-tooltip=傳送陣在 __1__ 秒內只能使用一次。 亦需在 __2__ 格之內使用\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
|
||||||
sub-tooltip-current= - __1__ 你目前的傳送陣;
|
|
||||||
sub-tooltip-connected= - __1__ 你可以到本傳送陣;
|
|
||||||
sub-tooltip-different= - __1__ 該傳送陣未連接;
|
|
||||||
sub-tooltip-cooldown= - __1__ 傳送冷卻中;
|
|
||||||
sub-tooltip-not_available= - __1__ 你不在傳送陣範圍;
|
|
||||||
sub-tooltip-bypass= - __1__ 你可以傳送到這裏;
|
|
||||||
too-close=無法新建傳送陣; 太接近 __1__ 了
|
|
||||||
too-close-to-water=無法新建傳送陣; 太接近水源了, 請移動 __1__ 格又或者填平該地方
|
|
||||||
too-close-to-entities=無法新建傳送陣; 太接近其他東西, 請移動 __1__ 格又或者拆除該東西
|
|
||||||
last-edit=最後由 __1__ 在 __2__ 更改\n按這在地圖上看
|
|
||||||
add-tooltip=新建傳送陣
|
|
||||||
confirm-tooltip=儲存更改
|
|
||||||
cancel-tooltip=放棄更改
|
|
||||||
edit-tooltip=現被 __1__ 修改中
|
|
||||||
edit-tooltip-none=現沒有被人修改
|
|
||||||
remove-tooltip=拆除傳送陣
|
|
||||||
timer-tooltip=請等 __1__ 秒才再次傳送
|
|
||||||
timer-tooltip-zero=你要等 __1__ 秒才可以再次傳送
|
|
||||||
goto-tooltip=到 X __1__ Y __2__
|
|
||||||
goto-bypass=到 X __1__ Y __2__, 繞行模式
|
|
||||||
goto-bypass-different-network=到 X __1__ Y __2__, 繞行模式 (不同網絡)
|
|
||||||
goto-same-warp=你已在該傳送陣
|
|
||||||
goto-different-network=該傳送陣未連接, 你可使用電纜連接
|
|
||||||
goto-cooldown=傳送冷卻中, 請等候冷卻
|
|
||||||
goto-disabled=你不在傳送陣, 請移至任意傳送陣
|
|
||||||
goto-edit=修改傳送陣圖案
|
|
||||||
|
|
||||||
[bonus]
|
|
||||||
description=取得 / 設定 Bonus 量。
|
|
||||||
arg-amount=Bonus 數量, 0 來停用。
|
|
||||||
set=你的 Bonus 已設為 __1__。
|
|
||||||
get=你的 Bonus 為 __1__。
|
|
||||||
perm=你沒有足夠權限設多過 __1__。
|
|
||||||
display-fmms=挖掘速度
|
|
||||||
display-fmms-tooltip=勢力挖掘速度
|
|
||||||
display-frs=跑步速度
|
|
||||||
display-frs-tooltip=勢力跑步速度
|
|
||||||
display-fcs=合成速度
|
|
||||||
display-fcs-tooltip=勢力合成速度
|
|
||||||
display-fisb=儲存位
|
|
||||||
display-fisb-tooltip=勢力儲存位
|
|
||||||
display-fhb=生命
|
|
||||||
display-fhb-tooltip=勢力生命
|
|
||||||
display-frdb=到達距離
|
|
||||||
display-frdb-tooltip=勢力到達距離
|
|
||||||
display-fwrsm=機械人速度
|
|
||||||
display-fwrsm-tooltip=勢力機械人速度
|
|
||||||
display-fwrbm=機械人電力
|
|
||||||
display-fwrbm-tooltip=勢力機械人電力
|
|
||||||
display-fwrsb=械人儲存
|
|
||||||
display-fwrsb-tooltip=勢力機械人儲存
|
|
||||||
display-ffrlm=機械人生命
|
|
||||||
display-ffrlm-tooltip=勢力戰鬥機械人生命時間
|
|
||||||
|
|
||||||
[vlayer]
|
|
||||||
main-tooltip=vlayer
|
|
||||||
description-pbr=使用 Vlayer 為玩家電池充電
|
|
||||||
description-vi=Vlayer 資訊
|
|
||||||
pbr-not-running=vlayer 沒有運行
|
|
||||||
display-item-solar=[img=entity/solar-panel] 太陽能板
|
|
||||||
display-item-accumulator=[img=entity/accumulator] 蓄電池
|
|
||||||
display-current-production=[virtual-signal=signal-P] 現時產能
|
|
||||||
display-sustained-production=[virtual-signal=signal-S] 持續產能
|
|
||||||
display-max-capacity=[virtual-signal=signal-C] 電池容量
|
|
||||||
display-current-capacity=[virtual-signal=signal-E] 電池電量
|
|
||||||
display-remaining-surface-area=[virtual-signal=signal-R] 餘下土地
|
|
||||||
display-item-solar-tooltip=太陽能板數量
|
|
||||||
display-item-accumulator-tooltip=蓄電池數量
|
|
||||||
display-current-production-tooltip=現時電力產能
|
|
||||||
display-sustained-production-tooltip=持續電力產能
|
|
||||||
display-max-capacity-tooltip=電池最大容量
|
|
||||||
display-current-capacity-tooltip=現時電池電量
|
|
||||||
display-remaining-surface-area-tooltip=餘下土地。 放入堆填來增加
|
|
||||||
steel-chest-detect=沒檢測到鋼箱
|
|
||||||
steel-chest-empty=鋼箱不是空的
|
|
||||||
control-refresh=刷新列表
|
|
||||||
control-see=查看介面
|
|
||||||
control-build=建造介面
|
|
||||||
control-remove=拆除介面
|
|
||||||
result-build=建造了
|
|
||||||
result-remove=拆除了
|
|
||||||
result-interface-location=__1__ 介面在 __2__
|
|
||||||
interface-result=__1__ 在 __2__ __3__ __4__ 介面
|
|
||||||
result-unable=無法建造 __1__ 介面,因 __2__
|
|
||||||
result-multiple=檢測到多個鋼箱
|
|
||||||
result-limit=超出最大限制
|
|
||||||
result-space=空間不足
|
|
||||||
control-type-energy=電力
|
|
||||||
control-type-circuit=回路
|
|
||||||
control-type-storage-input=放入箱
|
|
||||||
control-type-storage-output=提取箱
|
|
||||||
power-on-space-research=你要研究 [technology=__1__] 在 __2__ 級 才可使用太空平台 vlayer 功能。
|
|
||||||
|
|
||||||
[toolbar]
|
|
||||||
main-caption=工具箱
|
|
||||||
main-tooltip=工具箱設定\n選上來設定喜好
|
|
||||||
reset=重設
|
|
||||||
toggle=啟用喜好
|
|
||||||
move-up=向上
|
|
||||||
move-down=向下
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
[links]
|
||||||
|
discord=https://discord.aperx.org
|
||||||
|
website=https://aperx.org
|
||||||
|
status=https://aperx.org
|
||||||
|
github=https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=https://aperx.org
|
||||||
|
|
||||||
|
[info]
|
||||||
|
players-online=現在有 __1__ 人在線
|
||||||
|
total-map-time=地圖時間為 __1__
|
||||||
|
discord=加入社群: https://discord.aperx.org
|
||||||
|
website=訪問網站: https://aperx.org
|
||||||
|
status=伺服器狀態: https://aperx.org
|
||||||
|
github=增加功能或回報錯誤: https://github.com/PHIDIAS0303/ExpCluster
|
||||||
|
patreon=支持我們: https://aperx.org
|
||||||
|
custom-commands=這裹使用了自制指令,如 /tag 和 /me。可使用 /chelp 查看更多。
|
||||||
|
read-readme=確保你已閱讀相關資訊。按左上 i 圖標可再次查看。
|
||||||
|
softmod=這裹用了自設情境,是一種軟裝模組。
|
||||||
|
redmew=
|
||||||
|
lhd=列車必須是左則通行。這是本服務器長久以來的規則。
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
[join-message]
|
||||||
|
description-add=設定 / 取得你的加入信息。
|
||||||
|
description-remove=移除你的加入信息。
|
||||||
|
arg-message=你的加入信息。
|
||||||
|
greet=[color=0,1,0] 歡迎來到 EXP 的服務器! 若果你喜歡本服務器可加入 DISCORD: __1__ [/color]
|
||||||
|
message-set=你的加入信息已更新。
|
||||||
|
message-get=你的加入信息為: __1__
|
||||||
|
message-cleared=你的加入信息已清除。
|
||||||
|
|
||||||
|
[quickbar]
|
||||||
|
saved=你的工具列已儲存。
|
||||||
|
|
||||||
|
[exp-settings]
|
||||||
|
Colour=顏色
|
||||||
|
Colour-tooltip=你的人物顏色
|
||||||
|
Colour-value-tooltip=使用 /color 來更換你的人物顏色
|
||||||
|
JoinMessage=加入信息
|
||||||
|
JoinMessage-tooltip=你加入時所顯示的信息
|
||||||
|
JoinMessage-value-tooltip=使用 /join-message 來更換加入信息
|
||||||
|
QuickbarFilters=快捷欄
|
||||||
|
QuickbarFilters-tooltip=快捷欄的選項
|
||||||
|
QuickbarFilters-value-tooltip=使用 /save-quickbar 來更換快捷欄的選項
|
||||||
|
UsesAlt=細節模式
|
||||||
|
UsesAlt-tooltip=你加入時是否使用細節模式
|
||||||
|
UsesAlt-value-tooltip=按下 __CONTROL__show-info__ 來更改
|
||||||
|
UsesServerUps=服務器更新數 (SUPS)
|
||||||
|
UsesServerUps-tooltip=現在是否顯示服務器更新數 (SUPS)
|
||||||
|
UsesServerUps-value-tooltip=使用 /server-ups 來更換顯示
|
||||||
|
Tag=你的人物標籤
|
||||||
|
Tag-tooltip=你的人物標籤
|
||||||
|
Tag-value-tooltip=使用 /tag 來更換你的人物標籤
|
||||||
|
TagColor=人物標籤顏色
|
||||||
|
TagColor-tooltip=你的人物標籤顏色
|
||||||
|
TagColor-value-tooltip=使用 /tag-color 來更換你的人物標籤顏色
|
||||||
|
Bonus=人物附加屬性
|
||||||
|
Bonus-tooltip=你的人物附加屬性
|
||||||
|
Bonus-value-tooltip=使用 /bonus 來更改
|
||||||
|
HasEnabledDecon=快速拆除樹木
|
||||||
|
ToolbarState=工具箱
|
||||||
|
ToolbarState-tooltip=次序和喜愛項目
|
||||||
|
ToolbarState-value-tooltip=此值在離開時自動計算
|
||||||
|
|
||||||
|
[exp-statistics]
|
||||||
|
MapsPlayed=地圖遊玩次數
|
||||||
|
MapsPlayed-tooltip=你在本服務器遊玩過的地圖數
|
||||||
|
JoinCount=登入次數
|
||||||
|
JoinCount-tooltip=你在本服務器遊玩的次數
|
||||||
|
Playtime=遊玩時間
|
||||||
|
Playtime-tooltip=你在本服務器遊玩的時間
|
||||||
|
AfkTime=掛機時間
|
||||||
|
AfkTime-tooltip=你在本服務器掛機的時間
|
||||||
|
ChatMessages=傳送信息次數
|
||||||
|
ChatMessages-tooltip=你在本服務器發送信息的次數
|
||||||
|
CommandsUsed=使用指令次數
|
||||||
|
CommandsUsed-tooltip=你在本服務器使用指令的次數
|
||||||
|
RocketsLaunched=火箭發射次數
|
||||||
|
RocketsLaunched-tooltip=你在本服務器在線時所發射過火箭的次數
|
||||||
|
ResearchCompleted=研究次數
|
||||||
|
ResearchCompleted-tooltip=你在本服務器在線時完成研究的次數
|
||||||
|
MachinesBuilt=機器建造次數
|
||||||
|
MachinesBuilt-tooltip=你在本服務器建造過機器的次數
|
||||||
|
MachinesRemoved=機器拆除次數
|
||||||
|
MachinesRemoved-tooltip=你在本服務器拆除過機器的次數
|
||||||
|
TilesBuilt=地磚建造次數
|
||||||
|
TilesBuilt-tooltip=你在本服務器建造過地磚的次數
|
||||||
|
TilesRemoved=地磚拆除次數
|
||||||
|
TilesRemoved-tooltip=你在本服務器拆除過地磚的次數
|
||||||
|
TreesDestroyed=樹木拆除次數
|
||||||
|
TreesDestroyed-tooltip=你在本服務器拆除過樹木的次數
|
||||||
|
OreMined=挖礦次數
|
||||||
|
OreMined-tooltip=你在本服務器挖掘礦的次數
|
||||||
|
ItemsCrafted=物品合成數
|
||||||
|
ItemsCrafted-tooltip=你在本服務器合成過物品的次數
|
||||||
|
ItemsPickedUp=物品拾起數
|
||||||
|
ItemsPickedUp-tooltip=你在本服務器起過物品的次數
|
||||||
|
Kills=撃殺數
|
||||||
|
Kills-tooltip=你在本服務器殺過的敵人數量
|
||||||
|
Deaths=死亡次數
|
||||||
|
Deaths-tooltip=你在本服務器死過的數量
|
||||||
|
DamageDealt=傷害量
|
||||||
|
DamageDealt-tooltip=你在本伺服器對敵人所造成的傷害量
|
||||||
|
DistanceTravelled=移動距離
|
||||||
|
DistanceTravelled-tooltip=你在本服務器的總移動距離
|
||||||
|
CapsulesUsed=膠囊使用次數
|
||||||
|
CapsulesUsed-tooltip=你在本服務器使用過膠囊的次數
|
||||||
|
EntityRepaired=機器維修次數
|
||||||
|
EntityRepaired-tooltip=你在本服務器維修過機器的次數
|
||||||
|
DeconstructionPlannerUsed=拆除規劃器使用次數
|
||||||
|
DeconstructionPlannerUsed-tooltip=你在本服務器使用過拆除規劃器的次數
|
||||||
|
MapTagsMade=地圖標籤數量
|
||||||
|
MapTagsMade-tooltip=你在本服務器放過的地圖標籤數量
|
||||||
|
DamageDeathRatio=傷害死亡比
|
||||||
|
DamageDeathRatio-tooltip=傷害除以死亡
|
||||||
|
KillDeathRatio=撃殺死亡比
|
||||||
|
KillDeathRatio-tooltip=撃殺除以死亡
|
||||||
|
SessionTime=平均遊玩時間
|
||||||
|
SessionTime-tooltip=平均遊玩時間
|
||||||
|
BuildRatio=建築比
|
||||||
|
BuildRatio-tooltip=建築次數除以拆除次數
|
||||||
|
RocketPerHour=每小時火箭發射次數
|
||||||
|
RocketPerHour-tooltip=火箭發射次數除以遊玩時間
|
||||||
|
TreeKillPerMinute=每分鐘樹木拆除數
|
||||||
|
TreeKillPerMinute-tooltip=樹木拆除數除以遊玩時間
|
||||||
|
NetPlayTime=淨遊玩時間
|
||||||
|
NetPlayTime-tooltip=遊玩時間減掛機時間
|
||||||
|
AFKTimeRatio=掛機時間比
|
||||||
|
AFKTimeRatio-tooltip=掛機時間除以遊玩時間
|
||||||
|
Locale=語言
|
||||||
|
Locale-tooltip=用戶介面語言
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
[expcore-data]
|
||||||
|
description-preference=允許寫入資料。
|
||||||
|
description-data=把用戶資料寫入電腦
|
||||||
|
arg-option="All", "Statistics", "Settings", "Required" 之中
|
||||||
|
set-preference=你的喜好已設定為 __1__ 。在你重新加入前將不會有任何改動。
|
||||||
|
get-preference=你的喜好為 __1__ 。使用 /set-preference 來更改,使用 /save-data 來獲得一份資料副本。
|
||||||
|
get-data=你的個人資料已寫入: factorio/script_output/expgaming_player_data.json
|
||||||
|
data-failed=無法載入你的個人資料,任何改動將不會保存。
|
||||||
|
data-restore=已載入你的個人資料,所有改動將會被保存。
|
||||||
|
preference=儲存喜好
|
||||||
|
preference-tooltip=那種資料將在退出時保存
|
||||||
|
preference-value-tooltip=使用 /set-preference 來更換儲存喜好
|
||||||
|
preference-All=所有資料都會被儲存
|
||||||
|
preference-Statistics=只有數據, 設定和資料會被儲存
|
||||||
|
preference-Settings=只有設定和資料會被儲存
|
||||||
|
preference-Required=只有需要的資料會被儲存
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
[player-list]
|
||||||
|
main-tooltip=用戶名單
|
||||||
|
open-action-bar=選項
|
||||||
|
close-action-bar=關閉選項
|
||||||
|
reason-confirm=確認原因
|
||||||
|
reason-entry=輸入原因
|
||||||
|
goto-player=傳送到用戶
|
||||||
|
bring-player=傳送用戶到自己
|
||||||
|
report-player=舉報用戶
|
||||||
|
jail-player=監禁用戶
|
||||||
|
kick-player=踢除用戶
|
||||||
|
ban-player=封禁用戶
|
||||||
|
afk-time=__1__% 地圖時間\n上次移動: __2__
|
||||||
|
open-map=__1__ __2__\n__3__\n按下打開地圖
|
||||||
|
|
||||||
|
[warp-list]
|
||||||
|
main-caption=傳送陣清單 [img=info]
|
||||||
|
main-tooltip=傳送陣清單
|
||||||
|
sub-tooltip=傳送陣在 __1__ 秒內只能使用一次。 亦需在 __2__ 格之內使用\n__3__\n__4__\n__5__\n__6__\n__7__\n__8__
|
||||||
|
sub-tooltip-current= - __1__ 你目前的傳送陣;
|
||||||
|
sub-tooltip-connected= - __1__ 你可以到本傳送陣;
|
||||||
|
sub-tooltip-different= - __1__ 該傳送陣未連接;
|
||||||
|
sub-tooltip-cooldown= - __1__ 傳送冷卻中;
|
||||||
|
sub-tooltip-not_available= - __1__ 你不在傳送陣範圍;
|
||||||
|
sub-tooltip-bypass= - __1__ 你可以傳送到這裏;
|
||||||
|
too-close=無法新建傳送陣; 太接近 __1__ 了
|
||||||
|
too-close-to-water=無法新建傳送陣; 太接近水源了, 請移動 __1__ 格又或者填平該地方
|
||||||
|
too-close-to-entities=無法新建傳送陣; 太接近其他東西, 請移動 __1__ 格又或者拆除該東西
|
||||||
|
last-edit=最後由 __1__ 在 __2__ 更改\n按這在地圖上看
|
||||||
|
add-tooltip=新建傳送陣
|
||||||
|
confirm-tooltip=儲存更改
|
||||||
|
cancel-tooltip=放棄更改
|
||||||
|
edit-tooltip=現被 __1__ 修改中
|
||||||
|
edit-tooltip-none=現沒有被人修改
|
||||||
|
remove-tooltip=拆除傳送陣
|
||||||
|
timer-tooltip=請等 __1__ 秒才再次傳送
|
||||||
|
timer-tooltip-zero=你要等 __1__ 秒才可以再次傳送
|
||||||
|
goto-tooltip=到 X __1__ Y __2__
|
||||||
|
goto-bypass=到 X __1__ Y __2__, 繞行模式
|
||||||
|
goto-bypass-different-network=到 X __1__ Y __2__, 繞行模式 (不同網絡)
|
||||||
|
goto-same-warp=你已在該傳送陣
|
||||||
|
goto-different-network=該傳送陣未連接, 你可使用電纜連接
|
||||||
|
goto-cooldown=傳送冷卻中, 請等候冷卻
|
||||||
|
goto-disabled=你不在傳送陣, 請移至任意傳送陣
|
||||||
|
goto-edit=修改傳送陣圖案
|
||||||
|
|
||||||
|
[bonus]
|
||||||
|
description=取得 / 設定 Bonus 量。
|
||||||
|
arg-amount=Bonus 數量, 0 來停用。
|
||||||
|
set=你的 Bonus 已設為 __1__。
|
||||||
|
get=你的 Bonus 為 __1__。
|
||||||
|
perm=你沒有足夠權限設多過 __1__。
|
||||||
|
display-fmms=挖掘速度
|
||||||
|
display-fmms-tooltip=勢力挖掘速度
|
||||||
|
display-frs=跑步速度
|
||||||
|
display-frs-tooltip=勢力跑步速度
|
||||||
|
display-fcs=合成速度
|
||||||
|
display-fcs-tooltip=勢力合成速度
|
||||||
|
display-fisb=儲存位
|
||||||
|
display-fisb-tooltip=勢力儲存位
|
||||||
|
display-fhb=生命
|
||||||
|
display-fhb-tooltip=勢力生命
|
||||||
|
display-frdb=到達距離
|
||||||
|
display-frdb-tooltip=勢力到達距離
|
||||||
|
display-fwrsm=機械人速度
|
||||||
|
display-fwrsm-tooltip=勢力機械人速度
|
||||||
|
display-fwrbm=機械人電力
|
||||||
|
display-fwrbm-tooltip=勢力機械人電力
|
||||||
|
display-fwrsb=械人儲存
|
||||||
|
display-fwrsb-tooltip=勢力機械人儲存
|
||||||
|
display-ffrlm=機械人生命
|
||||||
|
display-ffrlm-tooltip=勢力戰鬥機械人生命時間
|
||||||
|
|
||||||
|
[vlayer]
|
||||||
|
main-tooltip=Vlayer 介面
|
||||||
|
description-pbr=使用 Vlayer 為玩家電池充電
|
||||||
|
description-vi=Vlayer 資訊
|
||||||
|
pbr-not-running=vlayer 沒有運行
|
||||||
|
display-item-solar=[img=entity/solar-panel] 太陽能板
|
||||||
|
display-item-accumulator=[img=entity/accumulator] 蓄電池
|
||||||
|
display-current-production=[virtual-signal=signal-P] 現時產能
|
||||||
|
display-sustained-production=[virtual-signal=signal-S] 持續產能
|
||||||
|
display-max-capacity=[virtual-signal=signal-C] 電池容量
|
||||||
|
display-current-capacity=[virtual-signal=signal-E] 電池電量
|
||||||
|
display-remaining-surface-area=[virtual-signal=signal-R] 餘下土地
|
||||||
|
display-item-solar-tooltip=太陽能板數量
|
||||||
|
display-item-accumulator-tooltip=蓄電池數量
|
||||||
|
display-current-production-tooltip=現時電力產能
|
||||||
|
display-sustained-production-tooltip=持續電力產能
|
||||||
|
display-max-capacity-tooltip=電池最大容量
|
||||||
|
display-current-capacity-tooltip=現時電池電量
|
||||||
|
display-remaining-surface-area-tooltip=餘下土地。 放入堆填來增加
|
||||||
|
steel-chest-detect=沒檢測到鋼箱
|
||||||
|
steel-chest-empty=鋼箱不是空的
|
||||||
|
control-refresh=刷新列表
|
||||||
|
control-see=查看介面
|
||||||
|
control-build=建造介面
|
||||||
|
control-remove=拆除介面
|
||||||
|
result-build=建造了
|
||||||
|
result-remove=拆除了
|
||||||
|
result-interface-location=__1__ 介面在 __2__
|
||||||
|
interface-result=__1__ 在 __2__ __3__ __4__ 介面
|
||||||
|
result-unable=無法建造 __1__ 介面,因 __2__
|
||||||
|
result-multiple=檢測到多個鋼箱
|
||||||
|
result-limit=超出最大限制
|
||||||
|
result-space=空間不足
|
||||||
|
control-type-energy=電力
|
||||||
|
control-type-circuit=回路
|
||||||
|
control-type-storage-input=放入箱
|
||||||
|
control-type-storage-output=提取箱
|
||||||
|
power-on-space-research=你要研究 [technology=__1__] 在 __2__ 級 才可使用太空平台 vlayer 功能。
|
||||||
|
enter=現在進入 vlayer 區域選擇
|
||||||
|
exit=已進入 vlayer 區域選擇
|
||||||
|
|
||||||
|
[toolbar]
|
||||||
|
main-caption=工具箱
|
||||||
|
main-tooltip=工具箱設定\n選上來設定喜好
|
||||||
|
reset=重設
|
||||||
|
toggle=啟用喜好
|
||||||
|
move-up=向上
|
||||||
|
move-down=向下
|
||||||
@@ -2,7 +2,6 @@
|
|||||||
-- @data Greetings
|
-- @data Greetings
|
||||||
|
|
||||||
local config = require("modules.exp_legacy.config.join_messages") --- @dep config.join_messages
|
local config = require("modules.exp_legacy.config.join_messages") --- @dep config.join_messages
|
||||||
local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail
|
|
||||||
local Commands = require("modules/exp_commands")
|
local Commands = require("modules/exp_commands")
|
||||||
|
|
||||||
--- Stores the join message that the player have
|
--- Stores the join message that the player have
|
||||||
@@ -19,11 +18,7 @@ CustomMessages:on_load(function(player_name, player_message)
|
|||||||
if custom_message then
|
if custom_message then
|
||||||
game.print(custom_message, { color = player.color })
|
game.print(custom_message, { color = player.color })
|
||||||
else
|
else
|
||||||
player.print{
|
player.print{ "join-message.greet", { "links.discord" } }
|
||||||
"join-message.greet",
|
|
||||||
config_server_detail["community_name"],
|
|
||||||
config_server_detail["discord"]
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|||||||
@@ -405,10 +405,10 @@ local vlayer_gui_control_build = Gui.define("vlayer_gui_control_build")
|
|||||||
width = 200,
|
width = 200,
|
||||||
}:on_click(function(def, player, element)
|
}:on_click(function(def, player, element)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
player.print{ "exp_util.selection_exit", { "vlayer.main-tooltip" } }
|
player.print{ "vlayer.exit" }
|
||||||
else
|
else
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
player.print{ "exp_util.selection_enter", { "vlayer.main-tooltip" } }
|
player.print{ "vlayer.enter" }
|
||||||
end
|
end
|
||||||
|
|
||||||
vlayer_gui_list_refresh(player)
|
vlayer_gui_list_refresh(player)
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production"
|
"prepare": "tsc --build && webpack-cli --env production"
|
||||||
|
|||||||
+65
-1
@@ -1,6 +1,7 @@
|
|||||||
import { BaseControllerPlugin, InstanceRecord } from "@clusterio/controller";
|
import { BaseControllerPlugin, InstanceRecord } from "@clusterio/controller";
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
|
import { SeedRole, seedRoles, flattenSeedPermissions } from "./seed";
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
|
|
||||||
export class ControllerPlugin extends BaseControllerPlugin {
|
export class ControllerPlugin extends BaseControllerPlugin {
|
||||||
@@ -34,6 +35,7 @@ export class ControllerPlugin extends BaseControllerPlugin {
|
|||||||
|
|
||||||
this.controller.handle(messages.RoleListRequest, this.handleRoleListRequest.bind(this));
|
this.controller.handle(messages.RoleListRequest, this.handleRoleListRequest.bind(this));
|
||||||
this.controller.handle(messages.RoleMetaUpdateRequest, this.handleRoleMetaUpdateRequest.bind(this));
|
this.controller.handle(messages.RoleMetaUpdateRequest, this.handleRoleMetaUpdateRequest.bind(this));
|
||||||
|
this.controller.handle(messages.SeedRolesRequest, this.handleSeedRolesRequest.bind(this));
|
||||||
|
|
||||||
this.controller.handle(messages.AssignmentListRequest, this.handleAssignmentListRequest.bind(this));
|
this.controller.handle(messages.AssignmentListRequest, this.handleAssignmentListRequest.bind(this));
|
||||||
this.controller.handle(messages.AssignmentUpdateRequest, this.handleAssignmentUpdateRequest.bind(this));
|
this.controller.handle(messages.AssignmentUpdateRequest, this.handleAssignmentUpdateRequest.bind(this));
|
||||||
@@ -43,6 +45,68 @@ export class ControllerPlugin extends BaseControllerPlugin {
|
|||||||
await this.roleMeta.save();
|
await this.roleMeta.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Seeding
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the roles the scenario shipped with. Roles which already exist
|
||||||
|
* by name are reused and only gain the seed permissions.
|
||||||
|
*/
|
||||||
|
async handleSeedRolesRequest() {
|
||||||
|
for (const [index, seedRole] of seedRoles.entries()) {
|
||||||
|
const role = this.seedRole(seedRole);
|
||||||
|
if (!role) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.roleMeta.set(new messages.RoleMetaRecord(
|
||||||
|
role.id,
|
||||||
|
index + 1,
|
||||||
|
seedRole.priority ?? 0,
|
||||||
|
seedRole.shortHand,
|
||||||
|
"",
|
||||||
|
seedRole.color,
|
||||||
|
seedRole.autoAssignHours === undefined ? null : seedRole.autoAssignHours * 3600000,
|
||||||
|
seedRole.blockAutoAssign ?? false,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.info(`Seeded ${seedRoles.length} roles`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Find or create the clusterio role for a seed role, returns undefined if it has no role to use. */
|
||||||
|
seedRole(seedRole: SeedRole) {
|
||||||
|
const roles = this.controller.roles;
|
||||||
|
if (seedRole.isAdmin) {
|
||||||
|
return roles.get(lib.Role.DefaultAdminRoleId);
|
||||||
|
}
|
||||||
|
if (seedRole.isDefault) {
|
||||||
|
const defaultRoleId = this.controller.config.get("controller.default_role_id");
|
||||||
|
return defaultRoleId !== null ? roles.get(defaultRoleId) : undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const permissions = flattenSeedPermissions(seedRole);
|
||||||
|
for (const permission of permissions) {
|
||||||
|
if (!lib.permissions.has(permission)) {
|
||||||
|
this.logger.warn(`Seed role ${seedRole.name} grants unknown permission ${permission}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let role = [...roles.valuesMutable()].find(other => other.name === seedRole.name);
|
||||||
|
if (role) {
|
||||||
|
for (const permission of permissions) {
|
||||||
|
role.permissions.add(permission);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const id = Math.max(5, ...[...roles.keys()].map(other => other + 1));
|
||||||
|
role = new lib.Role(id, seedRole.name, "", permissions);
|
||||||
|
this.logger.info(`Created role ${seedRole.name}`);
|
||||||
|
}
|
||||||
|
roles.set(role);
|
||||||
|
return role;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Role properties
|
Role properties
|
||||||
*/
|
*/
|
||||||
|
|||||||
+4
-6
@@ -1,8 +1,5 @@
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
|
|
||||||
export * from "./messages.js";
|
|
||||||
export type { ControllerPlugin } from "./controller.js";
|
|
||||||
|
|
||||||
declare module "@clusterio/lib" {
|
declare module "@clusterio/lib" {
|
||||||
export interface InstanceConfigFields {
|
export interface InstanceConfigFields {
|
||||||
@@ -30,12 +27,13 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
|
|
||||||
messages.RoleListRequest,
|
messages.RoleListRequest,
|
||||||
messages.RoleMetaUpdateRequest,
|
messages.RoleMetaUpdateRequest,
|
||||||
|
messages.SeedRolesRequest,
|
||||||
|
|
||||||
messages.AssignmentListRequest,
|
messages.AssignmentListRequest,
|
||||||
messages.AssignmentUpdateRequest,
|
messages.AssignmentUpdateRequest,
|
||||||
],
|
],
|
||||||
|
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
instanceConfigFields: {
|
instanceConfigFields: {
|
||||||
"exp_roles.sync_mode": {
|
"exp_roles.sync_mode": {
|
||||||
description: "Synchronize in game roles with the controller",
|
description: "Synchronize in game roles with the controller",
|
||||||
@@ -45,7 +43,7 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
controllerEntrypoint: "./dist/node/controller.js",
|
controllerEntrypoint: "./dist/node/controller",
|
||||||
controllerConfigFields: {
|
controllerConfigFields: {
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { BaseInstancePlugin } from "@clusterio/host";
|
import { BaseInstancePlugin } from "@clusterio/host";
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
import * as messages from "./messages";
|
||||||
|
|
||||||
/** Sent by the lua side when roles are changed in game. */
|
/** Sent by the lua side when roles are changed in game. */
|
||||||
export type IpcAssignmentUpdate = {
|
export type IpcAssignmentUpdate = {
|
||||||
|
|||||||
@@ -365,6 +365,18 @@ export class RoleMetaUpdateRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Create the roles the scenario shipped with, see seed.ts. */
|
||||||
|
export class SeedRolesRequest {
|
||||||
|
declare ["constructor"]: typeof SeedRolesRequest;
|
||||||
|
static plugin = "exp_roles" as const;
|
||||||
|
static type = "request" as const;
|
||||||
|
static src = "control" as const;
|
||||||
|
static dst = "controller" as const;
|
||||||
|
static permission = "core.role.create" as const;
|
||||||
|
|
||||||
|
constructor() {}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Assignment requests
|
Assignment requests
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[exp-roles]
|
[exp-roles]
|
||||||
game-message-assign=__1__ has been assigned to __2__ by __3__
|
game-message-assign=__1__ has been assigned: __2__ by __3__
|
||||||
game-message-unassign=__1__ has been unassigned from __2__ by __3__
|
game-message-unassign=__1__ has been unassigned: __2__ by __3__
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[exp-roles]
|
[exp-roles]
|
||||||
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
|
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
|
||||||
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
|
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
[exp-roles]
|
[exp-roles]
|
||||||
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
|
game-message-assign=__1__ 已被 __3__ 指派到身分組 __2__
|
||||||
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
|
game-message-unassign=__1__ 已被 __3__ 取消指派到身分組 __2__
|
||||||
|
|||||||
@@ -5,11 +5,10 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production",
|
"prepare": "tsc --build && webpack-cli --env production",
|
||||||
"test": "tap --type-strip-only --disable-coverage --allow-empty-coverage test/*.test.js",
|
"test": "tap --disable-coverage --allow-empty-coverage test/*.test.js",
|
||||||
"coverage": "tap --coverage-report=text test/*.test.js"
|
"coverage": "tap --coverage-report=text test/*.test.js"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@@ -27,6 +26,7 @@
|
|||||||
"@clusterio/host": "workspace:^",
|
"@clusterio/host": "workspace:^",
|
||||||
"@clusterio/lib": "workspace:^",
|
"@clusterio/lib": "workspace:^",
|
||||||
"@clusterio/web_ui": "workspace:^",
|
"@clusterio/web_ui": "workspace:^",
|
||||||
|
"@expcluster/scenario": "workspace:^",
|
||||||
"@types/node": "catalog:",
|
"@types/node": "catalog:",
|
||||||
"@types/react": "catalog:",
|
"@types/react": "catalog:",
|
||||||
"antd": "catalog:",
|
"antd": "catalog:",
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import type * as lib from "@clusterio/lib";
|
import { RoleColor } from "./messages";
|
||||||
import { RoleColor } from "@expcluster/roles";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A role created by the seed, as the scenario defined it before roles moved to
|
* A role created by the seed, as the scenario defined it before roles moved to
|
||||||
@@ -20,23 +19,7 @@ export interface SeedRole {
|
|||||||
isAdmin?: boolean;
|
isAdmin?: boolean;
|
||||||
/** Name of the role whose permissions are also granted, applied recursively. */
|
/** Name of the role whose permissions are also granted, applied recursively. */
|
||||||
parent?: string;
|
parent?: string;
|
||||||
permissions: lib.PermissionName[];
|
permissions: string[];
|
||||||
/**
|
|
||||||
* Name of the seed group holders are placed in by their highest role.
|
|
||||||
* Without one the holders stay in Factorio's Default group.
|
|
||||||
*/
|
|
||||||
group?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A Factorio permission group created by the seed, as the scenario defined it
|
|
||||||
* before groups moved to the controller.
|
|
||||||
*/
|
|
||||||
export interface SeedGroup {
|
|
||||||
name: string;
|
|
||||||
/** When true the input actions are the only ones disallowed, otherwise the only ones allowed. */
|
|
||||||
isBlacklist: boolean;
|
|
||||||
inputActions: string[];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const seedRoles: SeedRole[] = [
|
export const seedRoles: SeedRole[] = [
|
||||||
@@ -49,7 +32,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Senior Administrator",
|
name: "Senior Administrator",
|
||||||
group: "Admin",
|
|
||||||
shortHand: "SAdmin",
|
shortHand: "SAdmin",
|
||||||
color: new RoleColor(233, 63, 233),
|
color: new RoleColor(233, 63, 233),
|
||||||
parent: "Administrator",
|
parent: "Administrator",
|
||||||
@@ -62,7 +44,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Administrator",
|
name: "Administrator",
|
||||||
group: "Admin",
|
|
||||||
shortHand: "Admin",
|
shortHand: "Admin",
|
||||||
color: new RoleColor(233, 63, 233),
|
color: new RoleColor(233, 63, 233),
|
||||||
parent: "Moderator",
|
parent: "Moderator",
|
||||||
@@ -74,7 +55,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Moderator",
|
name: "Moderator",
|
||||||
group: "Admin",
|
|
||||||
shortHand: "Mod",
|
shortHand: "Mod",
|
||||||
color: new RoleColor(0, 170, 0),
|
color: new RoleColor(0, 170, 0),
|
||||||
parent: "Trainee",
|
parent: "Trainee",
|
||||||
@@ -109,7 +89,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Trainee",
|
name: "Trainee",
|
||||||
group: "Admin",
|
|
||||||
shortHand: "TrMod",
|
shortHand: "TrMod",
|
||||||
color: new RoleColor(0, 170, 0),
|
color: new RoleColor(0, 170, 0),
|
||||||
parent: "Veteran",
|
parent: "Veteran",
|
||||||
@@ -141,7 +120,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Board Member",
|
name: "Board Member",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Board",
|
shortHand: "Board",
|
||||||
color: new RoleColor(247, 246, 54),
|
color: new RoleColor(247, 246, 54),
|
||||||
parent: "Sponsor",
|
parent: "Sponsor",
|
||||||
@@ -155,7 +133,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Senior Backer",
|
name: "Senior Backer",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Backer",
|
shortHand: "Backer",
|
||||||
color: new RoleColor(238, 172, 44),
|
color: new RoleColor(238, 172, 44),
|
||||||
parent: "Sponsor",
|
parent: "Sponsor",
|
||||||
@@ -163,7 +140,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Sponsor",
|
name: "Sponsor",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Spon",
|
shortHand: "Spon",
|
||||||
color: new RoleColor(238, 172, 44),
|
color: new RoleColor(238, 172, 44),
|
||||||
parent: "Supporter",
|
parent: "Supporter",
|
||||||
@@ -182,7 +158,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Supporter",
|
name: "Supporter",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Sup",
|
shortHand: "Sup",
|
||||||
color: new RoleColor(230, 99, 34),
|
color: new RoleColor(230, 99, 34),
|
||||||
parent: "Veteran",
|
parent: "Veteran",
|
||||||
@@ -197,7 +172,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Partner",
|
name: "Partner",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Part",
|
shortHand: "Part",
|
||||||
color: new RoleColor(140, 120, 200),
|
color: new RoleColor(140, 120, 200),
|
||||||
parent: "Veteran",
|
parent: "Veteran",
|
||||||
@@ -209,7 +183,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Veteran",
|
name: "Veteran",
|
||||||
group: "Trusted",
|
|
||||||
shortHand: "Vet",
|
shortHand: "Vet",
|
||||||
color: new RoleColor(140, 120, 200),
|
color: new RoleColor(140, 120, 200),
|
||||||
parent: "Member",
|
parent: "Member",
|
||||||
@@ -223,7 +196,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Member",
|
name: "Member",
|
||||||
group: "Standard",
|
|
||||||
shortHand: "Mem",
|
shortHand: "Mem",
|
||||||
color: new RoleColor(24, 172, 188),
|
color: new RoleColor(24, 172, 188),
|
||||||
parent: "Regular",
|
parent: "Regular",
|
||||||
@@ -245,7 +217,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Regular",
|
name: "Regular",
|
||||||
group: "Standard",
|
|
||||||
shortHand: "Reg",
|
shortHand: "Reg",
|
||||||
color: new RoleColor(79, 155, 163),
|
color: new RoleColor(79, 155, 163),
|
||||||
autoAssignHours: 3,
|
autoAssignHours: 3,
|
||||||
@@ -261,7 +232,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Jail",
|
name: "Jail",
|
||||||
group: "Restricted",
|
|
||||||
shortHand: "Jail",
|
shortHand: "Jail",
|
||||||
color: new RoleColor(50, 50, 50),
|
color: new RoleColor(50, 50, 50),
|
||||||
priority: 1,
|
priority: 1,
|
||||||
@@ -270,7 +240,6 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Guest",
|
name: "Guest",
|
||||||
group: "Guest",
|
|
||||||
shortHand: "",
|
shortHand: "",
|
||||||
color: new RoleColor(185, 187, 160),
|
color: new RoleColor(185, 187, 160),
|
||||||
isDefault: true,
|
isDefault: true,
|
||||||
@@ -278,59 +247,9 @@ export const seedRoles: SeedRole[] = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const adminDisallowed = [
|
|
||||||
"add_permission_group",
|
|
||||||
"delete_permission_group",
|
|
||||||
"edit_permission_group",
|
|
||||||
"import_permissions_string",
|
|
||||||
"map_editor_action",
|
|
||||||
"toggle_map_editor",
|
|
||||||
"change_multiplayer_config",
|
|
||||||
"set_heat_interface_mode",
|
|
||||||
"set_heat_interface_temperature",
|
|
||||||
"set_infinity_container_filter_item",
|
|
||||||
"set_infinity_container_remove_unfiltered_items",
|
|
||||||
"set_infinity_pipe_filter",
|
|
||||||
];
|
|
||||||
|
|
||||||
const trustedDisallowed = [
|
|
||||||
...adminDisallowed,
|
|
||||||
"admin_action",
|
|
||||||
];
|
|
||||||
|
|
||||||
const standardDisallowed = [
|
|
||||||
...trustedDisallowed,
|
|
||||||
"change_programmable_speaker_alert_parameters",
|
|
||||||
"drop_item",
|
|
||||||
"open_new_platform_button_from_rocket_silo",
|
|
||||||
"set_rocket_silo_send_to_orbit_automated_mode",
|
|
||||||
];
|
|
||||||
|
|
||||||
const guestDisallowed = [
|
|
||||||
...standardDisallowed,
|
|
||||||
"change_programmable_speaker_parameters",
|
|
||||||
"change_train_stop_station",
|
|
||||||
"remove_cables",
|
|
||||||
"remove_train_station",
|
|
||||||
"reset_assembling_machine",
|
|
||||||
"rotate_entity",
|
|
||||||
"launch_rocket",
|
|
||||||
"cancel_research",
|
|
||||||
"flush_opened_entity_fluid",
|
|
||||||
"flush_opened_entity_specific_fluid",
|
|
||||||
];
|
|
||||||
|
|
||||||
export const seedGroups: SeedGroup[] = [
|
|
||||||
{ name: "Admin", isBlacklist: true, inputActions: adminDisallowed },
|
|
||||||
{ name: "Trusted", isBlacklist: true, inputActions: trustedDisallowed },
|
|
||||||
{ name: "Standard", isBlacklist: true, inputActions: standardDisallowed },
|
|
||||||
{ name: "Guest", isBlacklist: true, inputActions: guestDisallowed },
|
|
||||||
{ name: "Restricted", isBlacklist: false, inputActions: ["write_to_console"] },
|
|
||||||
];
|
|
||||||
|
|
||||||
/** The permissions a seed role grants, including those of its parents. */
|
/** The permissions a seed role grants, including those of its parents. */
|
||||||
export function flattenSeedPermissions(role: SeedRole, roles = seedRoles) {
|
export function flattenSeedPermissions(role: SeedRole, roles = seedRoles) {
|
||||||
const permissions = new Set<lib.PermissionName>();
|
const permissions = new Set<string>();
|
||||||
const seen = new Set<string>();
|
const seen = new Set<string>();
|
||||||
let current: SeedRole | undefined = role;
|
let current: SeedRole | undefined = role;
|
||||||
while (current && !seen.has(current.name)) {
|
while (current && !seen.has(current.name)) {
|
||||||
@@ -1,14 +1,20 @@
|
|||||||
import t from "tap";
|
"use strict";
|
||||||
import * as lib from "@clusterio/lib";
|
const t = require("tap");
|
||||||
import { Controller } from "@clusterio/controller";
|
const lib = require("@clusterio/lib");
|
||||||
import { ControllerPlugin } from "../dist/node/controller.js";
|
const { Controller } = require("@clusterio/controller");
|
||||||
import * as messages from "../dist/node/messages.js";
|
const { ControllerPlugin } = require("../dist/node/controller");
|
||||||
|
const messages = require("../dist/node/messages");
|
||||||
|
const { seedRoles } = require("../dist/node/seed");
|
||||||
|
|
||||||
|
// Importing this defines the exp_scenario permissions the seed grants
|
||||||
|
require("@expcluster/scenario/dist/node/permissions");
|
||||||
|
|
||||||
// The controller validates message classes against the link registry
|
// The controller validates message classes against the link registry
|
||||||
lib.Link.register(messages.RoleUpdatedEvent);
|
lib.Link.register(messages.RoleUpdatedEvent);
|
||||||
lib.Link.register(messages.AssignmentUpdatedEvent);
|
lib.Link.register(messages.AssignmentUpdatedEvent);
|
||||||
lib.Link.register(messages.RoleListRequest);
|
lib.Link.register(messages.RoleListRequest);
|
||||||
lib.Link.register(messages.RoleMetaUpdateRequest);
|
lib.Link.register(messages.RoleMetaUpdateRequest);
|
||||||
|
lib.Link.register(messages.SeedRolesRequest);
|
||||||
lib.Link.register(messages.AssignmentListRequest);
|
lib.Link.register(messages.AssignmentListRequest);
|
||||||
lib.Link.register(messages.AssignmentUpdateRequest);
|
lib.Link.register(messages.AssignmentUpdateRequest);
|
||||||
|
|
||||||
@@ -223,5 +229,22 @@ t.test("class ControllerPlugin", t2 => {
|
|||||||
t3.strictSame(none, null, "nothing is replayed when up to date");
|
t3.strictSame(none, null, "nothing is replayed when up to date");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
t2.test(".handleSeedRolesRequest() creates the roles and reuses them by name", async t3 => {
|
||||||
|
const { plugin, controller } = await startPlugin(t3, {
|
||||||
|
roles: [role(0, "Cluster Admin", ["core.admin"]), role(1, "Player")],
|
||||||
|
});
|
||||||
|
|
||||||
|
await plugin.handleSeedRolesRequest();
|
||||||
|
t3.strictSame(controller.roles.size, seedRoles.length, "every seed role exists");
|
||||||
|
|
||||||
|
const moderator = [...controller.roles.values()].find(other => other.name === "Moderator");
|
||||||
|
t3.ok(moderator.permissions.has("exp_scenario.command.jail"), "parent permissions are flattened in");
|
||||||
|
t3.ok(plugin.roleMeta.get(moderator.id), "the role properties are created");
|
||||||
|
t3.strictSame(plugin.roleMeta.get(moderator.id).shortHand, "Mod", "the properties match the seed");
|
||||||
|
|
||||||
|
await plugin.handleSeedRolesRequest();
|
||||||
|
t3.strictSame(controller.roles.size, seedRoles.length, "seeding again reuses the roles");
|
||||||
|
});
|
||||||
|
|
||||||
t2.end();
|
t2.end();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
import t from "tap";
|
"use strict";
|
||||||
import * as lib from "@clusterio/lib";
|
const t = require("tap");
|
||||||
import { Instance } from "@clusterio/host";
|
const lib = require("@clusterio/lib");
|
||||||
import { InstancePlugin } from "../dist/node/instance.js";
|
const { Instance } = require("@clusterio/host");
|
||||||
import { plugin as pluginDeclaration } from "../dist/node/index.js";
|
const { InstancePlugin } = require("../dist/node/instance");
|
||||||
import * as messages from "../dist/node/messages.js";
|
const { plugin: pluginDeclaration } = require("../dist/node/index");
|
||||||
|
const messages = require("../dist/node/messages");
|
||||||
|
|
||||||
// The instance validates message classes against the link registry, and the
|
// The instance validates message classes against the link registry, and the
|
||||||
// plugin's config fields must be defined before an InstanceConfig can set them
|
// plugin's config fields must be defined before an InstanceConfig can set them
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import t from "tap";
|
"use strict";
|
||||||
import * as messages from "../dist/node/messages.js";
|
const t = require("tap");
|
||||||
import { testMatrix, testRoundTripJsonSerialisable } from "../../test/common.js";
|
const messages = require("../dist/node/messages");
|
||||||
|
const { testMatrix, testRoundTripJsonSerialisable } = require("../../test/common");
|
||||||
|
|
||||||
const fullMeta = new messages.RoleMetaRecord(
|
const fullMeta = new messages.RoleMetaRecord(
|
||||||
7, 3, 1, "Mod", "[Mod]", new messages.RoleColor(1, 2, 3), 3600000, true, 12345, false,
|
7, 3, 1, "Mod", "[Mod]", new messages.RoleColor(1, 2, 3), 3600000, true, 12345, false,
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
import path from "node:path";
|
"use strict";
|
||||||
import t from "tap";
|
const path = require("node:path");
|
||||||
import { reportLuaTests } from "../../test/lua/runner.js";
|
const t = require("tap");
|
||||||
|
const { reportLuaTests } = require("../../test/lua/runner");
|
||||||
|
|
||||||
const envFile = path.join(import.meta.dirname, "module", "env.lua");
|
const envFile = path.join(__dirname, "module", "env.lua");
|
||||||
|
|
||||||
// Each file runs in its own lua state, and each test in a fresh environment
|
// Each file runs in its own lua state, and each test in a fresh environment
|
||||||
t.test("control.lua", t2 => {
|
t.test("control.lua", t2 => {
|
||||||
for (const file of ["lookup.lua", "players.lua", "assignment.lua", "sync.lua", "holders.lua"]) {
|
for (const file of ["lookup.lua", "players.lua", "assignment.lua", "sync.lua", "holders.lua"]) {
|
||||||
t2.test(file, t3 => reportLuaTests(t3, envFile, path.join(import.meta.dirname, "module", file)));
|
t2.test(file, t3 => reportLuaTests(t3, envFile, path.join(__dirname, "module", file)));
|
||||||
}
|
}
|
||||||
t2.end();
|
t2.end();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,11 +1,10 @@
|
|||||||
import t from "tap";
|
"use strict";
|
||||||
import * as lib from "@clusterio/lib";
|
const t = require("tap");
|
||||||
import { seedRoles, seedGroups, flattenSeedPermissions } from "../dist/node/seed.js";
|
const lib = require("@clusterio/lib");
|
||||||
|
const { seedRoles, flattenSeedPermissions } = require("../dist/node/seed");
|
||||||
|
|
||||||
import { plugin } from "../dist/node/index.js";
|
// Importing this defines the exp_scenario permissions the seed grants
|
||||||
|
require("@expcluster/scenario/dist/node/permissions");
|
||||||
// Registering the plugin defines the permissions the seed grants
|
|
||||||
lib.registerPluginPermissions([plugin]);
|
|
||||||
|
|
||||||
t.test("seedRoles[] grant only defined permissions", t2 => {
|
t.test("seedRoles[] grant only defined permissions", t2 => {
|
||||||
for (const role of seedRoles) {
|
for (const role of seedRoles) {
|
||||||
@@ -24,29 +23,6 @@ t.test("seedRoles[] are unique with one default and one admin", t2 => {
|
|||||||
t2.end();
|
t2.end();
|
||||||
});
|
});
|
||||||
|
|
||||||
t.test("seedRoles[] are placed in defined groups", t2 => {
|
|
||||||
const groupNames = new Set(seedGroups.map(group => group.name));
|
|
||||||
for (const role of seedRoles) {
|
|
||||||
if (role.group !== undefined) {
|
|
||||||
t2.ok(groupNames.has(role.group), `${role.name} is placed in defined group ${role.group}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
t2.end();
|
|
||||||
});
|
|
||||||
|
|
||||||
t.test("seedGroups[] are unique", t2 => {
|
|
||||||
const names = seedGroups.map(group => group.name);
|
|
||||||
t2.strictSame(names.length, new Set(names).size, "names are unique");
|
|
||||||
for (const group of seedGroups) {
|
|
||||||
t2.strictSame(
|
|
||||||
group.inputActions.length,
|
|
||||||
new Set(group.inputActions).size,
|
|
||||||
`${group.name} lists each input action once`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
t2.end();
|
|
||||||
});
|
|
||||||
|
|
||||||
t.test("flattenSeedPermissions() inherits permissions from parent roles", t2 => {
|
t.test("flattenSeedPermissions() inherits permissions from parent roles", t2 => {
|
||||||
const byName = new Map(seedRoles.map(role => [role.name, role]));
|
const byName = new Map(seedRoles.map(role => [role.name, role]));
|
||||||
for (const role of seedRoles) {
|
for (const role of seedRoles) {
|
||||||
@@ -4,7 +4,7 @@ import { Button, Col, ColorPicker, Form, Input, InputNumber, Row, Switch, Toolti
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import { ControlContext, SectionHeader, useAccount, notifyErrorHandler } from "@clusterio/web_ui";
|
import { ControlContext, SectionHeader, useAccount, notifyErrorHandler } from "@clusterio/web_ui";
|
||||||
|
|
||||||
import { RoleColor, RoleMetaRecord, RoleMetaUpdateRequest } from "../../messages.js";
|
import { RoleColor, RoleMetaRecord, RoleMetaUpdateRequest } from "../../messages";
|
||||||
import type { WebPlugin } from "..";
|
import type { WebPlugin } from "..";
|
||||||
|
|
||||||
const MS_PER_HOUR = 3600000;
|
const MS_PER_HOUR = 3600000;
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
import React, { useContext, useState } from "react";
|
||||||
|
import { Button, Popconfirm } from "antd";
|
||||||
|
|
||||||
|
import { ControlContext, SectionHeader, useAccount, notifyErrorHandler } from "@clusterio/web_ui";
|
||||||
|
|
||||||
|
import { SeedRolesRequest } from "../../messages";
|
||||||
|
|
||||||
|
/** Button on the roles page which creates the roles the scenario shipped with. */
|
||||||
|
export default function SeedRoles() {
|
||||||
|
const control = useContext(ControlContext);
|
||||||
|
const account = useAccount();
|
||||||
|
const [seeding, setSeeding] = useState(false);
|
||||||
|
|
||||||
|
if (!account.hasPermission("core.role.create")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return <SectionHeader
|
||||||
|
title="ExpGaming Roles"
|
||||||
|
extra={<Popconfirm
|
||||||
|
title="Create the ExpGaming roles?"
|
||||||
|
description="Roles which already exist by name are kept and only gain permissions."
|
||||||
|
onConfirm={() => {
|
||||||
|
setSeeding(true);
|
||||||
|
control.send(new SeedRolesRequest())
|
||||||
|
.catch(notifyErrorHandler("Error seeding roles"))
|
||||||
|
.finally(() => setSeeding(false));
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Button loading={seeding}>Seed roles</Button>
|
||||||
|
</Popconfirm>}
|
||||||
|
/>;
|
||||||
|
}
|
||||||
@@ -2,9 +2,10 @@ import React, { useCallback, useSyncExternalStore } from "react";
|
|||||||
import { BaseWebPlugin } from "@clusterio/web_ui";
|
import { BaseWebPlugin } from "@clusterio/web_ui";
|
||||||
|
|
||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "../messages.js";
|
import * as messages from "../messages";
|
||||||
|
|
||||||
import RoleProperties from "./components/RoleProperties";
|
import RoleProperties from "./components/RoleProperties";
|
||||||
|
import SeedRoles from "./components/SeedRoles";
|
||||||
|
|
||||||
export class WebPlugin extends BaseWebPlugin {
|
export class WebPlugin extends BaseWebPlugin {
|
||||||
roles = new lib.MapSubscriber(messages.RoleUpdatedEvent, this.control);
|
roles = new lib.MapSubscriber(messages.RoleUpdatedEvent, this.control);
|
||||||
@@ -14,6 +15,7 @@ export class WebPlugin extends BaseWebPlugin {
|
|||||||
// does not carry in its type
|
// does not carry in its type
|
||||||
this.componentExtra = {
|
this.componentExtra = {
|
||||||
RoleViewPage: RoleProperties as React.ComponentType,
|
RoleViewPage: RoleProperties as React.ComponentType,
|
||||||
|
RolesPage: SeedRoles,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,157 +1,6 @@
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import { BaseControllerPlugin } from "@clusterio/controller";
|
import { BaseControllerPlugin } from "@clusterio/controller";
|
||||||
import { RoleMetaRecord, type ControllerPlugin as RolesPlugin } from "@expcluster/roles";
|
|
||||||
import {
|
|
||||||
GroupRecord, GroupPermissions, RoleMappingRecord, type ControllerPlugin as GroupsPlugin,
|
|
||||||
} from "@expcluster/permission-groups";
|
|
||||||
import * as messages from "./messages.js";
|
|
||||||
import { SeedRole, SeedGroup, seedRoles, seedGroups, flattenSeedPermissions } from "./seed.js";
|
|
||||||
|
|
||||||
export class ControllerPlugin extends BaseControllerPlugin {
|
export class ControllerPlugin extends BaseControllerPlugin {
|
||||||
async init() {
|
|
||||||
this.controller.handle(messages.SeedRequest, this.handleSeedRequest.bind(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create the roles and permission groups the scenario shipped with.
|
|
||||||
*
|
|
||||||
* Roles which already exist by name are reused and only gain the seed
|
|
||||||
* permissions, groups which already exist by name are reset to the seed.
|
|
||||||
*/
|
|
||||||
async handleSeedRequest() {
|
|
||||||
const rolesPlugin = this.controller.plugins.get("exp_roles") as RolesPlugin | undefined;
|
|
||||||
const groupsPlugin = this.controller.plugins.get("exp_groups") as GroupsPlugin | undefined;
|
|
||||||
if (!rolesPlugin || !groupsPlugin) {
|
|
||||||
throw new lib.RequestError("Seeding requires the exp_roles and exp_groups plugins");
|
|
||||||
}
|
|
||||||
|
|
||||||
const roleIds = new Map<string, number>();
|
|
||||||
for (const [index, seedRole] of seedRoles.entries()) {
|
|
||||||
const role = this.seedRole(seedRole);
|
|
||||||
if (!role) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
roleIds.set(seedRole.name, role.id);
|
|
||||||
rolesPlugin.roleMeta.set(new RoleMetaRecord(
|
|
||||||
role.id,
|
|
||||||
index + 1,
|
|
||||||
seedRole.priority ?? 0,
|
|
||||||
seedRole.shortHand,
|
|
||||||
"",
|
|
||||||
seedRole.color,
|
|
||||||
seedRole.autoAssignHours === undefined ? null : seedRole.autoAssignHours * 3600000,
|
|
||||||
seedRole.blockAutoAssign ?? false,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
const groupIds = new Map<string, number>();
|
|
||||||
for (const seedGroup of seedGroups) {
|
|
||||||
groupIds.set(seedGroup.name, this.seedGroup(groupsPlugin, seedGroup).id);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.seedRoleMappings(groupsPlugin, roleIds, groupIds);
|
|
||||||
this.logger.info(`Seeded ${roleIds.size} roles and ${groupIds.size} permission groups`);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Find or create the clusterio role for a seed role, returns undefined if it has no role to use. */
|
|
||||||
seedRole(seedRole: SeedRole) {
|
|
||||||
const roles = this.controller.roles;
|
|
||||||
if (seedRole.isAdmin) {
|
|
||||||
return roles.get(lib.Role.DefaultAdminRoleId);
|
|
||||||
}
|
|
||||||
if (seedRole.isDefault) {
|
|
||||||
const defaultRoleId = this.controller.config.get("controller.default_role_id");
|
|
||||||
return defaultRoleId !== null ? roles.get(defaultRoleId) : undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const permissions = flattenSeedPermissions(seedRole);
|
|
||||||
for (const permission of permissions) {
|
|
||||||
if (!lib.permissions.has(permission)) {
|
|
||||||
this.logger.warn(`Seed role ${seedRole.name} grants unknown permission ${permission}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let role = [...roles.valuesMutable()].find(other => other.name === seedRole.name);
|
|
||||||
if (role) {
|
|
||||||
for (const permission of permissions) {
|
|
||||||
role.permissions.add(permission);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const id = Math.max(5, ...[...roles.keys()].map(other => other + 1));
|
|
||||||
role = new lib.Role(id, seedRole.name, "", permissions);
|
|
||||||
this.logger.info(`Created role ${seedRole.name}`);
|
|
||||||
}
|
|
||||||
roles.set(role);
|
|
||||||
return role;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Find or create the permission group for a seed group. */
|
|
||||||
seedGroup(groupsPlugin: GroupsPlugin, seedGroup: SeedGroup) {
|
|
||||||
const permissions = new GroupPermissions(seedGroup.isBlacklist, [...seedGroup.inputActions]);
|
|
||||||
const existing = [...groupsPlugin.groups.values()].find(other => other.name === seedGroup.name);
|
|
||||||
const group = new GroupRecord(existing?.id ?? newId(groupsPlugin.groups), seedGroup.name, permissions);
|
|
||||||
if (!existing) {
|
|
||||||
this.logger.info(`Created permission group ${seedGroup.name}`);
|
|
||||||
}
|
|
||||||
groupsPlugin.groups.set(group);
|
|
||||||
return group;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Map each seed role onto its seed group.
|
|
||||||
*
|
|
||||||
* The mapping with the highest priority decides a player's group, so the
|
|
||||||
* priorities follow how exp_roles picks a player's highest role: role
|
|
||||||
* priority first, then the role order.
|
|
||||||
*/
|
|
||||||
seedRoleMappings(groupsPlugin: GroupsPlugin, roleIds: Map<string, number>, groupIds: Map<string, number>) {
|
|
||||||
// Lowest role first, so the mapping priority rises with the role
|
|
||||||
const ranked = seedRoles
|
|
||||||
.filter(seedRole => seedRole.group !== undefined && roleIds.has(seedRole.name))
|
|
||||||
.reverse()
|
|
||||||
.sort((a, b) => (a.priority ?? 0) - (b.priority ?? 0));
|
|
||||||
const seededRoleIds = new Set(ranked.map(seedRole => roleIds.get(seedRole.name)!));
|
|
||||||
|
|
||||||
// A mapping of a single seed role is reused, every other mapping keeps its priority
|
|
||||||
const existing = new Map<number, RoleMappingRecord>();
|
|
||||||
const taken = new Set<number>();
|
|
||||||
for (const mapping of groupsPlugin.roleMappings.values()) {
|
|
||||||
const [roleId] = mapping.roleIds;
|
|
||||||
if (mapping.roleIds.size === 1 && seededRoleIds.has(roleId)) {
|
|
||||||
existing.set(roleId, mapping);
|
|
||||||
} else {
|
|
||||||
taken.add(mapping.priority);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const mappings = [];
|
|
||||||
let priority = 0;
|
|
||||||
for (const seedRole of ranked) {
|
|
||||||
priority += 1;
|
|
||||||
while (taken.has(priority)) {
|
|
||||||
priority += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
const roleId = roleIds.get(seedRole.name)!;
|
|
||||||
mappings.push(new RoleMappingRecord(
|
|
||||||
existing.get(roleId)?.id ?? newId(groupsPlugin.roleMappings),
|
|
||||||
new Set([roleId]),
|
|
||||||
groupIds.get(seedRole.group!)!,
|
|
||||||
priority,
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
groupsPlugin.roleMappings.setMany(mappings);
|
|
||||||
return mappings;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function newId(datastore: { has(id: number): boolean }) {
|
|
||||||
let id = Math.random() * 2 ** 31 | 0;
|
|
||||||
while (datastore.has(id)) {
|
|
||||||
id = Math.random() * 2 ** 31 | 0;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|||||||
+24
-30
@@ -1,45 +1,39 @@
|
|||||||
import * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
import * as messages from "./messages.js";
|
// import * as Messages from "./messages";
|
||||||
import { permissions as scenarioPermissions, type ScenarioPermissionName } from "./permissions.js";
|
|
||||||
|
// Defines a permission for every in game action and role flag used by the scenario
|
||||||
|
import "./permissions";
|
||||||
|
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_scenario.config.view",
|
||||||
|
title: "View ExpScenario Config",
|
||||||
|
description: "View the config for all submodules of ExpScenario",
|
||||||
|
});
|
||||||
|
|
||||||
|
lib.definePermission({
|
||||||
|
name: "exp_scenario.config.edit",
|
||||||
|
title: "Edit ExpScenario Config",
|
||||||
|
description: "Edit the config for all submodules of ExpScenario",
|
||||||
|
});
|
||||||
|
|
||||||
declare module "@clusterio/lib" {
|
declare module "@clusterio/lib" {
|
||||||
// Everything checked in game through exp_roles, plus the permissions checked on the controller
|
|
||||||
export interface Permissions extends Record<ScenarioPermissionName, never> {
|
|
||||||
"exp_scenario.config.view": never;
|
|
||||||
"exp_scenario.config.edit": never;
|
|
||||||
"exp_scenario.seed": never;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export const plugin: lib.PluginDeclaration = {
|
export const plugin: lib.PluginDeclaration = {
|
||||||
name: "exp_scenario",
|
name: "exp_scenario",
|
||||||
title: "exp_scenario",
|
title: "exp_scenario",
|
||||||
description: "Example Description. Plugin. Change me in index.ts",
|
description: "Example Description. Plugin. Change me in index.ts",
|
||||||
controllerEntrypoint: "./dist/node/controller.js",
|
controllerEntrypoint: "./dist/node/controller",
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
|
|
||||||
|
/*
|
||||||
messages: [
|
messages: [
|
||||||
messages.SeedRequest,
|
|
||||||
],
|
|
||||||
|
|
||||||
permissions: [
|
|
||||||
...scenarioPermissions,
|
|
||||||
{
|
|
||||||
name: "exp_scenario.config.view",
|
|
||||||
title: "View ExpScenario Config",
|
|
||||||
description: "View the config for all submodules of ExpScenario",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_scenario.config.edit",
|
|
||||||
title: "Edit ExpScenario Config",
|
|
||||||
description: "Edit the config for all submodules of ExpScenario",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "exp_scenario.seed",
|
|
||||||
title: "Seed ExpScenario roles and groups",
|
|
||||||
description: "Create the roles and permission groups the scenario shipped with",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
|
|
||||||
webEntrypoint: "./web",
|
webEntrypoint: "./web",
|
||||||
|
routes: [
|
||||||
|
"/exp_scenario",
|
||||||
|
],
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,11 +1,95 @@
|
|||||||
/** Create the roles and permission groups the scenario shipped with, see seed.ts. */
|
import { plainJson, jsonArray, JsonBoolean, JsonNumber, JsonString, StringEnum } from "@clusterio/lib";
|
||||||
export class SeedRequest {
|
import { Type, Static } from "@sinclair/typebox";
|
||||||
declare ["constructor"]: typeof SeedRequest;
|
|
||||||
static plugin = "exp_scenario" as const;
|
|
||||||
static type = "request" as const;
|
|
||||||
static src = "control" as const;
|
|
||||||
static dst = "controller" as const;
|
|
||||||
static permission = "exp_scenario.seed" as const;
|
|
||||||
|
|
||||||
constructor() {}
|
export class PluginExampleEvent {
|
||||||
|
declare ["constructor"]: typeof PluginExampleEvent;
|
||||||
|
static type = "event" as const;
|
||||||
|
static src = ["host", "control"] as const;
|
||||||
|
static dst = ["controller", "host", "instance"] as const;
|
||||||
|
static plugin = "exp_scenario" as const;
|
||||||
|
static permission = "exp_scenario.example.permission.event";
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public myString: string,
|
||||||
|
public myNumberArray: number[],
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
static jsonSchema = Type.Object({
|
||||||
|
"myString": Type.String(),
|
||||||
|
"myNumberArray": Type.Array(Type.Number()),
|
||||||
|
});
|
||||||
|
|
||||||
|
static fromJSON(json: Static<typeof PluginExampleEvent.jsonSchema>) {
|
||||||
|
return new PluginExampleEvent(json.myString, json.myNumberArray);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class PluginExampleRequest {
|
||||||
|
declare ["constructor"]: typeof PluginExampleRequest;
|
||||||
|
static type = "request" as const;
|
||||||
|
static src = ["host", "control"] as const;
|
||||||
|
static dst = ["controller", "host", "instance"] as const;
|
||||||
|
static plugin = "exp_scenario" as const;
|
||||||
|
static permission = "exp_scenario.example.permission.request";
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public myString: string,
|
||||||
|
public myNumberArray: number[],
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
static jsonSchema = Type.Object({
|
||||||
|
"myString": Type.String(),
|
||||||
|
"myNumberArray": Type.Array(Type.Number()),
|
||||||
|
});
|
||||||
|
|
||||||
|
static fromJSON(json: Static<typeof PluginExampleRequest.jsonSchema>) {
|
||||||
|
return new PluginExampleRequest(json.myString, json.myNumberArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Response = plainJson(Type.Object({
|
||||||
|
"myResponseString": Type.String(),
|
||||||
|
"myResponseNumbers": Type.Array(Type.Number()),
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ExampleSubscribableValue {
|
||||||
|
constructor(
|
||||||
|
public id: string,
|
||||||
|
public updatedAtMs: number,
|
||||||
|
public isDeleted: boolean,
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
static jsonSchema = Type.Object({
|
||||||
|
id: Type.String(),
|
||||||
|
updatedAtMs: Type.Number(),
|
||||||
|
isDeleted: Type.Boolean(),
|
||||||
|
});
|
||||||
|
|
||||||
|
static fromJSON(json: Static<typeof this.jsonSchema>) {
|
||||||
|
return new this(json.id, json.updatedAtMs, json.isDeleted);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ExampleSubscribableUpdate {
|
||||||
|
declare ["constructor"]: typeof ExampleSubscribableUpdate;
|
||||||
|
static type = "event" as const;
|
||||||
|
static src = "controller" as const;
|
||||||
|
static dst = "control" as const;
|
||||||
|
static plugin = "exp_scenario" as const;
|
||||||
|
static permission = "exp_scenario.example.permission.subscribe";
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
public updates: ExampleSubscribableValue[],
|
||||||
|
) { }
|
||||||
|
|
||||||
|
static jsonSchema = Type.Object({
|
||||||
|
"updates": Type.Array(ExampleSubscribableValue.jsonSchema),
|
||||||
|
});
|
||||||
|
|
||||||
|
static fromJSON(json: Static<typeof this.jsonSchema>) {
|
||||||
|
return new this(json.updates.map(update => ExampleSubscribableValue.fromJSON(update)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ local add_static, add_dynamic = Commands.add_rcon_static, Commands.add_rcon_dyna
|
|||||||
|
|
||||||
add_static("Gui", require("modules/exp_gui"))
|
add_static("Gui", require("modules/exp_gui"))
|
||||||
|
|
||||||
|
add_static("Group", require("modules.exp_legacy.expcore.permission_groups"))
|
||||||
add_static("Roles", require("modules/exp_roles"))
|
add_static("Roles", require("modules/exp_roles"))
|
||||||
add_static("Datastore", require("modules.exp_legacy.expcore.datastore"))
|
add_static("Datastore", require("modules.exp_legacy.expcore.datastore"))
|
||||||
add_static("External", require("modules.exp_legacy.expcore.external"))
|
add_static("External", require("modules.exp_legacy.expcore.external"))
|
||||||
|
|||||||
@@ -39,10 +39,10 @@ end
|
|||||||
commands.artillery = Commands.new("artillery", { "exp-commands_artillery.description" })
|
commands.artillery = Commands.new("artillery", { "exp-commands_artillery.description" })
|
||||||
:register(function(player)
|
:register(function(player)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
return Commands.status.success{ "exp_util.selection_exit", { "exp-commands_artillery.selection-name" } }
|
return Commands.status.success{ "exp-commands_artillery.exit" }
|
||||||
end
|
end
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
return Commands.status.success{ "exp_util.selection_enter", { "exp-commands_artillery.selection-name" } }
|
return Commands.status.success{ "exp-commands_artillery.enter" }
|
||||||
end) --[[@as any]]
|
end) --[[@as any]]
|
||||||
|
|
||||||
--- when an area is selected to add protection to the area
|
--- when an area is selected to add protection to the area
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ local commands = {}
|
|||||||
commands.lawnmower = Commands.new("lawnmower", { "exp-commands_lawnmower.description" })
|
commands.lawnmower = Commands.new("lawnmower", { "exp-commands_lawnmower.description" })
|
||||||
:register(function(player)
|
:register(function(player)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
return Commands.status.success{ "exp_util.selection_exit", { "exp-commands_lawnmower.selection-name" } }
|
return Commands.status.success{ "exp-commands_lawnmower.exit" }
|
||||||
end
|
end
|
||||||
|
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
return Commands.status.success{ "exp_util.selection_enter", { "exp-commands_lawnmower.selection-name" } }
|
return Commands.status.success{ "exp-commands_lawnmower.enter" }
|
||||||
end) --[[@as any]]
|
end) --[[@as any]]
|
||||||
|
|
||||||
--- When an area is selected to be handled
|
--- When an area is selected to be handled
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ local commands = {}
|
|||||||
commands.repair = Commands.new("repair", { "exp-commands_repair.description" })
|
commands.repair = Commands.new("repair", { "exp-commands_repair.description" })
|
||||||
:register(function(player)
|
:register(function(player)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
return Commands.status.success{ "exp_util.selection_exit", { "exp-commands_repair.selection-name" } }
|
return Commands.status.success{ "exp-commands_repair.exit" }
|
||||||
end
|
end
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
return Commands.status.success{ "exp_util.selection_enter", { "exp-commands_repair.selection-name" } }
|
return Commands.status.success{ "exp-commands_repair.enter" }
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--- When an area is selected to be converted to water
|
--- When an area is selected to be converted to water
|
||||||
|
|||||||
@@ -64,10 +64,11 @@ commands.clear_blueprints_surface = Commands.new("clear-blueprints-surface", { "
|
|||||||
commands.clear_blueprints = Commands.new("clear-blueprints", { "exp-commands_surface.description-blueprints" })
|
commands.clear_blueprints = Commands.new("clear-blueprints", { "exp-commands_surface.description-blueprints" })
|
||||||
:register(function(player)
|
:register(function(player)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
return Commands.status.success{ "exp_util.selection_exit", { "exp-commands_surface.selection-name" } }
|
return Commands.status.success{ "exp-commands_surface.exit" }
|
||||||
end
|
end
|
||||||
|
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
return Commands.status.success{ "exp_util.selection_enter", { "exp-commands_surface.selection-name" } }
|
return Commands.status.success{ "exp-commands_surface.enter" }
|
||||||
end) --[[@as any]]
|
end) --[[@as any]]
|
||||||
|
|
||||||
--- When an area is selected
|
--- When an area is selected
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ local commands = {}
|
|||||||
commands.waterfill = Commands.new("waterfill", { "exp-commands_waterfill.description" })
|
commands.waterfill = Commands.new("waterfill", { "exp-commands_waterfill.description" })
|
||||||
:register(function(player)
|
:register(function(player)
|
||||||
if SelectArea:stop(player) then
|
if SelectArea:stop(player) then
|
||||||
return Commands.status.success{ "exp_util.selection_exit", { "exp-commands_lawnmower.selection-name" } }
|
return Commands.status.success{ "exp-commands_waterfill.exit" }
|
||||||
end
|
end
|
||||||
local item_count_cliff = player.get_item_count("cliff-explosives")
|
local item_count_cliff = player.get_item_count("cliff-explosives")
|
||||||
local item_count_craft = math.min(math.floor(player.get_item_count("explosives") / 10), player.get_item_count("barrel"), player.get_item_count("grenade"))
|
local item_count_craft = math.min(math.floor(player.get_item_count("explosives") / 10), player.get_item_count("barrel"), player.get_item_count("grenade"))
|
||||||
@@ -34,7 +34,7 @@ commands.waterfill = Commands.new("waterfill", { "exp-commands_waterfill.descrip
|
|||||||
return Commands.status.error{ "exp-commands_waterfill.requires-explosives" }
|
return Commands.status.error{ "exp-commands_waterfill.requires-explosives" }
|
||||||
else
|
else
|
||||||
SelectArea:start(player)
|
SelectArea:start(player)
|
||||||
return Commands.status.success{ "exp_util.selection_enter", { "exp-commands_lawnmower.selection-name" } }
|
return Commands.status.success{ "exp-commands_waterfill.enter" }
|
||||||
end
|
end
|
||||||
end) --[[@as any]]
|
end) --[[@as any]]
|
||||||
|
|
||||||
|
|||||||
@@ -79,8 +79,8 @@ add(require("modules/exp_scenario/gui/production_stats"))
|
|||||||
add(require("modules/exp_scenario/gui/quick_actions"))
|
add(require("modules/exp_scenario/gui/quick_actions"))
|
||||||
add(require("modules/exp_scenario/gui/readme"))
|
add(require("modules/exp_scenario/gui/readme"))
|
||||||
add(require("modules/exp_scenario/gui/research_milestones"))
|
add(require("modules/exp_scenario/gui/research_milestones"))
|
||||||
add(require("modules/exp_scenario/gui/rocket_info"))
|
-- add(require("modules/exp_scenario/gui/rocket_info"))
|
||||||
add(require("modules/exp_scenario/gui/science_production"))
|
-- add(require("modules/exp_scenario/gui/science_production"))
|
||||||
add(require("modules/exp_scenario/gui/surveillance"))
|
add(require("modules/exp_scenario/gui/surveillance"))
|
||||||
add(require("modules/exp_scenario/gui/task_list"))
|
add(require("modules/exp_scenario/gui/task_list"))
|
||||||
add(require("modules/exp_scenario/gui/debug/shim"))
|
add(require("modules/exp_scenario/gui/debug/shim"))
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ Elements.player_stats_table = Gui.define("player_stats/data_table")
|
|||||||
width = 135,
|
width = 135,
|
||||||
})
|
})
|
||||||
labels[stat_name] = Elements.table_label(data_table, {
|
labels[stat_name] = Elements.table_label(data_table, {
|
||||||
caption = { "exp-gui_readme.data-format", value, metadata.unit or "" },
|
caption = { "readme.data-format", value, metadata.unit or "" },
|
||||||
tooltip = metadata.value_tooltip or { "exp-statistics." .. stat_name .. "-tooltip" },
|
tooltip = metadata.value_tooltip or { "exp-statistics." .. stat_name .. "-tooltip" },
|
||||||
width = 105,
|
width = 105,
|
||||||
})
|
})
|
||||||
@@ -131,7 +131,7 @@ Elements.player_stats_table = Gui.define("player_stats/data_table")
|
|||||||
width = 135,
|
width = 135,
|
||||||
})
|
})
|
||||||
labels[stat_name] = Elements.table_label(data_table, {
|
labels[stat_name] = Elements.table_label(data_table, {
|
||||||
caption = { "exp-gui_readme.data-format", data.default, "" },
|
caption = { "readme.data-format", data.default, "" },
|
||||||
tooltip = { "exp-statistics." .. stat_name .. "-tooltip" },
|
tooltip = { "exp-statistics." .. stat_name .. "-tooltip" },
|
||||||
width = 105,
|
width = 105,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ local Roles = require("modules/exp_roles")
|
|||||||
local Commands = require("modules/exp_commands")
|
local Commands = require("modules/exp_commands")
|
||||||
local PlayerData = require("modules.exp_legacy.expcore.player_data")
|
local PlayerData = require("modules.exp_legacy.expcore.player_data")
|
||||||
local External = require("modules.exp_legacy.expcore.external")
|
local External = require("modules.exp_legacy.expcore.external")
|
||||||
local config_server_detail = require("modules.exp_legacy.config.server_detail") --- @dep config.server_detail
|
|
||||||
|
|
||||||
local format_number = require("util").format_number
|
local format_number = require("util").format_number
|
||||||
local format_time = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true }
|
local format_time = ExpUtil.format_time_factory_locale{ format = "long", days = true, hours = true, minutes = true }
|
||||||
@@ -183,13 +182,13 @@ end
|
|||||||
--- Welcome tab
|
--- Welcome tab
|
||||||
define_tab(
|
define_tab(
|
||||||
{ "exp-gui_readme.welcome-tab" },
|
{ "exp-gui_readme.welcome-tab" },
|
||||||
{ "exp-gui_readme.welcome-tooltip", config_server_detail["community_name"] },
|
{ "exp-gui_readme.welcome-tooltip" },
|
||||||
Gui.define("readme/welcome")
|
Gui.define("readme/welcome")
|
||||||
:draw(function(_, parent)
|
:draw(function(_, parent)
|
||||||
local player = Gui.get_player(parent)
|
local player = Gui.get_player(parent)
|
||||||
|
|
||||||
local server_details = {
|
local server_details = {
|
||||||
name = config_server_detail["community_name"] .. " S0 - Local",
|
name = "ExpGaming S0 - Local",
|
||||||
welcome = "Failed to load description: disconnected from external api.",
|
welcome = "Failed to load description: disconnected from external api.",
|
||||||
reset_time = "Not Set",
|
reset_time = "Not Set",
|
||||||
}
|
}
|
||||||
@@ -224,9 +223,8 @@ define_tab(
|
|||||||
frame_width,
|
frame_width,
|
||||||
{
|
{
|
||||||
"exp-gui_readme.welcome-general",
|
"exp-gui_readme.welcome-general",
|
||||||
config_server_detail["community_name"],
|
|
||||||
format_time(game.tick),
|
|
||||||
server_details.reset_time,
|
server_details.reset_time,
|
||||||
|
format_time(game.tick),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -338,7 +336,7 @@ define_tab(
|
|||||||
local external_links = Elements.title_table(scroll_pane, 235, { "exp-gui_readme.servers-external" }, 2)
|
local external_links = Elements.title_table(scroll_pane, 235, { "exp-gui_readme.servers-external" }, 2)
|
||||||
for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do
|
for _, key in ipairs{ "discord", "website", "patreon", "status", "github" } do
|
||||||
Gui.elements.centered_label(external_links, 110, key:gsub("^%l", string.upper))
|
Gui.elements.centered_label(external_links, 110, key:gsub("^%l", string.upper))
|
||||||
Gui.elements.centered_label(external_links, 460, config_server_detail[key], { "exp-gui_readme.servers-open-in-browser" })
|
Gui.elements.centered_label(external_links, 460, { "links." .. key }, { "exp-gui_readme.servers-open-in-browser" })
|
||||||
end
|
end
|
||||||
|
|
||||||
return container
|
return container
|
||||||
|
|||||||
@@ -11,9 +11,10 @@ arg-message=The message to send.
|
|||||||
format=[AC] __1__: __2__
|
format=[AC] __1__: __2__
|
||||||
|
|
||||||
[exp-commands_artillery]
|
[exp-commands_artillery]
|
||||||
selection-name=Artillery
|
|
||||||
description=Automaticly select enemy target with artillery.
|
description=Automaticly select enemy target with artillery.
|
||||||
invalid-area=The selected area is not valid.
|
invalid-area=The selected area is not valid.
|
||||||
|
enter=Entered artillery selection mode.
|
||||||
|
exit=Existed artillery selection mode.
|
||||||
|
|
||||||
[exp-commands_bot-queue]
|
[exp-commands_bot-queue]
|
||||||
description=Get / Set the construction bot queue limits.
|
description=Get / Set the construction bot queue limits.
|
||||||
@@ -31,7 +32,7 @@ description-pollution-enabled=Set polution enabled state for this game.
|
|||||||
description-game-speed=Set or get the current game speed.
|
description-game-speed=Set or get the current game speed.
|
||||||
arg-state=State to set, default is to toggle the current value.
|
arg-state=State to set, default is to toggle the current value.
|
||||||
arg-player=Player to toggle cheat mode for.
|
arg-player=Player to toggle cheat mode for.
|
||||||
arg-force-friendly-fire=Force to toggle friendly fire.
|
arg-force-friendly-fire=Force to research all technology for.
|
||||||
arg-force-research=Force to research all technology for.
|
arg-force-research=Force to research all technology for.
|
||||||
arg-surface=Surface to toggle always day for.
|
arg-surface=Surface to toggle always day for.
|
||||||
arg-amount=Amount to set, returns the current value if not given.
|
arg-amount=Amount to set, returns the current value if not given.
|
||||||
@@ -100,9 +101,10 @@ already-dead=You are already dead.
|
|||||||
lower-role=You must have a higher role than the target.
|
lower-role=You must have a higher role than the target.
|
||||||
|
|
||||||
[exp-commands_lawnmower]
|
[exp-commands_lawnmower]
|
||||||
selection-name=lawnmower
|
|
||||||
description=Clean up biter corpse, decoratives and nuclear hole.
|
description=Clean up biter corpse, decoratives and nuclear hole.
|
||||||
arg-range=Range to clean up.
|
arg-range=Range to clean up.
|
||||||
|
enter=Entered selection mode, select the area to fill with water.
|
||||||
|
exit=Exited selection mode.
|
||||||
complete=__1__ tiles were handled.
|
complete=__1__ tiles were handled.
|
||||||
|
|
||||||
[exp-commands_locate]
|
[exp-commands_locate]
|
||||||
@@ -150,16 +152,17 @@ arg-items-per-second=Target items per second, defaults to output of a single mac
|
|||||||
not-selecting=Please select an entity with a recipe.
|
not-selecting=Please select an entity with a recipe.
|
||||||
item-in=You need __1__ per second of [item=__2__].
|
item-in=You need __1__ per second of [item=__2__].
|
||||||
fluid-in=You need __1__ per second of [fluid=__2__].
|
fluid-in=You need __1__ per second of [fluid=__2__].
|
||||||
item-out=This will result in: __1__ [item=__2__] per second.
|
item-out=This will result in: __1__ [item=__2__] per second.
|
||||||
fluid-out=This will result in: __1__ [fluid=__2__] per second.
|
fluid-out=This will result in: __1__ [fluid=__2__] per second.
|
||||||
machine-count=And you will need __1__ machines (with the same speed as this one) for this.
|
machine-count=And you will need __1__ machines (with the same speed as this one) for this.
|
||||||
|
|
||||||
[exp-commands_repair]
|
[exp-commands_repair]
|
||||||
selection-name=Repair
|
|
||||||
description=Repairs entities on your force around you.
|
description=Repairs entities on your force around you.
|
||||||
|
enter=Entered selection mode, select the area.
|
||||||
|
exit=Exited selection mode.
|
||||||
# Intentional space left on the two lines below so they can be joined together.
|
# Intentional space left on the two lines below so they can be joined together.
|
||||||
response-revive=__1__ entities were revived.
|
response-revive=__1__ entities were revived.
|
||||||
response-heal=__1__ entities were healed.
|
response-heal=__1__ entities were healed.
|
||||||
|
|
||||||
[exp-commands_reports]
|
[exp-commands_reports]
|
||||||
description-create=Reports a player and notifies moderators
|
description-create=Reports a player and notifies moderators
|
||||||
@@ -214,13 +217,14 @@ arg-player=Player to start following.
|
|||||||
follow-self=You can not follow yourself.
|
follow-self=You can not follow yourself.
|
||||||
|
|
||||||
[exp-commands_surface]
|
[exp-commands_surface]
|
||||||
selection-name=Surface
|
|
||||||
description-items=Clear all items on the ground.
|
description-items=Clear all items on the ground.
|
||||||
description-blueprints=Clear all blueprints.
|
description-blueprints=Clear all blueprints.
|
||||||
description-blueprints-surface=Clear all blueprints on the current surface.
|
description-blueprints-surface=Clear all blueprints on the current surface.
|
||||||
arg-surface=Surface to clear on, default all.
|
arg-surface=Surface to clear on, default all.
|
||||||
items=__1__ cleared all items on the ground of __2__.
|
items=__1__ cleared all items on the ground of __2__.
|
||||||
blueprints=__1__ cleared all blueprints on __2__.
|
blueprints=__1__ cleared all blueprints on __2__.
|
||||||
|
enter=Entered selection mode, select the area.
|
||||||
|
exit=Exited selection mode.
|
||||||
complete=__1__ blueprint ghost were removed.
|
complete=__1__ blueprint ghost were removed.
|
||||||
|
|
||||||
[exp-commands_trains]
|
[exp-commands_trains]
|
||||||
@@ -246,9 +250,10 @@ title=VLayer Information:
|
|||||||
result=__1__: __2__
|
result=__1__: __2__
|
||||||
|
|
||||||
[exp-commands_waterfill]
|
[exp-commands_waterfill]
|
||||||
selection-name=waterfill
|
|
||||||
description=Replace tiles with shallow water.
|
description=Replace tiles with shallow water.
|
||||||
requires-explosives=__ITEM__cliff-explosives__ are required to create water.
|
requires-explosives=__ITEM__cliff-explosives__ are required to create water.
|
||||||
|
enter=Entered waterfill selection mode, select the area to fill with water.
|
||||||
|
exit=Exited waterfill selection mode.
|
||||||
nauvis-only=Can only waterfill on Nauvis, this may change in the future.
|
nauvis-only=Can only waterfill on Nauvis, this may change in the future.
|
||||||
area-too-large=Selected area is too large, must be less than __1__ tiles, selected __2__.
|
area-too-large=Selected area is too large, must be less than __1__ tiles, selected __2__.
|
||||||
too-few-explosives=Requires __1__ __ITEM__cliff-explosives__ or its ingredients, you have __2__.
|
too-few-explosives=Requires __1__ __ITEM__cliff-explosives__ or its ingredients, you have __2__.
|
||||||
@@ -328,9 +333,9 @@ caption-waterfill=Waterfill
|
|||||||
[exp-gui_readme]
|
[exp-gui_readme]
|
||||||
main-tooltip=Information
|
main-tooltip=Information
|
||||||
welcome-tab=Welcome
|
welcome-tab=Welcome
|
||||||
welcome-tooltip=Welcome to __1__
|
welcome-tooltip=Welcome to Explosive Gaming
|
||||||
welcome-title=Welcome to __1__
|
welcome-title=Welcome to __1__
|
||||||
welcome-general=Welcome to __1__; we host many Factorio servers. While you are here, we ask you to follow our rules. You can find these in the tab above. You can also find our custom commands and links to our other servers. This map has been online for __2__.\nPlease note that our servers reset periodically, the next reset is: __3__
|
welcome-general=Welcome to Explosive Gaming; we host many Factorio servers. While you are here, we ask you to follow our rules. You can find these in the tab above. You can also find our custom commands and links to our other servers. This map has been online for __2__.\nPlease note that our servers reset periodically, the next reset is: __1__
|
||||||
welcome-roles=We run a custom role system to help protect the work of others. As a result you may not be able to use your deconstruction planner yet or drop items on the ground. Roles also give you access to some custom features such as adding tasks to our task list or making new warp points.\nYou have been assigned the roles: __1__
|
welcome-roles=We run a custom role system to help protect the work of others. As a result you may not be able to use your deconstruction planner yet or drop items on the ground. Roles also give you access to some custom features such as adding tasks to our task list or making new warp points.\nYou have been assigned the roles: __1__
|
||||||
welcome-chat=Chatting can be difficult for new players because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key (which is located under the “ESC key”). If you would like to change the key, go to your Controls tab in options.\nThe setting you need to change is “Toggle chat (and Lua console)” you currently have it set to "__CONTROL__toggle-console__"
|
welcome-chat=Chatting can be difficult for new players because it’s different than other games! It’s very simple, the button you need to press is the “GRAVE/TILDE” key (which is located under the “ESC key”). If you would like to change the key, go to your Controls tab in options.\nThe setting you need to change is “Toggle chat (and Lua console)” you currently have it set to "__CONTROL__toggle-console__"
|
||||||
rules-tab=Rules
|
rules-tab=Rules
|
||||||
@@ -500,7 +505,7 @@ reply-online=There are __1__ players online
|
|||||||
reply-players=There have been __1__ players on this map
|
reply-players=There have been __1__ players on this map
|
||||||
reply-dev=Cooldude2606 is a dev for this server and makes the scenario and is not a factorio dev.
|
reply-dev=Cooldude2606 is a dev for this server and makes the scenario and is not a factorio dev.
|
||||||
reply-softmod=A softmod is a custom scenario that runs on this server, an example is the player list.
|
reply-softmod=A softmod is a custom scenario that runs on this server, an example is the player list.
|
||||||
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
||||||
reply-blame=Blame __1__ for what just happened!
|
reply-blame=Blame __1__ for what just happened!
|
||||||
reply-afk=You're afk? Look at __1__, that player has been afk for: __2__
|
reply-afk=You're afk? Look at __1__, that player has been afk for: __2__
|
||||||
reply-evolution=Current evolution factor is __1__
|
reply-evolution=Current evolution factor is __1__
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
[exp-commands-authorities_role]
|
[exp-commands-authorities_role]
|
||||||
deny=你沒有權限運行該項目。
|
deny=你沒有權限運行該項目
|
||||||
|
|
||||||
[exp-commands-parse_role]
|
[exp-commands-parse_role]
|
||||||
lower-role=用戶組比你現有的更高。
|
lower-role=用戶組比你現有的更高
|
||||||
lower-role-player=用戶有更高權限。
|
lower-role-player=用戶有更高權限
|
||||||
|
|
||||||
[exp-commands_admin-chat]
|
[exp-commands_admin-chat]
|
||||||
description=一個只有管理員能看到的對話。
|
description=一個只有管理員能看到的對話。
|
||||||
@@ -11,32 +11,33 @@ arg-message=對話。
|
|||||||
format=[AC] __1__: __2__
|
format=[AC] __1__: __2__
|
||||||
|
|
||||||
[exp-commands_artillery]
|
[exp-commands_artillery]
|
||||||
selection-name=火炮
|
description=火炮遙控
|
||||||
description=火炮遙控。
|
invalid-area=所選地區無效
|
||||||
invalid-area=所選地區無效。
|
enter=現在進入火炮區域選擇
|
||||||
|
exit=已進入火炮區域選擇
|
||||||
|
|
||||||
[exp-commands_bot-queue]
|
[exp-commands_bot-queue]
|
||||||
description=取得或更改建設隊列數量。
|
description=取得或更改建設隊列數量。
|
||||||
arg-amount=建設隊列數量。
|
arg-amount=建設隊列數量
|
||||||
get=建設隊列為 __1__ 個成功嘗試,和 __2__ 個嘗試。
|
get=建設隊列為 __1__ 個成功嘗試,和 __2__ 個嘗試。
|
||||||
set=__1__ 把建設隊列改成 __2__ 個成功嘗試,和 __3__ 個嘗試。
|
set=__1__ 把建設隊列改成 __2__ 個成功嘗試,和 __3__ 個嘗試。
|
||||||
|
|
||||||
[exp-commands_cheat]
|
[exp-commands_cheat]
|
||||||
description-cheat-mode=為你或其他玩家切換作弊模式。
|
description-cheat-mode=為你或其他玩家切換作弊模式。
|
||||||
description-always-day=啟用永久白天。
|
description-always-day=啟用永久白天
|
||||||
description-friendly-fire=啟用友方傷害。
|
description-friendly-fire=啟用友方傷害
|
||||||
description-research-all=啟用所有科技。
|
description-research-all=啟用所有科技
|
||||||
description-clear-pollution=清除污染。
|
description-clear-pollution=清除污染
|
||||||
description-pollution-enabled=啟用污染。
|
description-pollution-enabled=啟用污染
|
||||||
description-game-speed=設定遊戲速度。
|
description-game-speed=設定遊戲速度
|
||||||
arg-state=要設定的狀態,預設是切換目前值。
|
arg-state=狀態
|
||||||
arg-player=要為其切換作弊模式的玩家。
|
arg-player=用戶
|
||||||
arg-force-friendly-fire=為勢力切換友方傷害。
|
arg-force-friendly-fire=勢力
|
||||||
arg-force-research=為勢力研究所有科技。
|
arg-force-research=勢力
|
||||||
arg-surface=為位面切換永久白晝。
|
arg-surface=位面
|
||||||
arg-amount=要設定的數量,如果未指定,則傳回目前值。
|
arg-amount=數量
|
||||||
cheat-mode=作弊模式現在為 __1__
|
cheat-mode=作弊模式現在為 __1__
|
||||||
always-day=__1__ 把在 __2__ 的位面的永久白晝設置為 __3__ 。
|
always-day=__1__ 把在 __2__ 的位面的永久白天設置為 __3__ 。
|
||||||
friendly-fire=__1__ 已為在 __2__ 的勢力設定成 __3__ 。
|
friendly-fire=__1__ 已為在 __2__ 的勢力設定成 __3__ 。
|
||||||
research-all=__1__ 已為在 __2__ 的勢力啟用所有科技 。
|
research-all=__1__ 已為在 __2__ 的勢力啟用所有科技 。
|
||||||
clear-pollution=__1__ 已為在 __2__ 的位面清除所有污染 。
|
clear-pollution=__1__ 已為在 __2__ 的位面清除所有污染 。
|
||||||
@@ -46,15 +47,15 @@ game-speed-get=現在遊戲速度為 __1__ 。
|
|||||||
|
|
||||||
[exp-commands_clear-inventory]
|
[exp-commands_clear-inventory]
|
||||||
description=清除用戶物品。
|
description=清除用戶物品。
|
||||||
arg-player=要清除其物品欄的用戶。
|
arg-player=用戶
|
||||||
|
|
||||||
[exp-commands_connect]
|
[exp-commands_connect]
|
||||||
description=連接到另一服務器。
|
description=連接到另一服務器
|
||||||
description-player=讓其他用戶連接到另一服務器。
|
description-player=讓其他用戶連接到另一服務器
|
||||||
description-all=將所有玩家連接到另一台服務器。
|
description-all=將所有玩家連接到另一台服務器
|
||||||
arg-player=連接到別的服務器的用戶。
|
arg-player=連接到別的服的用戶
|
||||||
arg-server=輸入為地址或名稱。
|
arg-server=輸入為地址 / 名稱
|
||||||
arg-is-address=輸入應該為地址。
|
arg-is-address=輸入為地址
|
||||||
too-many-matching=該服務器名稱有多過一個結果: __1__
|
too-many-matching=該服務器名稱有多過一個結果: __1__
|
||||||
wrong-version=該服務器版本不同: __1__
|
wrong-version=該服務器版本不同: __1__
|
||||||
same-server=你已連接該服務器: __1__
|
same-server=你已連接該服務器: __1__
|
||||||
@@ -65,15 +66,15 @@ none-matching=沒找到服務器。
|
|||||||
description=打開偵錯介面。
|
description=打開偵錯介面。
|
||||||
|
|
||||||
[exp-commands_enemy]
|
[exp-commands_enemy]
|
||||||
description-kill=僅移除蟲單位。
|
description-kill=僅移除蟲子
|
||||||
description-remove=移除蟲單位及停止生產器。
|
description-remove=移除蟲子及停止產生
|
||||||
arg-surface=位面
|
arg-surface=位面
|
||||||
|
|
||||||
[exp-commands_home]
|
[exp-commands_home]
|
||||||
description-home=傳送回家。
|
description-home=傳送回家
|
||||||
description-set=設定目前位置為家。
|
description-set=設定目前位置為家
|
||||||
description-get=取得家的位置。
|
description-get=取得家的位置
|
||||||
description-return=傳送回上一個位置。
|
description-return=傳送回上一個位置
|
||||||
no-home=你在 __1__ 上還沒設回程傳送點。
|
no-home=你在 __1__ 上還沒設回程傳送點。
|
||||||
no-return=你還沒在 __1__ 上使用過回程。
|
no-return=你還沒在 __1__ 上使用過回程。
|
||||||
home-set=你的回程傳送點為 __1__ 上, x: __2__ y: __3__
|
home-set=你的回程傳送點為 __1__ 上, x: __2__ y: __3__
|
||||||
@@ -100,19 +101,17 @@ already-dead=你已經死了。
|
|||||||
lower-role=用戶組比你現有的更高
|
lower-role=用戶組比你現有的更高
|
||||||
|
|
||||||
[exp-commands_lawnmower]
|
[exp-commands_lawnmower]
|
||||||
selection-name=割草機
|
description=清理屍體、裝飾和核洞
|
||||||
description=清理屍體、裝飾和核彈洞。
|
|
||||||
arg-range=半徑
|
arg-range=半徑
|
||||||
complete=__1__ 格已完成。
|
|
||||||
|
|
||||||
[exp-commands_locate]
|
[exp-commands_locate]
|
||||||
description=在地圖上查找用戶的最後位置。
|
description=在地圖上查找用戶
|
||||||
arg-player=用戶
|
arg-player=用戶
|
||||||
arg-remote=若為 true,則開啟在玩家遠端視圖的位置。
|
arg-remote=若在使用地圖查看模式
|
||||||
response=__1__ 的最後地點是 [gps=__2__,__3__]
|
response=__1__ 的最後地點是 [gps=__2__,__3__]
|
||||||
|
|
||||||
[exp-commands_me]
|
[exp-commands_me]
|
||||||
description=在聊天中發送操作訊息。
|
description=在聊天中發送操作訊息
|
||||||
arg-action=你想做的動作。
|
arg-action=你想做的動作。
|
||||||
response=* __1__ __2__ *
|
response=* __1__ __2__ *
|
||||||
|
|
||||||
@@ -121,8 +120,8 @@ description-entity=啟用建築保護
|
|||||||
description-area=啟用區域保護
|
description-area=啟用區域保護
|
||||||
enter-entity=現在進入建築保護,選擇一個建築來保護,按住 shift 來選擇則可取消。
|
enter-entity=現在進入建築保護,選擇一個建築來保護,按住 shift 來選擇則可取消。
|
||||||
enter-area=現在進入區域保護,選擇一個區域來保護,按住 shift 來選擇則可取消。
|
enter-area=現在進入區域保護,選擇一個區域來保護,按住 shift 來選擇則可取消。
|
||||||
exit-entity=已進入建築保護。
|
exit-entity=已進入建築保護
|
||||||
exit-area=已進入區域選擇。
|
exit-area=已進入區域選擇
|
||||||
protected-entities=__1__ 個建築現已受保護。
|
protected-entities=__1__ 個建築現已受保護。
|
||||||
unprotected-entities=__1__ 個建築現不受保護。
|
unprotected-entities=__1__ 個建築現不受保護。
|
||||||
already-protected=本地區已受保護。
|
already-protected=本地區已受保護。
|
||||||
@@ -131,7 +130,7 @@ unprotected-area=本地區現不受保護。
|
|||||||
repeat-offence=__1__ 在 [gps=__3__,__4__] 拆除了 __2__
|
repeat-offence=__1__ 在 [gps=__3__,__4__] 拆除了 __2__
|
||||||
|
|
||||||
[exp-commands_tag-protection]
|
[exp-commands_tag-protection]
|
||||||
description=切換管理員標記模式,新標記只能由管理員編輯。
|
description=切換管理員標記模式,新標記只能由管理員編輯
|
||||||
exit=你已離開管理員地圖標記模式,所有新地圖標記將不受保護。
|
exit=你已離開管理員地圖標記模式,所有新地圖標記將不受保護。
|
||||||
enter=你已進入管理員地圖標記模式,所有新地圖標記將受保護。
|
enter=你已進入管理員地圖標記模式,所有新地圖標記將受保護。
|
||||||
create=你放了一個管理員地圖標記。
|
create=你放了一個管理員地圖標記。
|
||||||
@@ -155,7 +154,6 @@ fluid-out=結果: __1__ [fluid=__2__] 每秒。
|
|||||||
machines=你需要 __1__ 部同樣的機器。
|
machines=你需要 __1__ 部同樣的機器。
|
||||||
|
|
||||||
[exp-commands_repair]
|
[exp-commands_repair]
|
||||||
selection-name=維修
|
|
||||||
description=維修周邊的建築
|
description=維修周邊的建築
|
||||||
arg-range=半徑
|
arg-range=半徑
|
||||||
# Intentional space left on the two lines below so they can be joined together。
|
# Intentional space left on the two lines below so they can be joined together。
|
||||||
@@ -172,10 +170,10 @@ arg-player-clear=用戶
|
|||||||
arg-reason=原因
|
arg-reason=原因
|
||||||
arg-from-player=用戶
|
arg-from-player=用戶
|
||||||
player-immune=用戶不能被舉報
|
player-immune=用戶不能被舉報
|
||||||
self-report=你不能舉報自己。
|
self-report=你不能舉報自己
|
||||||
response=__1__ 因 __2__ 被舉報了。
|
response=__1__ 因 __2__ 被舉報了。
|
||||||
response-admin=__1__ 因 __3__ 被 __2__ 舉報了。
|
response-admin=__1__ 因 __3__ 被 __2__ 舉報了。
|
||||||
already-reported=你已經舉報過該用戶了,你可以讓管理員清除報告來重寫。
|
already-reported=你已經舉報過該用戶了,你可以讓管理員清除報告來重寫
|
||||||
not-reported=該用戶沒有被舉報的紀錄。
|
not-reported=該用戶沒有被舉報的紀錄。
|
||||||
not-reported-by=該用戶沒有被 __1__ 舉報的紀錄。
|
not-reported-by=該用戶沒有被 __1__ 舉報的紀錄。
|
||||||
reports-title==該用戶現在的被舉報紀錄:
|
reports-title==該用戶現在的被舉報紀錄:
|
||||||
@@ -185,8 +183,8 @@ removed-all=__1__ 被舉報的所有紀錄已被 __2__ 清除。
|
|||||||
removed=__1__ 被舉報的一個紀錄已被 __2__ 清除。
|
removed=__1__ 被舉報的一個紀錄已被 __2__ 清除。
|
||||||
|
|
||||||
[exp-commands_roles]
|
[exp-commands_roles]
|
||||||
description-assign=為用戶指配用戶組。
|
description-assign=為用戶指配用戶組
|
||||||
description-unassign=為用戶取消指配用戶組。
|
description-unassign=為用戶取消指配用戶組
|
||||||
description-get=顯示所有用戶組
|
description-get=顯示所有用戶組
|
||||||
arg-player-assign=指配
|
arg-player-assign=指配
|
||||||
arg-player-unassign=取消指配
|
arg-player-unassign=取消指配
|
||||||
@@ -209,19 +207,20 @@ title=有 [item=__1__] 的用戶:
|
|||||||
result=\n__1__) __2__ 有 __3__ 個。 (__4__)
|
result=\n__1__) __2__ 有 __3__ 個。 (__4__)
|
||||||
|
|
||||||
[exp-commands_spectate]
|
[exp-commands_spectate]
|
||||||
description-spectate=切換旁觀者模式。
|
description-spectate=切換旁觀者模式
|
||||||
description-follow=開始在旁觀者模式中關注玩家。
|
description-follow=開始在旁觀者模式中關注玩家
|
||||||
arg-player=用戶
|
arg-player=用戶
|
||||||
follow-self=你不能追蹤自己。
|
follow-self=你不能追蹤自己
|
||||||
|
|
||||||
[exp-commands_surface]
|
[exp-commands_surface]
|
||||||
selection-name=位面
|
description-items=清除地面上的物品
|
||||||
description-items=清除地面上的物品。
|
description-blueprints=清除藍圖
|
||||||
description-blueprints=清除藍圖。
|
description-blueprints-surface=清除藍圖
|
||||||
description-blueprints-surface=清除本位面上的藍圖。
|
|
||||||
arg-surface=位面
|
arg-surface=位面
|
||||||
items=__1__ 清除了所有在 __2__ 中掉地上的東西。
|
items=__1__ 清除了所有在 __2__ 中掉地上的東西。
|
||||||
blueprints=__1__ 清除了所有在 __2__ 中在地上的藍圖。
|
blueprints=__1__ 清除了所有在 __2__ 中在地上的藍圖。
|
||||||
|
enter=現在進入區域選擇
|
||||||
|
exit=已進入區域選擇
|
||||||
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
||||||
complete=__1__ 個地上的藍圖已被清除。
|
complete=__1__ 個地上的藍圖已被清除。
|
||||||
|
|
||||||
@@ -248,9 +247,10 @@ title=vlayer 資訊:
|
|||||||
result=__1__: __2__
|
result=__1__: __2__
|
||||||
|
|
||||||
[exp-commands_waterfill]
|
[exp-commands_waterfill]
|
||||||
selection-name=挖水
|
|
||||||
description=把地換為淺水。
|
description=把地換為淺水。
|
||||||
requires-explosives=沒有足夠的 __ITEM__cliff-explosives__ 。
|
requires-explosives=沒有足夠的 __ITEM__cliff-explosives__ 。
|
||||||
|
enter=現在進入挖水區域選擇
|
||||||
|
exit=已進入挖水區域選擇
|
||||||
nauvis-only=只可在地星上填水,之後可能會再改變。
|
nauvis-only=只可在地星上填水,之後可能會再改變。
|
||||||
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
||||||
too-few-explosives=需要 __1__ 個 __ITEM__cliff-explosives__ 或其材料,你現在有 __2__ 個。
|
too-few-explosives=需要 __1__ 個 __ITEM__cliff-explosives__ 或其材料,你現在有 __2__ 個。
|
||||||
@@ -320,8 +320,8 @@ tooltip-waterfill=把地換為水。
|
|||||||
[exp-gui_readme]
|
[exp-gui_readme]
|
||||||
main-tooltip=資訊
|
main-tooltip=資訊
|
||||||
welcome-tab=歡迎
|
welcome-tab=歡迎
|
||||||
welcome-tooltip=歡迎來到 __1__
|
welcome-tooltip=歡迎來到 Explosive Gaming
|
||||||
welcome-general=歡迎來到 __1__; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __3__
|
welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__
|
||||||
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
||||||
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
||||||
rules-tab=規則
|
rules-tab=規則
|
||||||
@@ -420,7 +420,7 @@ data-caption-fastest-launch=最快發射
|
|||||||
data-tooltip-fastest-launch=最快發射時間
|
data-tooltip-fastest-launch=最快發射時間
|
||||||
data-caption-total-rockets=總發射次數
|
data-caption-total-rockets=總發射次數
|
||||||
data-tooltip-total-rockets=我方總發射次數
|
data-tooltip-total-rockets=我方總發射次數
|
||||||
value-tooltip-total-rockets=__1__% 的火箭發射都在這張地圖上
|
value-tooltip-total-rockets=__1__% 的火箭發射都在本地圖上。
|
||||||
data-caption-avg-launch=平均時間
|
data-caption-avg-launch=平均時間
|
||||||
data-tooltip-avg-launch=火箭發射平均時間
|
data-tooltip-avg-launch=火箭發射平均時間
|
||||||
data-caption-avg-launch-n=平均時間 __1__
|
data-caption-avg-launch-n=平均時間 __1__
|
||||||
@@ -463,8 +463,8 @@ tooltip-cursor-empty=游標為空
|
|||||||
caption-main=工作流程 [img=info]
|
caption-main=工作流程 [img=info]
|
||||||
tooltip-main=工作流程
|
tooltip-main=工作流程
|
||||||
tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。
|
tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。
|
||||||
caption-no-tasks=沒有工作流程!
|
caption-no-tasks=沒有工作流程
|
||||||
tooltip-no-tasks=按加號加入工作流程!
|
tooltip-no-tasks=按加號加入工作流程
|
||||||
tooltip-last-edit=最後由 __1__ 在 __2__ 修改
|
tooltip-last-edit=最後由 __1__ 在 __2__ 修改
|
||||||
tooltip-close=關閉工作流程
|
tooltip-close=關閉工作流程
|
||||||
tooltip-new=加入工作流程
|
tooltip-new=加入工作流程
|
||||||
@@ -487,18 +487,18 @@ kick-message=因地圖中沒有活躍玩家,所以所有人都已被請離。
|
|||||||
[exp_chat-auto-reply]
|
[exp_chat-auto-reply]
|
||||||
chat-reply=[Compilatron] __1__
|
chat-reply=[Compilatron] __1__
|
||||||
chat-disallowed=你沒有權限使用這個指令。
|
chat-disallowed=你沒有權限使用這個指令。
|
||||||
reply-online=現在有 __1__ 人在線
|
reply-online=現在有 __1__ 人上線。
|
||||||
reply-players=這張地圖上共有__1__名用戶
|
reply-players=本地圖現在有 __1__ 人曾上線。
|
||||||
reply-dev=Cooldude2606 只是本場境的開發者
|
reply-dev=Cooldude2606 只是本場境的開發者
|
||||||
reply-softmod=這裹用了自設情境。
|
reply-softmod=這裹用了自設情境。
|
||||||
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
||||||
reply-blame=責怪 __1__ 吧!
|
reply-blame=責怪 __1__ 吧。
|
||||||
reply-afk=看看 __1__,他的掛機時長為 __2__
|
reply-afk=看看 __1__, 他已掛機 __2__ 。
|
||||||
reply-evolution=現在敵人進化度為 __1__
|
reply-evolution=現在敵人進化度為 __1__ 。
|
||||||
reply-magic=Fear the admin magic (ノ゚∀゚)ノ⌒・*:.。. .。.:*・゜゚・*☆
|
reply-magic=Fear the admin magic (ノ゚∀゚)ノ⌒・*:.。. .。.:*・゜゚・*☆
|
||||||
reply-aids=≖ ‿ ≖ Fear the aids of a public server ≖ ‿ ≖
|
reply-aids=≖ ‿ ≖ Fear the aids of a public server ≖ ‿ ≖
|
||||||
reply-riot=(admins) ┬┴┬┴┤ᵒ_ᵒ)├┬┴┬┴ ‹ ‹\(´ω` )/››‹‹\ ( ´)/››‹‹\ ( ´ω`)/›› (rest of server)
|
reply-riot=(admins) ┬┴┬┴┤ᵒ_ᵒ)├┬┴┬┴ ‹ ‹\(´ω` )/››‹‹\ ( ´)/››‹‹\ ( ´ω`)/›› (rest of server)
|
||||||
reply-loops=架設迴旋處最終後果都不好!
|
reply-loops=架設迴旋處最終後果都不好。
|
||||||
reply-lenny=( ͡° ͜ʖ ͡°)
|
reply-lenny=( ͡° ͜ʖ ͡°)
|
||||||
reply-hodor=Hodor
|
reply-hodor=Hodor
|
||||||
reply-popcorn-1=Heating the oil and waiting for the popping sound...
|
reply-popcorn-1=Heating the oil and waiting for the popping sound...
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
[exp-commands-authorities_role]
|
[exp-commands-authorities_role]
|
||||||
deny=你沒有權限運行該項目。
|
deny=你沒有權限運行該項目
|
||||||
|
|
||||||
[exp-commands-parse_role]
|
[exp-commands-parse_role]
|
||||||
lower-role=用戶組比你現有的更高。
|
lower-role=用戶組比你現有的更高
|
||||||
lower-role-player=用戶有更高權限。
|
lower-role-player=用戶有更高權限
|
||||||
|
|
||||||
[exp-commands_admin-chat]
|
[exp-commands_admin-chat]
|
||||||
description=一個只有管理員能看到的對話。
|
description=一個只有管理員能看到的對話。
|
||||||
@@ -11,32 +11,33 @@ arg-message=對話。
|
|||||||
format=[AC] __1__: __2__
|
format=[AC] __1__: __2__
|
||||||
|
|
||||||
[exp-commands_artillery]
|
[exp-commands_artillery]
|
||||||
selection-name=火炮
|
description=火炮遙控
|
||||||
description=火炮遙控。
|
invalid-area=所選地區無效
|
||||||
invalid-area=所選地區無效。
|
enter=現在進入火炮區域選擇
|
||||||
|
exit=已進入火炮區域選擇
|
||||||
|
|
||||||
[exp-commands_bot-queue]
|
[exp-commands_bot-queue]
|
||||||
description=取得或更改建設隊列數量。
|
description=取得或更改建設隊列數量。
|
||||||
arg-amount=建設隊列數量。
|
arg-amount=建設隊列數量
|
||||||
get=建設隊列為 __1__ 個成功嘗試,和 __2__ 個嘗試。
|
get=建設隊列為 __1__ 個成功嘗試,和 __2__ 個嘗試。
|
||||||
set=__1__ 把建設隊列改成 __2__ 個成功嘗試,和 __3__ 個嘗試。
|
set=__1__ 把建設隊列改成 __2__ 個成功嘗試,和 __3__ 個嘗試。
|
||||||
|
|
||||||
[exp-commands_cheat]
|
[exp-commands_cheat]
|
||||||
description-cheat-mode=為你或其他玩家切換作弊模式。
|
description-cheat-mode=為你或其他玩家切換作弊模式。
|
||||||
description-always-day=啟用永久白天。
|
description-always-day=啟用永久白天
|
||||||
description-friendly-fire=啟用友方傷害。
|
description-friendly-fire=啟用友方傷害
|
||||||
description-research-all=啟用所有科技。
|
description-research-all=啟用所有科技
|
||||||
description-clear-pollution=清除污染。
|
description-clear-pollution=清除污染
|
||||||
description-pollution-enabled=啟用污染。
|
description-pollution-enabled=啟用污染
|
||||||
description-game-speed=設定遊戲速度。
|
description-game-speed=設定遊戲速度
|
||||||
arg-state=要設定的狀態,預設是切換目前值。
|
arg-state=狀態
|
||||||
arg-player=要為其切換作弊模式的玩家。
|
arg-player=用戶
|
||||||
arg-force-friendly-fire=為勢力切換友方傷害。
|
arg-force-friendly-fire=勢力
|
||||||
arg-force-research=為勢力研究所有科技。
|
arg-force-research=勢力
|
||||||
arg-surface=為位面切換永久白晝。
|
arg-surface=位面
|
||||||
arg-amount=要設定的數量,如果未指定,則傳回目前值。
|
arg-amount=數量
|
||||||
cheat-mode=作弊模式現在為 __1__
|
cheat-mode=作弊模式現在為 __1__
|
||||||
always-day=__1__ 把在 __2__ 的位面的永久白晝設置為 __3__ 。
|
always-day=__1__ 把在 __2__ 的位面的永久白天設置為 __3__ 。
|
||||||
friendly-fire=__1__ 已為在 __2__ 的勢力設定成 __3__ 。
|
friendly-fire=__1__ 已為在 __2__ 的勢力設定成 __3__ 。
|
||||||
research-all=__1__ 已為在 __2__ 的勢力啟用所有科技 。
|
research-all=__1__ 已為在 __2__ 的勢力啟用所有科技 。
|
||||||
clear-pollution=__1__ 已為在 __2__ 的位面清除所有污染 。
|
clear-pollution=__1__ 已為在 __2__ 的位面清除所有污染 。
|
||||||
@@ -46,15 +47,15 @@ game-speed-get=現在遊戲速度為 __1__ 。
|
|||||||
|
|
||||||
[exp-commands_clear-inventory]
|
[exp-commands_clear-inventory]
|
||||||
description=清除用戶物品。
|
description=清除用戶物品。
|
||||||
arg-player=要清除其物品欄的用戶。
|
arg-player=用戶
|
||||||
|
|
||||||
[exp-commands_connect]
|
[exp-commands_connect]
|
||||||
description=連接到另一服務器。
|
description=連接到另一服務器
|
||||||
description-player=讓其他用戶連接到另一服務器。
|
description-player=讓其他用戶連接到另一服務器
|
||||||
description-all=將所有玩家連接到另一台服務器。
|
description-all=將所有玩家連接到另一台服務器
|
||||||
arg-player=連接到別的服務器的用戶。
|
arg-player=連接到別的服的用戶
|
||||||
arg-server=輸入為地址或名稱。
|
arg-server=輸入為地址 / 名稱
|
||||||
arg-is-address=輸入應該為地址。
|
arg-is-address=輸入為地址
|
||||||
too-many-matching=該服務器名稱有多過一個結果: __1__
|
too-many-matching=該服務器名稱有多過一個結果: __1__
|
||||||
wrong-version=該服務器版本不同: __1__
|
wrong-version=該服務器版本不同: __1__
|
||||||
same-server=你已連接該服務器: __1__
|
same-server=你已連接該服務器: __1__
|
||||||
@@ -65,15 +66,15 @@ none-matching=沒找到服務器。
|
|||||||
description=打開偵錯介面。
|
description=打開偵錯介面。
|
||||||
|
|
||||||
[exp-commands_enemy]
|
[exp-commands_enemy]
|
||||||
description-kill=僅移除蟲單位。
|
description-kill=僅移除蟲子
|
||||||
description-remove=移除蟲單位及停止生產器。
|
description-remove=移除蟲子及停止產生
|
||||||
arg-surface=位面
|
arg-surface=位面
|
||||||
|
|
||||||
[exp-commands_home]
|
[exp-commands_home]
|
||||||
description-home=傳送回家。
|
description-home=傳送回家
|
||||||
description-set=設定目前位置為家。
|
description-set=設定目前位置為家
|
||||||
description-get=取得家的位置。
|
description-get=取得家的位置
|
||||||
description-return=傳送回上一個位置。
|
description-return=傳送回上一個位置
|
||||||
no-home=你在 __1__ 上還沒設回程傳送點。
|
no-home=你在 __1__ 上還沒設回程傳送點。
|
||||||
no-return=你還沒在 __1__ 上使用過回程。
|
no-return=你還沒在 __1__ 上使用過回程。
|
||||||
home-set=你的回程傳送點為 __1__ 上, x: __2__ y: __3__
|
home-set=你的回程傳送點為 __1__ 上, x: __2__ y: __3__
|
||||||
@@ -100,19 +101,17 @@ already-dead=你已經死了。
|
|||||||
lower-role=用戶組比你現有的更高
|
lower-role=用戶組比你現有的更高
|
||||||
|
|
||||||
[exp-commands_lawnmower]
|
[exp-commands_lawnmower]
|
||||||
selection-name=割草機
|
description=清理屍體、裝飾和核洞
|
||||||
description=清理屍體、裝飾和核彈洞。
|
|
||||||
arg-range=半徑
|
arg-range=半徑
|
||||||
complete=__1__ 格已完成。
|
|
||||||
|
|
||||||
[exp-commands_locate]
|
[exp-commands_locate]
|
||||||
description=在地圖上查找用戶的最後位置。
|
description=在地圖上查找用戶
|
||||||
arg-player=用戶
|
arg-player=用戶
|
||||||
arg-remote=若為 true,則開啟在玩家遠端視圖的位置。
|
arg-remote=若在使用地圖查看模式
|
||||||
response=__1__ 的最後地點是 [gps=__2__,__3__]
|
response=__1__ 的最後地點是 [gps=__2__,__3__]
|
||||||
|
|
||||||
[exp-commands_me]
|
[exp-commands_me]
|
||||||
description=在聊天中發送操作訊息。
|
description=在聊天中發送操作訊息
|
||||||
arg-action=你想做的動作。
|
arg-action=你想做的動作。
|
||||||
response=* __1__ __2__ *
|
response=* __1__ __2__ *
|
||||||
|
|
||||||
@@ -121,8 +120,8 @@ description-entity=啟用建築保護
|
|||||||
description-area=啟用區域保護
|
description-area=啟用區域保護
|
||||||
enter-entity=現在進入建築保護,選擇一個建築來保護,按住 shift 來選擇則可取消。
|
enter-entity=現在進入建築保護,選擇一個建築來保護,按住 shift 來選擇則可取消。
|
||||||
enter-area=現在進入區域保護,選擇一個區域來保護,按住 shift 來選擇則可取消。
|
enter-area=現在進入區域保護,選擇一個區域來保護,按住 shift 來選擇則可取消。
|
||||||
exit-entity=已進入建築保護。
|
exit-entity=已進入建築保護
|
||||||
exit-area=已進入區域選擇。
|
exit-area=已進入區域選擇
|
||||||
protected-entities=__1__ 個建築現已受保護。
|
protected-entities=__1__ 個建築現已受保護。
|
||||||
unprotected-entities=__1__ 個建築現不受保護。
|
unprotected-entities=__1__ 個建築現不受保護。
|
||||||
already-protected=本地區已受保護。
|
already-protected=本地區已受保護。
|
||||||
@@ -131,7 +130,7 @@ unprotected-area=本地區現不受保護。
|
|||||||
repeat-offence=__1__ 在 [gps=__3__,__4__] 拆除了 __2__
|
repeat-offence=__1__ 在 [gps=__3__,__4__] 拆除了 __2__
|
||||||
|
|
||||||
[exp-commands_tag-protection]
|
[exp-commands_tag-protection]
|
||||||
description=切換管理員標記模式,新標記只能由管理員編輯。
|
description=切換管理員標記模式,新標記只能由管理員編輯
|
||||||
exit=你已離開管理員地圖標記模式,所有新地圖標記將不受保護。
|
exit=你已離開管理員地圖標記模式,所有新地圖標記將不受保護。
|
||||||
enter=你已進入管理員地圖標記模式,所有新地圖標記將受保護。
|
enter=你已進入管理員地圖標記模式,所有新地圖標記將受保護。
|
||||||
create=你放了一個管理員地圖標記。
|
create=你放了一個管理員地圖標記。
|
||||||
@@ -155,7 +154,6 @@ fluid-out=結果: __1__ [fluid=__2__] 每秒。
|
|||||||
machines=你需要 __1__ 部同樣的機器。
|
machines=你需要 __1__ 部同樣的機器。
|
||||||
|
|
||||||
[exp-commands_repair]
|
[exp-commands_repair]
|
||||||
selection-name=維修
|
|
||||||
description=維修周邊的建築
|
description=維修周邊的建築
|
||||||
arg-range=半徑
|
arg-range=半徑
|
||||||
# Intentional space left on the two lines below so they can be joined together。
|
# Intentional space left on the two lines below so they can be joined together。
|
||||||
@@ -172,10 +170,10 @@ arg-player-clear=用戶
|
|||||||
arg-reason=原因
|
arg-reason=原因
|
||||||
arg-from-player=用戶
|
arg-from-player=用戶
|
||||||
player-immune=用戶不能被舉報
|
player-immune=用戶不能被舉報
|
||||||
self-report=你不能舉報自己。
|
self-report=你不能舉報自己
|
||||||
response=__1__ 因 __2__ 被舉報了。
|
response=__1__ 因 __2__ 被舉報了。
|
||||||
response-admin=__1__ 因 __3__ 被 __2__ 舉報了。
|
response-admin=__1__ 因 __3__ 被 __2__ 舉報了。
|
||||||
already-reported=你已經舉報過該用戶了,你可以讓管理員清除報告來重寫。
|
already-reported=你已經舉報過該用戶了,你可以讓管理員清除報告來重寫
|
||||||
not-reported=該用戶沒有被舉報的紀錄。
|
not-reported=該用戶沒有被舉報的紀錄。
|
||||||
not-reported-by=該用戶沒有被 __1__ 舉報的紀錄。
|
not-reported-by=該用戶沒有被 __1__ 舉報的紀錄。
|
||||||
reports-title==該用戶現在的被舉報紀錄:
|
reports-title==該用戶現在的被舉報紀錄:
|
||||||
@@ -185,8 +183,8 @@ removed-all=__1__ 被舉報的所有紀錄已被 __2__ 清除。
|
|||||||
removed=__1__ 被舉報的一個紀錄已被 __2__ 清除。
|
removed=__1__ 被舉報的一個紀錄已被 __2__ 清除。
|
||||||
|
|
||||||
[exp-commands_roles]
|
[exp-commands_roles]
|
||||||
description-assign=為用戶指配用戶組。
|
description-assign=為用戶指配用戶組
|
||||||
description-unassign=為用戶取消指配用戶組。
|
description-unassign=為用戶取消指配用戶組
|
||||||
description-get=顯示所有用戶組
|
description-get=顯示所有用戶組
|
||||||
arg-player-assign=指配
|
arg-player-assign=指配
|
||||||
arg-player-unassign=取消指配
|
arg-player-unassign=取消指配
|
||||||
@@ -209,19 +207,20 @@ title=有 [item=__1__] 的用戶:
|
|||||||
result=\n__1__) __2__ 有 __3__ 個。 (__4__)
|
result=\n__1__) __2__ 有 __3__ 個。 (__4__)
|
||||||
|
|
||||||
[exp-commands_spectate]
|
[exp-commands_spectate]
|
||||||
description-spectate=切換旁觀者模式。
|
description-spectate=切換旁觀者模式
|
||||||
description-follow=開始在旁觀者模式中關注玩家。
|
description-follow=開始在旁觀者模式中關注玩家
|
||||||
arg-player=用戶
|
arg-player=用戶
|
||||||
follow-self=你不能追蹤自己。
|
follow-self=你不能追蹤自己
|
||||||
|
|
||||||
[exp-commands_surface]
|
[exp-commands_surface]
|
||||||
selection-name=位面
|
description-items=清除地面上的物品
|
||||||
description-items=清除地面上的物品。
|
description-blueprints=清除藍圖
|
||||||
description-blueprints=清除藍圖。
|
description-blueprints-surface=清除藍圖
|
||||||
description-blueprints-surface=清除本位面上的藍圖。
|
|
||||||
arg-surface=位面
|
arg-surface=位面
|
||||||
items=__1__ 清除了所有在 __2__ 中掉地上的東西。
|
items=__1__ 清除了所有在 __2__ 中掉地上的東西。
|
||||||
blueprints=__1__ 清除了所有在 __2__ 中在地上的藍圖。
|
blueprints=__1__ 清除了所有在 __2__ 中在地上的藍圖。
|
||||||
|
enter=現在進入區域選擇
|
||||||
|
exit=已進入區域選擇
|
||||||
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
||||||
complete=__1__ 個地上的藍圖已被清除。
|
complete=__1__ 個地上的藍圖已被清除。
|
||||||
|
|
||||||
@@ -248,9 +247,10 @@ title=vlayer 資訊:
|
|||||||
result=__1__: __2__
|
result=__1__: __2__
|
||||||
|
|
||||||
[exp-commands_waterfill]
|
[exp-commands_waterfill]
|
||||||
selection-name=挖水
|
|
||||||
description=把地換為淺水。
|
description=把地換為淺水。
|
||||||
requires-explosives=沒有足夠的 __ITEM__cliff-explosives__ 。
|
requires-explosives=沒有足夠的 __ITEM__cliff-explosives__ 。
|
||||||
|
enter=現在進入挖水區域選擇
|
||||||
|
exit=已進入挖水區域選擇
|
||||||
nauvis-only=只可在地星上填水,之後可能會再改變。
|
nauvis-only=只可在地星上填水,之後可能會再改變。
|
||||||
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
area-too-large=區域太大了,需少過 __1__ 格,你選了 __2__ 格。
|
||||||
too-few-explosives=需要 __1__ 個 __ITEM__cliff-explosives__ 或其材料,你現在有 __2__ 個。
|
too-few-explosives=需要 __1__ 個 __ITEM__cliff-explosives__ 或其材料,你現在有 __2__ 個。
|
||||||
@@ -320,8 +320,8 @@ tooltip-waterfill=把地換為水。
|
|||||||
[exp-gui_readme]
|
[exp-gui_readme]
|
||||||
main-tooltip=資訊
|
main-tooltip=資訊
|
||||||
welcome-tab=歡迎
|
welcome-tab=歡迎
|
||||||
welcome-tooltip=歡迎來到 __1__
|
welcome-tooltip=歡迎來到 Explosive Gaming
|
||||||
welcome-general=歡迎來到 __1__; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __3__
|
welcome-general=歡迎來到 Explosive Gaming; 你在這裏的時候要遵守規則。 你可以在左上方的介面找到更多資訊。 地圖時間 __2__。\n下次地圖重設: __1__
|
||||||
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
welcome-roles=我們有自訂的身份組來保護其他用戶。 所以你有機會不能使用拆除規劃器或掉東西。 身份組給予你各種權限\n你有以下身份組: __1__
|
||||||
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
welcome-chat=你可以使用 「重音符/抑音符」 鍵 (ESC 鍵 下方) - 你也可以在選項中修改按鍵。\n你目前設定為 「__CONTROL__toggle-console__」
|
||||||
rules-tab=規則
|
rules-tab=規則
|
||||||
@@ -420,7 +420,7 @@ data-caption-fastest-launch=最快發射
|
|||||||
data-tooltip-fastest-launch=最快發射時間
|
data-tooltip-fastest-launch=最快發射時間
|
||||||
data-caption-total-rockets=總發射次數
|
data-caption-total-rockets=總發射次數
|
||||||
data-tooltip-total-rockets=我方總發射次數
|
data-tooltip-total-rockets=我方總發射次數
|
||||||
value-tooltip-total-rockets=__1__% 的火箭發射都在這張地圖上
|
value-tooltip-total-rockets=__1__% 的火箭發射都在本地圖上。
|
||||||
data-caption-avg-launch=平均時間
|
data-caption-avg-launch=平均時間
|
||||||
data-tooltip-avg-launch=火箭發射平均時間
|
data-tooltip-avg-launch=火箭發射平均時間
|
||||||
data-caption-avg-launch-n=平均時間 __1__
|
data-caption-avg-launch-n=平均時間 __1__
|
||||||
@@ -463,8 +463,8 @@ tooltip-cursor-empty=游標為空
|
|||||||
caption-main=工作流程 [img=info]
|
caption-main=工作流程 [img=info]
|
||||||
tooltip-main=工作流程
|
tooltip-main=工作流程
|
||||||
tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。
|
tooltip-sub=需要完成的工作流程\n- 你可以用富文本來加上圖片 [img=utility/not_enough_repair_packs_icon] 或 [color=blue] 顏色[/color]。
|
||||||
caption-no-tasks=沒有工作流程!
|
caption-no-tasks=沒有工作流程
|
||||||
tooltip-no-tasks=按加號加入工作流程!
|
tooltip-no-tasks=按加號加入工作流程
|
||||||
tooltip-last-edit=最後由 __1__ 在 __2__ 修改
|
tooltip-last-edit=最後由 __1__ 在 __2__ 修改
|
||||||
tooltip-close=關閉工作流程
|
tooltip-close=關閉工作流程
|
||||||
tooltip-new=加入工作流程
|
tooltip-new=加入工作流程
|
||||||
@@ -487,18 +487,18 @@ kick-message=因地圖中沒有活躍玩家,所以所有人都已被請離。
|
|||||||
[exp_chat-auto-reply]
|
[exp_chat-auto-reply]
|
||||||
chat-reply=[Compilatron] __1__
|
chat-reply=[Compilatron] __1__
|
||||||
chat-disallowed=你沒有權限使用這個指令。
|
chat-disallowed=你沒有權限使用這個指令。
|
||||||
reply-online=現在有 __1__ 人在線
|
reply-online=現在有 __1__ 人上線。
|
||||||
reply-players=這張地圖上共有__1__名用戶
|
reply-players=本地圖現在有 __1__ 人曾上線。
|
||||||
reply-dev=Cooldude2606 只是本場境的開發者
|
reply-dev=Cooldude2606 只是本場境的開發者
|
||||||
reply-softmod=這裹用了自設情境。
|
reply-softmod=這裹用了自設情境。
|
||||||
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
reply-clusterio=Clusterio is a factorio server hosting platform allowing internet enabled mods.
|
||||||
reply-blame=責怪 __1__ 吧!
|
reply-blame=責怪 __1__ 吧。
|
||||||
reply-afk=看看 __1__,他的掛機時長為 __2__
|
reply-afk=看看 __1__, 他已掛機 __2__ 。
|
||||||
reply-evolution=現在敵人進化度為 __1__
|
reply-evolution=現在敵人進化度為 __1__ 。
|
||||||
reply-magic=Fear the admin magic (ノ゚∀゚)ノ⌒・*:.。. .。.:*・゜゚・*☆
|
reply-magic=Fear the admin magic (ノ゚∀゚)ノ⌒・*:.。. .。.:*・゜゚・*☆
|
||||||
reply-aids=≖ ‿ ≖ Fear the aids of a public server ≖ ‿ ≖
|
reply-aids=≖ ‿ ≖ Fear the aids of a public server ≖ ‿ ≖
|
||||||
reply-riot=(admins) ┬┴┬┴┤ᵒ_ᵒ)├┬┴┬┴ ‹ ‹\(´ω` )/››‹‹\ ( ´)/››‹‹\ ( ´ω`)/›› (rest of server)
|
reply-riot=(admins) ┬┴┬┴┤ᵒ_ᵒ)├┬┴┬┴ ‹ ‹\(´ω` )/››‹‹\ ( ´)/››‹‹\ ( ´ω`)/›› (rest of server)
|
||||||
reply-loops=架設迴旋處最終後果都不好!
|
reply-loops=架設迴旋處最終後果都不好。
|
||||||
reply-lenny=( ͡° ͜ʖ ͡°)
|
reply-lenny=( ͡° ͜ʖ ͡°)
|
||||||
reply-hodor=Hodor
|
reply-hodor=Hodor
|
||||||
reply-popcorn-1=Heating the oil and waiting for the popping sound...
|
reply-popcorn-1=Heating the oil and waiting for the popping sound...
|
||||||
|
|||||||
@@ -5,22 +5,17 @@
|
|||||||
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
"author": "Cooldude2606 <https://github.com/Cooldude2606>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": "explosivegaming/ExpCluster",
|
"repository": "explosivegaming/ExpCluster",
|
||||||
"type": "module",
|
|
||||||
"main": "dist/node/index.js",
|
"main": "dist/node/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepare": "tsc --build && webpack-cli --env production",
|
"prepare": "tsc --build && webpack-cli --env production"
|
||||||
"test": "tap --type-strip-only --disable-coverage --allow-empty-coverage test/*.test.js",
|
|
||||||
"coverage": "tap --coverage-report=text test/*.test.js"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=18"
|
"node": ">=18"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@clusterio/controller": "workspace:^",
|
|
||||||
"@clusterio/lib": "workspace:^"
|
"@clusterio/lib": "workspace:^"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@clusterio/controller": "workspace:^",
|
|
||||||
"@clusterio/lib": "workspace:^",
|
"@clusterio/lib": "workspace:^",
|
||||||
"@clusterio/web_ui": "workspace:^",
|
"@clusterio/web_ui": "workspace:^",
|
||||||
"@types/node": "catalog:",
|
"@types/node": "catalog:",
|
||||||
@@ -28,7 +23,6 @@
|
|||||||
"antd": "catalog:",
|
"antd": "catalog:",
|
||||||
"react": "catalog:",
|
"react": "catalog:",
|
||||||
"react-dom": "catalog:",
|
"react-dom": "catalog:",
|
||||||
"tap": "^21.1.0",
|
|
||||||
"typescript": "catalog:",
|
"typescript": "catalog:",
|
||||||
"webpack": "catalog:",
|
"webpack": "catalog:",
|
||||||
"webpack-cli": "catalog:",
|
"webpack-cli": "catalog:",
|
||||||
@@ -38,8 +32,6 @@
|
|||||||
"@expcluster/lib_commands": "workspace:^",
|
"@expcluster/lib_commands": "workspace:^",
|
||||||
"@expcluster/lib_util": "workspace:^",
|
"@expcluster/lib_util": "workspace:^",
|
||||||
"@expcluster/lib_gui": "workspace:^",
|
"@expcluster/lib_gui": "workspace:^",
|
||||||
"@expcluster/permission-groups": "workspace:^",
|
|
||||||
"@expcluster/roles": "workspace:^",
|
|
||||||
"@sinclair/typebox": "catalog:"
|
"@sinclair/typebox": "catalog:"
|
||||||
},
|
},
|
||||||
"publishConfig": {
|
"publishConfig": {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import type * as lib from "@clusterio/lib";
|
import * as lib from "@clusterio/lib";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permissions checked by the scenario in game through exp_roles.
|
* Permissions checked by the scenario in game through exp_roles.
|
||||||
@@ -7,9 +7,9 @@ import type * as lib from "@clusterio/lib";
|
|||||||
* underscores, see module/commands/_authorities.lua. Everything else is checked
|
* underscores, see module/commands/_authorities.lua. Everything else is checked
|
||||||
* by name at its call site.
|
* by name at its call site.
|
||||||
*/
|
*/
|
||||||
type Definition<Name extends string = string> = readonly [name: Name, title: string, description: string, grantByDefault?: boolean];
|
type Definition = [name: string, title: string, description: string, grantByDefault?: boolean];
|
||||||
|
|
||||||
const definitions = [
|
const definitions: Definition[] = [
|
||||||
["exp_scenario.bypass.deconstruction_log", "Deconstruction log bypass", "Be excluded from the deconstruction log."],
|
["exp_scenario.bypass.deconstruction_log", "Deconstruction log bypass", "Be excluded from the deconstruction log."],
|
||||||
["exp_scenario.bypass.entity_protection", "Bypass entity protection", "Remove entities that the protection filter would block."],
|
["exp_scenario.bypass.entity_protection", "Bypass entity protection", "Remove entities that the protection filter would block."],
|
||||||
["exp_scenario.bypass.nuke_protection", "Bypass nuke protection", "Use nukes without the nuke protection restrictions."],
|
["exp_scenario.bypass.nuke_protection", "Bypass nuke protection", "Use nukes without the nuke protection restrictions."],
|
||||||
@@ -118,12 +118,8 @@ const definitions = [
|
|||||||
["exp_scenario.player.admin", "Factorio admin", "Be promoted to Factorio admin while holding a role with this permission."],
|
["exp_scenario.player.admin", "Factorio admin", "Be promoted to Factorio admin while holding a role with this permission."],
|
||||||
["exp_scenario.player.instant_respawn", "Instant respawn", "Respawn after two seconds instead of the default delay."],
|
["exp_scenario.player.instant_respawn", "Instant respawn", "Respawn after two seconds instead of the default delay."],
|
||||||
["exp_scenario.player.spectator", "Spectator", "Remove the zoom to world noise effect, as Factorio does for spectators."],
|
["exp_scenario.player.spectator", "Spectator", "Remove the zoom to world noise effect, as Factorio does for spectators."],
|
||||||
] as const satisfies readonly Definition[];
|
];
|
||||||
|
|
||||||
/** Name of a permission defined by the scenario, added to lib.Permissions in index.ts. */
|
for (const [name, title, description, grantByDefault] of definitions) {
|
||||||
export type ScenarioPermissionName = (typeof definitions)[number][0];
|
lib.definePermission({ name, title, description, grantByDefault });
|
||||||
|
}
|
||||||
export const permissions = definitions.map((definition: Definition<ScenarioPermissionName>): lib.PermissionDefinition => {
|
|
||||||
const [name, title, description, grantByDefault] = definition;
|
|
||||||
return { name, title, description, grantByDefault };
|
|
||||||
});
|
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
import t from "tap";
|
|
||||||
import * as lib from "@clusterio/lib";
|
|
||||||
import { Controller } from "@clusterio/controller";
|
|
||||||
import { ControllerPlugin } from "../dist/node/controller.js";
|
|
||||||
import * as messages from "../dist/node/messages.js";
|
|
||||||
import { seedRoles, seedGroups } from "../dist/node/seed.js";
|
|
||||||
import * as roles from "@expcluster/roles";
|
|
||||||
import * as groups from "@expcluster/permission-groups";
|
|
||||||
import { ControllerPlugin as RolesPlugin } from "@expcluster/roles/dist/node/controller.js";
|
|
||||||
import { ControllerPlugin as GroupsPlugin } from "@expcluster/permission-groups/dist/node/controller.js";
|
|
||||||
import { GroupRecord, GroupPermissions, RoleMappingRecord } from "@expcluster/permission-groups";
|
|
||||||
|
|
||||||
import { plugin } from "../dist/node/index.js";
|
|
||||||
|
|
||||||
// Registering the plugin defines the permissions the seed grants
|
|
||||||
lib.registerPluginPermissions([plugin]);
|
|
||||||
|
|
||||||
// The controller validates message classes against the link registry
|
|
||||||
for (const Message of [messages.SeedRequest, ...roles.plugin.messages, ...groups.plugin.messages]) {
|
|
||||||
lib.Link.register(Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
const logger = { child: () => logger, info: () => {}, warn: () => {}, error: () => {}, verbose: () => {} };
|
|
||||||
|
|
||||||
// Silence the singleton logger to avoid polluting the test output
|
|
||||||
lib.logger.silent = true;
|
|
||||||
t.after(() => {
|
|
||||||
lib.logger.silent = false;
|
|
||||||
});
|
|
||||||
|
|
||||||
/** Build the plugin around a real controller, which is side effect free while not started. */
|
|
||||||
async function startPlugin(t2, { withPlugins = true } = {}) {
|
|
||||||
const controllerConfig = new lib.ControllerConfig("controller", {
|
|
||||||
"controller.database_directory": t2.testdir(),
|
|
||||||
"controller.default_role_id": lib.Role.DefaultPlayerRoleId,
|
|
||||||
});
|
|
||||||
const controller = new Controller(logger, [], controllerConfig);
|
|
||||||
controller.roles.set(new lib.Role(0, "Cluster Admin", "", new Set(["core.admin"])));
|
|
||||||
controller.roles.set(new lib.Role(1, "Player", "", new Set()));
|
|
||||||
|
|
||||||
if (withPlugins) {
|
|
||||||
for (const [name, Plugin] of [["exp_roles", RolesPlugin], ["exp_groups", GroupsPlugin]]) {
|
|
||||||
const plugin = new Plugin({ name }, controller, undefined, logger);
|
|
||||||
await plugin.init();
|
|
||||||
controller.plugins.set(name, plugin);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const plugin = new ControllerPlugin({ name: "exp_scenario" }, controller, undefined, logger);
|
|
||||||
await plugin.init();
|
|
||||||
return { plugin, controller };
|
|
||||||
}
|
|
||||||
|
|
||||||
const byName = (datastore, name) => [...datastore.values()].find(other => other.name === name);
|
|
||||||
|
|
||||||
t.test("class ControllerPlugin", t2 => {
|
|
||||||
t2.test(".handleSeedRequest() throws when the seeded plugins are missing", async t3 => {
|
|
||||||
const { plugin } = await startPlugin(t3, { withPlugins: false });
|
|
||||||
await t3.rejects(
|
|
||||||
plugin.handleSeedRequest(),
|
|
||||||
{ message: "Seeding requires the exp_roles and exp_groups plugins" },
|
|
||||||
"the request is rejected",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
t2.test(".handleSeedRequest() creates the roles and reuses them by name", async t3 => {
|
|
||||||
const { plugin, controller } = await startPlugin(t3);
|
|
||||||
const rolesPlugin = controller.plugins.get("exp_roles");
|
|
||||||
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
t3.strictSame(controller.roles.size, seedRoles.length, "every seed role exists");
|
|
||||||
|
|
||||||
const moderator = byName(controller.roles, "Moderator");
|
|
||||||
t3.ok(moderator.permissions.has("exp_scenario.command.jail"), "parent permissions are flattened in");
|
|
||||||
t3.strictSame(rolesPlugin.roleMeta.get(moderator.id).shortHand, "Mod", "the role properties match the seed");
|
|
||||||
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
t3.strictSame(controller.roles.size, seedRoles.length, "seeding again reuses the roles");
|
|
||||||
});
|
|
||||||
|
|
||||||
t2.test(".handleSeedRequest() creates the groups and resets them by name", async t3 => {
|
|
||||||
const { plugin, controller } = await startPlugin(t3);
|
|
||||||
const groupsPlugin = controller.plugins.get("exp_groups");
|
|
||||||
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
t3.strictSame(groupsPlugin.groups.size, seedGroups.length, "every seed group exists");
|
|
||||||
|
|
||||||
const restricted = byName(groupsPlugin.groups, "Restricted");
|
|
||||||
t3.strictSame(restricted.permissions.isBlacklist, false, "the group only allows the listed actions");
|
|
||||||
t3.strictSame(restricted.permissions.permissions, ["write_to_console"], "the actions match the seed");
|
|
||||||
|
|
||||||
const admin = byName(groupsPlugin.groups, "Admin");
|
|
||||||
groupsPlugin.groups.set(new GroupRecord(admin.id, admin.name, new GroupPermissions(true, [])));
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
t3.strictSame(groupsPlugin.groups.size, seedGroups.length, "seeding again reuses the groups");
|
|
||||||
t3.ok(
|
|
||||||
byName(groupsPlugin.groups, "Admin").permissions.permissions.includes("toggle_map_editor"),
|
|
||||||
"seeding again resets the actions",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
t2.test(".handleSeedRequest() maps each role onto its group by rank", async t3 => {
|
|
||||||
const { plugin, controller } = await startPlugin(t3);
|
|
||||||
const groupsPlugin = controller.plugins.get("exp_groups");
|
|
||||||
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
const mapped = seedRoles.filter(role => role.group !== undefined);
|
|
||||||
t3.strictSame(groupsPlugin.roleMappings.size, mapped.length, "every role with a group is mapped");
|
|
||||||
|
|
||||||
const mappingOf = name => [...groupsPlugin.roleMappings.values()]
|
|
||||||
.find(mapping => mapping.roleIds.has(byName(controller.roles, name).id));
|
|
||||||
const groupOf = name => groupsPlugin.groups.get(mappingOf(name).groupId).name;
|
|
||||||
t3.strictSame(groupOf("Player"), "Guest", "the default role maps to the guest group");
|
|
||||||
t3.strictSame(groupOf("Jail"), "Restricted", "jail maps to the restricted group");
|
|
||||||
t3.ok(mappingOf("Jail").priority > mappingOf("Senior Administrator").priority, "jail outranks every role");
|
|
||||||
t3.ok(mappingOf("Moderator").priority > mappingOf("Veteran").priority, "the role order sets the rank");
|
|
||||||
t3.ok(mappingOf("Veteran").priority > mappingOf("Player").priority, "the default role ranks lowest");
|
|
||||||
t3.strictSame(mappingOf("Cluster Admin"), undefined, "the admin role keeps the factorio default group");
|
|
||||||
|
|
||||||
const priorities = [...groupsPlugin.roleMappings.values()].map(mapping => mapping.priority);
|
|
||||||
t3.strictSame(priorities.length, new Set(priorities).size, "priorities are unique");
|
|
||||||
});
|
|
||||||
|
|
||||||
t2.test(".handleSeedRequest() reuses mappings and keeps clear of other mappings", async t3 => {
|
|
||||||
const { plugin, controller } = await startPlugin(t3);
|
|
||||||
const groupsPlugin = controller.plugins.get("exp_groups");
|
|
||||||
|
|
||||||
groupsPlugin.roleMappings.set(new RoleMappingRecord(99, new Set([0, 1]), 5, 2, true));
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
const first = new Map([...groupsPlugin.roleMappings.values()].map(mapping => [mapping.id, mapping.priority]));
|
|
||||||
|
|
||||||
await plugin.handleSeedRequest();
|
|
||||||
const second = new Map([...groupsPlugin.roleMappings.values()].map(mapping => [mapping.id, mapping.priority]));
|
|
||||||
t3.strictSame(second, first, "seeding again reuses the mappings");
|
|
||||||
t3.strictSame(groupsPlugin.roleMappings.get(99).priority, 2, "other mappings are left alone");
|
|
||||||
t3.notOk([...first.values()].filter(priority => priority === 2).length > 1, "seed priorities skip taken ones");
|
|
||||||
});
|
|
||||||
|
|
||||||
t2.end();
|
|
||||||
});
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
{
|
{
|
||||||
"extends": "../tsconfig.browser.json",
|
"extends": "../tsconfig.browser.json",
|
||||||
"include": [ "web/**/*.tsx", "web/**/*.ts", "index.ts", "messages.ts", "permissions.ts", "package.json" ],
|
"include": [ "web/**/*.tsx", "web/**/*.ts", "messages.ts", "package.json" ],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
{
|
{
|
||||||
"extends": "../tsconfig.node.json",
|
"extends": "../tsconfig.node.json",
|
||||||
"references": [
|
|
||||||
{ "path": "../exp_groups/tsconfig.node.json" },
|
|
||||||
{ "path": "../exp_roles/tsconfig.node.json" },
|
|
||||||
],
|
|
||||||
"include": ["./**/*.ts"],
|
"include": ["./**/*.ts"],
|
||||||
"exclude": ["test/*", "./dist/*"],
|
"exclude": ["test/*", "./dist/*"],
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
import React, { useContext, useState } from "react";
|
|
||||||
import { Button, Popconfirm } from "antd";
|
|
||||||
|
|
||||||
import { ControlContext, SectionHeader, useAccount, notifyErrorHandler } from "@clusterio/web_ui";
|
|
||||||
|
|
||||||
import { SeedRequest } from "../../messages.js";
|
|
||||||
|
|
||||||
/** Button on the roles page which creates the roles and permission groups the scenario shipped with. */
|
|
||||||
export default function Seed() {
|
|
||||||
const control = useContext(ControlContext);
|
|
||||||
const account = useAccount();
|
|
||||||
const [seeding, setSeeding] = useState(false);
|
|
||||||
|
|
||||||
if (!account.hasPermission("exp_scenario.seed")) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return <SectionHeader
|
|
||||||
title="ExpGaming Roles"
|
|
||||||
extra={<Popconfirm
|
|
||||||
title="Create the ExpGaming roles and permission groups?"
|
|
||||||
description="Roles which already exist by name only gain permissions, groups are reset to the defaults."
|
|
||||||
onConfirm={() => {
|
|
||||||
setSeeding(true);
|
|
||||||
control.send(new SeedRequest())
|
|
||||||
.catch(notifyErrorHandler("Error seeding roles and groups"))
|
|
||||||
.finally(() => setSeeding(false));
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Button loading={seeding}>Seed roles and groups</Button>
|
|
||||||
</Popconfirm>}
|
|
||||||
/>;
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
import { BaseWebPlugin } from "@clusterio/web_ui";
|
|
||||||
|
|
||||||
import Seed from "./components/Seed";
|
|
||||||
|
|
||||||
export class WebPlugin extends BaseWebPlugin {
|
|
||||||
async init() {
|
|
||||||
this.componentExtra = {
|
|
||||||
RolesPage: Seed,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ export const plugin: lib.PluginDeclaration = {
|
|||||||
title: "ExpGaming - Server UPS",
|
title: "ExpGaming - Server UPS",
|
||||||
description: "Clusterio plugin providing in game server ups counter",
|
description: "Clusterio plugin providing in game server ups counter",
|
||||||
|
|
||||||
instanceEntrypoint: "./dist/node/instance.js",
|
instanceEntrypoint: "./dist/node/instance",
|
||||||
instanceConfigFields: {
|
instanceConfigFields: {
|
||||||
"exp_server_ups.update_interval": {
|
"exp_server_ups.update_interval": {
|
||||||
title: "Update Interval",
|
title: "Update Interval",
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
[exp_server-ups]
|
[exp_server-ups]
|
||||||
description=啟動 UPS 顯示。
|
description=啟動 UPS 顯示
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
[exp_server-ups]
|
[exp_server-ups]
|
||||||
description=啟動 UPS 顯示。
|
description=啟動 UPS 顯示
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user