Compare commits

..
124 Commits
Author SHA1 Message Date
Anuken 4410f31888 Merge remote-tracking branch 'origin/master' 2023-02-21 10:55:01 -05:00
Anuken df11dd7a74 Fixed issues with #7972 2023-02-21 10:54:56 -05:00
MonoDx 804dd61cd9 Updated belarusian translate. (#8327)
Edited by monodx.
2023-02-21 10:26:04 -05:00
Anuken b00c5b4cab Merge remote-tracking branch 'origin/master' 2023-02-21 10:24:50 -05:00
Anuken e0d6cebb2e Fixed #8326 2023-02-21 10:24:45 -05:00
ulwepo ab772dccd4 Update bundle_ja.properties (#8324) 2023-02-21 09:55:55 -05:00
BotiHUN7 b244032328 Update servers_v7.json (#8320) 2023-02-21 09:55:33 -05:00
DikHalzandColaHz 421c5e2879 Update servers_v7.json (#8325)
HUB

Co-authored-by: ColaHz <87813567+ColaHz@users.noreply.github.com>
2023-02-21 09:52:55 -05:00
Anuken 1a8c4d8d8a Update deployment.yml 2023-02-20 14:19:36 -05:00
Tomoko 9efb1824af Update servers_v7.json (#8322) 2023-02-20 13:46:01 -05:00
Anuken 74de125700 githubImportMod old signature returned 2023-02-20 12:27:24 -05:00
Anuken 64cea34a98 Merge remote-tracking branch 'origin/master' 2023-02-20 12:20:01 -05:00
Anuken 9c4bdc213d Crash fix 2023-02-20 12:19:56 -05:00
Fischer1000 92c0552fd5 Update hungarian language file (#8315)
Fine tune the file. I have made it to it's quarter today (line 537).
2023-02-19 09:26:59 -05:00
OSP ff39e5f90d [XCore] Change ip (#8319) 2023-02-19 09:25:09 -05:00
Anuken 83c55fdbb4 Merge remote-tracking branch 'origin/master' 2023-02-18 23:12:52 -05:00
Anuken 7d300a273b added missing break 2023-02-18 23:12:47 -05:00
MEEPofFaith 29f36c1927 ClientServerConnectEvent (#8309) 2023-02-18 19:48:22 -05:00
ferrandusqui31 b65c3cd931 Missing translation and errors correction (#8312)
On line 104 updated joingame from "Uneix-me a una partida" to "Unir-se a una partida".
On line 494 update editor.savemap from "Desa un mapa" to "Desa el mapa".
On line 1386 updated block.kiln.name from "Kiln" to "Forn de vidre".
On line 1468 updated block.reinforced.message  from "Missatge remarcat" to "Missatge reforçat".
2023-02-18 19:48:08 -05:00
Anuken 7401e7fe31 Fixed #8316 2023-02-18 19:47:22 -05:00
Anuken 150215712b formatting 2023-02-17 09:18:08 -05:00
Gureumi f7ccf3c04a Add window size parameter (#8281)
* Add window size parameter

* Formatting

* Java 8
2023-02-17 09:13:59 -05:00
Evgenij ebb798cac3 Update servers_v7.json (#8307) 2023-02-17 09:03:44 -05:00
MEEPofFaith 348819d1ac connectedPower similar to conductivePower (#8306) 2023-02-15 23:22:05 -05:00
MEEPofFaith a8a3453632 Move core launch/landing to CoreBlock (#8055)
* Move core launch/landing to CoreBlock

* Slight cleanup

* just gonna...
2023-02-15 12:16:51 -05:00
FunnyCat 9b02a274f1 Update servers_v7.json (#8293)
Explosive corp deleted
2023-02-15 10:38:44 -05:00
Anuken f093360565 Merge branch 'master' of https://github.com/Anuken/Mindustry 2023-02-15 10:34:57 -05:00
Anuken d457901d2e Minor Conquer buff 2023-02-15 10:34:52 -05:00
Anuken 460dbff7d1 Fixed shield break effect 2023-02-15 10:33:36 -05:00
Anuken e564602fd1 Hide isHidden content in mod info 2023-02-15 09:59:32 -05:00
Baldur404andAnuken e029321e5b Update servers_v7.json (#8290)
Co-authored-by: Anuken <arnukren@gmail.com>
2023-02-15 09:34:38 -05:00
Tentyanuk 87d7089df3 Update servers_v7.json (#8294)
DNS doesn't work for everyone
2023-02-15 09:02:46 -05:00
WayZer e4f929a851 Fix turret when cheating (#8291)
* (C/S) Fix ItemTurret ammo when `cheat`.

* (C/S) Fix `TurretBuild.updateReload` NPE when `cheat`

* Why `shouldConsume` cause `potentialEfficiency=0`
2023-02-15 09:02:32 -05:00
MEEPofFaith 8726cde05d Return salvo and swarmer to how they were before shoot changes (#8278) 2023-02-15 09:01:03 -05:00
Bill Arndt a189ac8613 Update Team.java to increase dynamic range of team colors (#8279)
I'm having a lot of trouble finding enough visually distinct team colors; In the worst case I need about 25 colors. I am manually excluded colliding team numbers I know about, but, I can only find about 14 easily distinguishable colors before everything is another bright magenta, or yellow, or cyan, or pale green.
2023-02-15 09:00:34 -05:00
ulwepo 652aa4c456 Update bundle_ja.properties (#8300) 2023-02-15 09:00:10 -05:00
MEEPofFaith cc3ae2c66c Use setBars instead of overriding displayBars (#8296) 2023-02-15 08:59:57 -05:00
Даркнесс#3729 359e59bbad Changed Darkdustry domain to direct IP address (#8292)
Why? Because darkdustry.net is not available in some countries (Ukraine, Israel and some more)
Also improved formatting
2023-02-15 08:58:09 -05:00
Anuken 40ec7fd6fc Less Core.app.post for build events 2023-02-15 08:57:06 -05:00
Anuken d17f0ebc51 Fixed #8297 2023-02-15 08:35:53 -05:00
Anuken 5027b70f5a Merge branch 'master' of https://github.com/Anuken/Mindustry 2023-02-14 15:08:27 -05:00
Anuken 0b7c790777 turret status fix 2023-02-14 15:08:24 -05:00
Github Actions 5ac9e9f63c Automatic bundle update 2023-02-13 19:13:48 +00:00
Anuken b08136e3ea Quell no longer targets flying units 2023-02-13 14:12:53 -05:00
Anuken ec8262418f Basic unit boost command support 2023-02-11 17:40:57 -05:00
Anuken 946e36c66e Merge branch 'master' of https://github.com/Anuken/Mindustry 2023-02-09 17:50:46 -05:00
Anuken 00f3518349 Fixed #8277 2023-02-09 17:50:43 -05:00
Volas171 29bf99fe1a Update servers_v7.json (#8276) 2023-02-09 17:43:11 -05:00
Tentyanuk e104591dec Update servers_v7.json (#8271)
**SRV proved to be really too inefficient and unprofitable!!**

1. Huge delays
2. These records do not work for everyone
2023-02-09 09:22:58 -05:00
Gureumi 0fd26e68d4 Fix server auto pause when gameover (#8220)
* Fix server auto pause when gameover

* Update ServerControl.java

* Update ServerControl.java
2023-02-09 09:21:55 -05:00
WayZer 53f410fee0 Fix Turret bug when cheat (#8273)
* (C/S) Fix ItemTurret ammo when `cheat`.

* (C/S) Fix `TurretBuild.updateReload` NPE when `cheat`
2023-02-09 09:20:06 -05:00
FunnyCat 53206e4b31 Update servers_v7.json (#8256)
Explosive hub deleted
2023-02-08 22:54:45 -05:00
Tentyanuk 3818bfffb4 Update servers_v7.json (#8260)
We added DNS v4/v6 with proxy, updated addresses and moved our servers to a more productive host

*P.S Sorry for creating pull requests before this, I was too stupid to realize that this pull request is directed to the order of ping requests, and not to the order of servers in general..*
2023-02-08 22:54:17 -05:00
Phinner e6afc6ef0b Add info section about SRV records in SERVERLIST.md (#8252)
* update SERVERLIST.md

* aslo setup 💀
2023-02-08 22:51:25 -05:00
Gureumi 5eb1c1dffc Remove dead servers v6 (#8262) 2023-02-08 22:50:21 -05:00
Github Actions 66406806b7 Automatic bundle update 2023-02-09 03:49:19 +00:00
Anuken 3a6debfae6 Merge branch 'master' of https://github.com/Anuken/Mindustry 2023-02-08 22:48:33 -05:00
Anuken a093fa5718 Replaced #8035 2023-02-08 22:48:17 -05:00
Даркнесс#3729 9c1f17fbdd Add pvpAutoPause rule (#8249)
* Update Rules.java

* Update NetServer.java
2023-02-08 22:44:07 -05:00
MEEPofFaith ce3643f0b3 Make type not required if the template already provides one (#8257)
Such as with missile units
2023-02-08 22:35:13 -05:00
MEEPofFaith f1fb7d8098 Fix modded payload conveyor icons (#8266) 2023-02-08 22:28:44 -05:00
Anuken 3d01eeaf1c Fixed #8251 2023-02-08 22:25:10 -05:00
Github Actions be39c31865 Automatic bundle update 2023-02-01 20:22:46 +00:00
Phinner 0d2dfadba7 Mod dependency resolution improvements (#7972)
* soft dependencies + better mod resolution algorithm

* update ModMeta#toString

* var

* add #7962 bugfix

* Use existing code to resolve

* add state text for mod dialog

* bugfix

* fix error text

* remove external resolver class

It's simpler like that :)
2023-02-01 15:21:42 -05:00
Anuken 2dcab97b6d Merge remote-tracking branch 'origin/master' 2023-02-01 15:20:38 -05:00
Anuken 31cb169002 Random server order 2023-02-01 15:20:34 -05:00
LeTuanVN c381499c58 Update vi translation (#8225)
* Update bundle_vi.properties

* Update bundle_vi.properties
2023-02-01 14:57:09 -05:00
KotMilkMeoWtwo 8577a8cca4 Update servers_v7.json (#8234)
nya
2023-02-01 14:55:52 -05:00
Tentyanuk 7a18c4a580 Update servers_v7.json (#8238) 2023-02-01 14:55:39 -05:00
TheRadioactiveBanana 40589eb9ff Added nuclear pvp server (#8222)
i somehow forgot to press propose changes doing this yesterday, so i do this again today
2023-02-01 14:51:47 -05:00
ulwepo 722370b57c Update servers_v7.json (#8214) 2023-02-01 14:51:36 -05:00
FunnyCat 573672622a Update servers_v7.json (#8215) 2023-02-01 14:48:26 -05:00
MEEPofFaith 12f747ae1d Strip colors from mod name as well (#8224) 2023-02-01 14:45:56 -05:00
WayZer 395dc99595 Update servers_v7.json (#8240) 2023-02-01 14:45:28 -05:00
Даркнесс#3729 c945243795 It doesn't work (#8237) 2023-02-01 14:45:00 -05:00
Anuken c2262cc9cf Fixed #8235 / Fixed #8221 2023-02-01 14:42:50 -05:00
Anuken 411399e96f Fixed #8211 2023-02-01 14:18:29 -05:00
Anuken f833b9e0ce Fixed #8236 2023-02-01 14:09:16 -05:00
Anuken 9955423e9a Merge remote-tracking branch 'origin/master' 2023-02-01 13:35:11 -05:00
Anuken 58b4265b31 Fixed #8232 2023-02-01 13:35:06 -05:00
Epowerj 671a62aed7 Merge pull request #8242 from osp54/patch-2
[XCore] Hexed server
2023-02-01 13:09:46 -05:00
OSP c94fe9c312 [XCore] Hexed server 2023-01-31 21:07:30 +02:00
Tentyanuk f46a9730a3 Update SERVERLIST.md (#8205) 2023-01-22 11:03:59 -05:00
Tentyanuk d45cd7c15e Banned logic displays on sandbox (#8204) 2023-01-22 09:54:39 -05:00
Anuken a84d52f5fe Removed Omnidustry sandbox due to moderation issues (#8203) 2023-01-22 09:26:09 -05:00
Anuken 330d37b7a5 Merge remote-tracking branch 'origin/master' 2023-01-22 08:59:36 -05:00
Anuken d2792a4e9d Fixed #8202 2023-01-22 08:59:32 -05:00
Kotamus c50a69d42a Update servers_v7.json (#8201)
Crawler arena
2023-01-21 09:40:26 -05:00
Anuken ee689d1597 Merge remote-tracking branch 'origin/master' 2023-01-20 09:37:33 -05:00
Anuken 6ef8d64d46 Efficiency fix 2023-01-20 09:37:28 -05:00
eSK8er 0095e89673 Update servers_v7.json (#8145) 2023-01-19 00:34:13 -05:00
SachaTending 55d97ea202 add tendhost(not running) [reopened] (#8147) 2023-01-18 11:49:22 -05:00
Anuken 85b8868d2b Fixed #8194 2023-01-18 10:41:39 -05:00
Anuken 65e92ab6fc Merge remote-tracking branch 'origin/master' 2023-01-17 18:50:49 -05:00
Anuken 478baf2532 Fixed #8192 2023-01-17 18:50:44 -05:00
Joan Josep 0750348cb1 Update bundle_ca.properties (#8190) 2023-01-17 18:49:20 -05:00
UnCaughT db6cbc5cc3 Update servers_v7.json (#8189)
HexPvP IP Change
2023-01-17 00:18:09 -05:00
Anuken b4359c0489 Merge remote-tracking branch 'origin/master' 2023-01-16 15:28:45 -05:00
Anuken 977192bc54 Fixed #8187 2023-01-16 15:28:40 -05:00
南门阳德 d54b557a9f Revert #8176 (#8186)
Liquid turrets are used to give buff like wet but not do the damage. The ammo change is not appropriate.
2023-01-16 11:07:00 -05:00
Anuken f6c97f4ff6 Fixed #8185 2023-01-16 11:06:34 -05:00
Anuken 66f4118896 Fixed #8184 2023-01-15 15:19:13 -05:00
Anuken 4a8f8c4ecf Merge remote-tracking branch 'origin/master' 2023-01-15 08:51:57 -05:00
Anuken 6d7c207b95 Fixed drawing of assembler payloads 2023-01-15 08:51:51 -05:00
DinnerWool 597bd31a0c Update servers_v7.json (#8183) 2023-01-15 08:42:59 -05:00
Knochi 98157f2852 Never use „tun“ in German language (#8179) 2023-01-14 14:41:14 -05:00
MEEPofFaith 5e324e71d4 Hitscan fix 2 (#8175)
* Revert "Reverting #8037"

Re-implement #8037

* Properly count collisions

Fix #8170
2023-01-14 10:05:30 -05:00
Anuken 3159ce6707 Merge remote-tracking branch 'origin/master' 2023-01-13 19:34:52 -05:00
Anuken 9b033532c8 Fixed #8177 2023-01-13 19:34:48 -05:00
Даркнесс#3729 0678592d59 Fix cheaty item and liquid turrets (#8176)
* Update Turret.java

* Update TractorBeamTurret.java

* Update TractorBeamTurret.java

* Update ItemTurret.java

* Update LiquidTurret.java
2023-01-13 16:51:36 -05:00
Anuken 00d6b0d483 Merge remote-tracking branch 'origin/master' 2023-01-13 09:59:05 -05:00
Anuken 598049265a Complete revert of #8019 2023-01-13 09:59:01 -05:00
Nunting c3209f2cdd Update bundle_ko.properties (#8171) 2023-01-13 09:44:08 -05:00
Anuken b2b4602c91 Reverting #8037 2023-01-13 09:42:28 -05:00
Anuken b1e1fe4922 Merge remote-tracking branch 'origin/master' 2023-01-13 09:31:14 -05:00
Anuken edcf3c4223 Fixed #8170 2023-01-13 09:31:10 -05:00
Github Actions 58315acfa3 Automatic bundle update 2023-01-13 03:53:33 +00:00
Anuken ec9eadd660 encoding test 2023-01-12 22:52:32 -05:00
Anuken 7277892e33 Merge remote-tracking branch 'origin/master' 2023-01-12 17:01:52 -05:00
Anuken 54962a158d Fixed #8168 2023-01-12 17:01:47 -05:00
Даркнесс#3729 30dcbe1af3 Administration improvements (#8167)
* Administration improvements

Reduced the interval for preventing sending the same message because 50 seconds is too much and kinda confusing
Added saving and loading kicked IPs so they are saved even when the server crashes
Fixed smth in Config

* skill issue
2023-01-12 16:24:51 -05:00
Anuken e92d5d2d2d Fixed #8165 2023-01-12 14:42:42 -05:00
Anuken 411367f294 Revert JSON rules change 2023-01-12 14:38:11 -05:00
Anuken f49e05a915 Fixed #8161 / Fixed #8162 2023-01-12 14:30:57 -05:00
95 changed files with 2703 additions and 2386 deletions
+2
View File
@@ -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
View File
@@ -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
+5
View File
@@ -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
+55 -50
View File
@@ -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 = Назад
+5
View File
@@ -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 = Назад
+10 -5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+6 -1
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+102 -97
View File
@@ -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
+5
View File
@@ -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
+11 -6
View File
@@ -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 = 기본 기체 제한
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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 = Назад
+5
View File
@@ -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
+5
View File
@@ -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
+5
View File
@@ -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 = กลับ
+5
View File
@@ -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
+5
View File
@@ -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 -41
View File
@@ -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 = 返回
+1 -3
View File
@@ -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){
+21 -2
View File
@@ -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;
}
}
+21
View File
@@ -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);
}
}
}
}
+22 -11
View File
@@ -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){
+5
View File
@@ -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;
+9
View File
@@ -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),
+17 -9
View File
@@ -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;
+12 -1
View File
@@ -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();
}
}
+3 -3
View File
@@ -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);
+28 -109
View File
@@ -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;
+5 -2
View File
@@ -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
+2 -2
View File
@@ -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;
}
+3 -1
View File
@@ -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(){
+10
View File
@@ -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;
+2
View File
@@ -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. */
+1 -1
View File
@@ -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());
}
+11 -7
View File
@@ -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);
}
}
+9 -4
View File
@@ -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);
}
}
+3 -29
View File
@@ -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;
}
}
}
}
+10
View File
@@ -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);
}
+2 -1
View File
@@ -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
+5 -4
View File
@@ -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
View File
@@ -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;
}
}
}
+19 -7
View File
@@ -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)),
+1 -1
View File
@@ -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
+2
View File
@@ -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;
+4
View File
@@ -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);
});
+14 -2
View File
@@ -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){
+4 -1
View File
@@ -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]);
}
+2 -2
View File
@@ -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
+9 -66
View File
@@ -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
View File
@@ -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
+10 -2
View File
@@ -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);
-72
View File
@@ -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
View File
@@ -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"]
}
]