mirror of
https://github.com/Anuken/Mindustry.git
synced 2026-10-03 20:00:26 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4410f31888 | ||
|
|
df11dd7a74 | ||
|
|
804dd61cd9 | ||
|
|
b00c5b4cab | ||
|
|
e0d6cebb2e | ||
|
|
ab772dccd4 | ||
|
|
b244032328 | ||
|
|
421c5e2879 | ||
|
|
1a8c4d8d8a | ||
|
|
9efb1824af | ||
|
|
74de125700 | ||
|
|
64cea34a98 | ||
|
|
9c4bdc213d | ||
|
|
92c0552fd5 | ||
|
|
ff39e5f90d | ||
|
|
83c55fdbb4 | ||
|
|
7d300a273b | ||
|
|
29f36c1927 | ||
|
|
b65c3cd931 | ||
|
|
7401e7fe31 | ||
|
|
150215712b | ||
|
|
f7ccf3c04a | ||
|
|
ebb798cac3 | ||
|
|
348819d1ac | ||
|
|
a8a3453632 | ||
|
|
9b02a274f1 | ||
|
|
f093360565 | ||
|
|
d457901d2e | ||
|
|
460dbff7d1 | ||
|
|
e564602fd1 | ||
|
|
e029321e5b | ||
|
|
87d7089df3 | ||
|
|
e4f929a851 | ||
|
|
8726cde05d | ||
|
|
a189ac8613 | ||
|
|
652aa4c456 | ||
|
|
cc3ae2c66c | ||
|
|
359e59bbad | ||
|
|
40ec7fd6fc | ||
|
|
d17f0ebc51 | ||
|
|
5027b70f5a | ||
|
|
0b7c790777 | ||
|
|
5ac9e9f63c | ||
|
|
b08136e3ea | ||
|
|
ec8262418f | ||
|
|
946e36c66e | ||
|
|
00f3518349 | ||
|
|
29bf99fe1a | ||
|
|
e104591dec | ||
|
|
0fd26e68d4 | ||
|
|
53f410fee0 | ||
|
|
53206e4b31 | ||
|
|
3818bfffb4 | ||
|
|
e6afc6ef0b | ||
|
|
5eb1c1dffc | ||
|
|
66406806b7 | ||
|
|
3a6debfae6 | ||
|
|
a093fa5718 | ||
|
|
9c1f17fbdd | ||
|
|
ce3643f0b3 | ||
|
|
f1fb7d8098 | ||
|
|
3d01eeaf1c | ||
|
|
be39c31865 | ||
|
|
0d2dfadba7 | ||
|
|
2dcab97b6d | ||
|
|
31cb169002 | ||
|
|
c381499c58 | ||
|
|
8577a8cca4 | ||
|
|
7a18c4a580 | ||
|
|
40589eb9ff | ||
|
|
722370b57c | ||
|
|
573672622a | ||
|
|
12f747ae1d | ||
|
|
395dc99595 | ||
|
|
c945243795 | ||
|
|
c2262cc9cf | ||
|
|
411399e96f | ||
|
|
f833b9e0ce | ||
|
|
9955423e9a | ||
|
|
58b4265b31 | ||
|
|
671a62aed7 | ||
|
|
c94fe9c312 | ||
|
|
f46a9730a3 | ||
|
|
d45cd7c15e | ||
|
|
a84d52f5fe | ||
|
|
330d37b7a5 | ||
|
|
d2792a4e9d | ||
|
|
c50a69d42a | ||
|
|
ee689d1597 | ||
|
|
6ef8d64d46 | ||
|
|
0095e89673 | ||
|
|
55d97ea202 | ||
|
|
85b8868d2b | ||
|
|
65e92ab6fc | ||
|
|
478baf2532 | ||
|
|
0750348cb1 | ||
|
|
db6cbc5cc3 | ||
|
|
b4359c0489 | ||
|
|
977192bc54 | ||
|
|
d54b557a9f | ||
|
|
f6c97f4ff6 | ||
|
|
66f4118896 | ||
|
|
4a8f8c4ecf | ||
|
|
6d7c207b95 | ||
|
|
597bd31a0c | ||
|
|
98157f2852 | ||
|
|
5e324e71d4 | ||
|
|
3159ce6707 | ||
|
|
9b033532c8 | ||
|
|
0678592d59 | ||
|
|
00d6b0d483 | ||
|
|
598049265a | ||
|
|
c3209f2cdd | ||
|
|
b2b4602c91 | ||
|
|
b1e1fe4922 | ||
|
|
edcf3c4223 | ||
|
|
58315acfa3 | ||
|
|
ec9eadd660 | ||
|
|
7277892e33 | ||
|
|
54962a158d | ||
|
|
30dcbe1af3 | ||
|
|
e92d5d2d2d | ||
|
|
411367f294 | ||
|
|
f49e05a915 |
@@ -23,6 +23,8 @@ jobs:
|
||||
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
|
||||
- name: Add Arc release
|
||||
run: |
|
||||
git config --global user.email "actions@github.com"
|
||||
git config --global user.name "Github Actions"
|
||||
git clone --depth=1 --branch=master https://github.com/Anuken/Arc ../Arc
|
||||
cd ../Arc
|
||||
git tag ${RELEASE_VERSION}
|
||||
|
||||
+14
-12
@@ -9,20 +9,22 @@ You may want to add your server to this list. The steps for getting this done ar
|
||||
1. **Ensure your server is properly moderated.** For the most part, this applies to survival servers, but PvP servers can be affected as well.
|
||||
You'll need to either hire some moderators, or make use of (currently non-existent) anti-grief and anti-curse plugins.
|
||||
*Consider enabling a rate limit:* `config messageRateLimit 2` will make it so that players can only send messages every 2 seconds, for example.
|
||||
2. Make sure that your server is able to handle inappropriate content - this includes NSFW display/sorter art and abusive messages. **Servers that allow such content will be removed immediately.** Consider banning display blocks if it is a problem for your server: `rules add bannedBlocks ["logic-display", "large-logic-display"]`.
|
||||
2. Make sure that your server is able to handle inappropriate content - this includes NSFW display/sorter art and abusive messages. **Servers that allow such content will be removed immediately.** Consider banning display blocks if it is a problem for your server: `rules add bannedBlocks ["canvas", "logic-display", "large-logic-display"]`.
|
||||
3. **Set an appropriate MOTD, name and description.** This is set with `config <name/desc/motd> <value>`. "Appropriate" means that:
|
||||
- Your name or description must reflect the type of server you're hosting.
|
||||
Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt.
|
||||
- Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you.
|
||||
- Try to be professional in your text; use common sense.
|
||||
- Your name or description must reflect the type of server you're hosting.
|
||||
Since new players may be exposed to the server list early on, put in a phrase like "Co-op survival" or "PvP" so players know what they're getting into. Yes, this is also displayed in the server mode info text, but having extra info in the name doesn't hurt.
|
||||
- Make sure players know where to refer to for server support. It should be fairly clear that the server owner is not me, but you.
|
||||
- Try to be professional in your text; use common sense.
|
||||
4. **Get some good maps.** *(optional, but highly recommended)*. Add some maps to your server and set the map rotation to custom-only. You can get maps from the Steam workshop by subscribing and exporting them; using the `#maps` channel on Discord is also an option.
|
||||
5. **Check your server configuration.** *(optional)* I would recommend adding a message rate limit of 1 second (`config messageRateLimit 1`), and disabling connect/disconnect messages to reduce spam (`config showConnectMessages false`).
|
||||
6. Finally, **submit a pull request** to add your server's IP to the list.
|
||||
This should be fairly straightforward: Press the edit button on the [server file](https://github.com/Anuken/Mindustry/blob/master/servers_v6.json), then add a JSON object with a single key, indicating your server address.
|
||||
For example, if your server address is `google.com`, you would add a comma after the last entry and insert:
|
||||
```json
|
||||
{
|
||||
"address": "google.com"
|
||||
}
|
||||
```
|
||||
Then, press the *'submit pull request'* button and I'll take a look at your server. If I have any issues with it, I'll let you know in the PR comments.
|
||||
For example, if your server address is `example.com:6000`, you would add a comma after the last entry and insert:
|
||||
```json
|
||||
{
|
||||
"address": "example.com:6000"
|
||||
}
|
||||
```
|
||||
> Note that Mindustry also support SRV records. This allows you to use a subdomain for your server address instead of specifying the port. For example, if you want to use `play.example.com` instead of `example.com:6000`, in the dns settings of your domain, add an SRV record with `_mindustry` as the service, `tcp` as the protocol, `play` as the target and `6000` as the port. You can also setup fallback servers by modifing the weight or priority of the record.
|
||||
|
||||
Then, press the *'submit pull request'* button and I'll take a look at your server. If I have any issues with it, I'll let you know in the PR comments.
|
||||
|
||||
@@ -629,7 +629,7 @@ public class EntityProcess extends BaseProcessor{
|
||||
groupsBuilder.addField(ParameterizedTypeName.get(
|
||||
ClassName.bestGuess("mindustry.entities.EntityGroup"), itype), group.name, Modifier.PUBLIC, Modifier.STATIC);
|
||||
|
||||
groupInit.addStatement("$L = new $T<>($L.class, $L, $L, (e, pos) -> (($L.IndexableEntity__$L)e).setIndex__$L(pos))", group.name, groupc, itype, group.spatial, group.mapping, packageName, group.name, group.name);
|
||||
groupInit.addStatement("$L = new $T<>($L.class, $L, $L, (e, pos) -> { if(e instanceof $L.IndexableEntity__$L ix) ix.setIndex__$L(pos); })", group.name, groupc, itype, group.spatial, group.mapping, packageName, group.name, group.name);
|
||||
}
|
||||
|
||||
//write the groups
|
||||
|
||||
@@ -150,12 +150,16 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [red]Content Errors
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This mod caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
|
||||
@@ -335,6 +339,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Open Link
|
||||
copylink = Copy Link
|
||||
back = Back
|
||||
|
||||
@@ -14,14 +14,14 @@ link.f-droid.description = Спампаваць для Android з F-Droid
|
||||
link.wiki.description = Афіцыйная вікі
|
||||
link.suggestions.description = Прапанаваць новыя функцыі
|
||||
link.bug.description = Found one? Report it here
|
||||
linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0}
|
||||
linkopen = Гэты сервер адправіў вам спасылку. Ці жадаеце адкрыць я?\n\n[sky]{0}
|
||||
linkfail = Не атрымалася адкрыць спасылку!\nURL-адрэс быў скапіяваны ў буфер абмена.
|
||||
screenshot = Cкрыншот захаваны ў {0}
|
||||
screenshot.invalid = Карта занадта вялікая, магчыма, не хапае памяці для скрыншота.
|
||||
gameover = Гульня скончана
|
||||
gameover.disconnect = Disconnect
|
||||
gameover.disconnect = Адключаны
|
||||
gameover.pvp = [accent]{0}[] каманда перамагла!
|
||||
gameover.waiting = [accent]Waiting for next map...
|
||||
gameover.waiting = [accent]Чаканне наступнай карты...
|
||||
highscore = [accent]Новы рэкорд!
|
||||
copied = Скапіявана.
|
||||
indev.notready = Гэта частка гульні яшчэ не зроблена.
|
||||
@@ -40,24 +40,24 @@ be.updating = Абнауляецца...
|
||||
be.ignore = Ігнараваць
|
||||
be.noupdates = Абнаўленні не знойдзены.
|
||||
be.check = Праверыць абнаўленні
|
||||
mods.browser = Mod Browser
|
||||
mods.browser.selected = Selected mod
|
||||
mods.browser.add = Install
|
||||
mods.browser.reinstall = Reinstall
|
||||
mods.browser.view-releases = View Releases
|
||||
mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published.
|
||||
mods.browser.latest = <Latest>
|
||||
mods.browser.releases = Releases
|
||||
mods.github.open = Repo
|
||||
mods.github.open-release = Release Page
|
||||
mods.browser.sortdate = Sort by recent
|
||||
mods.browser.sortstars = Sort by stars
|
||||
mods.browser = Браўзер Мадыфікацый
|
||||
mods.browser.selected = Выбраная Мадыфікацы
|
||||
mods.browser.add = Усталяваць
|
||||
mods.browser.reinstall = Пераусталяваць
|
||||
mods.browser.view-releases = Праглядзець Рэлізы
|
||||
mods.browser.noreleases = [scarlet]Рэлізы Не Знойдзеныя\n[accent]Не магчыма знайсці рэлізы для гэтай мадыфікацыі. Праверце ці гэтая мадыфікацыя утрымлівае апублікаваныя рэлізы.
|
||||
mods.browser.latest = <Апошнія>
|
||||
mods.browser.releases = Рэлізы
|
||||
mods.github.open = Рэпазіторый
|
||||
mods.github.open-release = Стпронка Рэлізаў
|
||||
mods.browser.sortdate = Сартаваць па нядаўняму
|
||||
mods.browser.sortstars = Сартаваць па зоркам
|
||||
|
||||
schematic = Схема
|
||||
schematic.add = Захаваць схему...
|
||||
schematics = Схемы
|
||||
schematic.replace = Схема с данным імем ўжо існуе. Замяніць яе?
|
||||
schematic.exists = Схема с данным імем ўжо існуе.
|
||||
schematic.replace = Схема с дадзенай назвай ужо існуе. Замяніць яе?
|
||||
schematic.exists = Схема с дадзенай назвай ужо існуе.
|
||||
schematic.import = Імпартаваць схему...
|
||||
schematic.exportfile = Экспартаваць файл
|
||||
schematic.importfile = Імпартаваць файл
|
||||
@@ -71,24 +71,24 @@ schematic.delete.confirm = Гэтая схема будзе выдалена.
|
||||
schematic.rename = Перайменаваць схему
|
||||
schematic.info = {0}x{1}, {2} блокаў
|
||||
schematic.disabled = [scarlet]Схемы забаронены[]\nВам нельга выкарыстоўваць схемы на гэтай [accent]карце[] альбо [accent]серверы.
|
||||
schematic.tags = Tags:
|
||||
schematic.edittags = Edit Tags
|
||||
schematic.addtag = Add Tag
|
||||
schematic.texttag = Text Tag
|
||||
schematic.icontag = Icon Tag
|
||||
schematic.renametag = Rename Tag
|
||||
schematic.tagdelconfirm = Delete this tag completely?
|
||||
schematic.tagexists = That tag already exists.
|
||||
stats = Stats
|
||||
stats.wave = Waves Defeated
|
||||
stats.unitsCreated = Units Created
|
||||
stats.enemiesDestroyed = Enemies Destroyed
|
||||
stats.built = Buildings Built
|
||||
stats.destroyed = Buildings Destroyed
|
||||
stats.deconstructed = Buildings Deconstructed
|
||||
stats.playtime = Time Played
|
||||
schematic.tags = Тэгі:
|
||||
schematic.edittags = Правіць Тэг
|
||||
schematic.addtag = Дабавіць Тэг
|
||||
schematic.texttag = Тэкст Тэгу
|
||||
schematic.icontag = Іконка Тэгу
|
||||
schematic.renametag = Пераназваць Тэг
|
||||
schematic.tagdelconfirm = Выдаліць гэты тэг цалкам?
|
||||
schematic.tagexists = Такі тэг ужо ёсць.
|
||||
stats = Вынікі
|
||||
stats.wave = Хваляў Пераможана
|
||||
stats.unitsCreated = Адзінкаў Створана
|
||||
stats.enemiesDestroyed = Ворагаў Знішчана
|
||||
stats.built = Пабудавана Будынкаў
|
||||
stats.destroyed = Знішчана Будынкаў
|
||||
stats.deconstructed = Дэкнструявана Будынкаў
|
||||
stats.playtime = Час Гульні
|
||||
|
||||
globalitems = [accent]Global Items
|
||||
globalitems = [accent]Усе Элементы
|
||||
map.delete = Вы сапраўды хочаце выдаліць карту «[accent]{0}[]»?
|
||||
level.highscore = Рэкорд: [accent]{0}
|
||||
level.select = Выбар карты
|
||||
@@ -96,15 +96,15 @@ level.mode = Рэжым гульні:
|
||||
coreattack = < Ядро знаходзіцца пад атакай! >
|
||||
nearpoint = [[ [scarlet]ПАКІНЬЦЕ КРОПКУ ВЫСАДКІ НЕАДКЛАДНА[] ]\nанігіляцыя непазбежна
|
||||
database = База дадзеных ядра
|
||||
database.button = Database
|
||||
savegame = Захаваць гульню
|
||||
loadgame = Спампаваць гульню
|
||||
joingame = Сеткавая гульня
|
||||
customgame = Карыстацкая гульня
|
||||
newgame = Новая гульня
|
||||
none = <ничога>
|
||||
none.found = [lightgray]<none found>
|
||||
none.inmap = [lightgray]<none in map>
|
||||
database.button = База Дадзеных
|
||||
savegame = Захаваць Гульню
|
||||
loadgame = Спампаваць Гульню
|
||||
joingame = Сеткавая Гульня
|
||||
customgame = Карыстальніцкая Гульня
|
||||
newgame = Новая Гульня
|
||||
none = <нічога>
|
||||
none.found = [lightgray]<нічога не знойдзена>
|
||||
none.inmap = [lightgray]<нічога не знойдзена на карце>
|
||||
minimap = Міні-карта
|
||||
position = Каардынаты
|
||||
close = Зачыніць
|
||||
@@ -137,20 +137,24 @@ mod.installed = [[Installed]
|
||||
mod.display = [gray]Мадыфікацыя:[orange] {0}
|
||||
mod.enabled = [lightgray]Уключана
|
||||
mod.disabled = [scarlet]Выключана
|
||||
mod.multiplayer.compatible = [gray]Multiplayer Compatible
|
||||
mod.multiplayer.compatible = [gray]Многакарыстальніцка-Сумяшчальна
|
||||
mod.disable = Выкл.
|
||||
mod.content = Змест:
|
||||
mod.delete.error = Немагчыма выдаліць мадыфікацыю. Магчыма, файл выкарыстоўваецца.
|
||||
mod.incompatiblegame = [red]Outdated Game
|
||||
mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.incompatiblegame = [red]Застарэлая Версія Гульні
|
||||
mod.incompatiblemod = [red]Несумящчальна
|
||||
mod.blacklisted = [red]Не Падтрымліваецца
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Памылкі змесціва
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Памылкі былі выкліканыя загружаным змесцівам.
|
||||
mod.noerrorplay = [scarlet]У Вас ёсць мадыфікацыі з памылкамі.[] Выключыце праблемныя мадыфікацыі або выпраўце памылкі перад гульнёй.
|
||||
@@ -158,8 +162,8 @@ mod.nowdisabled = [scarlet]Мадыфікацыі '{0}' патрабуюцца
|
||||
mod.enable = Укл.
|
||||
mod.requiresrestart = Цяпер гульня зачыніцца, каб прымяніць змены ў мадыфікацыях.
|
||||
mod.reloadrequired = [scarlet]Неабходны перазапуск
|
||||
mod.import = Імпартаваць мадыфікацыю
|
||||
mod.import.file = Import File
|
||||
mod.import = Імпартаваць Мадыфікацыю
|
||||
mod.import.file = Імпартаваць Файл
|
||||
mod.import.github = Імпартаваць мод з GitHub
|
||||
mod.jarwarn = [scarlet]JAR-мады не бяспечны па прынцыпу.[]\nПраверце, што імпартуеце гэты мод с надзейнай крыніцы!
|
||||
mod.item.remove = Гэты прадмет з’яўляецца часткай мадыфікацыі [accent]«{0}»[]. Каб выдаліць яго, выдаліце саму мадыфікацыю.
|
||||
@@ -173,7 +177,7 @@ mod.scripts.disable = Ваша прылада не падтрымлівае ма
|
||||
about.button = Аб гульні
|
||||
name = Імя:
|
||||
noname = Для пачатку, прыдумайце[accent] сабе iмя[].
|
||||
search = Search:
|
||||
search = Пошук:
|
||||
planetmap = Карта планеты
|
||||
launchcore = Запусціць ядро
|
||||
filename = Iмя файла:
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = адкрыць спасылку
|
||||
copylink = скапіяваць спасылку
|
||||
back = Назад
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Грешки в Съдържанието
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Възникнаха грешки при зареждане на съдържанието.
|
||||
mod.noerrorplay = [scarlet]Има грешки в някои от модовете, които използвате.[] Трябва да деактивирате тези модове или да поправите грешките преди да играете.
|
||||
@@ -331,6 +335,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Отвори Линк
|
||||
copylink = Копирай Линк
|
||||
back = Назад
|
||||
|
||||
@@ -101,7 +101,7 @@ database = Base de dades del nucli
|
||||
database.button = Base de dades
|
||||
savegame = Desa la partida
|
||||
loadgame = Carrega una partida
|
||||
joingame = Uneix-me a una partida
|
||||
joingame = Unir-se a una partida
|
||||
customgame = Partida personalitzada
|
||||
newgame = Partida nova
|
||||
none = <cap>
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Depèndencies sense resoldre
|
||||
mod.erroredcontent = [scarlet]Errors del contingut
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requereix la versió: [accent]{0}[]\nCal actualitzar la vostra versió del joc. El mod necessita una versió nova (potser una distribució alfa o beta) per a funcionar.
|
||||
mod.outdatedv7.details = Aquest mod és incompatible amb l’última versió del joc. L’autor l’ha d’actualitzar i afegir [accent]minGameVersion: 136[] al seu fitxer [accent]mod.json[].
|
||||
mod.blacklisted.details = Aquest mod s’ha afegit manualment a la llista negra perquè causa problemes amb aquesta versió del joc. No el feu servir.
|
||||
mod.missingdependencies.details = A aquest mod li falten dependències: {0}
|
||||
mod.erroredcontent.details = Aquesta partida ha causat errors mentre es carregava. Pregunteu a l’autor del mod si pot arreglar-ho.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Cal la versió [red]{0}[] del joc.
|
||||
mod.errors = S’han produït errors quan es carregava el contingut.
|
||||
mod.noerrorplay = [scarlet]S’executen mods amb errors.[] Desactiveu els mods afectats o arregleu les errades abans de jugar.
|
||||
@@ -331,6 +335,7 @@ command.repair = Repara
|
||||
command.rebuild = Reconstrueix
|
||||
command.assist = Assisteix al jugador
|
||||
command.move = Mou
|
||||
command.boost = Boost
|
||||
openlink = Obre l’enllaç
|
||||
copylink = Copia l’enllaç
|
||||
back = Enrere
|
||||
@@ -486,7 +491,7 @@ editor.generate = Genera
|
||||
editor.sectorgenerate = Generació del sector
|
||||
editor.resize = Canvia la mida
|
||||
editor.loadmap = Carrega un mapa
|
||||
editor.savemap = Desa un mapa
|
||||
editor.savemap = Desa el mapa
|
||||
editor.saved = S’ha desat.
|
||||
editor.save.noname = El mapa no té nom! Trieu-ne un des del menú «Informació del mapa».
|
||||
editor.save.overwrite = El vostre mapa sobreescriu un mapa incorporat al joc! Trieu un nom diferent des del menú «Informació del mapa».
|
||||
@@ -1207,7 +1212,7 @@ rules.unitbuildspeedmultiplier = Multiplicador de la velocitat de producció d
|
||||
rules.unitcostmultiplier = Multiplicador del cost de les unitats
|
||||
rules.unithealthmultiplier = Multiplicador de la salut de les unitats
|
||||
rules.unitdamagemultiplier = Multiplicador del dany de les unitats
|
||||
rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier
|
||||
rules.unitcrashdamagemultiplier = Multiplicador del dany de xoc de les unitats
|
||||
rules.solarmultiplier = Multiplicador de l’energia solar
|
||||
rules.unitcapvariable = Els nuclis contribueixen al límit d’unitats
|
||||
rules.unitcap = Capacitat base d’unitats
|
||||
@@ -1378,7 +1383,7 @@ block.scrap-wall-large.name = Mur de ferralla gros
|
||||
block.scrap-wall-huge.name = Mur de ferralla enorme
|
||||
block.scrap-wall-gigantic.name = Mur de ferralla gegantí
|
||||
block.thruster.name = Propulsor
|
||||
block.kiln.name = Kiln
|
||||
block.kiln.name = Forn de vidre
|
||||
block.graphite-press.name = Premsa de grafit
|
||||
block.multi-press.name = Premsa múltiple
|
||||
block.constructing = {0} [lightgray](Construint)
|
||||
@@ -1460,7 +1465,7 @@ block.distributor.name = Distrïbudor
|
||||
block.sorter.name = Classificador
|
||||
block.inverted-sorter.name = Classificador invers
|
||||
block.message.name = Missatge
|
||||
block.reinforced-message.name = Missatge remarcat
|
||||
block.reinforced-message.name = Missatge reforçat
|
||||
block.world-message.name = Missatge mundial
|
||||
block.illuminator.name = Il·luminador
|
||||
block.overflow-gate.name = Porta de desbordament
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]V obsahu jsou chyby[]
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Při načítání obsahu hry se vyskytly problémy.
|
||||
mod.noerrorplay = [scarlet]Máš modifikace s chybami.[] Buď zakaž dotčené modifikace, nebo oprav chyby před tím, než začneš hrát.
|
||||
@@ -331,6 +335,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Otevřít odkaz
|
||||
copylink = Zkopírovat odkaz
|
||||
back = Zpět
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Indholds fejl
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Fejl ved afhentning af indhold.
|
||||
mod.noerrorplay = [scarlet]Du har mods med fejl.[] Deaktiver det eller løs fejl før du starter spillet.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Åben Link
|
||||
copylink = Kopier Link
|
||||
back = Tilbage
|
||||
|
||||
@@ -150,12 +150,16 @@ mod.incompatiblemod = [red]Inkompatibel
|
||||
mod.blacklisted = [red]Nicht unterstützt
|
||||
mod.unmetdependencies = [red]Fehlende Abhängigkeiten
|
||||
mod.erroredcontent = [scarlet]Inhalt-Fehler
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
|
||||
mod.requiresversion.details = Benötigt Spielversion [accent]{0}[]\nDein Spiel ist veraltet. Diese Mod benötigt eine neuere (möglicherweise Alpha- oder Beta-) Spielversion.
|
||||
mod.outdatedv7.details = Diese Mod ist nicht mit der neuesten Version von Mindustry kompatibel. Der Autor muss diesen aktualisieren und [accent]minGameVersion: 136[] in der [accent]mod.json[]-Datei hinzufügen.
|
||||
mod.blacklisted.details = Diese Mod würde manuell gesperrt, weil er diese Spielversion zum Abstürzen bringt oder andere Fehler verursacht. Benutze diese Mod nicht.
|
||||
mod.missingdependencies.details = Dieser Mod fehlen folgende Abhängigkeiten: {0}
|
||||
mod.erroredcontent.details = Diese Mod hat beim Laden Fehler verursacht. Bitte den Mod-Autor, diese zu beheben.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
|
||||
mod.errors = Beim Laden von Inhalt sind Fehler aufgetreten.
|
||||
@@ -334,6 +338,7 @@ command.repair = Reparieren
|
||||
command.rebuild = Wiederaufbauen
|
||||
command.assist = Spieler unterstützen
|
||||
command.move = Bewegen
|
||||
command.boost = Boost
|
||||
openlink = Link öffnen
|
||||
copylink = Link kopieren
|
||||
back = Zurück
|
||||
@@ -1759,7 +1764,7 @@ hint.skip = Fertig
|
||||
hint.desktopMove = Drücke [accent][[WASD][], um dich zu bewegen.
|
||||
hint.zoom = [accent]Scrolle[], um rein oder raus zu zoomen.
|
||||
hint.desktopShoot = Benutze [accent][[Linksklick][], um zu schießen.
|
||||
hint.depositItems = Um Materialien in den Kern zu tun, ziehe sie von dir zum Kern.
|
||||
hint.depositItems = Um Materialien in den Kern zu verschieben, ziehe sie von dir zum Kern.
|
||||
hint.respawn = Um im Kern zu respawnen, drücke [accent][[V][].
|
||||
hint.respawn.mobile = Du steuerst nun eine Einheit oder einen Block. Um wieder zur normalen Einheit zu werden, [accent]drücke die Abbildung von dir oben links[].
|
||||
hint.desktopPause = Benutze [accent][[Leertaste][], um das Spiel zu pausieren oder entpausieren.
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Content Errors
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Errors have occurred loading content.
|
||||
mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Ava link
|
||||
copylink = Kopeeri link
|
||||
back = Tagasi
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Edukiaren erroreak
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This mod caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Erroreak gertatu dira edukia kargatzean.
|
||||
mod.noerrorplay = [scarlet]Erroreak dituzten mod-ak dituzu.[] Desgaitu kaltetutako mod-ak edo konpondu erroreak jolastu aurretik.
|
||||
@@ -329,6 +333,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Ireki esteka
|
||||
copylink = Kopiatu esteka
|
||||
back = Atzera
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Sisältövirheet
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Virheitä on tapahtunut pelin ladatessa.
|
||||
mod.noerrorplay = [scarlet]Sinulla on virheellisiä modeja.[] Joko poista ne käytöstä tai korjaa virheet.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Avaa linkki
|
||||
copylink = Kopioi linkki
|
||||
back = Takaisin
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Mga Error sa Nilalaman
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = May mga error na naitala habang ni-lo-load ang nilalaman.
|
||||
mod.noerrorplay = [scarlet]May mga mod kang may error.[] Maaaring 'wag munang paganahin ang mga apektadong mod o 'di kaya'y ayusin ang mga error bago maglaro.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Open Link
|
||||
copylink = Copy Link
|
||||
back = Back
|
||||
|
||||
@@ -150,12 +150,16 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Non supporté
|
||||
mod.unmetdependencies = [red]Dépendances manquantes
|
||||
mod.erroredcontent = [scarlet]Erreurs dans le contenu !
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
|
||||
mod.requiresversion.details = Requiert la version: [accent]{0}[]\nVotre jeu n'est pas à jour. Ce mod a besoin d'une version récente du jeu (la beta ou l'alpha) pour fonctionner.
|
||||
mod.outdatedv7.details = Ce mod est incompatible avec la version la plus récente du jeu. L'auteur doit le mettre à jour et ajouter [accent]minGameVersion: 136[] dans le fichier [accent]mod.json[].
|
||||
mod.blacklisted.details = Ce mod à été manuellement mis sur liste noire car il cause des crashs ou d'autres problèmes avec la version actuelle du jeu. Ne l'utilisez pas.
|
||||
mod.missingdependencies.details = Ce mod à des dépendances manquantes: {0}
|
||||
mod.erroredcontent.details = Ce mod cause des erreurs lors du chargement. Demandez à l'autheur de les régler.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
|
||||
mod.requiresversion = Requiert la version: [red]{0}
|
||||
|
||||
@@ -335,6 +339,7 @@ command.repair = Réparer
|
||||
command.rebuild = Reconstruire
|
||||
command.assist = Assister
|
||||
command.move = Bouger
|
||||
command.boost = Boost
|
||||
openlink = Ouvrir le lien
|
||||
copylink = Copier le lien
|
||||
back = Retour
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#A fordításban közreműködött: Vajda Simon, Polgár Sándor és Erdélyi Nimród
|
||||
#A fordításban közreműködött: Vajda Simon, Polgár Sándor, Erdélyi Nimród és Halász Gergő
|
||||
credits.text = Készítette: [royal]Anuken[] - [sky]anukendev@gmail.com[]
|
||||
credits = Credits
|
||||
credits = Creditek
|
||||
contributors = Fordítok és készítők
|
||||
discord = Csatlakozz a Mindustry Discord szerverhez!
|
||||
link.discord.description = Az eredeti Mindustry Discord chatszoba
|
||||
@@ -15,10 +15,10 @@ link.f-droid.description = F-Droid katalógus listázás
|
||||
link.wiki.description = Hivatalos Mindustry wiki
|
||||
link.suggestions.description = Új funkciók ajánlása
|
||||
link.bug.description = Találtál szoftver hibá-t? Jelentsd itt
|
||||
linkopen = This server has sent you a link. Are you sure you want to open it?\n\n[sky]{0}
|
||||
linkopen = Ez a szerber egy linket küldött neked. Biztos vagy benne, hogy megnyitod?\n\n[sky]{0}
|
||||
linkfail = Nem sikerült megnyitni a linket!\nAz URL a vágólapra lett másolva.
|
||||
screenshot = Képernyőkép mentve ide: {0}
|
||||
screenshot.invalid = Túl nagy a térkép, nincsen elég memória a képernyőképhez.
|
||||
screenshot.invalid = Túl nagy a map, nincsen elég memória a képernyőképhez.
|
||||
gameover = Játék vége
|
||||
gameover.disconnect = Kapcsolat megszakadt
|
||||
gameover.pvp = A[accent] {0}[] csapat nyert!
|
||||
@@ -41,22 +41,22 @@ be.updating = Frissítés...
|
||||
be.ignore = Most nem
|
||||
be.noupdates = Nem találtunk frissítést.
|
||||
be.check = Frissítések keresése.
|
||||
mods.browser = Mod Browser
|
||||
mods.browser = Mod választó
|
||||
mods.browser.selected = Mod kiválasztása
|
||||
mods.browser.add = Letöltés
|
||||
mods.browser.reinstall = Reinstall
|
||||
mods.browser.view-releases = View Releases
|
||||
mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published.
|
||||
mods.browser.view-releases = Kiadások megtekintése
|
||||
mods.browser.noreleases = [scarlet]Nincsenek kiadások.\n[accent]Nem lehet kiadásokat találni ehhez a modhoz. Nézd meg a repository-ját, hogy vannak -e kiadásai.
|
||||
mods.browser.latest = <Latest>
|
||||
mods.browser.releases = Releases
|
||||
mods.browser.releases = Kiadások
|
||||
mods.github.open = Megtekintés
|
||||
mods.github.open-release = Release Page
|
||||
mods.github.open-release = Kiadások oldala
|
||||
mods.browser.sortdate = Rendezés dátum szerint
|
||||
mods.browser.sortstars = Rendezés értékelés szerint
|
||||
|
||||
schematic = Schematic
|
||||
schematic.add = Schematic mentése...
|
||||
schematics = Schematicok
|
||||
schematics = Schematic-ok
|
||||
schematic.replace = Már van ilyen nevű schematic. Lecseréled?
|
||||
schematic.exists = Már van ilyen nevű schematic.
|
||||
schematic.import = Schematic importálása...
|
||||
@@ -72,23 +72,23 @@ schematic.delete.confirm = Ez a Schematic törölve lesz.
|
||||
schematic.rename = Schematic átnevezése
|
||||
schematic.info = {0}x{1}, {2} blokk
|
||||
schematic.disabled = [scarlet]Schematicok letiltva[]\nNem használhat Schematicot ezen a [accent]mapon[] vagy [accent] szerveren.
|
||||
schematic.tags = Tags:
|
||||
schematic.edittags = Edit Tags
|
||||
schematic.addtag = Add Tag
|
||||
schematic.texttag = Text Tag
|
||||
schematic.icontag = Icon Tag
|
||||
schematic.renametag = Rename Tag
|
||||
schematic.tagdelconfirm = Delete this tag completely?
|
||||
schematic.tagexists = That tag already exists.
|
||||
schematic.tags = Címkék:
|
||||
schematic.edittags = Címkék szerkesztése
|
||||
schematic.addtag = Címke hozzáadása
|
||||
schematic.texttag = Következő címke
|
||||
schematic.icontag = Icon címke
|
||||
schematic.renametag = Címke átnevezése
|
||||
schematic.tagdelconfirm = Teljesen törlöd ezt a címkét?
|
||||
schematic.tagexists = Ez a címke már létezik.
|
||||
|
||||
stats = Statisztika
|
||||
stats.wave = Waves Defeated
|
||||
stats.unitsCreated = Units Created
|
||||
stats.enemiesDestroyed = Enemies Destroyed
|
||||
stats.built = Buildings Built
|
||||
stats.destroyed = Buildings Destroyed
|
||||
stats.deconstructed = Buildings Deconstructed
|
||||
stats.playtime = Time Played
|
||||
stats.wave = Hullámok legyőzve
|
||||
stats.unitsCreated = Egységek létrehozva
|
||||
stats.enemiesDestroyed = Ellenségek megsemmisítve
|
||||
stats.built = Építmények építve
|
||||
stats.destroyed = Építmények elpusztítva
|
||||
stats.deconstructed = Építmények lebontva
|
||||
stats.playtime = Játszott idő
|
||||
|
||||
globalitems = [accent]Összes nyersanyag
|
||||
map.delete = Biztosan akkarod törlölni a "[accent]{0}[]" mapot?
|
||||
@@ -98,7 +98,7 @@ level.mode = Játékmód:
|
||||
coreattack = < A mag támadás alatt van! >
|
||||
nearpoint = [[ [scarlet]AZONNAL HAGYD EL A LEDOBÁSI PONTOT[] ]\nveszélyes zóna
|
||||
database = Mag adatbázis
|
||||
database.button = Database
|
||||
database.button = Adatbázis
|
||||
savegame = Játék mentése
|
||||
loadgame = Játék betöltése
|
||||
joingame = Csatlakozás játékhoz
|
||||
@@ -112,7 +112,7 @@ position = Pozíció
|
||||
close = Bezárás
|
||||
website = Weboldal
|
||||
quit = Kilépés
|
||||
save.quit = Mentés & Kilépés
|
||||
save.quit = Mentés és kilépés
|
||||
maps = Mapok
|
||||
maps.browse = Mapok keresése
|
||||
continue = Folytatás
|
||||
@@ -126,36 +126,40 @@ uploadingpreviewfile = Előnézet feltöltése
|
||||
committingchanges = Változások mentése
|
||||
done = Kész
|
||||
feature.unsupported = Az eszköz nem támogatja ezt a funkciót.
|
||||
mods.initfailed = [red]⚠[] The previous Mindustry instance failed to initialize. This was likely caused by misbehaving mods.\n\nTo prevent a crash loop, [red]all mods have been disabled.[]
|
||||
mods.initfailed = [red]⚠[] Az előző Mindustry munkamenet nem tudott inícializálódni. Ez valószínű egy rosszúl működő mod miatt történt.\n\nA crash loop elkerülése érdekében, [red]minden mod le lett tiltva.[]
|
||||
mods = Modok
|
||||
mods.none = [lightgray]Nincsen mod!
|
||||
mods.guide = Mod készítési útmutató
|
||||
mods.report = Hiba jelentése
|
||||
mods.openfolder = Megnyitás mappából
|
||||
mods.viewcontent = View Content
|
||||
mods.viewcontent = Tartalom megtekintése
|
||||
mods.reload = Újratöltés
|
||||
mods.reloadexit = Indítsd újra a játékot, hogy betöltődjenek a modok.
|
||||
mod.installed = [[Installed]
|
||||
mod.display = [gray]Mod:[orange] {0}
|
||||
mod.enabled = [lightgray]Aktív
|
||||
mod.disabled = [scarlet]Inaktív
|
||||
mod.multiplayer.compatible = [gray]Multiplayer Compatible
|
||||
mod.multiplayer.compatible = [gray]Többjátékos kompatibilis
|
||||
mod.disable = Letiltás
|
||||
mod.content = Tartalom:
|
||||
mod.delete.error = Nem lehet törölni a Modot. Lehet, hogy egy másik folyamat használja.
|
||||
mod.incompatiblegame = [red]Outdated Game
|
||||
mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.incompatiblegame = [red]Elavúlt játék
|
||||
mod.incompatiblemod = [red]Nem kompatibilis
|
||||
mod.blacklisted = [red]Nem támogatott
|
||||
mod.unmetdependencies = [red]Összeférhetetlen függőségek
|
||||
mod.erroredcontent = [scarlet]Tartalom hiba
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.circulardependencies = [red]Körkörös függőségek
|
||||
mod.incompletedependencies = [red]Befejezetlen függőségek
|
||||
mod.requiresversion.details = [accent]{0}[] játékverzió szükséges.\nA letöltésed elavúlt. Ez a mod egy újabb verziót kíván (velószínű, egy beta/alpha kiadást) a működéshez.
|
||||
mod.outdatedv7.details = Ez a mod nem kompatibilis a játék legújabb berziójával. A készítőjének frissítenie kell azt, és hozzá kell adnia a [accent]minGameVersion: 136[] -t a [accent]mod.json[] fájlhoz.
|
||||
mod.blacklisted.details = Ez a mod manuálisan a feketelistára került, mert a játék összeomlott tőle, vagy más probléma miatt. Ne használd!
|
||||
mod.missingdependencies.details = Ez a mod hiányol függőségeket: {0}
|
||||
mod.erroredcontent.details = Ez a játék hibákat okozott betöltésnél. Kérd meg a mod készítőjét hogy kijavítsa őket!
|
||||
mod.circulardependencies.details = Ennek a modnak egymástól függő föggőségai vannak.
|
||||
mod.incompletedependencies.details = Ez a mod nem tudott betölteni hiányzó, vagy rossz függőségek miatt: {0}.
|
||||
mod.requiresversion = [red]{0}[] játékverzió szükséges.
|
||||
mod.errors = Hiba történt a tartalom betöltése közben.
|
||||
mod.noerrorplay = [scarlet]Vannak hibás Modok.[] Kapcsold ki vagy javítsd ki őket a játék előtt.
|
||||
mod.noerrorplay = [scarlet]Vannak hibás Modok.[] Kapcsold ki, vagy javítsd ki őket a játék előtt.
|
||||
mod.nowdisabled = [scarlet]A '{0}' Modnak nincsen megfelelő függősége:[accent] {1}\n[lightgray]Ezeket előbb le kell tölteni.\nEz a Mod automatikusan törölve lesz.
|
||||
mod.enable = Engedélyezés
|
||||
mod.requiresrestart = A játék kilép a módosítások alkalmazásához.
|
||||
@@ -164,7 +168,7 @@ mod.import = Mod importálása
|
||||
mod.import.file = Fájl importálása
|
||||
mod.import.github = GitHub Mod importálása
|
||||
mod.jarwarn = [scarlet]A JAR modok eredendően nem biztonságosak.[]\nGyőződj meg arról, hogy ezt a modot megbízható forrásból importálod!
|
||||
mod.item.remove = Ez az elem része a [accent] '{0}'[] Modnak. A törléshez távolítsd el a Modot.
|
||||
mod.item.remove = Ez az elem része a(z) [accent] '{0}'[] Modnak. A törléshez távolítsd el a Modot.
|
||||
mod.remove.confirm = Ez a Mod törölve lesz.
|
||||
mod.author = [LIGHT_GRAY]Készítő:[] {0}
|
||||
mod.missing = Ez a mentés nemrég törölt vagy frissített Modokat tartalmaz. Elképzelhető, hogy nem fog működni. Biztosan betöltöd?\n[lightgray]Modok:\n{0}
|
||||
@@ -181,14 +185,14 @@ launchcore = Mag kilövése
|
||||
filename = Fájl név:
|
||||
unlocked = Új tartalom kinyitva!
|
||||
available = Új kutatás áll rendelkezésre!
|
||||
unlock.incampaign = < Unlock in campaign for details >
|
||||
campaign.select = Select Starting Campaign
|
||||
campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time.
|
||||
campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience.
|
||||
campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished.
|
||||
unlock.incampaign = < Oldd fel kampány módban a részletekért >
|
||||
campaign.select = Válassz kezdő kampányt!
|
||||
campaign.none = [lightgray]Válassz egy bolygót a kezdéshez.\nEzt bármikor megváltoztathatod.
|
||||
campaign.erekir = Újabb, csiszoltabb tartalom. Általában lineáris kampány.\n\nMagasabb minőségű mapok és élmények.
|
||||
campaign.serpulo = Régebbi tartalom. A klasszikus élmények. Nyíltabb végű.\n\nPotenciálisan kiegyensúlyozatlan mapok és kampány. Kevésbé csiszolt.
|
||||
completed = [accent]Kész
|
||||
techtree = Tech Tree
|
||||
techtree.select = Tech Tree Selection
|
||||
techtree = Fejlődési fa
|
||||
techtree.select = Fejlődési fa kiválasztás
|
||||
techtree.serpulo = Serpulo
|
||||
techtree.erekir = Erekir
|
||||
research.load = Betöltés
|
||||
@@ -234,7 +238,7 @@ hosts.none = [lightgray]Nincs helyi játék!
|
||||
host.invalid = [scarlet]Nem sikerült csatlakozni.
|
||||
|
||||
servers.local = Helyi Szerverek
|
||||
servers.local.steam = Open Games & Local Servers
|
||||
servers.local.steam = Nyitott játékok és helyi szerverek
|
||||
servers.remote = Távoli Szerverek
|
||||
servers.global = Közösségi szerverek
|
||||
|
||||
@@ -250,8 +254,8 @@ trace.ip = IP: [accent]{0}
|
||||
trace.id = Azonosító: [accent]{0}
|
||||
trace.mobile = Mobil kliens: [accent]{0}
|
||||
trace.modclient = Nem hivatalos kliens: [accent]{0}
|
||||
trace.times.joined = Times Joined: [accent]{0}
|
||||
trace.times.kicked = Times Kicked: [accent]{0}
|
||||
trace.times.joined = Csatlakotások száma: [accent]{0}
|
||||
trace.times.kicked = Kirúgások száma: [accent]{0}
|
||||
invalidid = Érvénytelen kliens ID! Küldj hibajelentést.
|
||||
server.bans = Tiltások
|
||||
server.bans.none = Nincsenek tiltott játékosok!
|
||||
@@ -287,7 +291,7 @@ server.invalidport = Érvénytelen port!
|
||||
server.error = [crimson]Nem sikerült megnyitni a szervert.
|
||||
save.new = Új mentés
|
||||
save.overwrite = Biztosan felülírod\nezt a mentést?
|
||||
save.nocampaign = Individual save files from the campaign cannot be imported.
|
||||
save.nocampaign = Nem lehet importálni különálló kampány mentés fájlokat.
|
||||
overwrite = Felülírás
|
||||
save.none = Nem található mentés!
|
||||
savefail = Nem sikerült menteni!
|
||||
@@ -308,7 +312,7 @@ save.corrupted = Érvénytelen fájl!
|
||||
empty = <üres>
|
||||
on = Be
|
||||
off = Ki
|
||||
save.search = Search saved games...
|
||||
save.search = Keresés a mentett játékok között...
|
||||
save.autosave = Automatikus mentés: {0}
|
||||
save.map = Térkép: {0}
|
||||
save.wave = Hullám: {0}
|
||||
@@ -324,17 +328,18 @@ ok = OK
|
||||
open = Megnyitás
|
||||
customize = Szabályok módosítása
|
||||
cancel = Mégse
|
||||
command = Command
|
||||
command.mine = Mine
|
||||
command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command = Parancs
|
||||
command.mine = Bányászás
|
||||
command.repair = Javítás
|
||||
command.rebuild = Újraépítés
|
||||
command.assist = Segítség játékosnak
|
||||
command.move = Mozgás
|
||||
command.boost = Boost-olás
|
||||
openlink = Link megnyitása
|
||||
copylink = Link másolása
|
||||
back = Vissza
|
||||
max = Max
|
||||
objective = Map Objective
|
||||
objective = Map célja
|
||||
crash.export = Összeomlási napló exportálása
|
||||
crash.none = Nem található összeomlási napló.
|
||||
crash.exported = Összeomlási napló exportálva.
|
||||
@@ -346,7 +351,7 @@ data.invalid = Érvénytelen adatok.
|
||||
data.import.confirm = Külső adat importálása felülírja[scarlet] minden[] jelenlegi adatodat.\n[accent]Nem lehet visszavonni![]\n\nAmint kész az importálás, kilép a játék.
|
||||
quit.confirm = Biztos kilépsz?
|
||||
loading = [accent]Betöltés...
|
||||
downloading = [accent]Downloading...
|
||||
downloading = [accent]Letöltés...
|
||||
saving = [accent]Mentés...
|
||||
respawn = Nyomd meg a(z) [accent][[{0}][] gombot, hogy újraéledj a magban.
|
||||
cancelbuilding = Használd a(z) [accent][[{0}][] gombot, hogy töröld a tervrajzot.
|
||||
@@ -355,7 +360,7 @@ pausebuilding = Használd a(z) [accent][[{0}][] gombot, hogy megállítsd az ép
|
||||
resumebuilding = Használd a(z) [scarlet][[{0}][] gombot, hogy folytasd az építkezést.
|
||||
enablebuilding = [scarlet][[{0}][] to enable building
|
||||
showui = A kezelőfelület elrejtve.\nNyomd meg a(z) [accent][[{0}][] gombot a megjelenítéséhez.
|
||||
commandmode.name = [accent]Command Mode
|
||||
commandmode.name = [accent]Parancs mód
|
||||
commandmode.nounits = [no units]
|
||||
wave = [accent]{0}. hullám
|
||||
wave.cap = [accent]{0}./{1} hullám
|
||||
@@ -386,17 +391,17 @@ map.publish.confirm = Biztos, hogy közzéteszed ezt a mapot?\n\n[lightgray] Gy
|
||||
workshop.menu = Válaszd ki, mit szeretnél csinálni ezzel az itemmel.
|
||||
workshop.info = Item Infó
|
||||
changelog = Változtatási napló (opcionális):
|
||||
updatedesc = Overwrite Title & Description
|
||||
updatedesc = Cím és leírás felülírása
|
||||
eula = Steam EULA
|
||||
missing = Ezt az elemet törölték vagy áthelyezték.\n[lightgray] A workshop adatait automatikusan leválasztották.
|
||||
publishing = [accent]Publikálás...
|
||||
publish.confirm = Biztosan közzéteszed?\n\n[lightgray] Győződj meg róla, hogy elfogadtad a Workshop EULA-t, különben az itemjeid nem jelennek meg!
|
||||
publish.error = Hiba az item publikálásakor: {0}
|
||||
steam.error = Nem sikerült inicializálni a Steam szolgáltatásokat.\nHiba: {0}
|
||||
editor.planet = Planet:
|
||||
editor.sector = Sector:
|
||||
editor.planet = Bolygó:
|
||||
editor.sector = Szektor:
|
||||
editor.seed = Seed:
|
||||
editor.cliffs = Walls To Cliffs
|
||||
editor.cliffs = Falak sziklákká
|
||||
|
||||
editor.brush = Méret
|
||||
editor.openin = Megnyitás a szerkesztőben
|
||||
@@ -409,35 +414,35 @@ editor.nodescription = A mapnak rendelkeznie kell egy legalább 4 karakter hossz
|
||||
editor.waves = Hullámok:
|
||||
editor.rules = Szabályok:
|
||||
editor.generation = generálás:
|
||||
editor.objectives = Objectives
|
||||
editor.objectives = Célok
|
||||
editor.ingame = Szerkesztés játékban
|
||||
editor.playtest = Playtest
|
||||
editor.playtest = Teszt játékban
|
||||
editor.publish.workshop = Közzététel workshopon
|
||||
editor.newmap = Új Map
|
||||
editor.center = Ugrás középre
|
||||
editor.search = Search maps...
|
||||
editor.filters = Filter Maps
|
||||
editor.filters.mode = Gamemodes:
|
||||
editor.filters.type = Map Type:
|
||||
editor.filters.search = Search In:
|
||||
editor.filters.author = Author
|
||||
editor.filters.description = Description
|
||||
editor.shiftx = Shift X
|
||||
editor.shifty = Shift Y
|
||||
editor.search = Mapok keresése...
|
||||
editor.filters = Mapok szűrése
|
||||
editor.filters.mode = Játékmódok:
|
||||
editor.filters.type = Map típus:
|
||||
editor.filters.search = Keresés ebben:
|
||||
editor.filters.author = Készítő
|
||||
editor.filters.description = Leírás
|
||||
editor.shiftx = X eltolás
|
||||
editor.shifty = Y eltolás
|
||||
workshop = Workshop
|
||||
waves.title = Hullámok
|
||||
waves.remove = Eltávolítás
|
||||
waves.every = every
|
||||
waves.every = minden
|
||||
waves.waves = hullámonként
|
||||
waves.health = health: {0}%
|
||||
waves.health = élet: {0}%
|
||||
waves.perspawn = per spawn
|
||||
waves.shields = pajzs/hullám
|
||||
waves.to = -
|
||||
waves.spawn = spawn:
|
||||
waves.spawn.all = <all>
|
||||
waves.spawn.select = Spawn Select
|
||||
waves.spawn.none = [scarlet]no spawns found in map
|
||||
waves.max = max units
|
||||
waves.spawn.all = <mind>
|
||||
waves.spawn.select = Kezdőhely kiválasztása
|
||||
waves.spawn.none = [scarlet]Nem lehet kezdőhelyet találni
|
||||
waves.max = max egységek
|
||||
waves.guardian = őrző
|
||||
waves.preview = Előnézet
|
||||
waves.edit = Szerksztés...
|
||||
@@ -447,11 +452,11 @@ waves.load = Másolás a vágólapról
|
||||
waves.invalid = Nem lehet beilleszteni a vágólapról.
|
||||
waves.copied = Hullámok másolva.
|
||||
waves.none = Nincs ellenség megadva.\nAz üresen hagyott tervek automatikusan lecserélődnek az alapbeállításra.
|
||||
waves.sort = Sort By
|
||||
waves.sort.reverse = Reverse Sort
|
||||
waves.sort = Rendezési szempont
|
||||
waves.sort.reverse = Rendezés visszafelé
|
||||
waves.sort.begin = Begin
|
||||
waves.sort.health = Health
|
||||
waves.sort.type = Type
|
||||
waves.sort.health = Élet
|
||||
waves.sort.type = Típus
|
||||
waves.units.hide = Hide All
|
||||
waves.units.show = Show All
|
||||
|
||||
@@ -463,10 +468,10 @@ wavemode.health = életpontok
|
||||
editor.default = [lightgray]<Alapbeállítás>
|
||||
details = Részletek...
|
||||
edit = Szerkesztés...
|
||||
variables = Vars
|
||||
variables = Változók
|
||||
editor.name = Név:
|
||||
editor.spawn = Spawn Unit
|
||||
editor.removeunit = Remove Unit
|
||||
editor.spawn = Egység megidézése
|
||||
editor.removeunit = Egység eltávolítása
|
||||
editor.teams = Csapatok
|
||||
editor.errorload = Hiba a fájl betöltése közben.
|
||||
editor.errorsave = Hiba a fájl mentése közben.
|
||||
@@ -477,12 +482,12 @@ editor.errorheader = Ez a map fájl vagy érvénytelen vagy sérült.
|
||||
editor.errorname = A Mapnak nincs neve. Mentést próbálsz betölteni?
|
||||
editor.update = Frissítés
|
||||
editor.randomize = Véletlenszerű
|
||||
editor.moveup = Move Up
|
||||
editor.movedown = Move Down
|
||||
editor.copy = Copy
|
||||
editor.moveup = Mozgás fel
|
||||
editor.movedown = Mozgás le
|
||||
editor.copy = Másolás
|
||||
editor.apply = Alkalmazás
|
||||
editor.generate = Haladó funkciók
|
||||
editor.sectorgenerate = Sector Generate
|
||||
editor.sectorgenerate = Szektor generálása
|
||||
editor.resize = Átméretezés
|
||||
editor.loadmap = Map betöltése
|
||||
editor.savemap = Mentés
|
||||
@@ -526,8 +531,8 @@ toolmode.fillteams = Fill Teams
|
||||
toolmode.fillteams.description = Fill teams instead of blocks.
|
||||
toolmode.drawteams = Draw Teams
|
||||
toolmode.drawteams.description = Draw teams instead of blocks.
|
||||
toolmode.underliquid = Under Liquids
|
||||
toolmode.underliquid.description = Draw floors under liquid tiles.
|
||||
toolmode.underliquid = Folyadékok alá
|
||||
toolmode.underliquid.description = Padlók folyadék blokkok alá rajzolása.
|
||||
|
||||
filters.empty = [lightgray]Még nincs filter! Adj hozzá egyet a lenti gombra kattintva!
|
||||
filter.distort = Distort
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Konten Mengalami Kesalahan
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Terjadi kesalahan saat memuat konten.
|
||||
mod.noerrorplay = [scarlet]Anda memiliki mod dengan suatu kesalahan.[] Nonaktifkan mod yang bersangkutan atau perbaiki kesalahan tersebut sebelum bermain.
|
||||
@@ -331,6 +335,7 @@ command.repair = Perbaiki
|
||||
command.rebuild = Bangun Kembali
|
||||
command.assist = Bantu Pemain
|
||||
command.move = Maju
|
||||
command.boost = Boost
|
||||
openlink = Buka Tautan
|
||||
copylink = Salin Tautan
|
||||
back = Kembali
|
||||
|
||||
@@ -147,11 +147,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Errori di Contenuto
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Si sono verificati degli errori durante il caricamento del contenuto.
|
||||
mod.noerrorplay = [scarlet]Sono presenti delle mod con errori.[] Puoi disabilitare le mod affette oppure sistemarle prima di giocare.
|
||||
@@ -329,6 +333,7 @@ command.repair = Ripara
|
||||
command.rebuild = Ricostruisci
|
||||
command.assist = Aiuta giocatore
|
||||
command.move = Muovi
|
||||
command.boost = Boost
|
||||
openlink = Apri Link
|
||||
copylink = Copia link
|
||||
back = Indietro
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]호환되지 않음
|
||||
mod.blacklisted = [red]지원하지 않음
|
||||
mod.unmetdependencies = [red]충촉되지 않은 종속성
|
||||
mod.erroredcontent = [scarlet]콘텐츠 오류
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = 게임 버전 요구: [accent]{0}[]\n당신의 게임은 구버전입니다. 이 모드가 작동하려면 최신 버전의 게임이 필요합니다. (베타/알파 릴리즈일 가능성이 있음).
|
||||
mod.outdatedv7.details = 이 모드는 최신 버전의 게임과 호환되지 않습니다. 반드시 작성자가 업데이트해야 하고, [accent]mod.json[] 파일에 [accent]최소게임버전: 136[]을 추가해야 합니다.
|
||||
mod.blacklisted.details = 이 모드는 이 버전의 게임에서 충돌 또는 기타 문제를 일으키는 것으로 인해 수동으로 블랙리스트에 올라와 있습니다. 사용하지 마세요.
|
||||
mod.missingdependencies.details = 이 모드에는 종속성이 없음: {0}
|
||||
mod.erroredcontent.details = 이 게임은 로딩하는 동안 오류가 발생했습니다. 모드 작성자에게 수정하도록 요청하세요.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = 필요한 게임 버전: [red]{0}
|
||||
mod.errors = 콘텐츠를 불러오는 중에 오류가 발생함
|
||||
mod.noerrorplay = [scarlet]오류가 있는 모드가 있습니다.[] 영향을 받는 모드를 비활성화하거나 플레이하기 전에 오류를 수정하세요.
|
||||
@@ -288,7 +292,7 @@ server.invalidport = 잘못된 포트 번호입니다!
|
||||
server.error = [scarlet]서버 호스팅 오류
|
||||
save.new = 새로 저장
|
||||
save.overwrite = 저장된 슬롯을 덮어쓰시겠습니까?
|
||||
save.nocampaign = Individual save files from the campaign cannot be imported.
|
||||
save.nocampaign = 캠페인의 개별 저장 파일을 가져올 수 없습니다.
|
||||
overwrite = 덮어쓰기
|
||||
save.none = 저장된 파일을 찾을 수 없습니다!
|
||||
savefail = 게임을 저장하지 못했습니다!
|
||||
@@ -331,6 +335,7 @@ command.repair = 수리
|
||||
command.rebuild = 재건
|
||||
command.assist = 플레이어 지원
|
||||
command.move = 이동
|
||||
command.boost = Boost
|
||||
openlink = 링크 열기
|
||||
copylink = 링크 복사
|
||||
back = 뒤로가기
|
||||
@@ -356,8 +361,8 @@ pausebuilding = [accent][[{0}][] 키를 눌러 건설을 일시중지
|
||||
resumebuilding = [scarlet][[{0}][] 키를 눌러 건설을 재개
|
||||
enablebuilding = [scarlet][[{0}][] 키를 눌러 건설을 활성
|
||||
showui = UI가 숨겨졌습니다. [accent][[{0}][] 키를 눌러 UI를 활성화하세요.
|
||||
commandmode.name = [accent]Command Mode
|
||||
commandmode.nounits = [no units]
|
||||
commandmode.name = [accent]명령 모드
|
||||
commandmode.nounits = [기체 없음]
|
||||
wave = [accent]{0}단계
|
||||
wave.cap = [accent]단계 {0}/{1}
|
||||
wave.waiting = 다음 단계까지[lightgray] {0}초
|
||||
@@ -441,7 +446,7 @@ waves.max = 기까지
|
||||
waves.guardian = 수호자
|
||||
waves.preview = 미리보기
|
||||
waves.edit = 편집
|
||||
waves.random = Random
|
||||
waves.random = 무작위
|
||||
waves.copy = 클립보드로 복사하기
|
||||
waves.load = 클립보드에서 불러오기
|
||||
waves.invalid = 클립보드에 잘못된 단계 데이터가 있습니다.
|
||||
@@ -700,7 +705,7 @@ sectors.enemybase = [scarlet]적 기지[]
|
||||
sectors.vulnerable = [scarlet]취약함[]
|
||||
sectors.underattack = [scarlet]공격받고 있습니다! [accent]{0}% 손상됨[]
|
||||
sectors.underattack.nodamage = [scarlet]점령되지 않음
|
||||
sectors.survives = [accent]{0} 단계 이상 버티세요.[]
|
||||
sectors.survives = [accent]{0} 단계 버팀[]
|
||||
sectors.go = 진입
|
||||
sector.abandon = 포기
|
||||
sector.abandon.confirm = 이 지역의 코어가 자폭합니다.\n계속하시겠습니까?
|
||||
@@ -1205,7 +1210,7 @@ rules.unitbuildspeedmultiplier = 기체 생산속도 배수
|
||||
rules.unitcostmultiplier = 기체 비용 배수
|
||||
rules.unithealthmultiplier = 기체 체력 배수
|
||||
rules.unitdamagemultiplier = 기체 피해량 배수
|
||||
rules.unitcrashdamagemultiplier = Unit Crash Damage Multiplier
|
||||
rules.unitcrashdamagemultiplier = 기체 파손 피해량 배수
|
||||
rules.solarmultiplier = 태양광 전력 배수
|
||||
rules.unitcapvariable = 코어 기체수 제한 추가
|
||||
rules.unitcap = 기본 기체 제한
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Turinio klaidos.
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Įvyko klaida kraunant turinį.
|
||||
mod.noerrorplay = [scarlet]Turite modifikacijas su klaidomis.[] Išjunkite modifikacijas su klaidomis arba patasykite jas prieš žaidžiant.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Atidaryti Nuorodą
|
||||
copylink = Kopijuoti Nuorodą
|
||||
back = Sugrįžti
|
||||
|
||||
@@ -150,12 +150,16 @@ mod.incompatiblemod = [red]Onverenigbaar
|
||||
mod.blacklisted = [red]Niet Ondersteund
|
||||
mod.unmetdependencies = [red]Onbevredigde Afhankelijkheden
|
||||
mod.erroredcontent = [scarlet]Fouten in de inhoud
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
|
||||
mod.requiresversion.details = Vereist spelversie: [accent]{0}[]\nJouw spel is verouderd. Deze mod heeft een nieuwere versie van de game nodig (mogelijk een beta/alpha release) om te functioneren.
|
||||
mod.outdatedv7.details = Deze mod is onverenigbaar met de nieuwste versie van het spel. De auteur moet het updaten en [accent]minGameVersion: 136[] toevoegen aan zijn/haar [accent]mod.json[] bestand.
|
||||
mod.blacklisted.details = Deze mod is handmatig op de zwarte lijst gezet wegens het veroorzaken van crashes of andere problemen met deze versie van het spel. Gebruik het niet.
|
||||
mod.missingdependencies.details = Deze mod mist afhankelijkheden: {0}
|
||||
mod.erroredcontent.details = Deze mod veroorzaakte fouten tijdens het laden. Vraag de auteur van de mod om ze te op te lossen.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
|
||||
mod.requiresversion = Vereist spelversie: [red]{0}
|
||||
|
||||
@@ -335,6 +339,7 @@ command.repair = Repareer
|
||||
command.rebuild = Herbouw
|
||||
command.assist = Assist Speler
|
||||
command.move = Beweeg
|
||||
command.boost = Boost
|
||||
openlink = Open Link
|
||||
copylink = Kopieer Link
|
||||
back = Terug
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Content Errors
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Errors have occurred loading content.
|
||||
mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Open Link
|
||||
copylink = Kopiëer Link
|
||||
back = Terug
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Niekompatybilne
|
||||
mod.blacklisted = [red]Niewspierane
|
||||
mod.unmetdependencies = [red]Niespełnione Zależnośći
|
||||
mod.erroredcontent = [scarlet]Błędy Zawartości
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Wymaga wersji gry: [accent]{0}[]\nTwoja gra jest przestarzała. Ten mod potrzebuje nowszej wersji gry (możliwe, że wersji w fazie alfa/beta) aby mógł funkcjonować.
|
||||
mod.outdatedv7.details = Ten mod jest niekompatybilny z najnowszą wersją gry. Autor musi go zaktualizować, i dodać [accent]minGameVersion: 136[] w pliku [accent]mod.json[].
|
||||
mod.blacklisted.details = Ten mod został ręczenie przeniesiony na czarną listę, ponieważ powodował wyłączenia gry i inne problemy na tej wersji. Nie używaj go.
|
||||
mod.missingdependencies.details = W tym modzie brakuje zależnośći: {0}
|
||||
mod.erroredcontent.details = Ten mod spowodował błędy przy uruchomianu. Poproś autora moda o ich naprawienie.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Wystąpił błąd podczas ładowania treści.
|
||||
mod.noerrorplay = [scarlet]Twoje mody zawierają błędy.[] Wyłącz je lub napraw błędy przed rozpoczęciem gry.
|
||||
@@ -331,6 +335,7 @@ command.repair = Naprawiaj
|
||||
command.rebuild = Odbudowywuj
|
||||
command.assist = Asystuj Graczowi
|
||||
command.move = Przemieść
|
||||
command.boost = Boost
|
||||
openlink = Otwórz Link
|
||||
copylink = Kopiuj Link
|
||||
back = Wróć
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Erros no conteúdo
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Ocorreram erros ao carregar o conteúdo.
|
||||
mod.noerrorplay = [scarlet]Você tem mods com erros.[] Desative os mods afetados ou conserte os erros antes de jogar.
|
||||
@@ -331,6 +335,7 @@ command.repair = Reparar
|
||||
command.rebuild = Reconstruir
|
||||
command.assist = Assist Player
|
||||
command.move = Mover
|
||||
command.boost = Boost
|
||||
openlink = Abrir Link
|
||||
copylink = Copiar link
|
||||
back = Voltar
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Erros de conteudo
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Ocorreram erros ao carregar o conteúdo.
|
||||
mod.noerrorplay = [scarlet]Tens mods com erros.[] Desative os mods afetados ou corrija os erros antes de jogar.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Abrir Ligação
|
||||
copylink = Copiar ligação
|
||||
back = Voltar
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Erori de Conținut
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Au apărut erori la încărcarea conținutului.
|
||||
mod.noerrorplay = [scarlet]Modurile tale au erori.[] Dezactivează modurile afectate sau repară erorile înainte să joci.
|
||||
@@ -331,6 +335,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Deschide Linkul
|
||||
copylink = Copiază Linkul
|
||||
back = Înapoi
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Несовместимый
|
||||
mod.blacklisted = [red]Неподдерживаемый
|
||||
mod.unmetdependencies = [red]Не найдены зависимости
|
||||
mod.erroredcontent = [scarlet]Ошибки содержимого
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Требуется версия игры: [accent]{0}[]\nВаша игра устарела. Для работы этого мода требуется более новая версия игры (возможно, альфа/бета-версия).
|
||||
mod.outdatedv7.details = Этот мод несовместим с последней версией игры. Автор должен обновить его и добавить [accent]minGameVersion: 136[] в файл [accent]mod.json[].
|
||||
mod.blacklisted.details = Этот мод был вручную занесен в черный список из-за того, что он вызывал сбои или другие проблемы с текущей версией игры. Не используйте его.
|
||||
mod.missingdependencies.details = Для этого мода отсутствуют зависимости: {0}
|
||||
mod.erroredcontent.details = Этот мод вызвал ошибки при загрузке. Попросите автора мода исправить их.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
|
||||
mod.requiresversion = Требуется версия игры: [red]{0}
|
||||
mod.errors = Ошибки были вызваны загружаемым содержимым.
|
||||
@@ -331,6 +335,7 @@ command.repair = Ремонтировать
|
||||
command.rebuild = Восстанавливать
|
||||
command.assist = Помогать игроку
|
||||
command.move = Двигаться
|
||||
command.boost = Boost
|
||||
openlink = Открыть ссылку
|
||||
copylink = Скопировать ссылку
|
||||
back = Назад
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Nije Podesan
|
||||
mod.blacklisted = [red]Nema Podršku
|
||||
mod.unmetdependencies = [red]Nedostaju Zavisni Modovi
|
||||
mod.erroredcontent = [scarlet]Greška u sadržaju
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Zahteva verziju igre: [accent]{0}[]\nVaša igra je zastarela. Ovaj mod zahteva novu verziju igre (po mogućstvu alfa/beta izdanje) da bi funkcionisala.
|
||||
mod.outdatedv7.details = Ovaj mod nije podesan sa novijom verzijom igre. Autor mora da ga ažurira, i da doda [accent]minGameVersion: 136[] u [accent]mod.json[] datoteku.
|
||||
mod.blacklisted.details = Ovaj mod nema podršku zato što stalno ispada ili prave razne greške u ovoj verziji igre. Ne koristi te ga.
|
||||
mod.missingdependencies.details = Ovaj mod nema sledeće zavisne modove: {0}
|
||||
mod.erroredcontent.details = Ova igra sadrži greške. Pitajte autora moda da ih popravi.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Greške su nastale tokom učitavanja sadržaja.
|
||||
mod.noerrorplay = [scarlet]Imate modove sa greškama.[] Onemogućite te modove, ili ispravite greške.
|
||||
@@ -331,6 +335,7 @@ command.repair = Popravljaj
|
||||
command.rebuild = Ponovna Gradnja
|
||||
command.assist = Pomoć Igraču
|
||||
command.move = Kretanje
|
||||
command.boost = Boost
|
||||
openlink = Otvori Link
|
||||
copylink = Iskopiraj Link
|
||||
back = Nazad
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Innehålls Fel
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Fel har inträffat under laddning av innehåll.
|
||||
mod.noerrorplay = [scarlet]Du har moddar med fel.[] Stäng antingen av de drabbade moddarna eller fixa felen innan du spelar.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Öppna Länk
|
||||
copylink = Kopiera Länk
|
||||
back = Tillbaka
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]เนื้อหาผิดพลาด
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = มีข้อผิดพลาดเกิดขึ้นระหว่างโหลดเนื้อหา
|
||||
mod.noerrorplay = [scarlet]คุณมีม็อดที่มีข้อผิดพลาด[] กรุณาปิดม็อดนั้นๆ หรือแก้ไขข้อผิดพลาดก่อนที่จะเล่น
|
||||
@@ -331,6 +335,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = เปิดลิ้งค์
|
||||
copylink = คัดลอกลิ้งค์
|
||||
back = กลับ
|
||||
|
||||
@@ -146,11 +146,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]Content Errors
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = Errors have occurred loading content.
|
||||
mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing.
|
||||
@@ -327,6 +331,7 @@ command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command.boost = Boost
|
||||
openlink = Linki ac
|
||||
copylink = Linki kopyala
|
||||
back = Geri don
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Sürüm Uyuşmazlığı
|
||||
mod.blacklisted = [red]Desteklenmeyen Sürüm
|
||||
mod.unmetdependencies = [red]Uyuşmayan Modlar.
|
||||
mod.erroredcontent = [scarlet]İçerik hatası.
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = [accent]{0}[] oyun sürümü gerekiyor.\nSürümün eski. Bu mod, çalışmak için oyunun daha yeni bir sürümünü gerektiriyor (büyük ihtimal alpha/beta).
|
||||
mod.outdatedv7.details = Bu mod, oyunun en son sürümüyle uyumsuz. Modun yapmıcısının [accent]mod.json[] dosyasına, [accent]minGameVersion: 136[] eklemesi gerekiyor.
|
||||
mod.blacklisted.details = Bu mod, oyunun bu sürümüyle hata verdiğinden veya başka sorunlar ötürü kara listeye alınmıştır. [#ff]KULLANMAYINIZ!
|
||||
mod.missingdependencies.details = Bu Mod, şu ek modları gerektiriyor: {0}
|
||||
mod.erroredcontent.details = Bu mod yüklenirken hata veriyor, yapımcıdan hataları düzeltmesini isteyin.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = İçerik yüklenirken bir hata oluştu.
|
||||
mod.noerrorplay = [scarlet]Hatalı modlarınız var.[] Oynamadan önce bu modları devre dışı bırakın veya dosyadaki hataları düzeltin.
|
||||
@@ -331,6 +335,7 @@ command.repair = Tamir Et
|
||||
command.rebuild = Yeniden İnşaa Et
|
||||
command.assist = Oyuncuya Yardım Et
|
||||
command.move = Hareket Et
|
||||
command.boost = Boost
|
||||
openlink = Bağlantıyı Aç
|
||||
copylink = Bağlantıyı Kopyala
|
||||
back = Geri
|
||||
|
||||
@@ -150,11 +150,15 @@ mod.incompatiblemod = [red]Несумісно
|
||||
mod.blacklisted = [red]Не підтримується
|
||||
mod.unmetdependencies = [red]Відсутні залежності
|
||||
mod.erroredcontent = [scarlet]Помилки під час завантаження
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Необхідна версія гри: [accent]{0}[]\nВаша гра застаріла. Мод потребує новішу версію гри (можливо бета- чи альфа-версію) для роботи.mod.outdatedv7.details = Ця модифікація не сумісна з останньою версією гри. Розробник модифікації має оновити її та додати [accent]minGameVersion: 136[] у свій [accent]mod.json[] файл.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = Цю модифікацію було вручну внесено у чорний список за постійні збої або інші проблеми з цією версією гри. Не використовуйте її.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = Ця модифікація спричинила помилки при завантаженні. Попросіть автора виправити їх.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Необхідна версія гри: [red]{0}
|
||||
mod.errors = Виникли помилки під час завантаження змісту.
|
||||
mod.noerrorplay = [red]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх.
|
||||
@@ -332,6 +336,7 @@ command.repair = Ремонтувати
|
||||
command.rebuild = Відбудовувати
|
||||
command.assist = Допомагати гравцеві
|
||||
command.move = Рухатися
|
||||
command.boost = Boost
|
||||
openlink = Перейти за посиланням
|
||||
copylink = Скопіювати посилання
|
||||
back = Назад
|
||||
|
||||
@@ -46,9 +46,9 @@ mods.browser.selected = Mod Đã chọn
|
||||
mods.browser.add = Cài đặt
|
||||
mods.browser.reinstall = Cài đặt lại
|
||||
mods.browser.view-releases = View Releases
|
||||
mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published.
|
||||
mods.browser.latest = <Latest>
|
||||
mods.browser.releases = Releases
|
||||
mods.browser.noreleases = [scarlet]Không tìm thấy phiên bản\n[accent]Không thể tìm thấy bất kì phiên bản nào của mod này. Kiểm tra xem mod này đã có bất kỳ phiên bản nào được ra mắt chưa.
|
||||
mods.browser.latest = <Mới nhất>
|
||||
mods.browser.releases = Các phiên bản
|
||||
mods.github.open = Repo
|
||||
mods.github.open-release = Release Page
|
||||
mods.browser.sortdate = Sắp xếp theo gần đây
|
||||
@@ -82,13 +82,13 @@ schematic.tagdelconfirm = Xóa thẻ này?
|
||||
schematic.tagexists = Thẻ đã tồn tại.
|
||||
|
||||
stats = Thống kê
|
||||
stats.wave = Waves Defeated
|
||||
stats.unitsCreated = Units Created
|
||||
stats.enemiesDestroyed = Enemies Destroyed
|
||||
stats.built = Buildings Built
|
||||
stats.destroyed = Buildings Destroyed
|
||||
stats.deconstructed = Buildings Deconstructed
|
||||
stats.playtime = Time Played
|
||||
stats.wave = Số lượt đã đánh bại
|
||||
stats.unitsCreated = Số quân lính đã tạo
|
||||
stats.enemiesDestroyed = Số quân địch đã tiêu diệt
|
||||
stats.built = Số kiến trúc đã xây dựng
|
||||
stats.destroyed = Số kiến trúc bị phá hủy
|
||||
stats.deconstructed = Số kiến trúc đã tháo dỡ
|
||||
stats.playtime = Khoảng thời gian đã chơi
|
||||
|
||||
globalitems = [accent]Toàn bộ vật phẩm
|
||||
map.delete = Bạn có chắc chắn muốn xóa bản đồ "[accent]{0}[]"?
|
||||
@@ -144,17 +144,21 @@ mod.multiplayer.compatible = [gray]Tương thích với chế độ nhiều ngư
|
||||
mod.disable = Tắt
|
||||
mod.content = Nội dung:
|
||||
mod.delete.error = Không thể xóa mod. Tệp có thể đang được sử dụng.
|
||||
mod.incompatiblegame = [red]Outdated Game
|
||||
mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.incompatiblegame = [red]Phiên bản game đã lỗi thời
|
||||
mod.incompatiblemod = [red]Không tương thích
|
||||
mod.blacklisted = [red]Không hỗ trợ
|
||||
mod.unmetdependencies = [red]Thiếu phần phụ thuộc
|
||||
mod.erroredcontent = [scarlet]Lỗi nội dung
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Yêu cầu phiên bản game: [accent]{0}[]\nPhiên bản game của bạn đã lỗi thời. Mod này yêu cầu phiên bản mới hơn của game (có thể là phiên bản beta/alpha hoặc BE) để hoạt động.
|
||||
mod.outdatedv7.details = Mod này không tương thích với phiên bản mới nhất của game. Tác giả của mod phải cập nhật nó, và thêm [accent]minGameVersion: 136[] vào trong tệp [accent]mod.json[].
|
||||
mod.blacklisted.details = Mod này đã vào danh sách đen vì gây ra các lỗi với phiên bản này của game. Đừng sử dụng nó.
|
||||
mod.missingdependencies.details = Mod này thiếu phần phụ thuộc: {0}
|
||||
mod.erroredcontent.details = Phần game này đã gặp lỗi khi tải. Liên hệ tác giả của mod để sửa chúng.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Yêu cầu phiên bản game: [red]{0}
|
||||
mod.errors = Đã xảy ra lỗi khi tải nội dung.
|
||||
mod.noerrorplay = [scarlet]Bạn có mod bị lỗi.[]Tắt các mod bị lỗi hoặc sửa các lỗi trước khi chơi.
|
||||
mod.nowdisabled = [scarlet]Mod '{0}' cần mod này để chạy:[accent] {1}\n[lightgray]Trước tiên bạn cần tải các mod này xuống.\nBản mod này sẽ tự động tắt.
|
||||
@@ -176,20 +180,20 @@ mod.scripts.disable = Thiết bị của bạn không hổ trợ mod chứa scri
|
||||
about.button = Thông tin
|
||||
name = Tên:
|
||||
noname = Hãy nhập[accent] tên[] trước.
|
||||
search = Search:
|
||||
search = Tìm kiếm:
|
||||
planetmap = Bản đồ hành tinh
|
||||
launchcore = Phóng căn cứ
|
||||
filename = Tên tệp:
|
||||
unlocked = Đã mở khóa nội dung mới!
|
||||
available = Đã có mục nghiên cứu mới!
|
||||
unlock.incampaign = < Mở khóa trong chiến dịch để biết chi tiết >
|
||||
campaign.select = Select Starting Campaign
|
||||
campaign.none = [lightgray]Select a planet to start on.\nThis can be switched at any time.
|
||||
campaign.erekir = Newer, more polished content. Mostly linear campaign progression.\n\nHigher quality maps and overall experience.
|
||||
campaign.serpulo = Older content; the classic experience. More open-ended.\n\nPotentially unbalanced maps and campaign mechanics. Less polished.
|
||||
campaign.select = Chọn nơi bắt đầu chiến dịch
|
||||
campaign.none = [lightgray]Chọn một hành tinh để bắt đầu.\nViệc này có thể thay đổi bất kì lúc nào.
|
||||
campaign.erekir = Mới hơn, nội dung được trau chuốt hơn. Quá trình chơi liền mạch hơn.\n\nChất lượng và trải nghiệm tốt hơn.
|
||||
campaign.serpulo = Nội dung cũ hơn; trải nghiệm cơ bản. Kết thúc mở.\n\nCó thể có các phần chơi và cơ chế chơi chưa được cân bằng. Ít được trau chuốt hơn.
|
||||
completed = [accent]Hoàn tất
|
||||
techtree = Tiến trình
|
||||
techtree.select = Tech Tree Selection
|
||||
techtree.select = Lựa chọn tiến trình
|
||||
techtree.serpulo = Serpulo
|
||||
techtree.erekir = Erekir
|
||||
research.load = Tải
|
||||
@@ -243,14 +247,14 @@ servers.disclaimer = Nhà phát triển [accent]không[] sở hữu và kiểm s
|
||||
servers.showhidden = Hiển thị Máy chủ Ẩn
|
||||
server.shown = Hiện
|
||||
server.hidden = Ẩn
|
||||
viewplayer = Viewing Player: [accent]{0}
|
||||
viewplayer = Đang xem người chơi: [accent]{0}
|
||||
|
||||
trace = Tìm người chơi
|
||||
trace.playername = Tên người chơi: [accent]{0}
|
||||
trace.ip = IP: [accent]{0}
|
||||
trace.id = ID: [accent]{0}
|
||||
trace.mobile = Mobile Client: [accent]{0}
|
||||
trace.modclient = Custom Client: [accent]{0}
|
||||
trace.modclient = Client tùy chỉnh: [accent]{0}
|
||||
trace.times.joined = Số lần tham gia: [accent]{0}
|
||||
trace.times.kicked = Số lần bị kick: [accent]{0}
|
||||
invalidid = Client ID không hợp lệ! Vui lòng gửi báo cáo lỗi.
|
||||
@@ -288,7 +292,7 @@ server.invalidport = Cổng không hợp lệ!
|
||||
server.error = [scarlet]Lỗi máy chủ.
|
||||
save.new = Bản lưu mới
|
||||
save.overwrite = Bạn có chắc muốn ghi đè\nbản lưu này?
|
||||
save.nocampaign = Individual save files from the campaign cannot be imported.
|
||||
save.nocampaign = Các tập tin đơn lẻ từ chiến dịch không thể được nhập.
|
||||
overwrite = Ghi đè
|
||||
save.none = Không có bản lưu nào được tìm thấy!
|
||||
savefail = Không thể lưu trò chơi này!
|
||||
@@ -325,17 +329,18 @@ ok = OK
|
||||
open = Mở
|
||||
customize = Luật tùy chỉnh
|
||||
cancel = Hủy
|
||||
command = Command
|
||||
command.mine = Mine
|
||||
command.repair = Repair
|
||||
command.rebuild = Rebuild
|
||||
command.assist = Assist Player
|
||||
command.move = Move
|
||||
command = Mệnh lệnh
|
||||
command.mine = Đào
|
||||
command.repair = Sửa chữa
|
||||
command.rebuild = Xây dựng lại
|
||||
command.assist = Hỗ trợ người chơi
|
||||
command.move = Di chuyển
|
||||
command.boost = Boost
|
||||
openlink = Mở link
|
||||
copylink = Sao chép link
|
||||
back = Quay lại
|
||||
max = Tối đa
|
||||
objective = Map Objective
|
||||
objective = Nhiệm vụ
|
||||
crash.export = Xuất Crash Logs
|
||||
crash.none = Không có Crash Logs nào được tìm thấy.
|
||||
crash.exported = Crash logs đã được xuất.
|
||||
@@ -356,7 +361,7 @@ pausebuilding = [accent][[{0}][] để tạm dừng xây dựng
|
||||
resumebuilding = [scarlet][[{0}][] để tiếp tục xây dựng
|
||||
enablebuilding = [scarlet][[{0}][] để bật xây dựng
|
||||
showui = UI hidden.\nPress [accent][[{0}][] để hiện UI.
|
||||
commandmode.name = [accent]Command Mode
|
||||
commandmode.name = [accent]Chế độ chỉ huy
|
||||
commandmode.nounits = [no units]
|
||||
wave = [accent]Đợt {0}
|
||||
wave.cap = [accent]Đợt {0}/{1}
|
||||
@@ -387,16 +392,16 @@ map.publish.confirm = Bạn có chắc chắn muốn xuất bản bản đồ n
|
||||
workshop.menu = Chọn những gì bạn muốn làm với mục này.
|
||||
workshop.info = Thông tin mục
|
||||
changelog = Danh sách các thay đổi (không bắt buộc):
|
||||
updatedesc = Overwrite Title & Description
|
||||
updatedesc = Ghi đè Tiêu đề và Mô tả
|
||||
eula = Steam EULA
|
||||
missing = Mục này đã bị xóa hoặc di chuyển.\n[lightgray]Danh sách workshop hiện đã được tự động hủy liên kết.
|
||||
publishing = [accent]Đang xuất bản...
|
||||
publish.confirm = Bạn có chắc chắn muốn xuất bản không?\n\n[lightgray]Đảm bảo rằng bạn đồng ý với Workshop EULA trước, hoặc mục của bạn sẽ không hiển thị!
|
||||
publish.error = Lỗi khi xuất bản: {0}
|
||||
steam.error = Không thể khởi chạy dịch vụ Steam.\nLỗi: {0}
|
||||
editor.planet = Planet:
|
||||
editor.sector = Sector:
|
||||
editor.seed = Seed:
|
||||
editor.planet = Hành tinh:
|
||||
editor.sector = Khu vực:
|
||||
editor.seed = Hạt giống:
|
||||
|
||||
editor.cliffs = Chuyển tường thành vách đá
|
||||
editor.brush = Kích thước
|
||||
|
||||
@@ -150,12 +150,16 @@ mod.incompatiblemod = [red]不兼容
|
||||
mod.blacklisted = [red]不支持
|
||||
mod.unmetdependencies = [red]缺少前置模组
|
||||
mod.erroredcontent = [scarlet]内容错误
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
|
||||
mod.requiresversion.details = 所需的最低游戏版本:[accent]{0}[]\n您的游戏版本过低。 这个模组需要更新的游戏版本(通常是beta/alpha版本)才能工作。
|
||||
mod.outdatedv7.details = 这个模组与最新版游戏不兼容。 作者必须更新它,并在[accent]mod.json[]文件中写入[accent]minGameVersion: 136[]。
|
||||
mod.blacklisted.details = 这个模组由于造成该版本游戏崩溃或其他原因被手动禁用了。 不要使用它。
|
||||
mod.missingdependencies.details = 缺少前置模组:{0}
|
||||
mod.erroredcontent.details = 这个模组在游戏加载时发生了错误。 请通知模组作者修复它。
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
|
||||
mod.errors = 读取内容时发生错误。
|
||||
@@ -334,6 +338,7 @@ command.repair = 维修
|
||||
command.rebuild = 重建
|
||||
command.assist = 协助建造
|
||||
command.move = 移动
|
||||
command.boost = Boost
|
||||
openlink = 打开链接
|
||||
copylink = 复制链接
|
||||
back = 返回
|
||||
|
||||
@@ -149,11 +149,15 @@ mod.incompatiblemod = [red]Incompatible
|
||||
mod.blacklisted = [red]Unsupported
|
||||
mod.unmetdependencies = [red]Unmet Dependencies
|
||||
mod.erroredcontent = [scarlet]內容錯誤
|
||||
mod.circulardependencies = [red]Circular Dependencies
|
||||
mod.incompletedependencies = [red]Incomplete Dependencies
|
||||
mod.requiresversion.details = Requires game version: [accent]{0}[]\nYour game is outdated. This mod requires a newer version of the game (possibly a beta/alpha release) to function.
|
||||
mod.outdatedv7.details = This mod is incompatible with the latest version of the game. The author must update it, and add [accent]minGameVersion: 136[] to its [accent]mod.json[] file.
|
||||
mod.blacklisted.details = This mod has been manually blacklisted for causing crashes or other issues with this version of the game. Do not use it.
|
||||
mod.missingdependencies.details = This mod is missing dependencies: {0}
|
||||
mod.erroredcontent.details = This game caused errors when loading. Ask the mod author to fix them.
|
||||
mod.circulardependencies.details = This mod has dependencies that depends on each other.
|
||||
mod.incompletedependencies.details = This mod is unable to be loaded due to invalid or missing dependencies: {0}.
|
||||
mod.requiresversion = Requires game version: [red]{0}
|
||||
mod.errors = 載入內容時發生錯誤
|
||||
mod.noerrorplay = [scarlet]你使用了有問題的模組。[] 遊戲前請先停用相關模組或修正問題。
|
||||
@@ -331,6 +335,7 @@ command.repair = 修復
|
||||
command.rebuild = 重建
|
||||
command.assist = 協助玩家
|
||||
command.move = 移動
|
||||
command.boost = Boost
|
||||
openlink = 開啟連結
|
||||
copylink = 複製連結
|
||||
back = 返回
|
||||
|
||||
@@ -102,9 +102,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform
|
||||
});
|
||||
assets.setLoader(Music.class, new MusicLoader(tree){
|
||||
@Override
|
||||
public void loadAsync(AssetManager manager, String fileName, Fi file, MusicParameter parameter){
|
||||
|
||||
}
|
||||
public void loadAsync(AssetManager manager, String fileName, Fi file, MusicParameter parameter){}
|
||||
|
||||
@Override
|
||||
public Music loadSync(AssetManager manager, String fileName, Fi file, MusicParameter parameter){
|
||||
|
||||
@@ -14,7 +14,10 @@ public class UnitCommand{
|
||||
|
||||
public static final UnitCommand
|
||||
|
||||
moveCommand = new UnitCommand("move", "right", u -> null),
|
||||
moveCommand = new UnitCommand("move", "right", u -> null){{
|
||||
drawTarget = true;
|
||||
resetTarget = false;
|
||||
}},
|
||||
repairCommand = new UnitCommand("repair", "modeSurvival", u -> new RepairAI()),
|
||||
rebuildCommand = new UnitCommand("rebuild", "hammer", u -> new BuilderAI()),
|
||||
assistCommand = new UnitCommand("assist", "players", u -> {
|
||||
@@ -22,7 +25,12 @@ public class UnitCommand{
|
||||
ai.onlyAssist = true;
|
||||
return ai;
|
||||
}),
|
||||
mineCommand = new UnitCommand("mine", "production", u -> new MinerAI());
|
||||
mineCommand = new UnitCommand("mine", "production", u -> new MinerAI()),
|
||||
boostCommand = new UnitCommand("boost", "up", u -> new BoostAI()){{
|
||||
switchToMove = false;
|
||||
drawTarget = true;
|
||||
resetTarget = false;
|
||||
}};
|
||||
|
||||
/** Unique ID number. */
|
||||
public final int id;
|
||||
@@ -32,6 +40,12 @@ public class UnitCommand{
|
||||
public final String icon;
|
||||
/** Controller that this unit will use when this command is used. Return null for "default" behavior. */
|
||||
public final Func<Unit, AIController> controller;
|
||||
/** If true, this unit will automatically switch away to the move command when given a position. */
|
||||
public boolean switchToMove = true;
|
||||
/** Whether to draw the movement/attack target. */
|
||||
public boolean drawTarget = false;
|
||||
/** Whether to reset targets when switching to or from this command. */
|
||||
public boolean resetTarget = true;
|
||||
|
||||
public UnitCommand(String name, String icon, Func<Unit, AIController> controller){
|
||||
this.name = name;
|
||||
@@ -45,4 +59,9 @@ public class UnitCommand{
|
||||
public String localized(){
|
||||
return Core.bundle.get("command." + name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "UnitCommand:" + name;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package mindustry.ai.types;
|
||||
|
||||
import mindustry.ai.*;
|
||||
import mindustry.entities.units.*;
|
||||
|
||||
//not meant to be used outside RTS-AI-controlled units
|
||||
public class BoostAI extends AIController{
|
||||
|
||||
@Override
|
||||
public void updateUnit(){
|
||||
if(unit.controller() instanceof CommandAI ai){
|
||||
ai.defaultBehavior();
|
||||
unit.updateBoosting(true);
|
||||
|
||||
//auto land when near target
|
||||
if(ai.attackTarget != null && unit.within(ai.attackTarget, unit.range())){
|
||||
unit.command().command(UnitCommand.moveCommand);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,8 +35,8 @@ public class CommandAI extends AIController{
|
||||
/** Last command type assigned. Used for detecting command changes. */
|
||||
protected @Nullable UnitCommand lastCommand;
|
||||
|
||||
public @Nullable UnitCommand currentCommand(){
|
||||
return command;
|
||||
public UnitCommand currentCommand(){
|
||||
return command == null ? UnitCommand.moveCommand : command;
|
||||
}
|
||||
|
||||
/** Attempts to assign a command to this unit. If not supported by the unit type, does nothing. */
|
||||
@@ -62,7 +62,7 @@ public class CommandAI extends AIController{
|
||||
}
|
||||
|
||||
//update command controller based on index.
|
||||
var curCommand = currentCommand();
|
||||
var curCommand = command;
|
||||
if(lastCommand != curCommand){
|
||||
lastCommand = curCommand;
|
||||
commandController = (curCommand == null ? null : curCommand.controller.get(unit));
|
||||
@@ -72,8 +72,14 @@ public class CommandAI extends AIController{
|
||||
if(commandController != null){
|
||||
if(commandController.unit() != unit) commandController.unit(unit);
|
||||
commandController.updateUnit();
|
||||
return;
|
||||
}else{
|
||||
defaultBehavior();
|
||||
//boosting control is not supported, so just don't.
|
||||
unit.updateBoosting(false);
|
||||
}
|
||||
}
|
||||
|
||||
public void defaultBehavior(){
|
||||
|
||||
//acquiring naval targets isn't supported yet, so use the fallback dumb AI
|
||||
if(unit.team.isAI() && unit.team.rules().rtsAi && unit.type.naval){
|
||||
@@ -162,10 +168,10 @@ public class CommandAI extends AIController{
|
||||
circleAttack(80f);
|
||||
}else{
|
||||
moveTo(vecOut,
|
||||
attackTarget != null && unit.within(attackTarget, engageRange) ? engageRange :
|
||||
unit.isGrounded() ? 0f :
|
||||
attackTarget != null ? engageRange :
|
||||
0f, unit.isFlying() ? 40f : 100f, false, null, targetPos.epsilonEquals(vecOut, 4.1f));
|
||||
attackTarget != null && unit.within(attackTarget, engageRange) ? engageRange :
|
||||
unit.isGrounded() ? 0f :
|
||||
attackTarget != null ? engageRange :
|
||||
0f, unit.isFlying() ? 40f : 100f, false, null, targetPos.epsilonEquals(vecOut, 4.1f));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,9 +213,6 @@ public class CommandAI extends AIController{
|
||||
}else if(target != null){
|
||||
faceTarget();
|
||||
}
|
||||
|
||||
//boosting control is not supported, so just don't.
|
||||
unit.updateBoosting(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -249,8 +252,12 @@ public class CommandAI extends AIController{
|
||||
lastTargetPos = targetPos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commandPosition(Vec2 pos){
|
||||
commandPosition(pos, false);
|
||||
if(commandController != null){
|
||||
commandController.commandPosition(pos);
|
||||
}
|
||||
}
|
||||
|
||||
public void commandPosition(Vec2 pos, boolean stopWhenInRange){
|
||||
@@ -261,8 +268,12 @@ public class CommandAI extends AIController{
|
||||
this.stopWhenInRange = stopWhenInRange;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void commandTarget(Teamc moveTo){
|
||||
commandTarget(moveTo, false);
|
||||
if(commandController != null){
|
||||
commandController.commandTarget(moveTo);
|
||||
}
|
||||
}
|
||||
|
||||
public void commandTarget(Teamc moveTo, boolean stopAtTarget){
|
||||
|
||||
@@ -1277,6 +1277,7 @@ public class Blocks{
|
||||
heatOutput = 3f;
|
||||
regionRotated1 = 1;
|
||||
ambientSound = Sounds.hum;
|
||||
itemCapacity = 0;
|
||||
consumePower(100f / 60f);
|
||||
}};
|
||||
|
||||
@@ -1287,6 +1288,7 @@ public class Blocks{
|
||||
|
||||
drawer = new DrawMulti(new DrawRegion("-bottom"), new DrawLiquidTile(Liquids.slag), new DrawDefault(), new DrawHeatOutput());
|
||||
size = 3;
|
||||
itemCapacity = 0;
|
||||
liquidCapacity = 40f;
|
||||
rotateDraw = false;
|
||||
regionRotated1 = 1;
|
||||
@@ -3402,6 +3404,7 @@ public class Blocks{
|
||||
reload = 30f;
|
||||
inaccuracy = 10f;
|
||||
range = 240f;
|
||||
consumeAmmoOnce = false;
|
||||
size = 2;
|
||||
scaledHealth = 300;
|
||||
shootSound = Sounds.missile;
|
||||
@@ -3464,6 +3467,7 @@ public class Blocks{
|
||||
size = 2;
|
||||
range = 190f;
|
||||
reload = 31f;
|
||||
consumeAmmoOnce = false;
|
||||
ammoEjectBack = 3f;
|
||||
recoil = 3f;
|
||||
shake = 1f;
|
||||
@@ -4079,6 +4083,7 @@ public class Blocks{
|
||||
|
||||
liquidConsumed = 10f / 60f;
|
||||
targetInterval = 5f;
|
||||
targetUnderBlocks = false;
|
||||
|
||||
float r = range = 130f;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ import arc.math.geom.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.entities.abilities.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.graphics.*;
|
||||
import mindustry.type.*;
|
||||
@@ -2404,6 +2405,14 @@ public class Fx{
|
||||
shieldBreak = new Effect(40, e -> {
|
||||
color(e.color);
|
||||
stroke(3f * e.fout());
|
||||
if(e.data instanceof Unit u){
|
||||
var ab = (ForceFieldAbility)Structs.find(u.abilities, a -> a instanceof ForceFieldAbility);
|
||||
if(ab != null){
|
||||
Lines.poly(e.x, e.y, ab.sides, e.rotation + e.fin(), ab.rotation);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Lines.poly(e.x, e.y, 6, e.rotation + e.fin());
|
||||
}).followParent(true),
|
||||
|
||||
|
||||
@@ -2751,7 +2751,7 @@ public class UnitTypes{
|
||||
weapons.add(new Weapon("conquer-weapon"){{
|
||||
shootSound = Sounds.largeCannon;
|
||||
layerOffset = 0.1f;
|
||||
reload = 110f;
|
||||
reload = 100f;
|
||||
shootY = 32.5f;
|
||||
shake = 5f;
|
||||
recoil = 5f;
|
||||
@@ -2823,7 +2823,7 @@ public class UnitTypes{
|
||||
}});
|
||||
}
|
||||
|
||||
bullet = new BasicBulletType(8f, 330f){{
|
||||
bullet = new BasicBulletType(8f, 360f){{
|
||||
sprite = "missile-large";
|
||||
width = 12f;
|
||||
height = 20f;
|
||||
@@ -2862,7 +2862,7 @@ public class UnitTypes{
|
||||
float fin = 0.05f + (j + 1) / (float)count;
|
||||
float spd = speed;
|
||||
float life = lifetime / Mathf.lerp(fin, 1f, 0.5f);
|
||||
spawnBullets.add(new BasicBulletType(spd * fin, 55){{
|
||||
spawnBullets.add(new BasicBulletType(spd * fin, 60){{
|
||||
drag = 0.002f;
|
||||
width = 12f;
|
||||
height = 11f;
|
||||
@@ -2879,7 +2879,7 @@ public class UnitTypes{
|
||||
weaveScale = (3f + s/2f) / 1.2f;
|
||||
weaveMag = i * (4f - fin * 2f);
|
||||
|
||||
splashDamage = 60f;
|
||||
splashDamage = 65f;
|
||||
splashDamageRadius = 30f;
|
||||
despawnEffect = new ExplosionEffect(){{
|
||||
lifetime = 50f;
|
||||
@@ -3434,9 +3434,9 @@ public class UnitTypes{
|
||||
}});
|
||||
}
|
||||
|
||||
bullet = new ArtilleryBulletType(5.5f, 280){{
|
||||
bullet = new ArtilleryBulletType(5.5f, 260){{
|
||||
collidesTiles = collides = true;
|
||||
lifetime = 75f;
|
||||
lifetime = 70f;
|
||||
shootEffect = Fx.shootBigColor;
|
||||
smokeEffect = Fx.shootSmokeSquareBig;
|
||||
frontColor = Color.white;
|
||||
@@ -3769,11 +3769,12 @@ public class UnitTypes{
|
||||
speed = 1.1f;
|
||||
rotateSpeed = 3.2f;
|
||||
accel = 0.1f;
|
||||
health = 8000f;
|
||||
armor = 5f;
|
||||
health = 6000f;
|
||||
armor = 4f;
|
||||
hitSize = 36f;
|
||||
payloadCapacity = Mathf.sqr(3f) * tilePayload;
|
||||
researchCostMultiplier = 0f;
|
||||
targetAir = false;
|
||||
|
||||
engineSize = 4.8f;
|
||||
engineOffset = 61 / 4f;
|
||||
@@ -3800,11 +3801,13 @@ public class UnitTypes{
|
||||
shake = 1f;
|
||||
speed = 0f;
|
||||
keepVelocity = false;
|
||||
collidesAir = false;
|
||||
|
||||
spawnUnit = new MissileUnitType("quell-missile"){{
|
||||
targetAir = false;
|
||||
speed = 4.3f;
|
||||
maxRange = 6f;
|
||||
lifetime = 60f * 1.6f;
|
||||
lifetime = 60f * 1.4f;
|
||||
outlineColor = Pal.darkOutline;
|
||||
engineColor = trailColor = Pal.sapBulletBack;
|
||||
engineLayer = Layer.effect;
|
||||
@@ -3818,6 +3821,7 @@ public class UnitTypes{
|
||||
shootOnDeath = true;
|
||||
bullet = new ExplosionBulletType(110f, 25f){{
|
||||
shootEffect = Fx.massiveExplosion;
|
||||
collidesAir = false;
|
||||
}};
|
||||
}});
|
||||
}};
|
||||
@@ -3844,6 +3848,7 @@ public class UnitTypes{
|
||||
armor = 9f;
|
||||
hitSize = 46f;
|
||||
payloadCapacity = Mathf.sqr(6f) * tilePayload;
|
||||
targetAir = false;
|
||||
|
||||
engineSize = 6f;
|
||||
engineOffset = 25.25f;
|
||||
@@ -3909,8 +3914,10 @@ public class UnitTypes{
|
||||
shake = 1f;
|
||||
speed = 0f;
|
||||
keepVelocity = false;
|
||||
collidesAir = false;
|
||||
|
||||
spawnUnit = new MissileUnitType("disrupt-missile"){{
|
||||
targetAir = false;
|
||||
speed = 4.6f;
|
||||
maxRange = 5f;
|
||||
outlineColor = Pal.darkOutline;
|
||||
@@ -3949,6 +3956,7 @@ public class UnitTypes{
|
||||
reload = 1f;
|
||||
shootOnDeath = true;
|
||||
bullet = new ExplosionBulletType(140f, 25f){{
|
||||
collidesAir = false;
|
||||
suppressionRange = 140f;
|
||||
shootEffect = new ExplosionEffect(){{
|
||||
lifetime = 50f;
|
||||
|
||||
@@ -383,12 +383,18 @@ public class Logic implements ApplicationListener{
|
||||
public static void researched(Content content){
|
||||
if(!(content instanceof UnlockableContent u)) return;
|
||||
|
||||
boolean was = u.unlockedNow();
|
||||
state.rules.researched.add(u.name);
|
||||
|
||||
if(!was){
|
||||
Events.fire(new UnlockEvent(u));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispose(){
|
||||
//save the settings before quitting
|
||||
netServer.admins.forceSave();
|
||||
Core.settings.manualSave();
|
||||
}
|
||||
|
||||
@@ -398,9 +404,12 @@ public class Logic implements ApplicationListener{
|
||||
universe.updateGlobal();
|
||||
|
||||
if(Core.settings.modified() && !state.isPlaying()){
|
||||
netServer.admins.forceSave();
|
||||
Core.settings.forceSave();
|
||||
}
|
||||
|
||||
boolean runStateCheck = !net.client() && !world.isInvalidMap() && !state.isEditor() && state.rules.canGameOver;
|
||||
|
||||
if(state.isGame()){
|
||||
if(!net.client()){
|
||||
state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.isEnemy());
|
||||
@@ -466,9 +475,11 @@ public class Logic implements ApplicationListener{
|
||||
Groups.update();
|
||||
}
|
||||
|
||||
if(!net.client() && !world.isInvalidMap() && !state.isEditor() && state.rules.canGameOver){
|
||||
if(runStateCheck){
|
||||
checkGameState();
|
||||
}
|
||||
}else if(netServer.isWaitingForPlayers() && runStateCheck){
|
||||
checkGameState();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -869,7 +869,7 @@ public class NetServer implements ApplicationListener{
|
||||
}
|
||||
|
||||
if(state.isGame() && net.server()){
|
||||
if(state.rules.pvp){
|
||||
if(state.rules.pvp && state.rules.pvpAutoPause){
|
||||
boolean waiting = isWaitingForPlayers(), paused = state.isPaused();
|
||||
if(waiting != paused){
|
||||
if(waiting){
|
||||
@@ -1003,7 +1003,7 @@ public class NetServer implements ApplicationListener{
|
||||
player.con.snapshotsSent++;
|
||||
}
|
||||
|
||||
String fixName(String name){
|
||||
public String fixName(String name){
|
||||
name = name.trim().replace("\n", "").replace("\t", "");
|
||||
if(name.equals("[") || name.equals("]")){
|
||||
return "";
|
||||
@@ -1027,7 +1027,7 @@ public class NetServer implements ApplicationListener{
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
static String checkColor(String str){
|
||||
public String checkColor(String str){
|
||||
for(int i = 1; i < str.length(); i++){
|
||||
if(str.charAt(i) == ']'){
|
||||
String color = str.substring(1, i);
|
||||
|
||||
@@ -32,7 +32,6 @@ public class Renderer implements ApplicationListener{
|
||||
private static final float cloudScaling = 1700f, cfinScl = -2f, cfinOffset = 0.3f, calphaFinOffset = 0.25f;
|
||||
private static final float[] cloudAlphas = {0, 0.5f, 1f, 0.1f, 0, 0f};
|
||||
private static final float cloudAlpha = 0.81f;
|
||||
private static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f};
|
||||
private static final Interp landInterp = Interp.pow3;
|
||||
|
||||
public final BlockRenderer blocks = new BlockRenderer();
|
||||
@@ -174,13 +173,14 @@ public class Renderer implements ApplicationListener{
|
||||
laserOpacity = settings.getInt("lasersopacity") / 100f;
|
||||
bridgeOpacity = settings.getInt("bridgeopacity") / 100f;
|
||||
animateShields = settings.getBool("animatedshields");
|
||||
drawStatus = Core.settings.getBool("blockstatus");
|
||||
drawStatus = settings.getBool("blockstatus");
|
||||
enableEffects = settings.getBool("effects");
|
||||
drawDisplays = !settings.getBool("hidedisplays");
|
||||
|
||||
if(landTime > 0){
|
||||
if(!state.isPaused()){
|
||||
updateLandParticles();
|
||||
CoreBuild build = landCore == null ? player.bestCore() : landCore;
|
||||
build.updateLandParticles();
|
||||
}
|
||||
|
||||
if(!state.isPaused()){
|
||||
@@ -453,63 +453,26 @@ public class Renderer implements ApplicationListener{
|
||||
|
||||
}
|
||||
|
||||
void updateLandParticles(){
|
||||
float time = launching ? coreLandDuration - landTime : landTime;
|
||||
float tsize = Mathf.sample(thrusterSizes, (time + 35f) / coreLandDuration);
|
||||
|
||||
landPTimer += tsize * Time.delta;
|
||||
if(landCore != null && landPTimer >= 1f){
|
||||
landCore.tile.getLinkedTiles(t -> {
|
||||
if(Mathf.chance(0.4f)){
|
||||
Fx.coreLandDust.at(t.worldx(), t.worldy(), landCore.angleTo(t) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f)));
|
||||
}
|
||||
});
|
||||
|
||||
landPTimer = 0f;
|
||||
}
|
||||
}
|
||||
|
||||
void drawLanding(){
|
||||
CoreBuild build = landCore == null ? player.bestCore() : landCore;
|
||||
var clouds = assets.get("sprites/clouds.png", Texture.class);
|
||||
if(landTime > 0 && build != null){
|
||||
float fout = landTime / coreLandDuration;
|
||||
|
||||
if(launching) fout = 1f - fout;
|
||||
|
||||
float fin = 1f - fout;
|
||||
|
||||
//draw core
|
||||
var block = launching && launchCoreType != null ? launchCoreType : (CoreBlock)build.block;
|
||||
TextureRegion reg = block.fullIcon;
|
||||
float scl = Scl.scl(4f) / camerascale;
|
||||
float shake = 0f;
|
||||
float s = reg.width * reg.scl() * scl * 3.6f * Interp.pow2Out.apply(fout);
|
||||
float rotation = Interp.pow2In.apply(fout) * 135f, x = build.x + Mathf.range(shake), y = build.y + Mathf.range(shake);
|
||||
float thrustOpen = 0.25f;
|
||||
float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen;
|
||||
float thrusterSize = Mathf.sample(thrusterSizes, fin);
|
||||
|
||||
//when launching, thrusters stay out the entire time.
|
||||
if(launching){
|
||||
Interp i = Interp.pow2Out;
|
||||
thrusterFrame = i.apply(Mathf.clamp(fout*13f));
|
||||
thrusterSize = i.apply(Mathf.clamp(fout*9f));
|
||||
}
|
||||
|
||||
Draw.color(Pal.lightTrail);
|
||||
//TODO spikier heat
|
||||
Draw.rect("circle-shadow", x, y, s, s);
|
||||
|
||||
Draw.color(Pal.lightTrail);
|
||||
|
||||
float pfin = Interp.pow3Out.apply(fin), pf = Interp.pow2In.apply(fout);
|
||||
|
||||
//draw particles
|
||||
Draw.color(Pal.lightTrail);
|
||||
Angles.randLenVectors(1, pfin, 100, 800f * scl * pfin, (ax, ay, ffin, ffout) -> {
|
||||
Lines.stroke(scl * ffin * pf * 3f);
|
||||
Lines.lineAngle(build.x + ax, build.y + ay, Mathf.angle(ax, ay), (ffin * 20 + 1f) * scl);
|
||||
});
|
||||
Draw.color();
|
||||
|
||||
CoreBlock block = launching && launchCoreType != null ? launchCoreType : (CoreBlock)build.block;
|
||||
block.drawLanding(build, build.x, build.y);
|
||||
|
||||
Draw.color();
|
||||
Draw.mixcol(Color.white, Interp.pow5In.apply(fout));
|
||||
@@ -522,44 +485,6 @@ public class Renderer implements ApplicationListener{
|
||||
}
|
||||
}
|
||||
|
||||
Draw.scl(scl);
|
||||
|
||||
Draw.alpha(1f);
|
||||
|
||||
//draw thruster flame
|
||||
float strength = (1f + (block.size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f));
|
||||
float offset = (block.size - 3) * 3f * scl;
|
||||
|
||||
for(int i = 0; i < 4; i++){
|
||||
Tmp.v1.trns(i * 90 + rotation, 1f);
|
||||
|
||||
Tmp.v1.setLength((block.size * tilesize/2f + 1f)*scl + strength*2f + offset);
|
||||
Draw.color(build.team.color);
|
||||
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength);
|
||||
|
||||
Tmp.v1.setLength((block.size * tilesize/2f + 1f)*scl + strength*0.5f + offset);
|
||||
Draw.color(Color.white);
|
||||
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength);
|
||||
}
|
||||
|
||||
drawThrusters(block, x, y, rotation, thrusterFrame);
|
||||
|
||||
Drawf.spinSprite(block.region, x, y, rotation);
|
||||
|
||||
Draw.alpha(Interp.pow4In.apply(thrusterFrame));
|
||||
drawThrusters(block, x, y, rotation, thrusterFrame);
|
||||
Draw.alpha(1f);
|
||||
|
||||
if(block.teamRegions[build.team.id] == block.teamRegion) Draw.color(build.team.color);
|
||||
|
||||
Drawf.spinSprite(block.teamRegions[build.team.id], x, y, rotation);
|
||||
|
||||
Draw.color();
|
||||
|
||||
Draw.scl();
|
||||
|
||||
Draw.reset();
|
||||
|
||||
//draw clouds
|
||||
if(state.rules.cloudColor.a > 0.0001f){
|
||||
float scaling = cloudScaling;
|
||||
@@ -582,32 +507,6 @@ public class Renderer implements ApplicationListener{
|
||||
}
|
||||
}
|
||||
|
||||
void drawThrusters(CoreBlock block, float x, float y, float rotation, float frame){
|
||||
float length = block.thrusterLength * (frame - 1f) - 1f/4f;
|
||||
float alpha = Draw.getColor().a;
|
||||
|
||||
//two passes for consistent lighting
|
||||
for(int j = 0; j < 2; j++){
|
||||
for(int i = 0; i < 4; i++){
|
||||
var reg = i >= 2 ? block.thruster2 : block.thruster1;
|
||||
float rot = (i * 90) + rotation % 90f;
|
||||
Tmp.v1.trns(rot, length * Draw.xscl);
|
||||
|
||||
//second pass applies extra layer of shading
|
||||
if(j == 1){
|
||||
Tmp.v1.rotate(-90f);
|
||||
Draw.alpha((rotation % 90f) / 90f * alpha);
|
||||
rot -= 90f;
|
||||
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
|
||||
}else{
|
||||
Draw.alpha(alpha);
|
||||
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
|
||||
}
|
||||
}
|
||||
}
|
||||
Draw.alpha(1f);
|
||||
}
|
||||
|
||||
public void scaleCamera(float amount){
|
||||
targetscale *= (amount / 4) + 1;
|
||||
clampScale();
|
||||
@@ -638,6 +537,26 @@ public class Renderer implements ApplicationListener{
|
||||
clampScale();
|
||||
}
|
||||
|
||||
public boolean isLaunching(){
|
||||
return launching;
|
||||
}
|
||||
|
||||
public CoreBlock getLaunchCoreType(){
|
||||
return launchCoreType;
|
||||
}
|
||||
|
||||
public float getLandTime(){
|
||||
return landTime;
|
||||
}
|
||||
|
||||
public float getLandPTimer(){
|
||||
return landPTimer;
|
||||
}
|
||||
|
||||
public void setLandPTimer(float landPTimer){
|
||||
this.landPTimer = landPTimer;
|
||||
}
|
||||
|
||||
public void showLanding(){
|
||||
launching = false;
|
||||
camerascale = minZoomScl;
|
||||
|
||||
@@ -237,7 +237,8 @@ public class Damage{
|
||||
seg2.set(seg1).add(vec);
|
||||
World.raycastEachWorld(x, y, seg2.x, seg2.y, (cx, cy) -> {
|
||||
Building tile = world.build(cx, cy);
|
||||
boolean collide = tile != null && hitter.checkUnderBuild(tile, cx * tilesize, cy * tilesize) && collidedBlocks.add(tile.pos());
|
||||
boolean collide = tile != null && hitter.checkUnderBuild(tile, cx * tilesize, cy * tilesize)
|
||||
&& ((tile.team != team && tile.collide(hitter)) || hitter.type.testCollision(hitter, tile)) && collidedBlocks.add(tile.pos());
|
||||
if(collide){
|
||||
collided.add(collidePool.obtain().set(cx * tilesize, cy * tilesize, tile));
|
||||
|
||||
@@ -275,17 +276,19 @@ public class Damage{
|
||||
int[] collideCount = {0};
|
||||
collided.sort(c -> hitter.dst2(c.x, c.y));
|
||||
collided.each(c -> {
|
||||
if(hitter.damage > 0 && (pierceCap <= 0 || collideCount[0]++ < pierceCap)){
|
||||
if(hitter.damage > 0 && (pierceCap <= 0 || collideCount[0] < pierceCap)){
|
||||
if(c.target instanceof Unit u){
|
||||
effect.at(c.x, c.y);
|
||||
u.collision(hitter, c.x, c.y);
|
||||
hitter.collision(u, c.x, c.y);
|
||||
collideCount[0]++;
|
||||
}else if(c.target instanceof Building tile){
|
||||
float health = tile.health;
|
||||
|
||||
if(tile.team != team && tile.collide(hitter)){
|
||||
tile.collision(hitter);
|
||||
hitter.type.hit(hitter, c.x, c.y);
|
||||
collideCount[0]++;
|
||||
}
|
||||
|
||||
//try to heal the tile
|
||||
|
||||
@@ -206,7 +206,7 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
|
||||
//fix incorrect HEAD index since it was swapped
|
||||
if(array.size > 0 && idx != array.size){
|
||||
var swapped = array.items[idx];
|
||||
indexer.change(swapped, idx);
|
||||
if(indexer != null) indexer.change(swapped, idx);
|
||||
}
|
||||
|
||||
if(map != null){
|
||||
@@ -228,7 +228,7 @@ public class EntityGroup<T extends Entityc> implements Iterable<T>{
|
||||
//swap head with current
|
||||
if(array.size > 1){
|
||||
var head = array.items[array.size - 1];
|
||||
indexer.change(head, position);
|
||||
if(indexer != null) indexer.change(head, position);
|
||||
array.items[position] = head;
|
||||
}
|
||||
|
||||
|
||||
@@ -69,7 +69,7 @@ public class Puddles{
|
||||
if(tile.floor().solid) return;
|
||||
|
||||
Puddle p = map.get(tile.pos());
|
||||
if(p == null){
|
||||
if(p == null || p.liquid == null){
|
||||
Puddle puddle = Puddle.create();
|
||||
puddle.tile = tile;
|
||||
puddle.liquid = liquid;
|
||||
@@ -107,6 +107,8 @@ public class Puddles{
|
||||
|
||||
/** Reacts two liquids together at a location. */
|
||||
private static float reactPuddle(Liquid dest, Liquid liquid, float amount, Tile tile, float x, float y){
|
||||
if(dest == null) return 0f;
|
||||
|
||||
if((dest.flammability > 0.3f && liquid.temperature > 0.7f) ||
|
||||
(liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid
|
||||
Fires.create(tile);
|
||||
|
||||
@@ -144,7 +144,7 @@ abstract class BuilderComp implements Posc, Statusc, Teamc, Rotc{
|
||||
}
|
||||
|
||||
if(tile.build instanceof ConstructBuild && !current.initialized){
|
||||
Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, team, self(), current.breaking)));
|
||||
Events.fire(new BuildSelectEvent(tile, team, self(), current.breaking));
|
||||
current.initialized = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -1254,7 +1254,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
public void placed(){
|
||||
if(net.client()) return;
|
||||
|
||||
if((block.consumesPower || block.outputsPower) && block.hasPower){
|
||||
if((block.consumesPower || block.outputsPower) && block.hasPower && block.connectedPower){
|
||||
PowerNode.getNodeLinks(tile, block, team, other -> {
|
||||
if(!other.power.links.contains(pos())){
|
||||
other.configureAny(pos());
|
||||
@@ -1746,7 +1746,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc,
|
||||
public void updateConsumption(){
|
||||
//everything is valid when cheating
|
||||
if(!block.hasConsumers || cheating()){
|
||||
potentialEfficiency = efficiency = optionalEfficiency = enabled ? 1f : 0f;
|
||||
potentialEfficiency = enabled && productionValid() ? 1f : 0f;
|
||||
efficiency = optionalEfficiency = shouldConsume() ? potentialEfficiency : 0f;
|
||||
updateEfficiencyMultiplier();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -142,6 +142,8 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc, Syncc{
|
||||
|
||||
@Override
|
||||
public void afterSync(){
|
||||
Puddles.register(self());
|
||||
if(liquid != null){
|
||||
Puddles.register(self());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I
|
||||
}
|
||||
|
||||
public void updateBoosting(boolean boost){
|
||||
if(!type.canBoost) return;
|
||||
if(!type.canBoost || dead) return;
|
||||
|
||||
elevation = Mathf.approachDelta(elevation, type.canBoost ? Mathf.num(boost || onSolid() || (isFlying() && !canLand())) : 0f, type.riseSpeed);
|
||||
}
|
||||
|
||||
@@ -222,6 +222,10 @@ public class AIController implements UnitController{
|
||||
return target(x, y, range, air, ground);
|
||||
}
|
||||
|
||||
public void commandTarget(Teamc moveTo){}
|
||||
|
||||
public void commandPosition(Vec2 pos){}
|
||||
|
||||
/** Called after this controller is assigned a unit. */
|
||||
public void init(){
|
||||
|
||||
|
||||
@@ -162,6 +162,16 @@ public class EventType{
|
||||
}
|
||||
}
|
||||
|
||||
public static class ClientServerConnectEvent{
|
||||
public final String ip;
|
||||
public final int port;
|
||||
|
||||
public ClientServerConnectEvent(String ip, int port){
|
||||
this.ip = ip;
|
||||
this.port = port;
|
||||
}
|
||||
}
|
||||
|
||||
/** Consider using Menus.registerMenu instead. */
|
||||
public static class MenuOptionChooseEvent{
|
||||
public final Player player;
|
||||
|
||||
@@ -31,6 +31,8 @@ public class Rules{
|
||||
public boolean waves;
|
||||
/** Whether the game objective is PvP. Note that this enables automatic hosting. */
|
||||
public boolean pvp;
|
||||
/** Whether is waiting for players enabled in PvP. */
|
||||
public boolean pvpAutoPause = true;
|
||||
/** Whether to pause the wave timer until all enemies are destroyed. */
|
||||
public boolean waitEnemies = false;
|
||||
/** Determines if gamemode is attack mode. */
|
||||
|
||||
@@ -42,7 +42,7 @@ public class Team implements Comparable<Team>{
|
||||
Mathf.rand.setSeed(8);
|
||||
//create the whole 256 placeholder teams
|
||||
for(int i = 6; i < all.length; i++){
|
||||
new Team(i, "team#" + i, Color.HSVtoRGB(360f * Mathf.random(), 100f * Mathf.random(0.6f, 1f), 100f * Mathf.random(0.8f, 1f), 1f));
|
||||
new Team(i, "team#" + i, Color.HSVtoRGB(360f * Mathf.random(), 100f * Mathf.random(0.4f, 1f), 100f * Mathf.random(0.6f, 1f), 1f));
|
||||
}
|
||||
Mathf.rand.setSeed(new Rand().nextLong());
|
||||
}
|
||||
|
||||
@@ -231,10 +231,13 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
if(unit != null && unit.team == player.team() && unit.controller() instanceof CommandAI ai){
|
||||
|
||||
//implicitly order it to move
|
||||
ai.command(UnitCommand.moveCommand);
|
||||
if(ai.command == null || ai.command.switchToMove){
|
||||
ai.command(UnitCommand.moveCommand);
|
||||
}
|
||||
|
||||
if(teamTarget != null && teamTarget.team() != player.team()){
|
||||
ai.commandTarget(teamTarget);
|
||||
|
||||
}else if(posTarget != null){
|
||||
ai.commandPosition(posTarget);
|
||||
}
|
||||
@@ -269,10 +272,12 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
for(int id : unitIds){
|
||||
Unit unit = Groups.unit.getByID(id);
|
||||
if(unit != null && unit.team == player.team() && unit.controller() instanceof CommandAI ai){
|
||||
boolean reset = command.resetTarget || ai.currentCommand().resetTarget;
|
||||
ai.command(command);
|
||||
//reset targeting
|
||||
ai.targetPos = null;
|
||||
ai.attackTarget = null;
|
||||
if(reset){
|
||||
ai.targetPos = null;
|
||||
ai.attackTarget = null;
|
||||
}
|
||||
unit.lastCommanded = player.coloredName();
|
||||
}
|
||||
}
|
||||
@@ -868,7 +873,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
for(Unit unit : selectedUnits){
|
||||
CommandAI ai = unit.command();
|
||||
//draw target line
|
||||
if(ai.targetPos != null && ai.command == UnitCommand.moveCommand){
|
||||
if(ai.targetPos != null && ai.currentCommand().drawTarget){
|
||||
Position lineDest = ai.attackTarget != null ? ai.attackTarget : ai.targetPos;
|
||||
Drawf.limitLine(unit, lineDest, unit.hitSize / 2f, 3.5f);
|
||||
|
||||
@@ -879,8 +884,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{
|
||||
|
||||
Drawf.square(unit.x, unit.y, unit.hitSize / 1.4f + 1f);
|
||||
|
||||
//TODO when to draw, when to not?
|
||||
if(ai.attackTarget != null && ai.command == UnitCommand.moveCommand){
|
||||
if(ai.attackTarget != null && ai.currentCommand().drawTarget){
|
||||
Drawf.target(ai.attackTarget.getX(), ai.attackTarget.getY(), 6f, Pal.remove);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,7 +306,13 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
b.button(Icon.flipX, style, () -> flipPlans(selectPlans, true));
|
||||
b.button(Icon.flipY, style, () -> flipPlans(selectPlans, false));
|
||||
b.row();
|
||||
b.button(Icon.rotate, style, () -> rotatePlans(selectPlans, 1));
|
||||
b.button(Icon.rotate, style, () -> rotatePlans(selectPlans, 1)).update(i -> {
|
||||
var img = i.getCells().first().get();
|
||||
|
||||
img.setScale(-1f, 1f);
|
||||
//why the heck doesn't setOrigin work for scaling
|
||||
img.setTranslation(img.getWidth(), 0f);
|
||||
});
|
||||
|
||||
}).margin(4f);
|
||||
});
|
||||
@@ -387,7 +393,7 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
|
||||
if(!plan.breaking && plan == lastPlaced && plan.block != null){
|
||||
Draw.mixcol();
|
||||
if(plan.block.rotate) drawArrow(plan.block, tile.x, tile.y, plan.rotation);
|
||||
if(plan.block.rotate && plan.block.drawArrow) drawArrow(plan.block, tile.x, tile.y, plan.rotation);
|
||||
}
|
||||
|
||||
Draw.reset();
|
||||
@@ -397,13 +403,12 @@ public class MobileInput extends InputHandler implements GestureListener{
|
||||
}
|
||||
|
||||
//draw last placed plan
|
||||
if(!plan.breaking && plan == lastPlaced && plan.block != null && plan.block.drawArrow){
|
||||
if(!plan.breaking && plan == lastPlaced && plan.block != null){
|
||||
boolean valid = validPlace(tile.x, tile.y, plan.block, rotation);
|
||||
Draw.mixcol();
|
||||
plan.block.drawPlace(tile.x, tile.y, rotation, valid);
|
||||
|
||||
drawOverlapCheck(plan.block, tile.x, tile.y, valid);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@ package mindustry.io;
|
||||
|
||||
import arc.graphics.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import arc.util.serialization.*;
|
||||
import arc.util.serialization.Json.*;
|
||||
@@ -79,30 +78,6 @@ public class JsonIO{
|
||||
json.setElementType(Rules.class, "spawns", SpawnGroup.class);
|
||||
json.setElementType(Rules.class, "loadout", ItemStack.class);
|
||||
|
||||
json.setSerializer(Rules.class, new Serializer<>(){
|
||||
@Override
|
||||
public void write(Json json, Rules object, Class knownType){
|
||||
json.writeObjectStart();
|
||||
json.writeFields(object);
|
||||
json.writeValue("envMapping", Env.idToName, IntMap.class);
|
||||
json.writeObjectEnd();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Rules read(Json json, JsonValue jsonData, Class type){
|
||||
Rules out = baseObject instanceof Rules rules ? rules : new Rules();
|
||||
json.readFields(out, jsonData);
|
||||
|
||||
// Older Rules data doesn't have env mapping.
|
||||
if(jsonData.has("envMapping")){
|
||||
IntMap<String> idToName = json.readValue(IntMap.class, jsonData.get("envMapping"));
|
||||
out.env = Env.remap(out.env, idToName);
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
});
|
||||
|
||||
json.setSerializer(Color.class, new Serializer<>(){
|
||||
@Override
|
||||
public void write(Json json, Color object, Class knownType){
|
||||
@@ -352,9 +327,8 @@ public class JsonIO{
|
||||
}
|
||||
}
|
||||
|
||||
private static Object baseObject;
|
||||
|
||||
static class CustomJson extends Json{
|
||||
private Object baseObject;
|
||||
|
||||
{ apply(this); }
|
||||
|
||||
@@ -364,7 +338,7 @@ public class JsonIO{
|
||||
}
|
||||
|
||||
public <T> T fromBaseJson(Class<T> type, T base, String json){
|
||||
baseObject = base;
|
||||
this.baseObject = base;
|
||||
return readValue(type, null, new JsonReader().parse(json));
|
||||
}
|
||||
|
||||
@@ -376,4 +350,4 @@ public class JsonIO{
|
||||
return baseObject;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
package mindustry.logic;
|
||||
|
||||
import mindustry.ctype.*;
|
||||
|
||||
//TODO
|
||||
public interface Settable{
|
||||
void setProperty(LAccess prop, double value);
|
||||
void setProperty(LAccess prop, Object value);
|
||||
void setProperty(UnlockableContent content, double value);
|
||||
}
|
||||
@@ -192,7 +192,8 @@ public class Map implements Comparable<Map>, Publishable{
|
||||
|
||||
@Override
|
||||
public Fi createSteamPreview(String id){
|
||||
return previewFile();
|
||||
//I have no idea what the hell I was even thinking with this preview stuff
|
||||
return Vars.mapPreviewDirectory.child((workshop && file.parent().exists() && file.parent().extEquals(".png") ? file.parent().name() : file.nameWithoutExtension()) + "_v2.png");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -461,12 +461,13 @@ public class ContentParser{
|
||||
}
|
||||
|
||||
var typeVal = value.get("type");
|
||||
if(unit.constructor == null || typeVal != null){
|
||||
if(typeVal != null && !typeVal.isString()){
|
||||
throw new RuntimeException("Unit '" + name + "' has an incorrect type. Types must be strings.");
|
||||
}
|
||||
|
||||
if(typeVal != null && !typeVal.isString()){
|
||||
throw new RuntimeException("Unit '" + name + "' has an incorrect type. Types must be strings.");
|
||||
unit.constructor = unitType(typeVal);
|
||||
}
|
||||
|
||||
unit.constructor = unitType(typeVal);
|
||||
}else{
|
||||
unit = locate(ContentType.unit, name);
|
||||
}
|
||||
|
||||
+160
-110
@@ -41,8 +41,12 @@ public class Mods implements Loadable{
|
||||
private ObjectSet<String> specialFolders = ObjectSet.with("bundles", "sprites", "sprites-override");
|
||||
|
||||
private int totalSprites;
|
||||
private static ObjectFloatMap<String> textureResize = new ObjectFloatMap<>();
|
||||
private ObjectFloatMap<String> textureResize = new ObjectFloatMap<>();
|
||||
private MultiPacker packer;
|
||||
|
||||
/** Ordered mods cache. Set to null to invalidate. */
|
||||
private @Nullable Seq<LoadedMod> lastOrderedMods = new Seq<>();
|
||||
|
||||
private ModClassLoader mainLoader = new ModClassLoader(getClass().getClassLoader());
|
||||
|
||||
Seq<LoadedMod> mods = new Seq<>();
|
||||
@@ -103,8 +107,10 @@ public class Mods implements Loadable{
|
||||
|
||||
file.copyTo(dest);
|
||||
try{
|
||||
var loaded = loadMod(dest, true);
|
||||
var loaded = loadMod(dest, true, true);
|
||||
mods.add(loaded);
|
||||
//invalidate ordered mods cache
|
||||
lastOrderedMods = null;
|
||||
requiresReload = true;
|
||||
//enable the mod on import
|
||||
Core.settings.put("mod-" + loaded.name + "-enabled", true);
|
||||
@@ -418,19 +424,59 @@ public class Mods implements Loadable{
|
||||
|
||||
/** Loads all mods from the folder, but does not call any methods on them.*/
|
||||
public void load(){
|
||||
var files = resolveDependencies(Seq.with(modDirectory.list()).filter(f ->
|
||||
f.extEquals("jar") || f.extEquals("zip") || (f.isDirectory() && (f.child("mod.json").exists() || f.child("mod.hjson").exists()))
|
||||
));
|
||||
var candidates = new Seq<Fi>();
|
||||
|
||||
// Add local mods
|
||||
Seq.with(modDirectory.list())
|
||||
.filter(f -> f.extEquals("jar") || f.extEquals("zip") || (f.isDirectory() && (f.child("mod.json").exists() || f.child("mod.hjson").exists())))
|
||||
.each(candidates::add);
|
||||
|
||||
// Add Steam workshop mods
|
||||
platform.getWorkshopContent(LoadedMod.class)
|
||||
.each(candidates::add);
|
||||
|
||||
var mapping = new ObjectMap<String, Fi>();
|
||||
var metas = new Seq<ModMeta>();
|
||||
|
||||
for(Fi file : candidates){
|
||||
ModMeta meta = null;
|
||||
|
||||
try{
|
||||
Fi zip = file.isDirectory() ? file : new ZipFi(file);
|
||||
|
||||
if(zip.list().length == 1 && zip.list()[0].isDirectory()){
|
||||
zip = zip.list()[0];
|
||||
}
|
||||
|
||||
meta = findMeta(zip);
|
||||
}catch(Throwable ignored){
|
||||
}
|
||||
|
||||
if(meta == null || meta.name == null) continue;
|
||||
metas.add(meta);
|
||||
mapping.put(meta.name, file);
|
||||
}
|
||||
|
||||
var resolved = resolveDependencies(metas);
|
||||
for(var entry : resolved){
|
||||
var file = mapping.get(entry.key);
|
||||
var steam = platform.getWorkshopContent(LoadedMod.class).contains(file);
|
||||
|
||||
for(Fi file : files){
|
||||
Log.debug("[Mods] Loading mod @", file);
|
||||
|
||||
try{
|
||||
LoadedMod mod = loadMod(file);
|
||||
LoadedMod mod = loadMod(file, false, entry.value == ModState.enabled);
|
||||
mod.state = entry.value;
|
||||
mods.add(mod);
|
||||
//invalidate ordered mods cache
|
||||
lastOrderedMods = null;
|
||||
if(steam) mod.addSteamID(file.name());
|
||||
}catch(Throwable e){
|
||||
if(e instanceof ClassNotFoundException && e.getMessage().contains("mindustry.plugin.Plugin")){
|
||||
Log.info("Plugin '@' is outdated and needs to be ported to 6.0! Update its main class to inherit from 'mindustry.mod.Plugin'. See https://mindustrygame.github.io/wiki/modding/6-migrationv6/", file.name());
|
||||
}else if(steam){
|
||||
Log.err("Failed to load mod workshop file @. Skipping.", file);
|
||||
Log.err(e);
|
||||
}else{
|
||||
Log.err("Failed to load mod file @. Skipping.", file);
|
||||
Log.err(e);
|
||||
@@ -438,21 +484,19 @@ public class Mods implements Loadable{
|
||||
}
|
||||
}
|
||||
|
||||
//load workshop mods now
|
||||
for(Fi file : resolveDependencies(platform.getWorkshopContent(LoadedMod.class))){
|
||||
try{
|
||||
LoadedMod mod = loadMod(file);
|
||||
mods.add(mod);
|
||||
mod.addSteamID(file.name());
|
||||
}catch(Throwable e){
|
||||
Log.err("Failed to load mod workshop file @. Skipping.", file);
|
||||
Log.err(e);
|
||||
// Resolve the state
|
||||
mods.each(this::updateDependencies);
|
||||
for(var mod : mods){
|
||||
// Skip mods where the state has already been resolved
|
||||
if(mod.state != ModState.enabled) continue;
|
||||
if(!mod.isSupported()){
|
||||
mod.state = ModState.unsupported;
|
||||
}else if(!mod.shouldBeEnabled()){
|
||||
mod.state = ModState.disabled;
|
||||
}
|
||||
}
|
||||
|
||||
resolveModState();
|
||||
sortMods();
|
||||
|
||||
buildFiles();
|
||||
}
|
||||
|
||||
@@ -461,18 +505,6 @@ public class Mods implements Loadable{
|
||||
mods.sort(Structs.comps(Structs.comparingInt(m -> m.state.ordinal()), Structs.comparing(m -> m.name)));
|
||||
}
|
||||
|
||||
private void resolveModState(){
|
||||
mods.each(this::updateDependencies);
|
||||
|
||||
for(LoadedMod mod : mods){
|
||||
mod.state =
|
||||
!mod.isSupported() ? ModState.unsupported :
|
||||
mod.hasUnmetDependencies() ? ModState.missingDependencies :
|
||||
!mod.shouldBeEnabled() ? ModState.disabled :
|
||||
ModState.enabled;
|
||||
}
|
||||
}
|
||||
|
||||
private void updateDependencies(LoadedMod mod){
|
||||
mod.dependencies.clear();
|
||||
mod.missingDependencies.clear();
|
||||
@@ -485,22 +517,17 @@ public class Mods implements Loadable{
|
||||
}
|
||||
}
|
||||
|
||||
private void topoSort(LoadedMod mod, Seq<LoadedMod> stack, ObjectSet<LoadedMod> visited){
|
||||
visited.add(mod);
|
||||
mod.dependencies.each(m -> !visited.contains(m), m -> topoSort(m, stack, visited));
|
||||
stack.add(mod);
|
||||
}
|
||||
|
||||
/** @return mods ordered in the correct way needed for dependencies. */
|
||||
private Seq<LoadedMod> orderedMods(){
|
||||
ObjectSet<LoadedMod> visited = new ObjectSet<>();
|
||||
Seq<LoadedMod> result = new Seq<>();
|
||||
eachEnabled(mod -> {
|
||||
if(!visited.contains(mod)){
|
||||
topoSort(mod, result, visited);
|
||||
}
|
||||
});
|
||||
return result;
|
||||
public Seq<LoadedMod> orderedMods(){
|
||||
//update cache if it's "dirty"/empty
|
||||
if(lastOrderedMods == null){
|
||||
//only enabled mods participate; this state is resolved in load()
|
||||
Seq<LoadedMod> enabled = mods.select(LoadedMod::enabled);
|
||||
|
||||
var mapping = enabled.asMap(m -> m.meta.name);
|
||||
lastOrderedMods = resolveDependencies(enabled.map(m -> m.meta)).orderedKeys().map(mapping::get);
|
||||
}
|
||||
return lastOrderedMods;
|
||||
}
|
||||
|
||||
public LoadedMod locateMod(String name){
|
||||
@@ -758,12 +785,12 @@ public class Mods implements Loadable{
|
||||
|
||||
/** Iterates through each mod with a main class. */
|
||||
public void eachClass(Cons<Mod> cons){
|
||||
mods.each(p -> p.main != null, p -> contextRun(p, () -> cons.get(p.main)));
|
||||
orderedMods().each(p -> p.main != null, p -> contextRun(p, () -> cons.get(p.main)));
|
||||
}
|
||||
|
||||
/** Iterates through each enabled mod. */
|
||||
public void eachEnabled(Cons<LoadedMod> cons){
|
||||
mods.each(LoadedMod::enabled, cons);
|
||||
orderedMods().each(LoadedMod::enabled, cons);
|
||||
}
|
||||
|
||||
public void contextRun(LoadedMod mod, Runnable run){
|
||||
@@ -793,78 +820,71 @@ public class Mods implements Loadable{
|
||||
return meta;
|
||||
}
|
||||
|
||||
/** Resolves the loading order of a list mods/plugins using their internal names.
|
||||
* It also skips non-mods files or folders. */
|
||||
public Seq<Fi> resolveDependencies(Seq<Fi> files){
|
||||
ObjectMap<String, Fi> fileMapping = new ObjectMap<>();
|
||||
ObjectMap<String, Seq<String>> dependencies = new ObjectMap<>();
|
||||
/** Resolves the loading order of a list mods/plugins using their internal names. */
|
||||
public OrderedMap<String, ModState> resolveDependencies(Seq<ModMeta> metas){
|
||||
var context = new ModResolutionContext();
|
||||
|
||||
for(Fi file : files){
|
||||
ModMeta meta = null;
|
||||
|
||||
try{
|
||||
Fi zip = file.isDirectory() ? file : new ZipFi(file);
|
||||
|
||||
if(zip.list().length == 1 && zip.list()[0].isDirectory()){
|
||||
zip = zip.list()[0];
|
||||
}
|
||||
|
||||
meta = findMeta(zip);
|
||||
}catch(Throwable ignored){
|
||||
for(var meta : metas){
|
||||
Seq<ModDependency> dependencies = new Seq<>();
|
||||
for(var dependency : meta.dependencies){
|
||||
dependencies.add(new ModDependency(dependency, true));
|
||||
}
|
||||
|
||||
if(meta == null || meta.name == null) continue;
|
||||
dependencies.put(meta.name, meta.dependencies);
|
||||
fileMapping.put(meta.name, file);
|
||||
}
|
||||
|
||||
ObjectSet<String> visited = new ObjectSet<>();
|
||||
OrderedSet<String> ordered = new OrderedSet<>();
|
||||
|
||||
for(String modName : dependencies.keys()){
|
||||
if(!ordered.contains(modName)){
|
||||
// Adds the loaded mods at the beginning of the list
|
||||
ordered.add(modName, 0);
|
||||
resolveDependencies(modName, dependencies, ordered, visited);
|
||||
visited.clear();
|
||||
for(var dependency : meta.softDependencies){
|
||||
dependencies.add(new ModDependency(dependency, false));
|
||||
}
|
||||
context.dependencies.put(meta.name, dependencies);
|
||||
}
|
||||
|
||||
// Adds the invalid mods
|
||||
for(String missingMod : dependencies.keys()){
|
||||
if(!ordered.contains(missingMod)) ordered.add(missingMod, 0);
|
||||
for(var key : context.dependencies.keys()){
|
||||
if (context.ordered.contains(key)) {
|
||||
continue;
|
||||
}
|
||||
resolve(key, context);
|
||||
context.visited.clear();
|
||||
}
|
||||
|
||||
Seq<Fi> resolved = ordered.orderedItems().map(fileMapping::get);
|
||||
// Since the resolver explores the dependencies from leaves to the root, reverse the seq
|
||||
resolved.reverse();
|
||||
return resolved;
|
||||
var result = new OrderedMap<String, ModState>();
|
||||
for(var name : context.ordered){
|
||||
result.put(name, ModState.enabled);
|
||||
}
|
||||
result.putAll(context.invalid);
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Recursive search of dependencies */
|
||||
public void resolveDependencies(String modName, ObjectMap<String, Seq<String>> dependencies, OrderedSet<String> ordered, ObjectSet<String> visited){
|
||||
visited.add(modName);
|
||||
|
||||
for(String dependency : dependencies.get(modName)){
|
||||
// Checks if the dependency tree isn't circular and that the dependency is not missing
|
||||
if(!visited.contains(dependency) && dependencies.containsKey(dependency)){
|
||||
// Skips if the dependency was already explored in a separate tree
|
||||
if(ordered.contains(dependency)) continue;
|
||||
ordered.add(dependency);
|
||||
resolveDependencies(dependency, dependencies, ordered, visited);
|
||||
private boolean resolve(String element, ModResolutionContext context){
|
||||
context.visited.add(element);
|
||||
for(final var dependency : context.dependencies.get(element)){
|
||||
// Circular dependencies ?
|
||||
if(context.visited.contains(dependency.name) && !context.ordered.contains(dependency.name)){
|
||||
context.invalid.put(dependency.name, ModState.circularDependencies);
|
||||
return false;
|
||||
// If dependency present, resolve it, or if it's not required, ignore it
|
||||
}else if(context.dependencies.containsKey(dependency.name)){
|
||||
if(!context.ordered.contains(dependency.name) && !resolve(dependency.name, context) && dependency.required){
|
||||
context.invalid.put(element, ModState.incompleteDependencies);
|
||||
return false;
|
||||
}
|
||||
// The dependency is missing, but if not required, skip
|
||||
}else if(dependency.required){
|
||||
context.invalid.put(element, ModState.missingDependencies);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(!context.ordered.contains(element)){
|
||||
context.ordered.add(element);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Loads a mod file+meta, but does not add it to the list.
|
||||
* Note that directories can be loaded as mods. */
|
||||
private LoadedMod loadMod(Fi sourceFile) throws Exception{
|
||||
return loadMod(sourceFile, false);
|
||||
return loadMod(sourceFile, false, true);
|
||||
}
|
||||
|
||||
/** Loads a mod file+meta, but does not add it to the list.
|
||||
* Note that directories can be loaded as mods. */
|
||||
private LoadedMod loadMod(Fi sourceFile, boolean overwrite) throws Exception{
|
||||
private LoadedMod loadMod(Fi sourceFile, boolean overwrite, boolean initialize) throws Exception{
|
||||
Time.mark();
|
||||
|
||||
ZipFi rootZip = null;
|
||||
@@ -930,7 +950,8 @@ public class Mods implements Loadable{
|
||||
!skipModLoading() &&
|
||||
Core.settings.getBool("mod-" + baseName + "-enabled", true) &&
|
||||
Version.isAtLeast(meta.minGameVersion) &&
|
||||
(meta.getMinMajor() >= 136 || headless)
|
||||
(meta.getMinMajor() >= 136 || headless) &&
|
||||
initialize
|
||||
){
|
||||
if(ios){
|
||||
throw new ModLoadException("Java class mods are not supported on iOS.");
|
||||
@@ -1152,6 +1173,7 @@ public class Mods implements Loadable{
|
||||
public String name, minGameVersion = "0";
|
||||
public @Nullable String displayName, author, description, subtitle, version, main, repo;
|
||||
public Seq<String> dependencies = Seq.with();
|
||||
public Seq<String> softDependencies = Seq.with();
|
||||
/** Hidden mods are only server-side or client-side, and do not support adding new content. */
|
||||
public boolean hidden;
|
||||
/** If true, this mod should be loaded as a Java class mod. This is technically optional, but highly recommended. */
|
||||
@@ -1173,6 +1195,7 @@ public class Mods implements Loadable{
|
||||
|
||||
//removes all colors
|
||||
public void cleanup(){
|
||||
if(name != null) name = Strings.stripColors(name);
|
||||
if(displayName != null) displayName = Strings.stripColors(displayName);
|
||||
if(author != null) author = Strings.stripColors(author);
|
||||
if(description != null) description = Strings.stripColors(description);
|
||||
@@ -1184,19 +1207,27 @@ public class Mods implements Loadable{
|
||||
int dot = ver.indexOf(".");
|
||||
return dot != -1 ? Strings.parseInt(ver.substring(0, dot), 0) : Strings.parseInt(ver, 0);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString(){
|
||||
return "ModMeta{" +
|
||||
"name='" + name + '\'' +
|
||||
", author='" + author + '\'' +
|
||||
", version='" + version + '\'' +
|
||||
", main='" + main + '\'' +
|
||||
", minGameVersion='" + minGameVersion + '\'' +
|
||||
", hidden=" + hidden +
|
||||
", repo=" + repo +
|
||||
", texturescale=" + texturescale +
|
||||
'}';
|
||||
"name='" + name + '\'' +
|
||||
", minGameVersion='" + minGameVersion + '\'' +
|
||||
", displayName='" + displayName + '\'' +
|
||||
", author='" + author + '\'' +
|
||||
", description='" + description + '\'' +
|
||||
", subtitle='" + subtitle + '\'' +
|
||||
", version='" + version + '\'' +
|
||||
", main='" + main + '\'' +
|
||||
", repo='" + repo + '\'' +
|
||||
", dependencies=" + dependencies +
|
||||
", softDependencies=" + softDependencies +
|
||||
", hidden=" + hidden +
|
||||
", java=" + java +
|
||||
", keepOutlines=" + keepOutlines +
|
||||
", texturescale=" + texturescale +
|
||||
", pregenerated=" + pregenerated +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1210,7 +1241,26 @@ public class Mods implements Loadable{
|
||||
enabled,
|
||||
contentErrors,
|
||||
missingDependencies,
|
||||
incompleteDependencies,
|
||||
circularDependencies,
|
||||
unsupported,
|
||||
disabled,
|
||||
}
|
||||
|
||||
public static class ModResolutionContext {
|
||||
public final ObjectMap<String, Seq<ModDependency>> dependencies = new ObjectMap<>();
|
||||
public final ObjectSet<String> visited = new ObjectSet<>();
|
||||
public final OrderedSet<String> ordered = new OrderedSet<>();
|
||||
public final ObjectMap<String, ModState> invalid = new OrderedMap<>();
|
||||
}
|
||||
|
||||
public static final class ModDependency{
|
||||
public final String name;
|
||||
public final boolean required;
|
||||
|
||||
public ModDependency(String name, boolean required){
|
||||
this.name = name;
|
||||
this.required = required;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ public class Administration{
|
||||
public ObjectSet<String> dosBlacklist = new ObjectSet<>();
|
||||
public ObjectMap<String, Long> kickedIPs = new ObjectMap<>();
|
||||
|
||||
|
||||
private boolean modified, loaded;
|
||||
/** All player info. Maps UUIDs to info. This persists throughout restarts. Do not access directly. */
|
||||
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
|
||||
|
||||
@@ -48,8 +50,8 @@ public class Administration{
|
||||
player.getInfo().messageInfractions = 0;
|
||||
}
|
||||
|
||||
//prevent players from sending the same message twice in the span of 50 seconds
|
||||
if(message.equals(player.getInfo().lastSentMessage) && Time.timeSinceMillis(player.getInfo().lastMessageTime) < 1000 * 50){
|
||||
//prevent players from sending the same message twice in the span of 10 seconds
|
||||
if(message.equals(player.getInfo().lastSentMessage) && Time.timeSinceMillis(player.getInfo().lastMessageTime) < 1000 * 10){
|
||||
player.sendMessage("[scarlet]You may not send the same message twice.");
|
||||
return null;
|
||||
}
|
||||
@@ -448,16 +450,26 @@ public class Administration{
|
||||
}
|
||||
|
||||
public void save(){
|
||||
Core.settings.putJson("player-data", playerInfo);
|
||||
Core.settings.putJson("ip-bans", String.class, bannedIPs);
|
||||
Core.settings.putJson("whitelist-ids", String.class, whitelist);
|
||||
Core.settings.putJson("banned-subnets", String.class, subnetBans);
|
||||
modified = true;
|
||||
}
|
||||
|
||||
public void forceSave(){
|
||||
if(modified && loaded){
|
||||
Core.settings.putJson("player-data", playerInfo);
|
||||
Core.settings.putJson("ip-kicks", kickedIPs);
|
||||
Core.settings.putJson("ip-bans", String.class, bannedIPs);
|
||||
Core.settings.putJson("whitelist-ids", String.class, whitelist);
|
||||
Core.settings.putJson("banned-subnets", String.class, subnetBans);
|
||||
modified = false;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void load(){
|
||||
loaded = true;
|
||||
//load default data
|
||||
playerInfo = Core.settings.getJson("player-data", ObjectMap.class, ObjectMap::new);
|
||||
kickedIPs = Core.settings.getJson("ip-kicks", ObjectMap.class, ObjectMap::new);
|
||||
bannedIPs = Core.settings.getJson("ip-bans", Seq.class, Seq::new);
|
||||
whitelist = Core.settings.getJson("whitelist-ids", Seq.class, Seq::new);
|
||||
subnetBans = Core.settings.getJson("banned-subnets", Seq.class, Seq::new);
|
||||
@@ -488,7 +500,7 @@ public class Administration{
|
||||
messageRateLimit = new Config("messageRateLimit", "Message rate limit in seconds. 0 to disable.", 0),
|
||||
messageSpamKick = new Config("messageSpamKick", "How many times a player must send a message before the cooldown to get kicked. 0 to disable.", 3),
|
||||
packetSpamLimit = new Config("packetSpamLimit", "Limit for packet count sent within 3sec that will lead to a blacklist + kick.", 300),
|
||||
chatSpamLimit = new Config("packetSpamLimit", "Limit for chat packet count sent within 2sec that will lead to a blacklist + kick. Not the same as a rate limit.", 20),
|
||||
chatSpamLimit = new Config("chatSpamLimit", "Limit for chat packet count sent within 2sec that will lead to a blacklist + kick. Not the same as a rate limit.", 20),
|
||||
socketInput = new Config("socketInput", "Allows a local application to control this server through a local TCP socket.", false, "socket", () -> Events.fire(Trigger.socketConfigChanged)),
|
||||
socketInputPort = new Config("socketInputPort", "The port for socket input.", 6859, () -> Events.fire(Trigger.socketConfigChanged)),
|
||||
socketInputAddress = new Config("socketInputAddress", "The bind address for socket input.", "localhost", () -> Events.fire(Trigger.socketConfigChanged)),
|
||||
|
||||
@@ -261,7 +261,7 @@ public class ArcNetProvider implements NetProvider{
|
||||
}
|
||||
ByteBuffer buffer = ByteBuffer.wrap(packet.getData());
|
||||
Host host = NetworkIO.readServerData((int)Time.timeSinceMillis(time), packet.getAddress().getHostAddress(), buffer);
|
||||
callback.get(host);
|
||||
Core.app.post(() -> callback.get(host));
|
||||
foundAddresses.add(packet.getAddress());
|
||||
}catch(Exception e){
|
||||
//don't crash when there's an error pinging a server or parsing data
|
||||
|
||||
@@ -5,6 +5,7 @@ import arc.func.*;
|
||||
import arc.net.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.gen.*;
|
||||
import mindustry.net.Packets.*;
|
||||
import mindustry.net.Streamable.*;
|
||||
@@ -154,6 +155,7 @@ public class Net{
|
||||
public void connect(String ip, int port, Runnable success){
|
||||
try{
|
||||
if(!active){
|
||||
Events.fire(new ClientServerConnectEvent(ip, port));
|
||||
provider.connectClient(ip, port, success);
|
||||
active = true;
|
||||
server = false;
|
||||
|
||||
@@ -805,6 +805,10 @@ public class UnitType extends UnlockableContent{
|
||||
|
||||
cmds.add(UnitCommand.moveCommand);
|
||||
|
||||
if(canBoost){
|
||||
cmds.add(UnitCommand.boostCommand);
|
||||
}
|
||||
|
||||
//healing, mining and building is only supported for flying units; pathfinding to ambiguously reachable locations is hard.
|
||||
if(flying){
|
||||
if(canHeal){
|
||||
|
||||
@@ -599,6 +599,7 @@ public class JoinDialog extends BaseDialog{
|
||||
});
|
||||
//modify default servers on main thread
|
||||
Core.app.post(() -> {
|
||||
servers.sort(s -> s.name == null ? Integer.MAX_VALUE : s.name.hashCode());
|
||||
defaultServers.addAll(servers);
|
||||
Log.info("Fetched @ community servers.", defaultServers.size);
|
||||
});
|
||||
|
||||
@@ -227,13 +227,11 @@ public class MapsDialog extends BaseDialog{
|
||||
t.button("@custom", Styles.flatTogglet, () -> {
|
||||
showCustom = !showCustom;
|
||||
Core.settings.put("editorshowcustommaps", showCustom);
|
||||
Core.settings.forceSave();
|
||||
rebuildMaps();
|
||||
}).size(150f, 60f).checked(showCustom);
|
||||
t.button("@builtin", Styles.flatTogglet, () -> {
|
||||
showBuiltIn = !showBuiltIn;
|
||||
Core.settings.put("editorshowbuiltinmaps", showBuiltIn);
|
||||
Core.settings.forceSave();
|
||||
rebuildMaps();
|
||||
}).size(150f, 60f).checked(showBuiltIn);
|
||||
}).padBottom(10f);
|
||||
@@ -244,13 +242,11 @@ public class MapsDialog extends BaseDialog{
|
||||
t.button("@editor.filters.author", Styles.flatTogglet, () -> {
|
||||
searchAuthor = !searchAuthor;
|
||||
Core.settings.put("editorsearchauthor", searchAuthor);
|
||||
Core.settings.forceSave();
|
||||
rebuildMaps();
|
||||
}).size(150f, 60f).checked(searchAuthor);
|
||||
t.button("@editor.filters.description", Styles.flatTogglet, () -> {
|
||||
searchDescription = !searchDescription;
|
||||
Core.settings.put("editorsearchdescription", searchDescription);
|
||||
Core.settings.forceSave();
|
||||
rebuildMaps();
|
||||
}).size(150f, 60f).checked(searchDescription);
|
||||
});
|
||||
|
||||
@@ -329,6 +329,10 @@ public class ModsDialog extends BaseDialog{
|
||||
return "@mod.blacklisted";
|
||||
}else if(!item.isSupported()){
|
||||
return "@mod.incompatiblegame";
|
||||
}else if(item.state == ModState.circularDependencies){
|
||||
return "@mod.circulardependencies";
|
||||
}else if(item.state == ModState.incompleteDependencies){
|
||||
return "@mod.incompletedependencies";
|
||||
}else if(item.hasUnmetDependencies()){
|
||||
return "@mod.unmetdependencies";
|
||||
}else if(item.hasContentErrors()){
|
||||
@@ -346,6 +350,10 @@ public class ModsDialog extends BaseDialog{
|
||||
return "@mod.blacklisted.details";
|
||||
}else if(!item.isSupported()){
|
||||
return Core.bundle.format("mod.requiresversion.details", item.meta.minGameVersion);
|
||||
}else if(item.state == ModState.circularDependencies){
|
||||
return "@mod.circulardependencies.details";
|
||||
}else if(item.state == ModState.incompleteDependencies){
|
||||
return Core.bundle.format("mod.incompletedependencies.details", item.missingDependencies.toString(", "));
|
||||
}else if(item.hasUnmetDependencies()){
|
||||
return Core.bundle.format("mod.missingdependencies.details", item.missingDependencies.toString(", "));
|
||||
}else if(item.hasContentErrors()){
|
||||
@@ -407,7 +415,7 @@ public class ModsDialog extends BaseDialog{
|
||||
|
||||
}).width(400f);
|
||||
|
||||
Seq<UnlockableContent> all = Seq.with(content.getContentMap()).<Content>flatten().select(c -> c.minfo.mod == mod && c instanceof UnlockableContent).as();
|
||||
Seq<UnlockableContent> all = Seq.with(content.getContentMap()).<Content>flatten().select(c -> c.minfo.mod == mod && c instanceof UnlockableContent u && !u.isHidden()).as();
|
||||
if(all.any()){
|
||||
dialog.cont.row();
|
||||
dialog.cont.button("@mods.viewcontent", Icon.book, () -> {
|
||||
@@ -636,7 +644,11 @@ public class ModsDialog extends BaseDialog{
|
||||
Core.app.post(() -> modError(t));
|
||||
}
|
||||
|
||||
private void githubImportMod(String repo, boolean isJava, @Nullable String release){
|
||||
public void githubImportMod(String repo, boolean isJava){
|
||||
githubImportMod(repo, isJava, null);
|
||||
}
|
||||
|
||||
public void githubImportMod(String repo, boolean isJava, @Nullable String release){
|
||||
modImportProgress = 0f;
|
||||
ui.loadfrag.show("@downloading");
|
||||
ui.loadfrag.setProgress(() -> modImportProgress);
|
||||
|
||||
@@ -177,6 +177,15 @@ public class ResearchDialog extends BaseDialog{
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Dialog show(){
|
||||
if(net.client()){
|
||||
ui.showInfo("@research.multiplayer");
|
||||
return this;
|
||||
}
|
||||
return show(Core.scene);
|
||||
}
|
||||
|
||||
void checkMargin(){
|
||||
if(Core.graphics.isPortrait() && showTechSelect){
|
||||
itemDisplay.marginTop(60f);
|
||||
|
||||
@@ -115,11 +115,14 @@ public class MinimapFragment{
|
||||
}
|
||||
|
||||
public void toggle(){
|
||||
float size = baseSize * zoom * world.width();
|
||||
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
|
||||
float px = player.dead() ? Core.camera.position.x : player.x, py = player.dead() ? Core.camera.position.y : player.y;
|
||||
panx = (size/2f - px / (world.width() * tilesize) * size) / zoom;
|
||||
pany = (size*ratio/2f - py / (world.height() * tilesize) * size*ratio) / zoom;
|
||||
if(renderer.minimap.getTexture() != null){
|
||||
float size = baseSize * zoom * world.width();
|
||||
float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width;
|
||||
float px = player.dead() ? Core.camera.position.x : player.x, py = player.dead() ? Core.camera.position.y : player.y;
|
||||
panx = (size/2f - px / (world.width() * tilesize) * size) / zoom;
|
||||
pany = (size*ratio/2f - py / (world.height() * tilesize) * size*ratio) / zoom;
|
||||
}
|
||||
|
||||
shown = !shown;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,7 +514,7 @@ public class PlacementFragment{
|
||||
//find the command that all units have, or null if they do not share one
|
||||
for(var unit : control.input.selectedUnits){
|
||||
if(unit.isCommandable()){
|
||||
var nextCommand = unit.command().currentCommand();
|
||||
var nextCommand = unit.command().command;
|
||||
|
||||
if(hadCommand){
|
||||
if(shareCommand != nextCommand){
|
||||
|
||||
@@ -51,6 +51,8 @@ public class Block extends UnlockableContent implements Senseable{
|
||||
public boolean consumesPower = true;
|
||||
/** If true, this block is a generator that can produce power. */
|
||||
public boolean outputsPower = false;
|
||||
/** If false, power nodes cannot connect to this block. */
|
||||
public boolean connectedPower = true;
|
||||
/** If true, this block can conduct power like a cable. */
|
||||
public boolean conductivePower = false;
|
||||
/** If true, this block can output payloads; affects blending. */
|
||||
@@ -413,7 +415,7 @@ public class Block extends UnlockableContent implements Senseable{
|
||||
}
|
||||
|
||||
public void drawPotentialLinks(int x, int y){
|
||||
if((consumesPower || outputsPower) && hasPower){
|
||||
if((consumesPower || outputsPower) && hasPower && connectedPower){
|
||||
Tile tile = world.tile(x, y);
|
||||
if(tile != null){
|
||||
PowerNode.getNodeLinks(tile, this, player.team(), other -> {
|
||||
@@ -1324,6 +1326,7 @@ public class Block extends UnlockableContent implements Senseable{
|
||||
|
||||
editorBase = new PixmapRegion(base);
|
||||
}else{
|
||||
if(gen[0] != null) packer.add(PageType.main, "block-" + name + "-full", Core.atlas.getPixmap(gen[0]));
|
||||
editorBase = gen[0] == null ? Core.atlas.getPixmap(fullIcon) : Core.atlas.getPixmap(gen[0]);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ public class Build{
|
||||
tile.build.lastAccessed = unit.getControllerName();
|
||||
}
|
||||
|
||||
Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, unit, true)));
|
||||
Events.fire(new BlockBuildBeginEvent(tile, team, unit, true));
|
||||
}
|
||||
|
||||
/** Places a ConstructBlock at this location. */
|
||||
@@ -115,7 +115,7 @@ public class Build{
|
||||
|
||||
result.placeBegan(tile, previous);
|
||||
|
||||
Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, unit, false)));
|
||||
Events.fire(new BlockBuildBeginEvent(tile, team, unit, false));
|
||||
}
|
||||
|
||||
/** Returns whether a tile can be placed at this location by this team. */
|
||||
|
||||
@@ -105,7 +105,9 @@ public class BuildTurret extends BaseTurret{
|
||||
unit.lookAt(angleTo(unit.buildPlan()));
|
||||
}
|
||||
|
||||
checkSuppression();
|
||||
if(checkSuppression()){
|
||||
efficiency = potentialEfficiency = 0f;
|
||||
}
|
||||
|
||||
unit.buildSpeedMultiplier(potentialEfficiency * timeScale);
|
||||
unit.speedMultiplier(potentialEfficiency * timeScale);
|
||||
|
||||
@@ -19,7 +19,7 @@ import mindustry.world.meta.*;
|
||||
import static mindustry.Vars.*;
|
||||
|
||||
public class ItemTurret extends Turret{
|
||||
public ObjectMap<Item, BulletType> ammoTypes = new ObjectMap<>();
|
||||
public ObjectMap<Item, BulletType> ammoTypes = new OrderedMap<>();
|
||||
|
||||
public ItemTurret(String name){
|
||||
super(name);
|
||||
@@ -51,6 +51,19 @@ public class ItemTurret extends Turret{
|
||||
stats.add(Stat.ammo, StatValues.ammo(ammoTypes));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setBars(){
|
||||
super.setBars();
|
||||
|
||||
addBar("ammo", (ItemTurretBuild entity) ->
|
||||
new Bar(
|
||||
"stat.ammo",
|
||||
Pal.ammo,
|
||||
() -> (float)entity.totalAmmo / maxAmmo
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(){
|
||||
consume(new ConsumeItemFilter(i -> ammoTypes.containsKey(i)){
|
||||
@@ -88,8 +101,8 @@ public class ItemTurret extends Turret{
|
||||
super.onProximityAdded();
|
||||
|
||||
//add first ammo item to cheaty blocks so they can shoot properly
|
||||
if(cheating() && ammo.size > 0){
|
||||
handleItem(this, ammoTypes.entries().next().key);
|
||||
if(!hasAmmo() && cheating() && ammoTypes.size > 0){
|
||||
handleItem(this, ammoTypes.keys().next());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,14 +113,6 @@ public class ItemTurret extends Turret{
|
||||
super.updateTile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void displayBars(Table bars){
|
||||
super.displayBars(bars);
|
||||
|
||||
bars.add(new Bar("stat.ammo", Pal.ammo, () -> (float)totalAmmo / maxAmmo)).growX();
|
||||
bars.row();
|
||||
}
|
||||
|
||||
@Override
|
||||
public int acceptStack(Item item, int amount, Teamc source){
|
||||
BulletType type = ammoTypes.get(item);
|
||||
|
||||
@@ -470,7 +470,7 @@ public class Turret extends ReloadTurret{
|
||||
@Override
|
||||
public void updateEfficiencyMultiplier(){
|
||||
if(heatRequirement > 0){
|
||||
efficiency *= Math.min(heatReq / heatRequirement, maxHeatEfficiency);
|
||||
efficiency *= Math.min(Math.max(heatReq / heatRequirement, cheating() ? 1f : 0f), maxHeatEfficiency);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -500,7 +500,8 @@ public class Turret extends ReloadTurret{
|
||||
if(ammo.size >= 2 && ammo.peek().amount < ammoPerShot && ammo.get(ammo.size - 2).amount >= ammoPerShot){
|
||||
ammo.swap(ammo.size - 1, ammo.size - 2);
|
||||
}
|
||||
return ammo.size > 0 && ammo.peek().amount >= ammoPerShot;
|
||||
|
||||
return ammo.size > 0 && (ammo.peek().amount >= ammoPerShot || cheating());
|
||||
}
|
||||
|
||||
public boolean charging(){
|
||||
|
||||
@@ -179,7 +179,7 @@ public class BeamNode extends PowerBlock{
|
||||
}
|
||||
|
||||
//power nodes do NOT play nice with beam nodes, do not touch them as that forcefully modifies their links
|
||||
if(other != null && other.block.hasPower && other.team == team && !(other.block instanceof PowerNode)){
|
||||
if(other != null && other.block.hasPower && other.block.connectedPower && other.team == team && !(other.block instanceof PowerNode)){
|
||||
links[i] = other;
|
||||
dests[i] = world.tile(tile.x + j * dir.x, tile.y + j * dir.y);
|
||||
break;
|
||||
|
||||
@@ -210,7 +210,7 @@ public class PowerNode extends PowerBlock{
|
||||
protected void getPotentialLinks(Tile tile, Team team, Cons<Building> others){
|
||||
if(!autolink) return;
|
||||
|
||||
Boolf<Building> valid = other -> other != null && other.tile() != tile && other.power != null &&
|
||||
Boolf<Building> valid = other -> other != null && other.tile() != tile && other.block.connectedPower && other.power != null &&
|
||||
(other.block.outputsPower || other.block.consumesPower || other.block instanceof PowerNode) &&
|
||||
overlaps(tile.x * tilesize + offset, tile.y * tilesize + offset, other.tile(), laserRange * tilesize) && other.team == team &&
|
||||
!graphs.contains(other.power.graph) &&
|
||||
@@ -342,7 +342,7 @@ public class PowerNode extends PowerBlock{
|
||||
}
|
||||
|
||||
public boolean linkValid(Building tile, Building link, boolean checkMaxNodes){
|
||||
if(tile == link || link == null || !link.block.hasPower || tile.team != link.team) return false;
|
||||
if(tile == link || link == null || !link.block.hasPower || !link.block.connectedPower || tile.team != link.team) return false;
|
||||
|
||||
if(overlaps(tile, link, laserRange * tilesize) || (link.block instanceof PowerNode node && overlaps(link, tile, node.laserRange * tilesize))){
|
||||
if(checkMaxNodes && link.block instanceof PowerNode node){
|
||||
|
||||
@@ -61,7 +61,9 @@ public class GenericCrafter extends Block{
|
||||
public void setStats(){
|
||||
stats.timePeriod = craftTime;
|
||||
super.setStats();
|
||||
stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds);
|
||||
if((hasItems && itemCapacity > 0) || outputItems != null){
|
||||
stats.add(Stat.productionTime, craftTime / 60f, StatUnit.seconds);
|
||||
}
|
||||
|
||||
if(outputItems != null){
|
||||
stats.add(Stat.output, StatValues.items(craftTime, outputItems));
|
||||
|
||||
@@ -26,7 +26,7 @@ public class HeatCrafter extends GenericCrafter{
|
||||
|
||||
addBar("heat", (HeatCrafterBuild entity) ->
|
||||
new Bar(() ->
|
||||
Core.bundle.format("bar.heatpercent", (int)(entity.heat + 0.00001f), (int)(entity.efficiencyScale() * 100 + 0.0001f)),
|
||||
Core.bundle.format("bar.heatpercent", (int)(entity.heat + 0.01f), (int)(entity.efficiencyScale() * 100 + 0.01f)),
|
||||
() -> Pal.lightOrange,
|
||||
() -> entity.heat / heatRequirement));
|
||||
}
|
||||
|
||||
@@ -2,15 +2,18 @@ package mindustry.world.blocks.storage;
|
||||
|
||||
import arc.*;
|
||||
import arc.func.*;
|
||||
import arc.graphics.*;
|
||||
import arc.graphics.g2d.*;
|
||||
import arc.math.*;
|
||||
import arc.math.geom.*;
|
||||
import arc.scene.ui.layout.*;
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
import mindustry.*;
|
||||
import mindustry.annotations.Annotations.*;
|
||||
import mindustry.content.*;
|
||||
import mindustry.core.*;
|
||||
import mindustry.ctype.*;
|
||||
import mindustry.entities.*;
|
||||
import mindustry.game.EventType.*;
|
||||
import mindustry.game.*;
|
||||
@@ -28,6 +31,7 @@ import static mindustry.Vars.*;
|
||||
public class CoreBlock extends StorageBlock{
|
||||
//hacky way to pass item modules between methods
|
||||
private static ItemModule nextItems;
|
||||
protected static final float[] thrusterSizes = {0f, 0f, 0f, 0f, 0.3f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 1f, 0f};
|
||||
|
||||
public @Load(value = "@-thruster1", fallback = "clear-effect") TextureRegion thruster1; //top right
|
||||
public @Load(value = "@-thruster2", fallback = "clear-effect") TextureRegion thruster2; //bot left
|
||||
@@ -100,7 +104,7 @@ public class CoreBlock extends StorageBlock{
|
||||
addBar("capacity", (CoreBuild e) -> new Bar(
|
||||
() -> Core.bundle.format("bar.capacity", UI.formatAmount(e.storageCapacity)),
|
||||
() -> Pal.items,
|
||||
() -> e.items.total() / ((float)e.storageCapacity * content.items().count(i -> i.unlockedNow()))
|
||||
() -> e.items.total() / ((float)e.storageCapacity * content.items().count(UnlockableContent::unlockedNow))
|
||||
));
|
||||
}
|
||||
|
||||
@@ -196,6 +200,95 @@ public class CoreBlock extends StorageBlock{
|
||||
}
|
||||
}
|
||||
|
||||
public void drawLanding(CoreBuild build, float x, float y){
|
||||
float fout = renderer.getLandTime() / coreLandDuration;
|
||||
|
||||
if(renderer.isLaunching()) fout = 1f - fout;
|
||||
|
||||
float fin = 1f - fout;
|
||||
|
||||
float scl = Scl.scl(4f) / renderer.getDisplayScale();
|
||||
float shake = 0f;
|
||||
float s = region.width * region.scl() * scl * 3.6f * Interp.pow2Out.apply(fout);
|
||||
float rotation = Interp.pow2In.apply(fout) * 135f;
|
||||
x += Mathf.range(shake);
|
||||
y += Mathf.range(shake);
|
||||
float thrustOpen = 0.25f;
|
||||
float thrusterFrame = fin >= thrustOpen ? 1f : fin / thrustOpen;
|
||||
float thrusterSize = Mathf.sample(thrusterSizes, fin);
|
||||
|
||||
//when launching, thrusters stay out the entire time.
|
||||
if(renderer.isLaunching()){
|
||||
Interp i = Interp.pow2Out;
|
||||
thrusterFrame = i.apply(Mathf.clamp(fout*13f));
|
||||
thrusterSize = i.apply(Mathf.clamp(fout*9f));
|
||||
}
|
||||
|
||||
Draw.color(Pal.lightTrail);
|
||||
//TODO spikier heat
|
||||
Draw.rect("circle-shadow", x, y, s, s);
|
||||
|
||||
Draw.scl(scl);
|
||||
|
||||
//draw thruster flame
|
||||
float strength = (1f + (size - 3)/2.5f) * scl * thrusterSize * (0.95f + Mathf.absin(2f, 0.1f));
|
||||
float offset = (size - 3) * 3f * scl;
|
||||
|
||||
for(int i = 0; i < 4; i++){
|
||||
Tmp.v1.trns(i * 90 + rotation, 1f);
|
||||
|
||||
Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*2f + offset);
|
||||
Draw.color(build.team.color);
|
||||
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 6f * strength);
|
||||
|
||||
Tmp.v1.setLength((size * tilesize/2f + 1f)*scl + strength*0.5f + offset);
|
||||
Draw.color(Color.white);
|
||||
Fill.circle(Tmp.v1.x + x, Tmp.v1.y + y, 3.5f * strength);
|
||||
}
|
||||
|
||||
drawLandingThrusters(x, y, rotation, thrusterFrame);
|
||||
|
||||
Drawf.spinSprite(region, x, y, rotation);
|
||||
|
||||
Draw.alpha(Interp.pow4In.apply(thrusterFrame));
|
||||
drawLandingThrusters(x, y, rotation, thrusterFrame);
|
||||
Draw.alpha(1f);
|
||||
|
||||
if(teamRegions[build.team.id] == teamRegion) Draw.color(build.team.color);
|
||||
|
||||
Drawf.spinSprite(teamRegions[build.team.id], x, y, rotation);
|
||||
|
||||
Draw.color();
|
||||
Draw.scl();
|
||||
Draw.reset();
|
||||
}
|
||||
|
||||
protected void drawLandingThrusters(float x, float y, float rotation, float frame){
|
||||
float length = thrusterLength * (frame - 1f) - 1f/4f;
|
||||
float alpha = Draw.getColor().a;
|
||||
|
||||
//two passes for consistent lighting
|
||||
for(int j = 0; j < 2; j++){
|
||||
for(int i = 0; i < 4; i++){
|
||||
var reg = i >= 2 ? thruster2 : thruster1;
|
||||
float rot = (i * 90) + rotation % 90f;
|
||||
Tmp.v1.trns(rot, length * Draw.xscl);
|
||||
|
||||
//second pass applies extra layer of shading
|
||||
if(j == 1){
|
||||
Tmp.v1.rotate(-90f);
|
||||
Draw.alpha((rotation % 90f) / 90f * alpha);
|
||||
rot -= 90f;
|
||||
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
|
||||
}else{
|
||||
Draw.alpha(alpha);
|
||||
Draw.rect(reg, x + Tmp.v1.x, y + Tmp.v1.y, rot);
|
||||
}
|
||||
}
|
||||
}
|
||||
Draw.alpha(1f);
|
||||
}
|
||||
|
||||
public class CoreBuild extends Building{
|
||||
public int storageCapacity;
|
||||
public boolean noEffect = false;
|
||||
@@ -294,6 +387,22 @@ public class CoreBlock extends StorageBlock{
|
||||
thrusterTime -= Time.delta/90f;
|
||||
}
|
||||
|
||||
public void updateLandParticles(){
|
||||
float time = renderer.isLaunching() ? coreLandDuration - renderer.getLandTime() : renderer.getLandTime();
|
||||
float tsize = Mathf.sample(thrusterSizes, (time + 35f) / coreLandDuration);
|
||||
|
||||
renderer.setLandPTimer(renderer.getLandPTimer() + tsize * Time.delta);
|
||||
if(renderer.getLandTime() >= 1f){
|
||||
tile.getLinkedTiles(t -> {
|
||||
if(Mathf.chance(0.4f)){
|
||||
Fx.coreLandDust.at(t.worldx(), t.worldy(), angleTo(t) + Mathf.range(30f), Tmp.c1.set(t.floor().mapColor).mul(1.5f + Mathf.range(0.15f)));
|
||||
}
|
||||
});
|
||||
|
||||
renderer.setLandPTimer(0f);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canPickup(){
|
||||
//cores can never be picked up
|
||||
|
||||
@@ -209,7 +209,7 @@ public class RepairTurret extends Block{
|
||||
|
||||
@Override
|
||||
public BlockStatus status(){
|
||||
return Mathf.equal(efficiency, 0f, 0.01f) ? BlockStatus.noInput : super.status();
|
||||
return Mathf.equal(potentialEfficiency, 0f, 0.01f) ? BlockStatus.noInput : super.status();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -479,6 +479,8 @@ public class UnitAssembler extends PayloadBlock{
|
||||
|
||||
Draw.rect(topRegion, x, y);
|
||||
|
||||
if(isPayload()) return;
|
||||
|
||||
//draw drone construction
|
||||
if(droneWarmup > 0.001f){
|
||||
Draw.draw(Layer.blockOver + 0.2f, () -> {
|
||||
@@ -592,7 +594,7 @@ public class UnitAssembler extends PayloadBlock{
|
||||
public boolean acceptPayload(Building source, Payload payload){
|
||||
var plan = plan();
|
||||
return (this.payload == null || source instanceof UnitAssemblerModuleBuild) &&
|
||||
plan.requirements.contains(b -> b.item == payload.content() && blocks.get(payload.content()) < b.amount);
|
||||
plan.requirements.contains(b -> b.item == payload.content() && blocks.get(payload.content()) < Mathf.round(b.amount * team.rules().unitCostMultiplier));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,83 +1,26 @@
|
||||
package mindustry.world.meta;
|
||||
|
||||
import arc.struct.*;
|
||||
import arc.util.*;
|
||||
|
||||
/** Environmental flags for different types of locations. */
|
||||
public class Env{
|
||||
public static final int
|
||||
//is on a planet
|
||||
terrestrial,
|
||||
terrestrial = 1,
|
||||
//is in space, no atmosphere
|
||||
space,
|
||||
space = 1 << 1,
|
||||
//is underwater, on a planet
|
||||
underwater,
|
||||
underwater = 1 << 2,
|
||||
//has a spores
|
||||
spores,
|
||||
spores = 1 << 3,
|
||||
//has a scorching env effect
|
||||
scorching,
|
||||
scorching = 1 << 4,
|
||||
//has oil reservoirs
|
||||
groundOil,
|
||||
groundOil = 1 << 5,
|
||||
//has water reservoirs
|
||||
groundWater,
|
||||
groundWater = 1 << 6,
|
||||
//has oxygen in the atmosphere
|
||||
oxygen,
|
||||
oxygen = 1 << 7,
|
||||
//all attributes combined, only used for bitmasking purposes
|
||||
any = 0xffffffff,
|
||||
//no attributes (0)
|
||||
none = 0;
|
||||
|
||||
//do NOT modify directly!
|
||||
public static final ObjectIntMap<String> nameToId;
|
||||
public static final IntMap<String> idToName;
|
||||
|
||||
static{
|
||||
//last time i didn't use a static initializer i got a null pointer.
|
||||
//i can probably just move the fields around, but i don't trust java enough for that
|
||||
nameToId = new ObjectIntMap<>();
|
||||
idToName = new IntMap<>();
|
||||
|
||||
terrestrial = add("terrestrial");
|
||||
space = add("space");
|
||||
underwater = add("underwater");
|
||||
spores = add("spores");
|
||||
scorching = add("scorching");
|
||||
groundOil = add("groundOil");
|
||||
groundWater = add("groundWater");
|
||||
oxygen = add("oxygen");
|
||||
}
|
||||
|
||||
public static int add(String key){
|
||||
if(nameToId.containsKey(key)) throw new IllegalArgumentException("'" + key + "' env already exists.");
|
||||
if(nameToId.size >= 32) throw new IllegalStateException("Max env count 32 exceeded.");
|
||||
|
||||
int id = 1 << nameToId.size;
|
||||
nameToId.put(key, id);
|
||||
idToName.put(id, key);
|
||||
return id;
|
||||
}
|
||||
|
||||
public static int remap(int mask, IntMap<String> idToName){
|
||||
int out = 0;
|
||||
for(int i = 0; i < 32; i++){
|
||||
int key = 1 << i;
|
||||
if((mask & key) == key){
|
||||
String name = idToName.get(key);
|
||||
if(name == null){
|
||||
//if it's unmapped it's probably just some mods using constant value
|
||||
out |= key;
|
||||
continue;
|
||||
}
|
||||
|
||||
int id = nameToId.get(name, -1);
|
||||
if(id == -1){
|
||||
Log.warn("Ignoring '@' env key.", name);
|
||||
}else{
|
||||
out |= id;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,15 +41,22 @@ public class DesktopLauncher extends ClientLauncher{
|
||||
maximized = true;
|
||||
width = 900;
|
||||
height = 700;
|
||||
//enable gl3 with command-line argument (slower performance, apparently)
|
||||
if(Structs.contains(arg, "-gl3")){
|
||||
gl30 = true;
|
||||
}
|
||||
if(Structs.contains(arg, "-antialias")){
|
||||
samples = 16;
|
||||
}
|
||||
if(Structs.contains(arg, "-debug")){
|
||||
Log.level = LogLevel.debug;
|
||||
for(int i = 0; i < arg.length; i++){
|
||||
if(arg[i].charAt(0) == '-'){
|
||||
String name = arg[i].substring(1);
|
||||
try{
|
||||
switch(name){
|
||||
case "width": width = Integer.parseInt(arg[i + 1]); break;
|
||||
case "height": height = Integer.parseInt(arg[i + 1]); break;
|
||||
case "gl3": gl30 = true; break;
|
||||
case "antialias": samples = 16; break;
|
||||
case "debug": Log.level = LogLevel.debug; break;
|
||||
case "maximized": maximized = Boolean.parseBoolean(arg[i + 1]); break;
|
||||
}
|
||||
}catch(NumberFormatException number){
|
||||
Log.warn("Invalid parameter number value.");
|
||||
}
|
||||
}
|
||||
}
|
||||
setWindowIcon(FileType.internal, "icons/icon_64.png");
|
||||
}});
|
||||
@@ -303,7 +310,7 @@ public class DesktopLauncher extends ClientLauncher{
|
||||
if(state.rules.waves){
|
||||
gameMapWithWave += " | Wave " + state.wave;
|
||||
}
|
||||
gameMode = state.rules.pvp ? "PvP" : state.rules.attackMode ? "Attack" : "Survival";
|
||||
gameMode = state.rules.pvp ? "PvP" : state.rules.attackMode ? "Attack" : state.rules.infiniteResources ? "Sandbox" : "Survival";
|
||||
if(net.active() && Groups.player.size() > 1){
|
||||
gamePlayersSuffix = " | " + Groups.player.size() + " Players";
|
||||
}
|
||||
|
||||
@@ -164,7 +164,10 @@ public class SWorkshop implements SteamUGCCallback{
|
||||
tags.add(p.steamTag());
|
||||
|
||||
ugc.setItemTags(h, tags.toArray(String.class));
|
||||
ugc.setItemPreview(h, p.createSteamPreview(sid).absolutePath());
|
||||
String path = p.createSteamPreview(sid).absolutePath();
|
||||
|
||||
Log.info("PREVIEW @ @ @", ugc.setItemPreview(h, path), path, Fi.get(path).exists());
|
||||
|
||||
ugc.setItemContent(h, p.createSteamFolder(sid).absolutePath());
|
||||
if(changelog == null){
|
||||
ugc.setItemVisibility(h, PublishedFileVisibility.Private);
|
||||
|
||||
+1
-1
@@ -25,4 +25,4 @@ org.gradle.caching=true
|
||||
#used for slow jitpack builds; TODO see if this actually works
|
||||
org.gradle.internal.http.socketTimeout=100000
|
||||
org.gradle.internal.http.connectionTimeout=100000
|
||||
archash=d0d80da882
|
||||
archash=9de902fcfe
|
||||
|
||||
@@ -191,7 +191,12 @@ public class ServerControl implements ApplicationListener{
|
||||
|
||||
info("Selected next map to be @.", Strings.stripColors(map.name()));
|
||||
|
||||
play(true, () -> world.loadMap(map, map.applyRules(lastMode)));
|
||||
play(true, () -> {
|
||||
world.loadMap(map, map.applyRules(lastMode));
|
||||
if(Config.autoPause.bool() && Groups.player.isEmpty()){
|
||||
Core.app.post(() -> state.set(State.paused));
|
||||
}
|
||||
});
|
||||
}else{
|
||||
netServer.kickAll(KickReason.gameover);
|
||||
state.set(State.menu);
|
||||
@@ -255,7 +260,10 @@ public class ServerControl implements ApplicationListener{
|
||||
|
||||
//autosave settings once a minute
|
||||
float saveInterval = 60;
|
||||
Timer.schedule(() -> Core.settings.forceSave(), saveInterval, saveInterval);
|
||||
Timer.schedule(() -> {
|
||||
netServer.admins.forceSave();
|
||||
Core.settings.forceSave();
|
||||
}, saveInterval, saveInterval);
|
||||
|
||||
if(!mods.list().isEmpty()){
|
||||
info("@ mods loaded.", mods.list().size);
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
[
|
||||
{
|
||||
"name": "Sectorized",
|
||||
"address": ["sectorized.ddns.net"]
|
||||
},
|
||||
{
|
||||
"name": "{AA}",
|
||||
"address": ["recessive.net"]
|
||||
@@ -11,18 +7,6 @@
|
||||
"name": "EasyPlay",
|
||||
"address": ["easyplay.su"]
|
||||
},
|
||||
{
|
||||
"name": "Tendhost",
|
||||
"address": ["tendhost.ddns.net", "smokeofanarchy.ru:7576"]
|
||||
},
|
||||
{
|
||||
"name": "Atanner Gaming",
|
||||
"address": ["mindustry.atannergaming.com:6567", "mindustry.atannergaming.com:6700", "mindustry.atannergaming.com:9000"]
|
||||
},
|
||||
{
|
||||
"name": "C.A.M.S.",
|
||||
"address": ["0.baseduser.eu.org:42000", "nikochio.ddns.net"]
|
||||
},
|
||||
{
|
||||
"name": "Chaotic Neutral",
|
||||
"address": ["c-n.ddns.net:1111", "c-n.ddns.net:2222", "c-n.ddns.net:3333"]
|
||||
@@ -47,64 +31,8 @@
|
||||
"name": "ALEX",
|
||||
"address": ["alexmindustryhub.ddns.net:6568", "dogemindustry.ddns.net:25586", "alexmindustry.ddns.net:25587", "alexmindustryattac.ddns.net:25800","alexmindustryturbo.ddns.net:25581","alexmindustryhex.ddns.net:25583"]
|
||||
},
|
||||
{
|
||||
"name": "Minty [subzero]",
|
||||
"address": ["minty-server.ddns.net"]
|
||||
},
|
||||
{
|
||||
"name": "Korea",
|
||||
"address": ["mindustry.initd.kr","mindustry.kr:7100"]
|
||||
},
|
||||
{
|
||||
"name": "Obvilion Network",
|
||||
"address": ["obvilion.ru", "obvilion.ru:7001", "obvilion.ru:7002", "obvilion.ru:7003"]
|
||||
},
|
||||
{
|
||||
"name": "Nydus",
|
||||
"address": ["v6.mindustry.nydus.app:6566"]
|
||||
},
|
||||
{
|
||||
"name": "Mindustry.Party",
|
||||
"address": ["game.mindustry.party"]
|
||||
},
|
||||
{
|
||||
"name": "TSR",
|
||||
"address": ["uk01.optik.host:26175", "uk01.optik.host:26164"]
|
||||
},
|
||||
{
|
||||
"name": "Sakura",
|
||||
"address": ["160.16.207.141", "160.16.207.141:21527", "160.16.207.141:31587", "160.16.207.141:26810", "160.16.207.141:4848"]
|
||||
},
|
||||
{
|
||||
"name": "MeowLand",
|
||||
"address": ["34.134.111.15"]
|
||||
},
|
||||
{
|
||||
"name": "M-DE",
|
||||
"address": ["mindustry.inc.li", "mindustry.inc.li:6568"]
|
||||
},
|
||||
{
|
||||
"name": "CxZx",
|
||||
"address": ["usfr2.forcehost.net:25578"]
|
||||
},
|
||||
{
|
||||
"name": "CreateDustry",
|
||||
"address": ["129.151.64.81:26032"]
|
||||
},
|
||||
{
|
||||
"name": "NukeDustry",
|
||||
"address": ["nukedustry.tk:7777", "nukedustry.tk:8888"]
|
||||
},
|
||||
{
|
||||
"name": "MindustryBR",
|
||||
"address": ["mindustryptbr.ddns.net:25579"]
|
||||
},
|
||||
{
|
||||
"name": "Shard",
|
||||
"address": ["59.12.120.171"]
|
||||
},
|
||||
{
|
||||
"name": "New Campaign Like",
|
||||
"address": ["n5.yeet.ml:6568"]
|
||||
}
|
||||
]
|
||||
|
||||
+40
-16
@@ -1,12 +1,12 @@
|
||||
[
|
||||
{
|
||||
"name": "Explosive corp",
|
||||
"address": ["94.103.91.96:4545", "94.103.91.96:4848", "94.103.91.96:4949", "94.103.91.96:5050"]
|
||||
},
|
||||
{
|
||||
"name": "RCM",
|
||||
"address": ["rcrms.ru:6567"]
|
||||
},
|
||||
{
|
||||
"name": "Tendhost",
|
||||
"address": ["tendhost.ddns.net:7576"]
|
||||
},
|
||||
{
|
||||
"name": "generic mindustry",
|
||||
"address": ["212.192.29.92:25554", "212.192.29.24:25298"]
|
||||
@@ -33,7 +33,7 @@
|
||||
},
|
||||
{
|
||||
"name": "Voiddustry",
|
||||
"address": ["45.144.66.250:6566", "45.144.66.250:6565"]
|
||||
"address": ["45.144.66.250:6566", "45.144.66.250:6565", "45.144.66.250:6561"]
|
||||
},
|
||||
{
|
||||
"name": "C.A.M.S.",
|
||||
@@ -45,23 +45,23 @@
|
||||
},
|
||||
{
|
||||
"name": "HexPvP Network",
|
||||
"address": ["hexpvp.ml", "kycb42148.ddns.net:6614"]
|
||||
"address": ["hexpvp.ddns.net", "kycb42148.ddns.net:6614"]
|
||||
},
|
||||
{
|
||||
"name": "Omega Hub",
|
||||
"address": ["n1.mindustry.me:6608", "n7.mindustry.me:6567", "n7.mindustry.me:6570", "n1.mindustry.me:6568", "n1.mindustry.me:6671", "n1.mindustry.me:6570", "n1.mindustry.me:6573", "n1.mindustry.me:6610", "n1.mindustry.me:6567", "n1.mindustry.me:6599", "n1.mindustry.me:6774", "n1.mindustry.me:6571"]
|
||||
"address": ["n1.mindustry.me:6608", "n7.mindustry.me:6567", "n7.mindustry.me:6570", "n1.mindustry.me:6568", "n1.mindustry.me:6671", "n1.mindustry.me:6570", "n1.mindustry.me:6573", "n1.mindustry.me:6610", "n1.mindustry.me:6567", "n1.mindustry.me:6599", "n1.mindustry.me:6774", "n1.mindustry.me:6571", "n1.mindustry.me:6589"]
|
||||
},
|
||||
{
|
||||
"name": "KMWStudios",
|
||||
"address": ["meowland.ru"]
|
||||
"address": ["46.151.26.232:1024", "46.151.26.232:2000", "46.151.26.232:3000", "46.151.26.232:4000", "46.151.26.232:6000", "46.151.26.232:7000", "46.151.26.232:8000"]
|
||||
},
|
||||
{
|
||||
"name": "XCore",
|
||||
"address": ["185.13.47.146:19000", "185.13.47.146:19001"]
|
||||
"address": ["130.61.52.25", "130.61.52.25:6568", "130.61.52.25:6569", "130.61.52.25:6570"]
|
||||
},
|
||||
{
|
||||
"name": "Darkdustry",
|
||||
"address": ["darkdustry.net", "darkdustry.net:1500", "darkdustry.net:2000", "darkdustry.net:3000", "darkdustry.net:4000", "darkdustry.net:5000", "darkdustry.net:6000", "darkdustry.net:7000", "darkdustry.net:8000", "darkdustry.net:9000", "darkdustry.net:10000"]
|
||||
"address": ["45.82.176.157", "45.82.176.157:1500", "45.82.176.157:2000", "45.82.176.157:3000", "45.82.176.157:4000", "45.82.176.157:5000", "45.82.176.157:6000", "45.82.176.157:7000", "45.82.176.157:8000", "45.82.176.157:9000", "45.82.176.157:10000"]
|
||||
},
|
||||
{
|
||||
"name": "Chaotic Neutral",
|
||||
@@ -85,19 +85,23 @@
|
||||
},
|
||||
{
|
||||
"name": "LatamDustry",
|
||||
"address": ["n1.xpdustry.fr:7003", "n1.xpdustry.fr:7004", "n1.xpdustry.fr:7005", "n1.xpdustry.fr:7006", "n1.xpdustry.fr:7007"]
|
||||
"address": ["n1.xpdustry.fr:7003", "n1.xpdustry.fr:7004", "n1.xpdustry.fr:7005", "n1.xpdustry.fr:7006", "n1.xpdustry.fr:7007", "uk-prem-01.optik.host:5894"]
|
||||
},
|
||||
{
|
||||
"name": "Pandorum",
|
||||
"address": ["pandorum.su:5018", "pandorum.su:5019", "pandorum.su:5020"]
|
||||
},
|
||||
{
|
||||
"name": "Tinylake",
|
||||
"address": ["mindustry.top", "cn.mindustry.top", "g.mindustry.top"]
|
||||
},
|
||||
{
|
||||
"name": "Fish",
|
||||
"address": ["170.187.144.235", "162.248.100.98"]
|
||||
},
|
||||
{
|
||||
"name": "OMNIDUSTRY",
|
||||
"address": ["109.94.209.233","109.94.209.233:6568","109.94.209.233:6569","109.94.209.233:6570","109.94.209.233:6571","109.94.209.233:6572","109.94.209.233:6573","109.94.209.233:6574"]
|
||||
"address": ["185.178.46.229", "185.178.46.229:6568", "185.178.46.229:6569", "185.178.46.229:6570", "185.178.46.229:6571", "185.178.46.229:6572", "185.178.46.229:6573", "185.178.46.229:6574"]
|
||||
},
|
||||
{
|
||||
"name": "The Devil",
|
||||
@@ -105,11 +109,11 @@
|
||||
},
|
||||
{
|
||||
"name": "Eradicationdustry",
|
||||
"address": ["eradicationmindustry.mindustry.me:6569", "eradicationmindustry.mindustry.me:9547", "eradicationmindustry.mindustry.me:6572", "eradicationmindustry.yeet.ml:6570", "eradicationmindustry.mindustry.me:6571", "eradicationmindustry.mindustry.me:6574", "eradicationmindustry.mindustry.me:6573", "eradicationmindustry2.mindustry.me:6567"]
|
||||
"address": ["eradicationmindustry.mindustry.me:6569", "eradicationmindustry.mindustry.me:9547", "eradicationmindustry.mindustry.me:6572", "eradicationmindustry.yeet.ml:6570", "eradicationmindustry.mindustry.me:6571", "eradicationmindustry.mindustry.me:6574", "eradicationmindustry.mindustry.me:6573", "eradicationmindustry2.mindustry.me:6567", "eradicationmindustry.mindustry.me:6568"]
|
||||
},
|
||||
{
|
||||
"name": "Conservatory",
|
||||
"address": ["165.232.137.170:6567","165.232.137.170:6568"]
|
||||
"address": ["165.232.137.170:6567", "165.232.137.170:6568"]
|
||||
},
|
||||
{
|
||||
"name": "mindustry.ddns.net",
|
||||
@@ -129,11 +133,11 @@
|
||||
},
|
||||
{
|
||||
"name": "Sakura",
|
||||
"address": ["160.16.207.141:22527", "160.16.207.141:23527", "160.16.207.141:24527", "160.16.207.141:25527", "160.16.207.141:26527"]
|
||||
"address": ["160.16.207.141:22527", "160.16.207.141:23527", "160.16.207.141:24527", "160.16.207.141:25527", "160.16.207.141:26527", "160.16.207.141:27527", "160.16.207.141:28527"]
|
||||
},
|
||||
{
|
||||
"name": "|RussianServers|[]",
|
||||
"address": ["2p2g.ml:6568","2p2g.ml:6569","2p2g.ml:6570","2p2g.ml:6571","2p2g.ml:6572","2p2g.ml:6573"]
|
||||
"address": ["2p2g.ml:6568", "2p2g.ml:6569", "2p2g.ml:6570", "2p2g.ml:6571", "2p2g.ml:6572", "2p2g.ml:6573"]
|
||||
},
|
||||
{
|
||||
"name": "Hungarian",
|
||||
@@ -142,5 +146,25 @@
|
||||
{
|
||||
"name": "SubZero",
|
||||
"address": ["mintyserver.net"]
|
||||
},
|
||||
{
|
||||
"name": "Router Pi",
|
||||
"address": ["a55c81b7c4d6e6d604651a93f8af5cd83.asuscomm.com"]
|
||||
},
|
||||
{
|
||||
"name": "Vndustry",
|
||||
"address": ["vndustry.ddns.net", "vndustry.ddns.net:6568"]
|
||||
},
|
||||
{
|
||||
"name": "Anana&ShenYv",
|
||||
"address": ["mdtleague.top"]
|
||||
},
|
||||
{
|
||||
"name": "Vortex",
|
||||
"address": ["vortex.org.ru", "vortex.org.ru:6568", "vortex.org.ru:6569", "vortex.org.ru:6570", "vortex.org.ru:6571"]
|
||||
},
|
||||
{
|
||||
"name": "Botipont",
|
||||
"address": ["217.144.54.208:6567", "217.144.54.208:6568", "217.144.54.208:6569"]
|
||||
}
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user