Merge branch 'master' of https://github.com/Anuken/Mindustry into resource-rework

This commit is contained in:
Anuken 2018-08-18 13:10:22 -04:00
commit a60ce3c54c
63 changed files with 1674 additions and 1830 deletions

View file

@ -26,7 +26,7 @@ allprojects {
appName = 'Mindustry'
gdxVersion = '1.9.8'
roboVMVersion = '2.3.0'
uCoreVersion = '2f18f69ffb'
uCoreVersion = 'e492954e86'
getVersionString = {
String buildVersion = getBuildVersion()
@ -194,7 +194,9 @@ project(":server") {
apply plugin: "java"
configurations {
compile.exclude module: android
if(findProject(":android") != null){
compile.exclude module: android
}
}
dependencies {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 279 B

After

Width:  |  Height:  |  Size: 279 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 308 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 390 B

After

Width:  |  Height:  |  Size: 374 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

After

Width:  |  Height:  |  Size: 302 B

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 B

After

Width:  |  Height:  |  Size: 423 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 323 B

After

Width:  |  Height:  |  Size: 327 B

Before After
Before After

View file

@ -87,7 +87,7 @@ text.server.kicked.serverOutdated=Outdated server! Ask the host to update!
text.server.kicked.banned=You are banned on this server.
text.server.kicked.recentKick=You have been kicked recently.\nWait before connecting again.
text.server.kicked.nameInUse=There is someone with that name\nalready on this server.
text.server.kicked.nameEmpty=Your name must contain at least one character or number.
text.server.kicked.nameEmpty=Your chosen name is invalid.
text.server.kicked.idInUse=You are already on this server! Connecting with two accounts is not permitted.
text.server.kicked.customClient=This server does not support custom builds. Download an official version.
text.host.info=The [accent]host[] button hosts a server on port [scarlet]6567[]. \nAnybody on the same [LIGHT_GRAY]wifi or local network[] should be able to see your server in their server list.\n\nIf you want people to be able to connect from anywhere by IP, [accent]port forwarding[] is required.\n\n[LIGHT_GRAY]Note: If someone is experiencing trouble connecting to your LAN game, make sure you have allowed Mindustry access to your local network in your firewall settings.
@ -356,6 +356,11 @@ setting.mutemusic.name=Mute Music
setting.sfxvol.name=SFX Volume
setting.mutesound.name=Mute Sound
text.keybind.title=Rebind Keys
category.general.name=General
category.view.name=View
category.multiplayer.name=Multiplayer
keybind.move_x.name=Move x
keybind.move_y.name=Move y
keybind.select.name=Select
@ -368,8 +373,15 @@ keybind.pause.name=Pause
keybind.dash.name=Dash
keybind.chat.name=Chat
keybind.player_list.name=Player list
keybind.console.name=console
keybind.console.name=Console
keybind.rotate.name=Rotate
keybind.toggle_menus.name=Toggle menus
keybind.chat_history_prev.name=Chat history prev
keybind.chat_history_next.name=Chat history next
keybind.chat_scroll.name=Chat scroll
keybind.drop_unit.name=drop unit
keybind.zoom_minimap.name=Zoom minimap
mode.text.help.title=Description of modes
mode.waves.name=waves
mode.waves.description=the normal mode. limited resources and automatic incoming waves.

View file

@ -15,7 +15,6 @@ text.players={0} Spieler online
text.players.single={0} Spieler online
text.server.mismatch=Paketfehler: Mögliche Client / Server-Version stimmt nicht überein. Stell sicher, dass du und der Host die neueste Version von Mindustry haben!
text.server.kicked.kick=Du wurdest vom Server gekickt!
text.server.kicked.invalidPassword=Falsches Passwort.
text.hostserver=Server hosten
text.host=Host
text.hosting=[accent] Server wird geöffnet...
@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

File diff suppressed because it is too large Load diff

View file

@ -16,7 +16,6 @@ text.players.single=joueur en ligne
text.server.mismatch=Erreur de paquet: possible incompatibilité de version client/serveur. Assurez-vous que vous et l'hôte avez la dernière version de Mindustry!
text.server.closing=[accent]Fermeture du serveur ...
text.server.kicked.kick=Vous avez été expulsé du serveur!
text.server.kicked.invalidPassword=Mot de passe non valide !
text.server.kicked.clientOutdated=Client dépassé! Mettez à jour votre jeu!
text.server.kicked.serverOutdated=Serveur dépassé! Demandez à l'hôte de le mettre à jour!
text.server.kicked.banned=Vous êtes banni sur ce serveur.
@ -224,19 +223,20 @@ block.liquidjunction.name=jonction à liquide
block.sorter.name=trieur
block.smelter.name=fonderie
text.credits=Credits
text.link.discord.description=the official Mindustry discord chatroom
text.link.github.description=Game source code
text.link.dev-builds.description=Unstable development builds
text.link.trello.description=Official trello board for planned features
text.link.itch.io.description=itch.io page with PC downloads and web version
text.link.google-play.description=Google Play store listing
text.link.wiki.description=official Mindustry wiki
text.linkfail=Failed to open link!\nThe URL has been copied to your cliboard.
text.editor.web=The web version does not support the editor!\nDownload the game to use it.
text.web.unsupported=The web version does not support this feature! Download the game to use it.
text.map.delete=Are you sure you want to delete the map "[orange]{0}[]"?
text.construction.title=Block Construction Guide
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.link.discord.description=Le discord officiel de Mindustry
text.link.github.description=code source du jeu
text.link.dev-builds.description=version de développement instable
text.link.trello.description=le tableau trelli officiel pour les futures ajouts
text.link.itch.io.description=la page itch.io avec la version Web et PC à télécharger
text.link.google-play.description=la page Google play Store
text.link.wiki.description=wiki officiel de Mindustry
text.linkfail=Erreur lors de l'ouverture du lien !\nL'URL as bien été copier dans le presse-papiers.
text.editor.web=Votre navigateur ne supporte pas l'éditeur !\nTéléchargez le jeu pour l'utiliser.
text.web.unsupported=votre navigateur ne supporte pas cette fonctionnalité ! Téléchargez le jeu pour l'utiliser.
text.map.delete=êtes vous sûre de supprimer la carte "[orange]{0}[]"?
text.construction.title=Guide des blocs de construction
text.construction=Voou avez sélectionné le [accent]mode de construction de blocs[].\n\n pour commencer à en placer, taper sur un emplacement validé près de votre vaisseau '.\nUne fois que vous avez sélectionné des blocs, appuyez sur la flèche pour valider, et votre vaisseau va les construire.\n\n- [accent]Enlever des blocs[] de votre sélection en les touchant.\n- [accent]étendez la sélection[] en maintenant et en étirant les blocs de la selection.\n- [accent]Placer des blocs en ligne[] en touchant et en laissant appuyer sur une case vide, puis étirez dans une direction.\n- [accent]Annulez une construction ou une selection[]en appuyant sur X en bas à gauche .
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Don't show again next session
@ -464,7 +464,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
@ -503,8 +502,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +513,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -16,7 +16,6 @@ text.players.single={0} pemain online
text.server.mismatch=Kesalahan paket: kemungkinan versi client / server tidak sesuai.\nPastikan Anda dan host memiliki versi terbaru Mindustry!
text.server.closing=[accent]Menutup server...
text.server.kicked.kick=Anda telah dikeluarkan dari server!
text.server.kicked.invalidPassword=Kata sandi salah!
text.server.kicked.clientOutdated=Client versi lama! Update game Anda!
text.server.kicked.serverOutdated=Server versi lama! Tanyakan host untuk mengupdate!
text.hostserver=Host Server
@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -26,7 +26,6 @@ text.players.single={0} giocatori online
text.server.mismatch=Errore nel pacchetto: possibile discrepanza nella versione client / server. Assicurati che tu e l'host abbiate l'ultima versione di Mindustry!
text.server.closing=[accent]Chiusura server ...
text.server.kicked.kick=Sei stato cacciato dal server!
text.server.kicked.invalidPassword=Password non valida.
text.server.kicked.clientOutdated=Versione del client obsoleta! Aggiorna il tuo gioco!
text.server.kicked.serverOutdated=Server obsoleto! Chiedi all'host di aggiornare!
text.server.kicked.banned=Sei bannato da questo server.
@ -254,7 +253,6 @@ text.showagain=non mostrare più
text.unlocks=Sblocchi
text.addplayers=Aggiungi/rimuovi giocatori
text.customgame=Gioco personalizzato
text.campaign=Campagna
text.sectors=Settori
text.sector=Settori Selezionati: [LIGHT_GRAY]{0}
text.sector.time=Tempo: [LIGHT_GRAY]{0}
@ -308,28 +306,28 @@ text.editor.export=Esportazione...
text.editor.exportfile=Esporta file
text.editor.exportfile.description=Esporta file mappa
text.editor.exportimage=Esporta immagine terreno
text.editor.exportimage.description=Export a map image file
text.editor.overwrite.confirm=[scarlet]Warning![] A map with this name already exists. Are you sure you want to overwrite it?
text.editor.exportimage.description=Esporta file immagine mappa
text.editor.overwrite.confirm=[scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere?
text.fps=FPS: {0}
text.tps=TPS: {0}
text.ping=Ping: {0}ms
text.settings.rebind=Rebind
text.yes=Yes
text.settings.rebind=Reinposta
text.yes=Si
text.no=No
text.blocks.targetsair=Targets Air
text.blocks.itemspeed=Units Moved
text.blocks.shootrange=Range
text.blocks.poweruse=Power Use
text.blocks.inputitemcapacity=Input Item Capacity
text.blocks.outputitemcapacity=Input Item Capacity
text.blocks.maxpowergeneration=Max Power Generation
text.blocks.powertransferspeed=Power Transfer
text.blocks.craftspeed=Production Speed
text.blocks.inputliquidaux=Aux Liquid
text.blocks.inputitems=Input Items
text.blocks.outputitem=Output Item
text.blocks.drilltier=Drillables
text.blocks.drillspeed=Base Drill Speed
text.blocks.targetsair=Attacca nemici aerei
text.blocks.itemspeed=Unità spostate
text.blocks.shootrange=Raggio
text.blocks.poweruse=Utilizzo energia
text.blocks.inputitemcapacity=Capacità oggetti in entrata
text.blocks.outputitemcapacity=Capacità oggetti in uscità
text.blocks.maxpowergeneration=Produzione massima energia
text.blocks.powertransferspeed=Velocità trasferimento energia
text.blocks.craftspeed=Velocità produzione
text.blocks.inputliquidaux=Liquidi extra
text.blocks.inputitems=Oggetti in entrata
text.blocks.outputitem=Oggetti in uscita
text.blocks.drilltier=Scavabili
text.blocks.drillspeed=Velocità scavo stbile
text.blocks.liquidoutput=Uscita liquidi
text.blocks.liquiduse=Uso liquidi
text.blocks.coolant=Refrigerante
@ -508,11 +506,36 @@ unit.drone.name=Drone
unit.drone.description=Un'unità base, che mina e costruisce.
unit.fabricator.name=Costruttore
unit.fabricator.description=Un drone molto avanzato che raccoglie minerali e costruisce molto meglio e più velocemente di un drone base.
unit.scout.name=Esploratore
unit.scout.description=Un unità di base a terra. Usa piombo come munizioni.
unit.titan.name=Titano
unit.titan.description=Un'unità di terra corazzata avanzata. Utilizza carburo come munizione. Attacca sia bersagli terrestri che aerei.
unit.monsoon.name=Monsone
unit.monsoon.description=Un bombardiere molto potente, che raderà al suolo chiunque gli passi davanti.
unit.interceptor.name=Intercettatore
unit.interceptor.description=Un veloce ed efficiente torretta che funziona con il piombo.
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -40,7 +40,6 @@ text.server.mismatch=클라이언트와 서버 버전이 일치하지 않습니
text.server.closing=[accent]서버 닫는중...
text.server.kicked.kick=당신은 서버에서 추방되었습니다!
text.server.kicked.fastShoot=당신은 총을 너무 빨리 발사했습니다.
text.server.kicked.invalidPassword=알 수 없는 비밀번호 입니다!
text.server.kicked.clientOutdated=오래된 버전의 클라이언트 입니다! 게임을 업데이트 하세요!
text.server.kicked.serverOutdated=오래된 버전의 서버입니다! 서버 호스트 관리자에게 문의하세요!
text.server.kicked.banned=당신은 서버에서 밴 망치를 맞아 차단당했습니다.
@ -281,7 +280,6 @@ text.category.liquids=액체
text.category.items=아이템
text.category.crafting=제작
text.category.shooting=사격
setting.difficulty.easy=쉬움
setting.difficulty.normal=보통
setting.difficulty.hard=어려움
@ -304,9 +302,7 @@ setting.musicvol.name=음악 크기
setting.mutemusic.name=음소거
setting.sfxvol.name=효과음 크기
setting.mutesound.name=소리 끄기
text.keybind.title=키 바인딩
keybind.move_x.name=오른쪽/왼쪽 이동
keybind.move_y.name=위쪽/아래쪽 이동
keybind.select.name=선택
@ -321,7 +317,6 @@ keybind.chat.name=채팅
keybind.player_list.name=플레이어 목록
keybind.console.name=콘솔
keybind.rotate.name=회전
mode.text.help.title=도움말
mode.waves.name=단계
mode.waves.description=이것은 일반 모드입니다. 제한된 자원과 자동으로 다음 단계가 시작됩니다.
@ -329,12 +324,10 @@ mode.sandbox.name=샌드박스
mode.sandbox.description=무한한 자원과 다음단계 시작을 위한 타이머가 없습니다.
mode.freebuild.name=자유 건축
mode.freebuild.description=제한된 자원과 다음단계 시작을 위한 타이머가 없습니다.
content.item.name=아이템
content.liquid.name=액체
content.unit-type.name=종류
content.recipe.name=블록
item.stone.name=
item.stone.description=흔히 찾을 수 있는 자원. 바닥에서 돌을 캐거나 용암을 사용하여 얻을 수 있습니다.
item.tungsten.name=텅스텐
@ -363,12 +356,10 @@ item.blast-compound.name=폭발 화합물
item.blast-compound.description=폭탄 및 폭발물에 사용되는 휘발성 화합물. 이 연료로 불을 낼 수 있지만, 별로 추천하지는 않습니다.
item.pyratite.name=피러레이트
item.pyratite.description=화염 무기에 사용되는 엄청난 가연성 물질.
liquid.water.name=
liquid.lava.name=용암
liquid.oil.name=석유
liquid.cryofluid.name=냉각수
text.item.explosiveness=[LIGHT_GRAY]폭발력:{0}
text.item.flammability=[LIGHT_GRAY]인화성:{0}
text.item.radioactivity=[LIGHT_GRAY]방사능:{0}
@ -377,7 +368,6 @@ text.item.hardness=[LIGHT_GRAY]강도:{0}
text.liquid.heatcapacity=[LIGHT_GRAY]발열량:{0}
text.liquid.viscosity=[LIGHT_GRAY]점도:{0}
text.liquid.temperature=[LIGHT_GRAY]온도:{0}
block.deepwater.name=깊은물
block.water.name=
block.lava.name=용암
@ -485,10 +475,8 @@ block.liquid-junction.name=액체 교차기
block.bridge-conduit.name=다리 파이프
block.rotary-pump.name=동력 펌프
block.nuclear-reactor.name=원자로
text.save.old=이 저장파일은 이전 버전의 게임용이며, 지금은 사용할 수 없습니다. \n\n[LIGHT_GRAY]4.0 정식때 이전 게임버전에서 만든 저장파일과 호환됩니다.
text.customgame=커스텀 게임
text.campaign=캠페인
text.sectors=구역
text.sector=선택된 구역:[LIGHT_GRAY]{0}
text.sector.time=시간:[LIGHT_GRAY]{0}
@ -503,13 +491,10 @@ text.credits.text=Created by [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[]\n\n[GR
text.sector.gameover=이 구역을 잃었습니다. 다시 배치하시겠습니까?
text.sector.retry=다시할꺼임
text.wave.lasted=[accent]{0}[] 까지 버티셨습니다.
setting.fpscap.name=최대 FPS
setting.fpscap.none=없음
setting.fpscap.text={0} FPS
block.command-center.name=명령 본부
text.mission=목표:[LIGHT_GRAY] {0}
text.mission.wave=[accent]{0}[]단계가 될때까지 생존하세요.
text.mission.battle=적 본부를 파괴하세요.
@ -520,20 +505,16 @@ text.mission.complete.body=구역 {0},{1} 탐색 성공.
text.mission.resource=Obtain {0} x{1}
text.unit.health=[LIGHT_GRAY]체력:{0}
text.unit.speed=[LIGHT_GRAY]속도:{0}
block.drone-pad.name=드론 공장
block.fabricator-pad.name=페버 공장
block.interceptor-pad.name=인터셉터 공장
block.monsoon-pad.name=문순 공장
block.mass-driver.name=물질 이동기
block.blast-drill.name=고속 발열 드릴
unit.drone.name=드론
unit.drone.description=초기형 드론 유닛입니다. 기본적으로 코어에서 1대를 스폰합니다. 자동으로 아이템을 수집/채광하며 블럭들을 수리합니다.
unit.fabricator.name=페버
unit.fabricator.description=고급 드론 유닛입니다. 자동으로 아이템과 수집/채광/블록들을 수리하며, 일반 드론보다 더 빠르게 작업할 수 있습니다.
unit.scout.name=스카웃
unit.scout.description=기본 지상 유닛입니다. 납을 탄약으로 사용합니다.
unit.titan.name=타이탄
unit.titan.description=고급 지상 유닛입니다. 합금을 탄약으로 사용하며 지상과 공중 둘다 공격할 수 있습니다.
unit.monsoon.name=문순
@ -542,9 +523,19 @@ unit.interceptor.name=인터셉터
unit.interceptor.description=빠르고, 공격하고 튀는 방식을 사용합니다. 납을 탄약으로 사용합니다.
unit.dagger.name=디거
unit.dagger.description=기본 지상 유닛입니다. 스웜과 같이 쓰면 유용합니다.
mode.sandbox.warning=Note that blocks cannot be used in sandbox mode until they are unlocked in other modes.\n\n[LIGHT_GRAY]If you have not unlocked any blocks, none will appear.
block.thermal-pump.name=지열 펌프
block.dagger-pad.name=디거 공장
block.titan-pad.name=타이탄 공장
block.thermal-generator.name=지열 발전기
block.thermal-generator.name=지열 발전기
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
setting.difficulty.purge=purge
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View file

@ -16,7 +16,6 @@ text.players.single={0} gracz online
text.server.mismatch=Błąd pakietu: możliwa niezgodność wersji klienta/serwera.\nUpewnij się, że Ty i host macie najnowszą wersję Mindustry!
text.server.closing=[accent] Zamykanie serwera ...
text.server.kicked.kick=Zostałeś wyrzucony z serwera!
text.server.kicked.invalidPassword=Nieprawidłowe hasło!
text.server.kicked.clientOutdated=Nieaktualna gra! Zaktualizują ją!
text.server.kicked.serverOutdated=Nieaktualna gra! Zaktualizują ją!
text.hostserver=Stwórz Serwer
@ -462,7 +461,6 @@ block.rotary-pump.name=Wirowa Pompa
block.nuclear-reactor.name=Reaktor Nuklearny
text.save.old=Ten zapis jest ze starej wersji i gra nie może go teraz wczytać.\n\n[LIGHT_GRAY]Wsparcie starych zapisów będzie w pełnej wersji 4.0.
text.customgame=Własna Gra
text.campaign=Kampania
text.sectors=Sektory
text.sector=Wybrany Sektor: [LIGHT_GRAY]{0}
text.sector.time=Czas: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -162,7 +162,6 @@ text.server.mismatch=Packet error: Versão do Cliente/Servidor Incompativel.\nTe
text.server.closing=[accent]Fechando servidor...
text.server.kicked.kick=Voce foi expulso do servidor!
text.server.kicked.fastShoot=Voce esta atirando rapido demais.
text.server.kicked.invalidPassword=Senha Incorreta!
text.server.kicked.clientOutdated=Cliente desatualizado! Atualize seu jogo!
text.server.kicked.serverOutdated=Servidor desatualiado! Peca ao dono para atualizar!
text.server.kicked.banned=Voce foi banido do servidor.
@ -463,7 +462,6 @@ block.rotary-pump.name=Bomba Rotatoria
block.nuclear-reactor.name=Reator Nuclear
text.save.old=Este save é para uma versão antiga do jogo, E não pode ser usado.\n\n[LIGHT_GRAY]Salvar Versões antigas vai ser Implementado Na versão 4.0 completa
text.customgame=Jogo Customizado
text.campaign=Campanha
text.sectors=Setores
text.sector=Setor Selecionado: [LIGHT_GRAY]{0}
text.sector.time=Tempo: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -33,7 +33,6 @@ text.loadgame=Загрузить игру
text.joingame=Присоединиться
text.addplayers=Доб/удалить игроков
text.customgame=Пользовательская игра
text.campaign=Кампания
text.sectors=Секторы
text.sector=Выбранный сектор: [LIGHT_GRAY]{0}
text.sector.time=Время: [LIGHT_GRAY]{0}
@ -64,7 +63,9 @@ text.server.mismatch=Ошибка пакета: возможное несоот
text.server.closing=[accent]Закрытие сервера...
text.server.kicked.kick=Вас выгнали с сервера!
text.server.kicked.fastShoot=Вы стреляете слишком быстро.
text.server.kicked.invalidPassword=Неверный пароль.
text.server.kicked.serverClose=Сервер закрыт.
text.server.kicked.sectorComplete=Сектор завершён.
text.server.kicked.sectorComplete.text=Ваша миссия завершена.\nТеперь сервер продолжит работу в следующем секторе.
text.server.kicked.clientOutdated=Устаревший клиент! Обновите игру!
text.server.kicked.serverOutdated=Устаревший сервер! Попросите хост обновить!
text.server.kicked.banned=Вы заблокированы на этом сервере.
@ -337,6 +338,9 @@ setting.mutemusic.name=Заглушить музыку
setting.sfxvol.name=Громкость звуковых эффектов
setting.mutesound.name=Заглушить звук
text.keybind.title=Переназначить клавиши
section.general.name=Oснoвнoe
section.view.name=Прoсмoтр
section.multiplayer.name=Мультиплеер
keybind.move_x.name=Движение x
keybind.move_y.name=Движение y
keybind.select.name=выбрать
@ -535,3 +539,9 @@ unit.monsoon.name=Муссон
unit.monsoon.description=Тяжелый ковровый бомбардировщик. Использует взрывоопасное соединение или пиратит в качестве боеприпасов.
unit.interceptor.name=Истребитель-перехватчик
unit.interceptor.description=Быстрая и ударная боевая единица, которая использует набег с отскоком.
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View file

@ -26,7 +26,6 @@ text.players.single={0} Oyuncu Çevrimiçi
text.server.mismatch=Paket hatası: olası istemci / sunucu sürümü uyuşmazlığı. Siz ve ev sahibi Mindustry'nin en son sürümüne sahip olduğunuzdan emin olun!
text.server.closing=[accent] Sunucu kapatılıyor ...
text.server.kicked.kick=Sunucudan kovuldun!
text.server.kicked.invalidPassword=Geçersiz şifre!
text.server.kicked.clientOutdated=Oyun sürümünüz geçerli değil. Oyununu güncelleyin!
text.server.kicked.serverOutdated=Eski sunucu! Ev sahibinden güncellemesini isteyin!
text.server.kicked.banned=Bu sunucudan yasaklandınız.
@ -464,7 +463,6 @@ block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.save.old=This save is for an older version of the game, and can no longer be used.\n\n[LIGHT_GRAY]Save backwards compatibility will be implemented in the full 4.0 release.
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -22,9 +22,9 @@ text.map.delete=Ви впевнені, що хочете видалити кар
text.level.select=Вибір рівня
text.level.mode=Ігровий режим:
text.construction.title=Block Construction Guide
text.construction=\You've just selected [accent]block construction mode[].\n\n\To begin placing, simply tap a valid location near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Shift the selection[] by holding and dragging any block in the selection.\n\- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.construction=You've just selected [accent]block construction mode[].\n\nTo begin placing, simply tap a valid location near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin constructing them.\n\\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Shift the selection[] by holding and dragging any block in the selection.\n- [accent]Place blocks in a line[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel construction or selection[] by pressing the X at the bottom left.
text.deconstruction.title=Block Deconstruction Guide
text.deconstruction=\You've just selected [accent]block deconstruction mode[].\n\n\To begin breaking, simply tap a block near your ship.\n\Once you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\\n\- [accent]Remove blocks[] from your selection by tapping them.\n\- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n\- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.deconstruction=You've just selected [accent]block deconstruction mode[].\n\nTo begin breaking, simply tap a block near your ship.\nOnce you have selected some blocks, press the checkbox to confirm, and your ship will begin de-constructing them.\n\\n- [accent]Remove blocks[] from your selection by tapping them.\n- [accent]Remove blocks in an area[] by tapping and holding an empty spot, then dragging in a direction.\n- [accent]Cancel deconstruction or selection[] by pressing the X at the bottom left.
text.showagain=Не показувати знову до наступного сеансу
text.coreattack=< Ядро під атакою! >
text.unlocks=Разблоковане
@ -535,3 +535,7 @@ unit.monsoon.name=Мусон
unit.monsoon.description=Важкий килимовий бомбардувальник. Використовує вибухонебезпечну речовину або піратит як боєприпаси.
unit.interceptor.name=Винищувач-перехполювач
unit.interceptor.description=Швидка, ударна бойова одиниця, котра використовує набіг з відскоком
text.settings.language=Language
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer

View file

@ -32,7 +32,6 @@ text.loadgame=载入游戏
text.joingame=加入游戏
text.addplayers=增加/删除玩家
text.customgame=自定义游戏
text.campaign=战役
text.sectors=区域
text.sector=区域: [LIGHT_GRAY]{0}
text.sector.time=时间: [LIGHT_GRAY]{0}
@ -59,7 +58,6 @@ text.server.mismatch=Packet error: 可能是客户端/服务器版本不匹配\n
text.server.closing=[accent]正在关闭服务器...
text.server.kicked.kick=你被踢出服务器了!
text.server.kicked.fastShoot=你发射得太快了!
text.server.kicked.invalidPassword=无效的密码!
text.server.kicked.clientOutdated=客户端版本过旧!请升级!
text.server.kicked.serverOutdated=服务器版本过旧!请联系房主升级!
text.server.kicked.banned=你被这个服务器拉黑了。
@ -497,8 +495,6 @@ unit.drone.name=无人机
unit.drone.description=初始的无人机单位.自动在核心生成,自动采矿,收集物品,修复方块
unit.fabricator.name=装配工
unit.fabricator.description=高级无人机单位,自动采矿,收集物品和修复方块.比普通无人机快很多.
unit.scout.name=侦察机
unit.scout.description=基础地面单位,使用钨作为弹药.
unit.titan.name=泰坦
unit.titan.description=高级的有武装地面单位,使用电石作为弹药.攻击地面单位和空中单位.
unit.monsoon.name=狂风
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

View file

@ -27,7 +27,6 @@ text.server.mismatch=封包錯誤:客戶端與伺服器版本可能不相符
text.server.closing=[accent] 正在關閉伺服器...
text.server.kicked.kick=您已被踢出伺服器!
text.server.kicked.fastShoot=您射擊的太快了!
text.server.kicked.invalidPassword=密碼無效!
text.server.kicked.clientOutdated=客戶端版本過舊!請更新遊戲!
text.server.kicked.serverOutdated=伺服器版本過舊!請聯絡伺服主更新伺服器!
text.server.kicked.banned=您已經從這個伺服器被封禁。
@ -464,7 +463,6 @@ block.bridge-conduit.name=Bridge Conduit
block.rotary-pump.name=Rotary Pump
block.nuclear-reactor.name=Nuclear Reactor
text.customgame=Custom Game
text.campaign=Campaign
text.sectors=Sectors
text.sector=Selected Sector: [LIGHT_GRAY]{0}
text.sector.time=Time: [LIGHT_GRAY]{0}
@ -503,8 +501,6 @@ unit.drone.name=Drone
unit.drone.description=The starter drone unit. Spawns in the core by default. Automatically mines ores, collects items and repairs blocks.
unit.fabricator.name=Fabricator
unit.fabricator.description=An advanced drone unit. Automatically mines ores, collects items and repairs blocks. Significantly more effective than a drone.
unit.scout.name=Scout
unit.scout.description=A basic ground unit. Uses lead as ammo.
unit.titan.name=Titan
unit.titan.description=An advanced armored ground unit. Uses carbide as ammo. Attacks both ground and air targets.
unit.monsoon.name=Monsoon
@ -516,3 +512,30 @@ block.thermal-pump.name=Thermal Pump
block.dagger-pad.name=Dagger Pad
block.titan-pad.name=Titan Pad
block.thermal-generator.name=Thermal Generator
text.coreattack=< Core is under attack! >
text.continue=Continue
text.nextmission=Next Mission
text.server.kicked.serverClose=Server closed.
text.server.kicked.sectorComplete=Sector completed.
text.server.kicked.sectorComplete.text=Your mission is complete.\nThe server will now continue at the next sector.
text.map.invalid=Error loading map: corrupted or invalid map file.
section.general.name=General
section.view.name=View
section.multiplayer.name=Multiplayer
block.deepwater.name=deepwater
block.water.name=water
block.lava.name=lava
block.oil.name=oil
block.blackstone.name=blackstone
block.stone.name=stone
block.dirt.name=dirt
block.sand.name=sand
block.ice.name=ice
block.snow.name=snow
block.grass.name=grass
block.shrub.name=shrub
block.rock.name=rock
block.blackrock.name=blackrock
block.icerock.name=icerock
unit.dagger.name=Dagger
unit.dagger.description=A basic ground unit. Useful in swarms.

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Before After
Before After

View file

@ -142,7 +142,6 @@ public class Recipes implements ContentList{
new Recipe(units, UnitBlocks.monsoonPad, new ItemStack(Items.plastanium, 80), new ItemStack(Items.titanium, 100), new ItemStack(Items.lead, 130), new ItemStack(Items.silicon, 220)).setMode(GameMode.noWaves);
new Recipe(units, UnitBlocks.repairPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.resupplyPoint, new ItemStack(Items.lead, 30), new ItemStack(Items.tungsten, 30), new ItemStack(Items.silicon, 30));
new Recipe(units, UnitBlocks.commandCenter, new ItemStack(Items.lead, 100), new ItemStack(Items.carbide, 100), new ItemStack(Items.silicon, 200)).setMode(GameMode.noWaves);
//LIQUIDS

View file

@ -19,7 +19,7 @@ public class Weapons implements ContentList{
reload = 15f;
roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletLead);
ammo = AmmoTypes.bulletLead;
}};
missiles = new Weapon("missiles"){{
@ -30,7 +30,7 @@ public class Weapons implements ContentList{
roundrobin = false;
roundrobin = true;
ejectEffect = Fx.none;
setAmmo(AmmoTypes.weaponMissile);
ammo = AmmoTypes.weaponMissile;
}};
chainBlaster = new Weapon("chain-blaster"){{
@ -38,7 +38,7 @@ public class Weapons implements ContentList{
reload = 28f;
roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletLead, AmmoTypes.bulletCarbide, AmmoTypes.bulletTungsten, AmmoTypes.bulletSilicon, AmmoTypes.bulletThorium);
ammo = AmmoTypes.bulletLead;
}};
shockgun = new Weapon("shockgun"){{
@ -50,7 +50,7 @@ public class Weapons implements ContentList{
recoil = 2f;
velocityRnd = 0.7f;
ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.shotgunTungsten);
ammo = AmmoTypes.shotgunTungsten;
}};
flakgun = new Weapon("flakgun"){{
@ -62,7 +62,7 @@ public class Weapons implements ContentList{
recoil = 3f;
velocityRnd = 0.1f;
ejectEffect = ShootFx.shellEjectMedium;
setAmmo(AmmoTypes.shellCarbide);
ammo = AmmoTypes.shellCarbide;
}};
flamethrower = new Weapon("flamethrower"){{
@ -71,7 +71,7 @@ public class Weapons implements ContentList{
roundrobin = true;
recoil = 1f;
ejectEffect = Fx.none;
setAmmo(AmmoTypes.flamerThermite);
ammo = AmmoTypes.flamerThermite;
}};
sapper = new Weapon("sapper"){{
@ -79,7 +79,7 @@ public class Weapons implements ContentList{
reload = 12f;
roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletCarbide);
ammo = AmmoTypes.bulletCarbide;
}};
swarmer = new Weapon("swarmer"){{
@ -87,7 +87,7 @@ public class Weapons implements ContentList{
reload = 10f;
roundrobin = true;
ejectEffect = ShootFx.shellEjectSmall;
setAmmo(AmmoTypes.bulletPyratite);
ammo = AmmoTypes.bulletPyratite;
}};
bomber = new Weapon("bomber"){{
@ -98,7 +98,7 @@ public class Weapons implements ContentList{
ejectEffect = Fx.none;
velocityRnd = 1f;
inaccuracy = 40f;
setAmmo(AmmoTypes.bombExplosive, AmmoTypes.bombIncendiary, AmmoTypes.bombOil);
ammo = AmmoTypes.bombExplosive;
}};
}

View file

@ -106,7 +106,7 @@ public class Blocks extends BlockList implements ContentList{
stone = new Floor("stone"){{
hasOres = true;
drops = new ItemStack(Items.stone, 1);
blends = block -> block != this && !(block instanceof Ore);
blends = block -> block != this && !(block instanceof OreBlock);
minimapColor = Color.valueOf("323232");
playerUnmineable = true;
}};

View file

@ -8,7 +8,7 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.blocks.units.*;
public class UnitBlocks extends BlockList implements ContentList{
public static Block resupplyPoint, repairPoint, dronePad,
public static Block repairPoint, dronePad,
fabricatorPad, interceptorPad, monsoonPad, daggerPad, titanPad,
dropPoint, reconstructor, overdriveProjector, shieldProjector, commandCenter;
@ -64,11 +64,6 @@ public class UnitBlocks extends BlockList implements ContentList{
consumes.items(new ItemStack[]{new ItemStack(Items.silicon, 20), new ItemStack(Items.thorium, 30)});
}};
resupplyPoint = new ResupplyPoint("resupply-point"){{
shadow = "shadow-round-1";
itemCapacity = 30;
}};
dropPoint = new DropPoint("drop-point"){{
shadow = "shadow-round-1";
itemCapacity = 40;

View file

@ -473,6 +473,9 @@ public class NetServer extends Module{
}
String fixName(String name){
if(name.equals("[") || name.equals("]")){
return "";
}
for(int i = 0; i < name.length(); i++){
if(name.charAt(i) == '[' && i != name.length() - 1 && name.charAt(i + 1) != '[' && (i == 0 || name.charAt(i - 1) != '[')){

View file

@ -331,8 +331,8 @@ public class Renderer extends RendererModule{
Graphics.beginShaders(Shaders.outline);
Graphics.shader(Shaders.mix, true);
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead());
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team);
drawAndInterpolate(unitGroups[team.ordinal()], u -> u.isFlying() == flying && !u.isDead(), Unit::drawAll);
drawAndInterpolate(playerGroup, p -> p.isFlying() == flying && p.getTeam() == team, Unit::drawAll);
Graphics.shader();
blocks.drawTeamBlocks(Layer.turret, team);
Graphics.endShaders();

View file

@ -363,6 +363,10 @@ public class World extends Module{
return null;
}
public void raycastEachWorld(float x0, float y0, float x1, float y1, Raycaster cons){
raycastEach(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons);
}
public void raycastEach(int x0f, int y0f, int x1, int y1, Raycaster cons){
int x0 = x0f;
int y0 = y0f;

View file

@ -6,6 +6,7 @@ import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.bullets.TurretBullets;
import io.anuke.mindustry.content.fx.ExplosionFx;
import io.anuke.mindustry.content.fx.Fx;
import io.anuke.mindustry.entities.bullet.Bullet;
import io.anuke.mindustry.entities.effect.Fire;
import io.anuke.mindustry.entities.effect.Lightning;
import io.anuke.mindustry.game.Team;
@ -15,7 +16,6 @@ import io.anuke.mindustry.world.Tile;
import io.anuke.ucore.core.Effects;
import io.anuke.ucore.core.Effects.Effect;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.entities.impl.SolidEntity;
import io.anuke.ucore.function.Consumer;
import io.anuke.ucore.function.Predicate;
import io.anuke.ucore.util.Mathf;
@ -84,8 +84,17 @@ public class Damage{
* Damages entities in a line.
* Only enemies of the specified team are damaged.
*/
public static void collideLine(SolidEntity hitter, Team team, Effect effect, float x, float y, float angle, float length){
public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length){
tr.trns(angle, length);
world.raycastEachWorld(x, y, x + tr.x, y + tr.y, (cx, cy) -> {
Tile tile = world.tile(cx, cy);
if(tile != null && tile.entity != null && tile.entity.collide(hitter)){
tile.entity.collision(hitter);
Effects.effect(effect, tile.worldx(), tile.worldy());
}
return false;
});
rect.setPosition(x, y).setSize(tr.x, tr.y);
float x2 = tr.x + x, y2 = tr.y + y;

View file

@ -129,11 +129,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
return mech.itemCapacity;
}
@Override
public int getAmmoCapacity(){
return mech.ammoCapacity;
}
@Override
public void interpolate(){
super.interpolate();
@ -187,21 +182,11 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
return mech.armor;
}
@Override
public boolean acceptsAmmo(Item item){
return mech.weapon.getAmmoType(item) != null && inventory.canAcceptAmmo(mech.weapon.getAmmoType(item));
}
@Override
public void added(){
baseRotation = 90f;
}
@Override
public void addAmmo(Item item){
inventory.addAmmo(mech.weapon.getAmmoType(item));
}
@Override
public float getMass(){
return mech.mass;
@ -273,6 +258,23 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
Draw.rect(mech.iconRegion, x , y, rotation - 90);
}
@Override
public void drawAll(){
boolean snap = snapCamera && isLocal;
float px = x, py = y;
if(snap){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
super.drawAll();
x = px;
y = py;
}
@Override
public void draw(){
if((debug && (!showPlayer || !showUI)) || dead) return;
@ -284,15 +286,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
boostHeat = Mathf.lerpDelta(boostHeat, isBoosting && ((!movement.isZero() && moved) || !isLocal) ? 1f : 0f, 0.08f);
boolean snap = snapCamera && isLocal;
float px = x, py = y;
if(snap){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
float ft = Mathf.sin(walktime, 6f, 2f) * (1f - boostHeat);
Floor floor = getFloorOn();
@ -351,9 +344,6 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
Draw.alpha(1f);
x = px;
y = py;
}
@Override
@ -620,20 +610,20 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
y += Mathf.cos(Timers.time() + id * 999, 25f, 0.08f);
//update shooting if not building, not mining and there's ammo left
if(!isBuilding() && inventory.hasAmmo() && getMineTile() == null){
if(!isBuilding() && getMineTile() == null){
//autofire: mobile only!
if(mobile){
if(target == null){
isShooting = false;
target = Units.getClosestTarget(team, x, y, inventory.getAmmoRange());
target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
}else if(target.isValid()){
//rotate toward and shoot the target
rotation = Mathf.slerpDelta(rotation, angleTo(target), 0.2f);
Vector2 intercept =
Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, inventory.getAmmo().bullet.speed);
Predict.intercept(x, y, target.getX(), target.getY(), target.getVelocity().x - velocity.x, target.getVelocity().y - velocity.y, getWeapon().getAmmo().bullet.speed);
pointerX = intercept.x;
pointerY = intercept.y;
@ -677,7 +667,7 @@ public class Player extends Unit implements BuilderTrait, CarryTrait, ShooterTra
}
public boolean isShooting(){
return isShooting && inventory.hasAmmo() && (!isBoosting || mech.flying);
return isShooting && (!isBoosting || mech.flying);
}
public void updateRespawning(){

View file

@ -1,5 +1,6 @@
package io.anuke.mindustry.entities;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.content.blocks.Blocks;
@ -8,8 +9,8 @@ import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.net.Interpolator;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.ucore.core.Effects;
@ -33,17 +34,11 @@ import static io.anuke.mindustry.Vars.state;
import static io.anuke.mindustry.Vars.world;
public abstract class Unit extends DestructibleEntity implements SaveTrait, TargetTrait, SyncTrait, DrawTrait, TeamTrait, CarriableTrait, InventoryTrait{
/**
* total duration of hit flash effect
*/
/**Total duration of hit flash effect*/
public static final float hitDuration = 9f;
/**
* Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks.
*/
/**Percision divisor of velocity, used when writing. For example a value of '2' would mean the percision is 1/2 = 0.5-size chunks.*/
public static final float velocityPercision = 8f;
/**
* Maximum absolute value of a velocity vector component.
*/
/**Maximum absolute value of a velocity vector component.*/
public static final float maxAbsVelocity = 127f / velocityPercision;
private static final Vector2 moveVector = new Vector2();
@ -300,16 +295,30 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
}
}
public float getAmmoFraction(){
return inventory.totalAmmo() / (float) inventory.ammoCapacity();
}
public void drawUnder(){
}
public void drawOver(){
}
public void drawStats(){
Draw.color(Color.BLACK, team.color, healthf() + Mathf.absin(Timers.time(), healthf()*5f, 1f - healthf()));
Draw.alpha(hitTime);
Draw.rect(getPowerCellRegion(), x, y, rotation - 90);
Draw.color();
}
public TextureRegion getPowerCellRegion(){
return Draw.region("power-cell");
}
public void drawAll(){
if(!isDead()){
draw();
drawStats();
}
}
public void drawShadow(){
Draw.rect(getIconRegion(), x , y, rotation - 90);
}
@ -318,26 +327,18 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ
Fill.circle(x, y, getViewDistance());
}
public boolean isInfiniteAmmo(){
return false;
}
public float getViewDistance(){
return 135f;
}
public abstract TextureRegion getIconRegion();
public abstract Weapon getWeapon();
public abstract int getItemCapacity();
public abstract int getAmmoCapacity();
public abstract float getArmor();
public abstract boolean acceptsAmmo(Item item);
public abstract void addAmmo(Item item);
public abstract float getMass();
public abstract boolean isFlying();

View file

@ -1,10 +1,7 @@
package io.anuke.mindustry.entities;
import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.traits.Saveable;
import io.anuke.mindustry.type.AmmoEntry;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
@ -14,8 +11,6 @@ import java.io.IOException;
public class UnitInventory implements Saveable{
private final Unit unit;
private Array<AmmoEntry> ammos = new Array<>();
private int totalAmmo;
private ItemStack item = new ItemStack(Items.stone, 0);
public UnitInventory(Unit unit){
@ -30,90 +25,19 @@ public class UnitInventory implements Saveable{
public void writeSave(DataOutput stream) throws IOException{
stream.writeShort(item.amount);
stream.writeByte(item.item.id);
stream.writeShort(totalAmmo);
stream.writeByte(ammos.size);
for(int i = 0; i < ammos.size; i++){
stream.writeByte(ammos.get(i).type.id);
stream.writeShort(ammos.get(i).amount);
}
}
@Override
public void readSave(DataInput stream) throws IOException{
short iamount = stream.readShort();
byte iid = stream.readByte();
this.totalAmmo = stream.readShort();
byte ammoa = stream.readByte();
for(int i = 0; i < ammoa; i++){
byte aid = stream.readByte();
int am = stream.readShort();
ammos.add(new AmmoEntry(AmmoType.getByID(aid), am));
}
item.item = Item.getByID(iid);
item.amount = iamount;
}
/**
* Returns ammo range, or MAX_VALUE if this inventory has no ammo.
*/
public float getAmmoRange(){
return hasAmmo() ? getAmmo().getRange() : Float.MAX_VALUE;
}
public AmmoType getAmmo(){
return ammos.size == 0 ? null : ammos.peek().type;
}
public boolean hasAmmo(){
return totalAmmo > 0;
}
public void useAmmo(){
if(unit.isInfiniteAmmo()) return;
AmmoEntry entry = ammos.peek();
entry.amount--;
if(entry.amount == 0) ammos.pop();
totalAmmo--;
}
public int totalAmmo(){
return totalAmmo;
}
public int ammoCapacity(){
return unit.getAmmoCapacity();
}
public boolean canAcceptAmmo(AmmoType type){
return totalAmmo + type.quantityMultiplier <= unit.getAmmoCapacity();
}
public void addAmmo(AmmoType type){
if(type == null) return;
totalAmmo += type.quantityMultiplier;
//find ammo entry by type
for(int i = ammos.size - 1; i >= 0; i--){
AmmoEntry entry = ammos.get(i);
//if found, put it to the right
if(entry.type == type){
entry.amount += type.quantityMultiplier;
ammos.swap(i, ammos.size - 1);
return;
}
}
//must not be found
AmmoEntry entry = new AmmoEntry(type, (int) type.quantityMultiplier);
ammos.add(entry);
}
public void fillAmmo(AmmoType type){
totalAmmo = ammoCapacity();
ammos.clear();
ammos.add(new AmmoEntry(type, ammoCapacity()));
public void clear(){
item.amount = 0;
}
public int capacity(){
@ -140,12 +64,6 @@ public class UnitInventory implements Saveable{
return (!hasItem() && amount <= unit.getItemCapacity()) || (item.item == type && item.amount + amount <= unit.getItemCapacity());
}
public void clear(){
item.amount = 0;
ammos.clear();
totalAmmo = 0;
}
public void clearItem(){
item.amount = 0;
}

View file

@ -51,7 +51,7 @@ public class Units{
* See {@link #invalidateTarget(TargetTrait, Team, float, float, float)}
*/
public static boolean invalidateTarget(TargetTrait target, Unit targeter){
return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.inventory.getAmmoRange());
return invalidateTarget(target, targeter.team, targeter.x, targeter.y, targeter.getWeapon().getAmmo().getRange());
}
/**

View file

@ -13,41 +13,23 @@ public abstract class BulletType extends BaseBulletType<Bullet> implements Conte
private static Array<BulletType> types = new Array<>();
public final int id;
/**
* Knockback in velocity.
*/
/**Knockback in velocity.*/
public float knockback;
/**
* Whether this bullet hits tiles.
*/
/**Whether this bullet hits tiles.*/
public boolean hitTiles = true;
/**
* Status effect applied on hit.
*/
/**Status effect applied on hit.*/
public StatusEffect status = StatusEffects.none;
/**
* Intensity of applied status effect in terms of duration.
*/
/**Intensity of applied status effect in terms of duration.*/
public float statusIntensity = 0.5f;
/**
* What fraction of armor is pierced, 0-1
*/
/**What fraction of armor is pierced, 0-1*/
public float armorPierce = 0f;
/**
* Whether to sync this bullet to clients.
*/
/**Whether to sync this bullet to clients.*/
public boolean syncable;
/**
* Whether this bullet type collides with tiles.
*/
/**Whether this bullet type collides with tiles.*/
public boolean collidesTiles = true;
/**
* Whether this bullet types collides with anything at all.
*/
/**Whether this bullet types collides with anything at all.*/
public boolean collides = true;
/**
* Whether velocity is inherited from the shooter.
*/
/**Whether velocity is inherited from the shooter.*/
public boolean keepVelocity = true;
public BulletType(float speed, float damage){

View file

@ -34,14 +34,6 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{
public ItemTransfer(){
}
@Remote(called = Loc.server, unreliable = true)
public static void transferAmmo(Item item, float x, float y, Unit to){
if(to == null) return;
to.addAmmo(item);
create(item, x, y, to, () -> {
});
}
@Remote(called = Loc.server, unreliable = true)
public static void transferItemEffect(Item item, float x, float y, Unit to){
if(to == null) return;

View file

@ -19,7 +19,6 @@ import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile;
@ -185,7 +184,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
}
public void targetClosest(){
target = Units.getClosestTarget(team, x, y, inventory.getAmmoRange());
target = Units.getClosestTarget(team, x, y, getWeapon().getAmmo().getRange());
}
public TileEntity getClosestEnemyCore(){
@ -253,16 +252,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type.itemCapacity;
}
@Override
public int getAmmoCapacity(){
return type.ammoCapacity;
}
@Override
public boolean isInfiniteAmmo(){
return isWave;
}
@Override
public void interpolate(){
super.interpolate();
@ -282,16 +271,6 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{
return type.armor;
}
@Override
public boolean acceptsAmmo(Item item){
return getWeapon().getAmmoType(item) != null && inventory.canAcceptAmmo(getWeapon().getAmmoType(item));
}
@Override
public void addAmmo(Item item){
inventory.addAmmo(getWeapon().getAmmoType(item));
}
@Override
public float getSize(){
return 8;

View file

@ -28,22 +28,6 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
protected CarriableTrait carrying;
protected final UnitState
resupply = new UnitState(){
public void entered(){
target = null;
}
public void update(){
if(inventory.totalAmmo() + 10 >= inventory.ammoCapacity()){
state.set(attack);
}else if(!targetHasFlag(BlockFlag.resupplyPoint)){
retarget(() -> targetClosestAllyFlag(BlockFlag.resupplyPoint));
}else{
circle(20f);
}
}
},
idle = new UnitState(){
public void update(){
if(!isCommanded()){
@ -75,9 +59,7 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
target = null;
}
if(!inventory.hasAmmo()){
state.set(resupply);
}else if(target == null){
if(target == null){
retarget(() -> {
targetClosest();
if(target == null) targetClosestEnemyFlag(BlockFlag.target);
@ -91,10 +73,9 @@ public abstract class FlyingUnit extends BaseUnit implements CarryTrait{
}else{
attack(150f);
if((Mathf.angNear(angleTo(target), rotation, 15f) || !inventory.getAmmo().bullet.keepVelocity) //bombers don't care about rotation
&& distanceTo(target) < inventory.getAmmo().getRange()){
AmmoType ammo = inventory.getAmmo();
inventory.useAmmo();
if((Mathf.angNear(angleTo(target), rotation, 15f) || !getWeapon().getAmmo().bullet.keepVelocity) //bombers don't care about rotation
&& distanceTo(target) < getWeapon().getAmmo().getRange()){
AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(FlyingUnit.this, target, ammo.bullet.speed);

View file

@ -12,11 +12,9 @@ import io.anuke.mindustry.type.Upgrade;
import io.anuke.mindustry.type.Weapon;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.Floor;
import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.Geometry;
import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator;
@ -35,24 +33,6 @@ public abstract class GroundUnit extends BaseUnit{
public final UnitState
resupply = new UnitState(){
public void entered(){
target = null;
}
public void update(){
Tile tile = Geometry.findClosest(x, y, world.indexer().getAllied(team, BlockFlag.resupplyPoint));
if(tile != null && distanceTo(tile) > 40){
moveAwayFromCore();
}
//TODO move toward resupply point
if(isWave || inventory.totalAmmo() + 10 >= inventory.ammoCapacity()){
state.set(attack);
}
}
},
attack = new UnitState(){
public void entered(){
target = null;
@ -62,17 +42,15 @@ public abstract class GroundUnit extends BaseUnit{
TileEntity core = getClosestEnemyCore();
float dst = core == null ? 0 : distanceTo(core);
if(core != null && inventory.hasAmmo() && dst < inventory.getAmmo().getRange() / 1.1f){
if(core != null && dst < getWeapon().getAmmo().getRange() / 1.1f){
target = core;
}else{
retarget(() -> targetClosest());
}
if(!inventory.hasAmmo()){
state.set(resupply);
}else if(target != null){
if(target != null){
if(core != null){
if(dst > inventory.getAmmo().getRange() * 0.5f){
if(dst > getWeapon().getAmmo().getRange() * 0.5f){
moveToCore();
}
@ -80,11 +58,11 @@ public abstract class GroundUnit extends BaseUnit{
moveToCore();
}
if(distanceTo(target) < inventory.getAmmo().getRange()){
if(distanceTo(target) < getWeapon().getAmmo().getRange()){
rotate(angleTo(target));
if(Mathf.angNear(angleTo(target), rotation, 13f)){
AmmoType ammo = inventory.getAmmo();
AmmoType ammo = getWeapon().getAmmo();
Vector2 to = Predict.intercept(GroundUnit.this, target, ammo.bullet.speed);
@ -143,14 +121,14 @@ public abstract class GroundUnit extends BaseUnit{
@Override
public UnitState getStartState(){
return resupply;
return attack;
}
@Override
public void update(){
super.update();
if(!velocity.isZero(0.0001f) && (target == null || !inventory.hasAmmo() || (inventory.hasAmmo() && distanceTo(target) > inventory.getAmmoRange()))){
if(!velocity.isZero(0.0001f) && (target == null || (distanceTo(target) > getWeapon().getAmmo().getRange()))){
rotation = Mathf.slerpDelta(rotation, velocity.angle(), 0.2f);
}
}

View file

@ -3,6 +3,7 @@ package io.anuke.mindustry.entities.units;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.content.Items;
import io.anuke.mindustry.entities.effect.ItemDrop;
import io.anuke.mindustry.game.Team;
import io.anuke.mindustry.type.Item;
import io.anuke.ucore.util.Mathf;
@ -11,7 +12,7 @@ public class UnitDrops{
private static Item[] dropTable;
public static void dropItems(BaseUnit unit){
if(Vars.itemGroup.size() > maxItems){
if(Vars.itemGroup.size() > maxItems || unit.getTeam() != Team.red){
return;
}

View file

@ -395,11 +395,6 @@ public class Drone extends FlyingUnit implements BuilderTrait{
return isBuilding() ? placeDistance * 2f : 30f;
}
@Override
public float getAmmoFraction(){
return inventory.getItem().amount / (float) type.itemCapacity;
}
protected void findItem(){
TileEntity entity = getClosestCore();
if(entity == null){

View file

@ -3,7 +3,6 @@ package io.anuke.mindustry.game;
import io.anuke.mindustry.entities.units.BaseUnit;
import io.anuke.mindustry.entities.units.GroundUnit;
import io.anuke.mindustry.entities.units.UnitType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.type.StatusEffect;
import io.anuke.mindustry.type.Weapon;
@ -62,10 +61,6 @@ public class SpawnGroup{
* Items this unit spawns with. Null to disable.
*/
protected ItemStack items;
/**
* Ammo type this unit spawns with. Null to use the first available ammo.
*/
protected Item ammoItem;
public SpawnGroup(UnitType type){
this.type = type;
@ -114,12 +109,6 @@ public class SpawnGroup{
unit.inventory.addItem(items.item, items.amount);
}
if(ammoItem != null){
unit.inventory.addAmmo(unit.getWeapon().getAmmoType(ammoItem));
}else{
unit.inventory.addAmmo(unit.getWeapon().getAmmoType(unit.getWeapon().getAcceptedItems().iterator().next()));
}
return unit;
}
}

View file

@ -41,7 +41,6 @@ public class Waves{
unitScaling = 2;
unitAmount = 1;
spacing = 2;
ammoItem = Items.tungsten;
end = 30;
}},
@ -86,7 +85,6 @@ public class Waves{
groupAmount = 2;
unitScaling = 3;
effect = StatusEffects.overdrive;
ammoItem = Items.silicon;
}},
new SpawnGroup(UnitTypes.dagger){{
@ -95,7 +93,6 @@ public class Waves{
unitAmount = 1;
unitScaling = 3;
effect = StatusEffects.shielded;
ammoItem = Items.thorium;
max = 10;
}},
@ -121,7 +118,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{
begin = 40;
ammoItem = Items.blastCompound;
unitAmount = 2;
spacing = 2;
unitScaling = 3;
@ -140,7 +136,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{
begin = 53;
ammoItem = Items.pyratite;
unitAmount = 2;
unitScaling = 3;
spacing = 4;
@ -150,7 +145,6 @@ public class Waves{
new SpawnGroup(UnitTypes.monsoon){{
begin = 53;
ammoItem = Items.coal;
unitAmount = 2;
unitScaling = 3;
spacing = 4;
@ -176,10 +170,6 @@ public class Waves{
System.out.print(":" + spawn.weapon.name);
}
if(spawn.ammoItem != null){
System.out.print(":" + spawn.ammoItem.name);
}
System.out.print(" ");
}
}

View file

@ -7,14 +7,12 @@ import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.content.blocks.Blocks;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.game.TeamInfo.TeamData;
import io.anuke.mindustry.input.InputHandler;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockBar;
import io.anuke.ucore.core.Graphics;
import io.anuke.ucore.core.Settings;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Fill;
@ -176,32 +174,7 @@ public class OverlayRenderer{
Draw.color();
}
}
}
if((!debug || showUI) && Settings.getBool("healthbars")){
for(TeamData ally : (debug ? state.teams.getTeams() : state.teams.getTeams(true))){
renderer.drawAndInterpolate(unitGroups[ally.team.ordinal()], u -> !u.isDead(), this::drawStats);
}
renderer.drawAndInterpolate(playerGroup, u -> !u.isDead(), this::drawStats);
}
}
void drawStats(Unit unit){
if(unit.isDead()) return;
float x = unit.x;
float y = unit.y;
if(unit == players[0] && players.length == 1 && snapCamera){
x = (int) (x + 0.0001f);
y = (int) (y + 0.0001f);
}
drawEncloser(x, y - 9f, 2f);
drawBar(Palette.healthstats, x, y - 8f, unit.healthf());
drawBar(Palette.ammo, x, y - 9f, unit.getAmmoFraction());
}
void drawBar(Color color, float x, float y, float finion){

View file

@ -3,70 +3,72 @@ package io.anuke.mindustry.graphics;
import com.badlogic.gdx.graphics.Color;
public class Palette{
public static final Color command = Color.valueOf("eab678");
public static final Color
public static final Color bulletYellow = Color.valueOf("ffeec9");
public static final Color bulletYellowBack = Color.valueOf("f9c87a");
command = Color.valueOf("eab678"),
public static final Color missileYellow = Color.valueOf("ffd2ae");
public static final Color missileYellowBack = Color.valueOf("e58956");
bulletYellow = Color.valueOf("ffeec9"),
bulletYellowBack = Color.valueOf("f9c87a"),
public static final Color plastaniumBack = Color.valueOf("d8d97f");
public static final Color plastaniumFront = Color.valueOf("fffac6");
missileYellow = Color.valueOf("ffd2ae"),
missileYellowBack = Color.valueOf("e58956"),
public static final Color lightFlame = Color.valueOf("ffdd55");
public static final Color darkFlame = Color.valueOf("db401c");
plastaniumBack = Color.valueOf("d8d97f"),
plastaniumFront = Color.valueOf("fffac6"),
public static final Color turretHeat = Color.valueOf("ab3400");
lightFlame = Color.valueOf("ffdd55"),
darkFlame = Color.valueOf("db401c"),
public static final Color lightOrange = Color.valueOf("f68021");
public static final Color lightishOrange = Color.valueOf("f8ad42");
public static final Color lighterOrange = Color.valueOf("f6e096");
turretHeat = Color.valueOf("ab3400"),
public static final Color lightishGray = Color.valueOf("a2a2a2");
public static final Color darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f);
lightOrange = Color.valueOf("f68021"),
lightishOrange = Color.valueOf("f8ad42"),
lighterOrange = Color.valueOf("f6e096"),
public static final Color lancerLaser = Color.valueOf("a9d8ff");
lightishGray = Color.valueOf("a2a2a2"),
darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f),
public static final Color stoneGray = Color.valueOf("8f8f8f");
lancerLaser = Color.valueOf("a9d8ff"),
public static final Color portalLight = Color.valueOf("9054ea");
public static final Color portal = Color.valueOf("6344d7");
public static final Color portalDark = Color.valueOf("3f3dac");
stoneGray = Color.valueOf("8f8f8f"),
public static final Color powerLaserFrom = Color.valueOf("e3e3e3");
public static final Color powerLaserTo = Color.valueOf("ffe7a8");
portalLight = Color.valueOf("9054ea"),
portal = Color.valueOf("6344d7"),
portalDark = Color.valueOf("3f3dac"),
public static final Color description = Color.WHITE;
public static final Color turretinfo = Color.ORANGE;
public static final Color iteminfo = Color.LIGHT_GRAY;
public static final Color powerinfo = Color.YELLOW;
public static final Color liquidinfo = Color.ROYAL;
public static final Color craftinfo = Color.LIGHT_GRAY;
powerLaserFrom = Color.valueOf("e3e3e3"),
powerLaserTo = Color.valueOf("ffe7a8"),
public static final Color missingitems = Color.SCARLET;
public static final Color health = Color.YELLOW;
public static final Color ammo = Color.valueOf("32cf6d");
public static final Color healthstats = Color.SCARLET;
public static final Color bar = Color.SLATE;
public static final Color interact = Color.ORANGE;
public static final Color accent = Color.valueOf("f4ba6e");
public static final Color place = Color.valueOf("6335f8");
public static final Color remove = Color.valueOf("e55454");
public static final Color placeRotate = accent;
public static final Color breakInvalid = Color.valueOf("d44b3d");
public static final Color range = Color.valueOf("f4ba6e");
public static final Color power = Color.valueOf("fbd367");
public static final Color placing = Color.valueOf("616161");
description = Color.WHITE,
turretinfo = Color.ORANGE,
iteminfo = Color.LIGHT_GRAY,
powerinfo = Color.YELLOW,
liquidinfo = Color.ROYAL,
craftinfo = Color.LIGHT_GRAY,
public static final Color lightTrail = Color.valueOf("ffe2a9");
missingitems = Color.SCARLET,
health = Color.YELLOW,
ammo = Color.valueOf("32cf6d"),
healthstats = Color.SCARLET,
bar = Color.SLATE,
interact = Color.ORANGE,
accent = Color.valueOf("f4ba6e"),
place = Color.valueOf("6335f8"),
remove = Color.valueOf("e55454"),
placeRotate = accent,
breakInvalid = Color.valueOf("d44b3d"),
range = Color.valueOf("f4ba6e"),
power = Color.valueOf("fbd367"),
placing = Color.valueOf("616161"),
public static final Color redSpark = Color.valueOf("fbb97f");
public static final Color orangeSpark = Color.valueOf("d2b29c");
lightTrail = Color.valueOf("ffe2a9"),
public static final Color redDust = Color.valueOf("ffa480");
public static final Color redderDust = Color.valueOf("ff7b69");
redSpark = Color.valueOf("fbb97f"),
orangeSpark = Color.valueOf("d2b29c"),
public static final Color plasticSmoke = Color.valueOf("f1e479");
public static final Color plasticBurn = Color.valueOf("e9ead3");
redDust = Color.valueOf("ffa480"),
redderDust = Color.valueOf("ff7b69"),
plasticSmoke = Color.valueOf("f1e479"),
plasticBurn = Color.valueOf("e9ead3");
}

View file

@ -16,7 +16,7 @@ public class DefaultKeybinds{
for(String section : sections){
KeyBinds.defaultSection(section, DeviceType.keyboard,
new Category("General"),
new Category("general"),
"move_x", new Axis(Input.A, Input.D),
"move_y", new Axis(Input.S, Input.W),
//"select", Input.MOUSE_LEFT,
@ -25,14 +25,14 @@ public class DefaultKeybinds{
"rotate", new Axis(Input.SCROLL),
"dash", Input.SHIFT_LEFT,
"drop_unit", Input.SHIFT_LEFT,
new Category("View"),
new Category("view"),
"zoom_hold", Input.CONTROL_LEFT,
"zoom", new Axis(Input.SCROLL),
"zoom_minimap", new Axis(Input.MINUS, Input.PLUS),
"menu", Gdx.app.getType() == ApplicationType.Android ? Input.BACK : Input.ESCAPE,
"pause", Input.SPACE,
"toggle_menus", Input.C,
new Category("Multiplayer"),
new Category("multiplayer"),
"player_list", Input.TAB,
"chat", Input.ENTER,
"chat_history_prev", Input.UP,
@ -42,7 +42,7 @@ public class DefaultKeybinds{
);
KeyBinds.defaultSection(section, DeviceType.controller,
new Category("General"),
new Category("general"),
"move_x", new Axis(Input.CONTROLLER_L_STICK_HORIZONTAL_AXIS),
"move_y", new Axis(Input.CONTROLLER_L_STICK_VERTICAL_AXIS),
"cursor_x", new Axis(Input.CONTROLLER_R_STICK_HORIZONTAL_AXIS),
@ -53,12 +53,12 @@ public class DefaultKeybinds{
"dash", Input.CONTROLLER_Y,
"rotate_alt", new Axis(Input.CONTROLLER_DPAD_RIGHT, Input.CONTROLLER_DPAD_LEFT),
"rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B),
new Category("View"),
new Category("view"),
"zoom_hold", Input.ANY_KEY,
"zoom", new Axis(Input.CONTROLLER_DPAD_DOWN, Input.CONTROLLER_DPAD_UP),
"menu", Input.CONTROLLER_X,
"pause", Input.CONTROLLER_L_TRIGGER,
new Category("Multiplayer"),
new Category("multiplayer"),
"player_list", Input.CONTROLLER_START
);

View file

@ -76,7 +76,9 @@ public class Save16 extends SaveFileVersion{
short width = stream.readShort();
short height = stream.readShort();
if(map == null){
if(world.getSector() != null){
world.setMap(new Map("Sector " + world.getSector().x + ", " + world.getSector().y, width, height));
}else if(map == null){
world.setMap(new Map("unknown", width, height));
}

View file

@ -15,7 +15,6 @@ import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret;
import io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret;
import io.anuke.mindustry.world.blocks.units.ResupplyPoint;
import io.anuke.ucore.util.Mathf;
import static io.anuke.mindustry.Vars.world;
@ -186,7 +185,6 @@ public class FortressGenerator{
}
Block fixBlock(Block result){
if(result == UnitBlocks.resupplyPoint) result = DefenseBlocks.tungstenWall;
if(result == UnitBlocks.dronePad) result = DefenseBlocks.tungstenWallLarge;
if(result == UnitBlocks.fabricatorPad) result = DefenseBlocks.tungstenWallLarge;
return result;
@ -201,8 +199,6 @@ public class FortressGenerator{
ItemTurret turret = (ItemTurret)block;
AmmoType[] type = turret.getAmmoTypes();
block.handleStack(type[0].item, block.acceptStack(type[0].item, 1000, tile, null), tile, null);
}else if(block instanceof ResupplyPoint){
tile.entity.items.add(Items.lead, tile.block().itemCapacity);
}
}

View file

@ -1,7 +1,6 @@
package io.anuke.mindustry.type;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.utils.OrderedMap;
import io.anuke.annotations.Annotations.Loc;
import io.anuke.annotations.Annotations.Remote;
import io.anuke.mindustry.Vars;
@ -19,64 +18,37 @@ import io.anuke.ucore.util.Mathf;
import io.anuke.ucore.util.Translator;
public class Weapon extends Upgrade{
/**
* minimum cursor distance from player, fixes 'cross-eyed' shooting.
*/
/**minimum cursor distance from player, fixes 'cross-eyed' shooting.*/
protected static float minPlayerDist = 20f;
public TextureRegion equipRegion, region;
/**
* ammo type map. set with setAmmo()
*/
protected OrderedMap<Item, AmmoType> ammoMap = new OrderedMap<>();
/**
* shell ejection effect
*/
/**ammo type map. set with setAmmo()*/
protected AmmoType ammo;
/**shell ejection effect*/
protected Effect ejectEffect = Fx.none;
/**
* weapon reload in frames
*/
/**weapon reload in frames*/
protected float reload;
/**
* amount of shots per fire
*/
/**amount of shots per fire*/
protected int shots = 1;
/**
* spacing in degrees between multiple shots, if applicable
*/
/**spacing in degrees between multiple shots, if applicable*/
protected float spacing = 12f;
/**
* inaccuracy of degrees of each shot
*/
/**inaccuracy of degrees of each shot*/
protected float inaccuracy = 0f;
/**
* intensity and duration of each shot's screen shake
*/
/**intensity and duration of each shot's screen shake*/
protected float shake = 0f;
/**
* visual weapon knockback.
*/
/**visual weapon knockback.*/
protected float recoil = 1.5f;
/**
* shoot barrel y offset
*/
/**shoot barrel y offset*/
protected float length = 3f;
/**
* shoot barrel x offset.
*/
/**shoot barrel x offset.*/
protected float width = 4f;
/**
* fraction of velocity that is random
*/
/**fraction of velocity that is random*/
protected float velocityRnd = 0f;
/**
* whether to shoot the weapons in different arms one after another, rather than all at once
*/
/**whether to shoot the weapons in different arms one after another, rather than all at once*/
protected boolean roundrobin = false;
/**
* translator for vector calulations
*/
/**translator for vector calulations*/
protected Translator tr = new Translator();
public TextureRegion equipRegion, region;
protected Weapon(String name){
super(name);
}
@ -103,12 +75,9 @@ public class Weapon extends Upgrade{
Weapon weapon = shooter.getWeapon();
Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> weapon.bullet(shooter, x, y, f + Mathf.range(weapon.inaccuracy)));
AmmoType ammo = weapon.ammo;
AmmoType type = shooter.getInventory().getAmmo();
if(type == null) return;
weapon.tr.trns(rotation + 180f, type.recoil);
weapon.tr.trns(rotation + 180f, ammo.recoil);
shooter.getVelocity().add(weapon.tr);
@ -116,8 +85,8 @@ public class Weapon extends Upgrade{
Effects.shake(weapon.shake, weapon.shake, x, y);
Effects.effect(weapon.ejectEffect, x, y, rotation * -Mathf.sign(left));
Effects.effect(type.shootEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
Effects.effect(type.smokeEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
Effects.effect(ammo.shootEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
Effects.effect(ammo.smokeEffect, x + weapon.tr.x, y + weapon.tr.y, rotation, shooter);
//reset timer for remote players
shooter.getTimer().get(shooter.getShootTimer(left), weapon.reload);
@ -134,13 +103,17 @@ public class Weapon extends Upgrade{
return "weapon";
}
public AmmoType getAmmo(){
return ammo;
}
public void update(ShooterTrait shooter, float pointerX, float pointerY){
update(shooter, true, pointerX, pointerY);
update(shooter, false, pointerX, pointerY);
}
private void update(ShooterTrait shooter, boolean left, float pointerX, float pointerY){
if(shooter.getInventory().hasAmmo() && shooter.getTimer().get(shooter.getShootTimer(left), reload)){
if(shooter.getTimer().get(shooter.getShootTimer(left), reload)){
if(roundrobin){
shooter.getTimer().reset(shooter.getShootTimer(!left), reload / 2f);
}
@ -180,29 +153,13 @@ public class Weapon extends Upgrade{
Call.onGenericShootWeapon(p, x, y, angle, left);
}
}
p.getInventory().useAmmo();
}
public Iterable<Item> getAcceptedItems(){
return ammoMap.orderedKeys();
}
public AmmoType getAmmoType(Item item){
return ammoMap.get(item);
}
protected void setAmmo(AmmoType... types){
for(AmmoType type : types){
ammoMap.put(type.item, type);
}
}
void bullet(ShooterTrait owner, float x, float y, float angle){
if(owner == null || !owner.getInventory().hasAmmo()) return;
if(owner == null) return;
tr.trns(angle, 3f);
Bullet.create(owner.getInventory().getAmmo().bullet,
Bullet.create(ammo.bullet,
owner, owner.getTeam(), x + tr.x, y + tr.y, angle, (1f - velocityRnd) + Mathf.random(velocityRnd));
}
}

View file

@ -145,7 +145,6 @@ public class DebugFragment extends Fragment{
for(UnitType type : UnitType.all()){
dialog.content().addImageButton("white", 40, () -> {
BaseUnit unit = type.create(player.getTeam());
unit.inventory.addAmmo(type.weapon.getAmmoType(type.weapon.getAcceptedItems().iterator().next()));
unit.setWave();
unit.set(player.x, player.y);
unit.add();

View file

@ -217,6 +217,9 @@ public class BuildBlock extends Block{
if(recipe != null){
ItemStack[] requirements = recipe.requirements;
if(requirements.length != accumulator.length || totalAccumulator.length != requirements.length){
setDeconstruct(previous);
}
for(int i = 0; i < requirements.length; i++){
accumulator[i] += Math.min(requirements[i].amount * amount / 2f, requirements[i].amount/2f - totalAccumulator[i]); //add scaled amount progressed to the accumulator

View file

@ -1,12 +0,0 @@
package io.anuke.mindustry.world.blocks;
import io.anuke.mindustry.content.blocks.Blocks;
public class Ore extends Floor{
public Ore(String name){
super(name);
blends = block -> block != this && block != Blocks.stone;
}
}

View file

@ -14,7 +14,7 @@ public class OreBlock extends Floor{
public OreBlock(Item ore, Floor base){
super("ore-" + ore.name + "-" + base.name);
this.formalName = ore.name + " " + base.formalName;
this.formalName = ore.localizedName() + " " + base.formalName;
this.drops = new ItemStack(ore, 1);
this.base = base;
this.variants = 3;

View file

@ -227,7 +227,7 @@ public class PowerNode extends PowerBlock{
}
protected boolean shouldDistribute(Tile tile, Tile other){
return other != null && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
return other != null && other.entity != null && other.block().hasPower && other.getTeamID() == tile.getTeamID() && other.entity.power.amount / other.block().powerCapacity <= tile.entity.power.amount / powerCapacity &&
!(other.block() instanceof PowerGenerator); //do not distribute to power generators
}

View file

@ -235,25 +235,6 @@ public class CoreBlock extends StorageBlock{
entity.heat = Mathf.lerpDelta(entity.heat, 0f, 0.1f);
}
if(entity.solid && tile.entity.timer.get(timerSupply, supplyInterval)){
rect.setSize(supplyRadius * 2).setCenter(tile.drawx(), tile.drawy());
Units.getNearby(tile.getTeam(), rect, unit -> {
if(unit.isDead() || unit.distanceTo(tile.drawx(), tile.drawy()) > supplyRadius || unit.getGroup() == null)
return;
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(tile.entity.items.get(item) > 0 && unit.acceptsAmmo(item)){
tile.entity.items.remove(item, 1);
unit.addAmmo(item);
Call.transferAmmo(item, tile.drawx(), tile.drawy(), unit);
return;
}
}
});
}
}
@Override
@ -261,19 +242,6 @@ public class CoreBlock extends StorageBlock{
return new CoreEntity();
}
/*
@Remote(called = Loc.server)
public static void onCoreUnitSet(Tile tile, Unit player){
CoreEntity entity = tile.entity();
entity.currentUnit = player;
entity.progress = 0f;
player.set(tile.drawx(), tile.drawy());
if(player instanceof Player){
((Player) player).setRespawning(true);
}
}
*/
public class CoreEntity extends TileEntity implements SpawnerTrait{
public Unit currentUnit;
int droneID = -1;

View file

@ -1,144 +0,0 @@
package io.anuke.mindustry.world.blocks.units;
import com.badlogic.gdx.math.Rectangle;
import com.badlogic.gdx.math.Vector2;
import io.anuke.mindustry.entities.TileEntity;
import io.anuke.mindustry.entities.Unit;
import io.anuke.mindustry.entities.Units;
import io.anuke.mindustry.graphics.Layer;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Tile;
import io.anuke.mindustry.world.meta.BlockFlag;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.graphics.Draw;
import io.anuke.ucore.graphics.Lines;
import io.anuke.ucore.graphics.Shapes;
import io.anuke.ucore.util.Angles;
import io.anuke.ucore.util.EnumSet;
import io.anuke.ucore.util.Mathf;
public class ResupplyPoint extends Block{
private static Rectangle rect = new Rectangle();
protected int timerSupply = timers++;
protected int timerTarget = timers++;
protected float supplyRadius = 50f;
protected float supplyInterval = 10f;
public ResupplyPoint(String name){
super(name);
update = true;
solid = true;
flags = EnumSet.of(BlockFlag.resupplyPoint);
layer = Layer.laser;
hasItems = true;
hasPower = true;
powerCapacity = 20f;
consumes.power(0.02f);
}
@Override
public void drawSelect(Tile tile){
Draw.color(Palette.accent);
Lines.dashCircle(tile.drawx(), tile.drawy(), supplyRadius);
Draw.color();
}
@Override
public void drawLayer(Tile tile){
ResupplyPointEntity entity = tile.entity();
if(entity.strength > 0f){
float ang = entity.angleTo(entity.lastx, entity.lasty);
float len = 5f;
float x1 = tile.drawx() + Angles.trnsx(ang, len), y1 = tile.drawy() + Angles.trnsy(ang, len);
float dstTo = Vector2.dst(x1, y1, entity.lastx, entity.lasty);
float space = 4f;
float xf = entity.lastx - x1, yf = entity.lasty - y1;
Shapes.laser("transfer", "transfer-end",
x1, y1, entity.lastx, entity.lasty, entity.strength);
Draw.color(Palette.accent);
for(int i = 0; i < dstTo / space - 1; i++){
float fract = (i * space) / dstTo + ((Timers.time() / 90f) % (space / dstTo));
Draw.alpha(Mathf.clamp(fract * 1.5f));
Draw.rect("transfer-arrow", x1 + fract * xf, y1 + fract * yf,
8, 8 * entity.strength, ang);
}
Draw.color();
}
}
@Override
public void update(Tile tile){
ResupplyPointEntity entity = tile.entity();
if(!validTarget(entity, entity.target) || entity.target.distanceTo(tile) > supplyRadius){
entity.target = null;
}else if(entity.target != null && entity.strength > 0.5f){
if(entity.timer.get(timerSupply, supplyInterval)){
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(tile.entity.items.has(item) && entity.target.acceptsAmmo(item)){
tile.entity.items.remove(item, 1);
entity.target.addAmmo(item);
break;
}
}
}
entity.rotation = Mathf.slerpDelta(entity.rotation, entity.angleTo(entity.target), 0.5f);
}
if(entity.target != null && entity.cons.valid()){
entity.lastx = entity.target.x;
entity.lasty = entity.target.y;
entity.strength = Mathf.lerpDelta(entity.strength, 1f, 0.08f * Timers.delta());
}else{
entity.strength = Mathf.lerpDelta(entity.strength, 0f, 0.08f * Timers.delta());
}
if(entity.timer.get(timerTarget, 20)){
rect.setSize(supplyRadius * 2).setCenter(tile.drawx(), tile.drawy());
entity.target = Units.getClosest(tile.getTeam(), tile.drawx(), tile.drawy(), supplyRadius, unit -> validTarget(entity, unit));
}
}
@Override
public boolean acceptItem(Item item, Tile tile, Tile source){
return tile.entity.items.total() < itemCapacity;
}
@Override
public TileEntity getEntity(){
return new ResupplyPointEntity();
}
boolean validTarget(ResupplyPointEntity entity, Unit unit){
if(unit == null || unit.inventory.totalAmmo() >= unit.inventory.ammoCapacity()
|| unit.isDead()) return false;
for(int i = 0; i < Item.all().size; i++){
Item item = Item.getByID(i);
if(entity.items.has(item) && unit.acceptsAmmo(item)){
return true;
}
}
return false;
}
public class ResupplyPointEntity extends TileEntity{
public Unit target;
public float strength, rotation = 90, lastx, lasty;
}
}

View file

@ -13,7 +13,6 @@ import io.anuke.mindustry.gen.Call;
import io.anuke.mindustry.graphics.Palette;
import io.anuke.mindustry.graphics.Shaders;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.type.AmmoType;
import io.anuke.mindustry.type.Item;
import io.anuke.mindustry.type.ItemStack;
import io.anuke.mindustry.world.BarType;
@ -74,10 +73,6 @@ public class UnitPad extends Block{
unit.set(tile.drawx(), tile.drawy());
unit.add();
unit.getVelocity().y = factory.launchVelocity;
//fill inventory with 1st ammo
AmmoType type = unit.getWeapon().getAmmoType(unit.getWeapon().getAcceptedItems().iterator().next());
unit.inventory.fillAmmo(type);
}
}

View file

@ -11,6 +11,7 @@ import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.core.Platform;
import io.anuke.mindustry.core.ThreadHandler.ThreadProvider;
import io.anuke.mindustry.game.GameMode;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.dialogs.FileChooser;
import io.anuke.ucore.function.Consumer;
@ -78,14 +79,24 @@ public class DesktopPlatform extends Platform{
DiscordRichPresence presence = new DiscordRichPresence();
if(!state.is(State.menu)){
presence.state = Strings.capitalize(state.mode.name()) + ", Solo";
presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave;
presence.largeImageText = "Wave " + state.wave;
presence.state = Strings.capitalize(state.mode.name());
if(state.mode == GameMode.noWaves){
presence.details = Strings.capitalize(world.getMap().name);
}else{
presence.details = Strings.capitalize(world.getMap().name) + " | Wave " + state.wave;
presence.largeImageText = "Wave " + state.wave;
}
if(state.mode != GameMode.noWaves){
presence.state = Strings.capitalize(state.mode.name());
}else{
presence.state = unitGroups[players[0].getTeam().ordinal()].size() == 1 ? "1 Unit Active" :
(unitGroups[players[0].getTeam().ordinal()].size() + " Units Active");
}
if(Net.active()){
presence.partyMax = 16;
presence.partySize = playerGroup.size();
presence.state = Strings.capitalize(state.mode.name());
}
}else{
if(ui.editor != null && ui.editor.isShown()){

View file

@ -1,118 +1,119 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${app.name}</string>
<key>CFBundleExecutable</key>
<string>${app.executable}</string>
<key>CFBundleIdentifier</key>
<string>${app.id}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>MinimumOSVersion</key>
<string>9.0.0</string>
<key>CFBundleName</key>
<string>${app.name}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${app.version}</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${app.build}</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>
<key>UIRequiresFullScreen</key>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Mindustry</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>opengles-2</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleDisplayName</key>
<string>${app.name}</string>
<key>CFBundleExecutable</key>
<string>${app.executable}</string>
<key>CFBundleIdentifier</key>
<string>${app.id}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>MinimumOSVersion</key>
<string>9.0.0</string>
<key>CFBundleName</key>
<string>${app.name}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${app.version}</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>${app.build}</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>
<key>UIRequiresFullScreen</key>
<true/>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>Mindustry</string>
<key>UIDeviceFamily</key>
<array>
<integer>1</integer>
<integer>2</integer>
</array>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
<string>opengles-2</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
</array>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon-72.png</string>
</array>
<key>CFBundleTypeName</key>
<string>Mindustry Map File</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>io.anuke.mindustry.mapfile</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon-72.png</string>
</array>
<key>CFBundleTypeName</key>
<string>Mindustry Map File</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>io.anuke.mindustry.mapfile</string>
<string>io.anuke.mindustry.savefile</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Save File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.savefile</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Save File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.savefile</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>msav</string>
<key>public.mime-type</key>
<string>mindustry/msav</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>msav</string>
<key>public.mime-type</key>
<string>mindustry/msav</string>
</dict>
</dict>
</dict>
</array>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Map File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.mapfile</string>
<key>UTTypeTagSpecification</key>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>public.filename-extension</key>
<string>mmap</string>
<key>public.mime-type</key>
<string>mindustry/mmap</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Mindustry Map File</string>
<key>UTTypeIdentifier</key>
<string>io.anuke.mindustry.mapfile</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>mmap</string>
<key>public.mime-type</key>
<string>mindustry/mmap</string>
</dict>
</dict>
</dict>
</array>
</dict>
</array>
</dict>
</plist>

View file

@ -32,6 +32,8 @@ import static io.anuke.mindustry.Vars.*;
import static org.robovm.apple.foundation.NSPathUtilities.getDocumentsDirectory;
public class IOSLauncher extends IOSApplication.Delegate {
private boolean forced;
@Override
protected IOSApplication createApplication() {
Net.setClientProvider(new KryoClient());
@ -86,7 +88,17 @@ public class IOSLauncher extends IOSApplication.Delegate {
p.getPopoverPresentationController().setSourceView(UIApplication.getSharedApplication().getKeyWindow().getRootViewController().getView());
UIApplication.getSharedApplication().getKeyWindow().getRootViewController()
.presentViewController(p, true, () -> io.anuke.ucore.util.Log.info("Success! Presented {0}", to));
.presentViewController(p, true, () -> io.anuke.ucore.util.Log.info("Success! Presented {0}", to));
}
@Override
public void beginForceLandscape(){
forced = true;
}
@Override
public void endForceLandscape(){
forced = false;
}
};
@ -94,6 +106,11 @@ public class IOSLauncher extends IOSApplication.Delegate {
return new IOSApplication(new Mindustry(), config);
}
@Override
public UIInterfaceOrientationMask getSupportedInterfaceOrientations(UIApplication application, UIWindow window){
return forced ? UIInterfaceOrientationMask.Landscape : UIInterfaceOrientationMask.All;
}
@Override
public boolean openURL(UIApplication app, NSURL url, UIApplicationOpenURLOptions options) {
System.out.println("Opened URL: " + url.getPath());

View file

@ -405,7 +405,6 @@ public class ServerControl extends Module{
for(Player player : playerGroup.all()){
if(player.name.equalsIgnoreCase(arg[0])){
target = player;
break;
}
}
@ -457,7 +456,6 @@ public class ServerControl extends Module{
if(player.con.address != null &&
player.con.address.equals(arg[0])){
netServer.kick(player.con.id, KickReason.banned);
break;
}
}
}else{
@ -472,7 +470,6 @@ public class ServerControl extends Module{
for(Player player : playerGroup.all()){
if(player.uuid.equals(arg[0])){
netServer.kick(player.con.id, KickReason.banned);
break;
}
}
}else{