From 124480f96bb8d5810f328bb05ccf9b771ce8b182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Sat, 9 Nov 2019 00:17:29 +0900 Subject: [PATCH 001/107] Update EventType.java --- core/src/io/anuke/mindustry/game/EventType.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index fef2556d35..189ea60de4 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -126,9 +126,19 @@ public class EventType{ } - /** Called when a player withdraws items from a block. Tutorial only.*/ + /** Called when the player withdraws items from a block. */ public static class WithdrawEvent{ + public final Tile tile; + public final Player player; + public final Item item; + public final int amount; + public WithdrawEvent(Tile tile, Player player, Item item, int amount){ + this.tile = tile; + this.player = player; + this.item = item; + this.amount = amount; + } } /** Called when a player deposits items to a block.*/ From 7871b5bdaac59e668ab5aa040d6b689441f5ede8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Sat, 9 Nov 2019 00:18:41 +0900 Subject: [PATCH 002/107] Update BlockInventoryFragment.java --- .../anuke/mindustry/ui/fragments/BlockInventoryFragment.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 1c663f2b4a..094b56026a 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -42,6 +42,7 @@ public class BlockInventoryFragment extends Fragment{ int removed = tile.block().removeStack(tile, item, amount); player.addItem(item, removed); + Events.fire(new WithdrawEvent(tile, player, item, amount)); for(int j = 0; j < Mathf.clamp(removed / 3, 1, 8); j++){ Time.run(j * 3f, () -> Call.transferItemEffect(item, tile.drawx(), tile.drawy(), player)); } @@ -100,7 +101,7 @@ public class BlockInventoryFragment extends Fragment{ holding = false; holdTime = 0f; - Events.fire(new WithdrawEvent()); + Events.fire(new WithdrawEvent(tile, player, item, amount)); } } @@ -153,7 +154,7 @@ public class BlockInventoryFragment extends Fragment{ lastItem = item; holding = true; holdTime = 0f; - Events.fire(new WithdrawEvent()); + Events.fire(new WithdrawEvent(tile, player, item, amount)); } return true; } From 0c430527b85178ed0783836494becadf6aa9590e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Sat, 9 Nov 2019 00:41:31 +0900 Subject: [PATCH 003/107] Fix error --- .../io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 094b56026a..05b7a1ea47 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -101,7 +101,7 @@ public class BlockInventoryFragment extends Fragment{ holding = false; holdTime = 0f; - Events.fire(new WithdrawEvent(tile, player, item, amount)); + Events.fire(new WithdrawEvent(tile, player, lastItem, amount)); } } From 4487d01a38b582b98638b5703535a771b49fdb56 Mon Sep 17 00:00:00 2001 From: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com> Date: Tue, 19 Nov 2019 13:41:31 +0200 Subject: [PATCH 004/107] Update bundle_ru.properties --- core/assets/bundles/bundle_ru.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 5170552cb7..befe38c17e 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -682,6 +682,7 @@ mode.attack.name = Атака mode.attack.description = Уничтожьте вражескую базу. Никаких волн.\n[gray]Для игры требуется красное ядро на карте. mode.custom = Пользовательские правила rules.infiniteresources = Бесконечные ресурсы (Игрок) +rules.reactorexplosions = Взрывы реактора rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки @@ -1091,7 +1092,7 @@ block.sorter.description = Сортирует предметы. Если пре block.inverted-sorter.description = Работает с предметами так же, как и стандартный сортировщик, но выводит выбранный предмет по бокам, а не прямо. block.router.description = Принимает предмет в одном направлении и выводит их до 3 других направлений в равной степени. Полезно для разделения материалов из одного источника на несколько целей.\n\n[scarlet]Никогда не используйте рядом с заводами и т.п., так как маршрутизатор будет забит выходными предметами.[] block.distributor.description = Расширенный маршрутизатор. Разделение элементов до 7 других направлений в равной степени. -block.overflow-gate.description = Комбинированный разделитель и маршрутизатор. Выводит только влево и вправо, если передний путь заблокирован. +block.overflow-gate.description = Выводит только влево и вправо, если передний путь заблокирован. block.mass-driver.description = Конечный транспортный блок. Собирает несколько предметов и затем стреляет ими в другую катапульту на большом расстоянии. Требуется энергия для работы. block.mechanical-pump.description = Дешёвый насос с низкой производительностью, но без энергопотребления. block.rotary-pump.description = Продвинутый насос. Качает больше жидкости, но требуют энергию. @@ -1106,6 +1107,7 @@ block.phase-conduit.description = Расширенный блок транспо block.power-node.description = Передает питание на подключенные узлы. Узел будет получать питание или поставлять питание на любые соседние блоки. block.power-node-large.description = Усовершенствованный силовой узел с большей дальностью и большим количеством соединений. block.surge-tower.description = Силовой узел с очень большим радиусом действия, но меньшим количеством доступных соединений. +block.diode.description = Питание от батареи может проходить через этот блок только в одном направлении, но только если на другой стороне накоплено меньше энергии. block.battery.description = Накапливает энергию как буфер во времена избытка энергии. Выводит энергию во времена дефицита. block.battery-large.description = Хранит гораздо больше энергии, чем обычная батарея. block.combustion-generator.description = Вырабатывает энергию путём сжигания легковоспламеняющихся материалов, таких как уголь. From 10376ee59dff7b9f88a0b869fac5c6bf93452ad2 Mon Sep 17 00:00:00 2001 From: ballgamer56 <30421594+ballgamer56@users.noreply.github.com> Date: Thu, 21 Nov 2019 07:53:13 +0700 Subject: [PATCH 005/107] Thai trabslation Took me a week to finish :3 --- core/assets/bundles/bundle_th.properties | 1202 ++++++++++++++++++++++ 1 file changed, 1202 insertions(+) create mode 100644 core/assets/bundles/bundle_th.properties diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties new file mode 100644 index 0000000000..90b72d7312 --- /dev/null +++ b/core/assets/bundles/bundle_th.properties @@ -0,0 +1,1202 @@ +credits.text = สร้างโดย [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] +credits = เครดิต +contributors = ผู้แปลภาษาและผู้ช่วย +discord = เข้าร่วมเซิฟเวอร์ Discord ของ Mindustry! +link.discord.description = เซิฟเวอร์ Discord อย่างเป็นทางการของ Mindustry +link.reddit.description = ซับเรดดิท (subreddit) ของ Mindustry +link.github.description = source code ของเกม +link.changelog.description = รายการที่อัปเดต +link.dev-builds.description = เวอร์ชั่นระหว่างพัฒนา (ไม่เสถียร) +link.trello.description = Official Trello board for planned features +link.itch.io.description = itch.io page with PC downloads +link.google-play.description = Google Play store listing +link.wiki.description = Official Mindustry wiki +linkfail = ไม่สามารถเปิดลิ้งค์ได้\nคัดลอก URL ลงในคลิปบอร์ดแล้ว +screenshot = Screenshot บันทึกที่ {0} +screenshot.invalid = แมพใหญ่เกินไป, หน่วยความจำอาจจะไม่พอสำหรับ screenshot. +gameover = Game Over +gameover.pvp = ทีมที่ชนะคือทีม[accent] {0}[]! +highscore = [accent]คะแนนสูงสุดใหม่! +copied = คัดลอกแล้ว. + +load.sound = เสียง +load.map = แมพ +load.image = รูป +load.content = Content +load.system = ระบบ +load.mod = มอด + +schematic = Schematic +schematic.add = กำลังบันทึก Schematic... +schematics = Schematics +schematic.replace = มี schematic ที่ใช้ชื่อนี้แล้ว. แทนที่มัน? +schematic.import = นำเข้า Schematic... +schematic.exportfile = ส่งออก File +schematic.importfile = นำเข้า File +schematic.browseworkshop = ค้นหา Workshop +schematic.copy = คัดลอกไปที่คลิปบอร์ด +schematic.copy.import = นำเข้าจากคลิปบอร์ด +schematic.shareworkshop = แชร์บน Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: กลับ Schematic +schematic.saved = บันทึก Schematic แล้ว. +schematic.delete.confirm = schematic นี้จะถูกกำจัดให้หมดสิ้นโดยสิ้นเชิง +schematic.rename = เปลี่ยนชื่อของ Schematic +schematic.info = {0}x{1}, {2} บล็อค + +stat.wave = จำนวน wave ที่กำจัดได้:[accent] {0} +stat.enemiesDestroyed = จำนวนศัตรูที่ถูกทำลาย:[accent] {0} +stat.built = จำนวนสิ่งก่อสร้างที่สร้าง:[accent] {0} +stat.destroyed = จำนวนสิ่งก่อสร้างที่ถูกทำลายโดยศัตรู:[accent] {0} +stat.deconstructed = จำนวนสิ่งก่อสร้างที่ทำลาย:[accent] {0} +stat.delivered = ทรัพยากรที่ส่ง: +stat.rank = แรงค์: [accent]{0} + +launcheditems = [accent]ไอเท็มที่ส่ง +launchinfo = [unlaunched][[ส่ง] core ของคุณเพื่อที่จะรับไอเท็มที่ไฮไลท์สีน้ำเงิน +map.delete = คุณแน่ใจหรือว่าจะลบแมพชื่อ "[accent]{0}[]"? +level.highscore = คะแนนสูงสุด: [accent]{0} +level.select = เลือกด่าน +level.mode = เกมโหมด: +showagain = ไม่แสดงอีกในครั้งต่อไป +coreattack = < Core กำลังถูกโจมตี! > +nearpoint = [[ [scarlet]ออกจากดรอปพอยท์ด่วน IMMEDIATELY[] ]\nการทำลายล้างกำลังใกล้เข้ามา +database = Core Database +savegame = เซฟเกม +loadgame = โหลดเกม +joingame = เข้าร่วมเกม +customgame = เกมที่กำหนดเอง +newgame = เริ่มเกมใหม่ +none = <ไม่มี> +minimap = มินิแมพ +position = ตำแหน่ง +close = ปิด +website = เว็ปไซต์ +quit = ออก +save.quit = เซฟแล้วออก +maps = แมพ +maps.browse = ค้นหาแมพ +continue = ต่อ +maps.none = [lightgray]ไม่มีแมพ! +invalid = ไม่ถูกต้อง +preparingconfig = กำลังเตรียม Config +preparingcontent = กำลังเตรียม Content +uploadingcontent = กำลังอัปโหลด Content +uploadingpreviewfile = กำลังอัปโหลดไฟล์พรีวิว +committingchanges = Comitting Changes +done = เรียบร้อย +feature.unsupported = อุปกรณ์ของคุณไม่รองรับฟีเจอร์นี้ + +mods.alphainfo = จำไว้ว่ามอดนั้นยังอยู่ในขั้น alpha และ[scarlet] อาจจะมีบัค[].\nโปรดรายงานปัญหาที่คุณพบใน Github ของ Mindustry หรือ ในเซิฟเวอร์ Discord +mods.alpha = [accent](Alpha) +mods = มอด +mods.none = [LIGHT_GRAY]ไม่พบมอด! +mods.guide = คู่มือการทำมอด +mods.report = รายงานบัค +mods.openfolder = เปิดมอดโฟลเดอร์ +mod.enabled = [lightgray]เปิดใช้งาน +mod.disabled = [scarlet]ปิดใช้งาน +mod.disable = ปิดใช้งาน +mod.delete.error = ไม่สามารถลบมอดได้. ไฟล์อาจอยู่ในระหว่างการใช้งาน. +mod.missingdependencies = [scarlet]dependencies หาย: {0} +mod.nowdisabled = [scarlet]มอด '{0}' ไม่มี dependencies:[accent] {1}\n[lightgray]จำเป็นต้องโหลดมอดพวกนี้ก่อน\nมอดนี้จะถูกปิดใช้งานโดยอัตโนมัติ +mod.enable = เปิดใช้งาน +mod.requiresrestart = เกมจะปิดลงเพื่อใส่มอด +mod.reloadrequired = [scarlet]จำเป็นต้องรีโหลด +mod.import = นำเข้ามอด +mod.import.github = นำเข้ามอดจาก Github +mod.remove.confirm = มอดนี้จะถูกลบ +mod.author = [LIGHT_GRAY]ผู้สร้าง:[] {0} +mod.missing = เซฟนี้มีมอดที่คุณอัปเดตหรือไม่ได้ติดตั้งแล้ว. อาจทำให้เซฟเสีย. คุณแน่จะหรือว่าจะโหลดเซฟนี้?\n[lightgray]Mods:\n{0} +mod.preview.missing = ก่อนที่จะนำมอดไปลงใน workshop, คุณต้องใส่รูปพรีวิวก่อน\nใส่รูปชื่อ[accent] preview.png[] ลงในโฟลเดอร์ของมอดแล้วลองอีกครั้ง +mod.folder.missing = มอดที่อยู่ในรูปแบบโฟลเดอร์เท่านั้นที่สามารถลงใน workshop ได้\nunzip ไฟล์แล้วลบไฟล์ zip เก่า แล้วรีสตาร์ทเกมหรือรีโหลดมอด + +about.button = เกี่ยวกับ +name = ชื่อ: +noname = ใส่ชื่อ[accent] ผู้เล่น[] ก่อน. +filename = ชื่อไฟล์: +unlocked = content ใหม่ปลดล็อค! +completed = [accent]สำเร็จ +techtree = สายวิจัย +research.list = [lightgray]วิจัย: +research = วิจัย +researched = [lightgray]{0} วิจัยแล้ว. +players = {0} ผู้เล่น +players.single = {0} ผู้เล่น +server.closing = [accent]กำลังปิดเซิฟเวอร์... +server.kicked.kick = คุณถูกเตะออกจากเซิฟเวอร์! +server.kicked.whitelist = คุณไม่ได้อยู่ใน whitelisted +server.kicked.serverClose = เซิฟเวอร์ถูกปิด. +server.kicked.vote = คุณถูกโหวตเตะออก. บายบาย. +server.kicked.clientOutdated = client ล่าสมัย! กรุณาอัปเดตเกมของคุณ! +server.kicked.serverOutdated = server ล่าสมัย! โปรดถามเจ้าของเซิฟเพื่ออัปเดต! +server.kicked.banned = คุณถูกแบนในเซิฟเวอร์นี้ +server.kicked.typeMismatch = เซิฟเวอร์นี้ไม่เข้ากับ build type ของคุณ. +server.kicked.playerLimit = เซิฟเวอร์เต็ม. กรุณารอให้เซิฟเวอร์ว่างก่อน. +server.kicked.recentKick = คุณเพิ่งถูกเตะออกจากเซิฟเวอร์นี้.\nกรุณารอสักครู่เพื่อเข้าร่วมอีกครั้ง +server.kicked.nameInUse = มีคนที่ใช้ชืชื่อนี้\nอยู่ในเซิฟเวอร์แล้ว +server.kicked.nameEmpty = ชื่อของคุณไม่สามารถใช้ได้ +server.kicked.idInUse = คุณเชื่อมต่อกับเซิฟเวอร์นี้อยู่แล้ว เราไม่อนุญาตให้เชื่อมต่อ 2 บัญชีในเซฟเวอร์เดียวกัน +server.kicked.customClient = เซิฟเวอร์นี้ไม่รองรับ builds ปรับแต่ง. กรุณาโหลดของ official. +server.kicked.gameover = Game over! +server.versions = เวอร์ชั่นของคุณ:[accent] {0}[]\nเวอร์ชั่นของเซิฟเวอร์:[accent] {1}[] +host.info = ปุ่ม [accent]โฮสต์[] นั้นโฮสต์เซฟเวอร์ที่พอร์ท [scarlet]6567[]. \nทุกคนที่อยู่ใน [lightgray]wifi หรือ local network[] เดียวกันจะสามารถเห็นเซิฟเวอร์ของคุณในลิสของเซิฟเวอร์ได้\n\nถ้าคุณต้องการให้ผู้เล่นอื่นๆสามารถเชื่อมต่อได้จากทุกที่โดยใช้ IP, จำเป็นจะต้องใช้การ [accent]port forwarding[] \n\n[lightgray]Note: ถ้าผู้เล่นคนใดมีปัญหาในการเชื่อมต่อ LAN ของคุณ เช็คให้แน่ใจว่าคุณได้อนุญาตให้ Mindustry เข้าถึง local network ของคุณในการตั้งค่า firewall. จำให้ว่า network สาธารณะบางครั้งไม่อนุญาตการค้นหาเซิฟเวอร์ +join.info = คุณสามารถใส่ [accent]IP ของเซิฟเวอร์[] เพื่อที่จะเชื่อมต่อหรือค้นหา เซิฟเวอร์ที่ใช้[accent]local network[] จะสามารถเชื่อมโดยใช้\n LAN หรือ WAN ก็ได้\n\n[lightgray]โน้ต: เกมนี้ไม่มีระบบค้นหาเซิฟเวอร์ global ให้อัตโนมัติserver list; ถ้าคุณต้องการเชื่อมต่อกับเซิฟเวอร์โดยใช้ IP, คุณจำเป็นต้องถาม IP ผู้เล่นที่โฮสต์เซิฟเวอร์นั้นๆ. +hostserver = โฮสต์เกม Multiplayer +invitefriends = ชวนเพื่อน +hostserver.mobile = โฮสต์\nเกม +host = โฮสต์ +hosting = [accent]กำลังเปิดเซิฟเวอร์... +hosts.refresh = รีเฟรช +hosts.discovering = กำลังค้นหาเซิฟเวอร์ใน LAN +hosts.discovering.any = กำลังค้นหาเซิฟเวอร์ +server.refreshing = กำลังรีเฟรชเซิฟเวอร์ +hosts.none = [lightgray]ไม่พบเซิฟเวอร์ใน local! +host.invalid = [scarlet]ไม่สามารถเชื่อมต่อกับโฮสต์ได้ +trace = Trace ผู้เล่น/ แกะรอยผู้เล่น +trace.playername = ชื่อผู้เล่น: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID พิเศษ: [accent]{0} +trace.mobile = Mobile Client : [accent]{0} +trace.modclient = Client แบบกำหนดเอง: [accent]{0} +invalidid = client ID ไม่ถูกต้อง! กรุณารายงานบัคนี้ +server.bans = แบน +server.bans.none = ไม่พบผู้เล่นที่ถูกแบน! +server.admins = แอดมิน +server.admins.none = ไม่พบแอดมิน! +server.add = เพิ่มเซิฟเวอร์ +server.delete = คุณแน่ใจหรือว่าจะลบเซิฟเวอร์นี้? +server.edit = แก้ไขเซิฟเวอร์ +server.outdated = [crimson]Server ล้าสมัย![] +server.outdated.client = [crimson]Client ล้าสมัย![] +server.version = [gray]เวอร์ชั่น{0} {1} +server.custombuild = [accent]Build +ที่กำหนดเอง +confirmban = คุณแน่ใจหรือว่าจะแบนผู้เล่นนี้? +confirmkick = คุณแน่ใจหรือว่าจะเตะผู้เล่นนี้ออก? +confirmvotekick = คุณแน่ใจหรือว่าจะโหวตเตะผู้เล่นนี้ออก? +confirmunban = คุณแน่ใจหรือว่าจะเลิกแบนผู้เล่นนี้? +confirmadmin = คุณแน่ใจหรือว่าจะเปลี่ยนผู้เล่นคนนี้เป็นแอดมิน? +confirmunadmin = คุณแน่ใจหรือว่าจะลบสถานะการเป็นแอดมินของผู้เล่นนี้ง? +joingame.title = เข้าร่วมเกม +joingame.ip = ที่อยู่: +disconnect = ตัดการเชื่อมต่อแล้ว +disconnect.error = การเชื่อมต่อมีปัญหา +disconnect.closed = การเชื่อมต่อถูกปิดแล้ว +disconnect.timeout = Timed out. +disconnect.data = การโหลดข้อมูลของ world ผิดพลาด! +cantconnect = ไม่สามารถเข้าร่วมเซิฟเวอร์ ([accent]{0}[]). +connecting = [accent]กำลังเชื่อมต่อ... +connecting.data = [accent]กำลังโหลดข้อมูลของ world ... +server.port = Port: +server.addressinuse = มีคนใช้ Address นี้แล้ว! +server.invalidport = เลข port ไม่ถูกต้อง! +server.error = [crimson]การโฮตส์เซิฟเวอร์ผิดพลาด +save.new = เซฟใหม่ +save.overwrite = คุณแใจหรือว่าจะเซฟทับ\nเซฟนี้? +overwrite = เขียนทับ +save.none = ไม่พบเซฟ! +saveload = กำลังเซฟ... +savefail = เซฟเกมผิดพลาด! +save.delete.confirm = คุณแน่ใจหรือว่าจะลบเซฟนี้? +save.delete = ลบ +save.export = ส่งออกเซฟ +save.import.invalid = [accent]เซฟนี้ไม่ถูกต้อง! +save.import.fail = [crimson]ไม่สามารถนำเข้าเซฟ: [accent]{0} +ได้ +save.export.fail = [crimson]ไม่สามารถส่งออกเซฟ: [accent]{0} +ได้ +save.import = นำเข้าเซฟ +save.newslot = ชื่อเซฟ: +save.rename = เปลี่ยนชื่อ +save.rename.text = ชื่อใหม่: +selectslot = เลือกเซฟ. +slot = [accent]Slot {0} +editmessage = แก้ไขข้อความ +save.corrupted = ไฟล์เซฟเสียหายหรือไม่ถูกต้อง! +empty = <ว่างเปล่า> +on = เปิด +off = ปิด +save.autosave = เซฟอัตโนมัติ: {0} +save.map = แมพ: {0} +save.wave = Wave {0} +save.mode = โหมดของเกม: {0} +save.date = เซฟล่าสุด: {0} +save.playtime = เวลาที่เล่นไป: {0} +warning = คำเตือน. +confirm = ตกลง +delete = ลบ +view.workshop = เปิดใน Workshop +workshop.listing = แก้ไข Workshop Listing +ok = โอเค +open = เปิด +customize = กฎแบบกำหนดเอง +cancel = ยกเลิก +openlink = เปิดลิ้งค์ +copylink = คัดลอกลิ้งค์ +back = กลับ +data.export = ส่งออกข้อมูล +data.import = นำเข้าข้อมูล +data.exported = ข้อมูลส่งออกแล้ว +data.invalid = นี่ไม่ใช่ข้อมูลเกมที่ถูกต้อง. +data.import.confirm = การนำเข้าข้อมูลจากภายนอกจะเขียนทับข้อมูลเก่า[scarlet]ทั้งหมด[]\n[accentและไม่สามารถย้อนกลับได้![]\n\nหลังจากที่นำข้อมูลแล้วเกมจะปิดลงโดยทันที +classic.export = ส่งออกข้อมูล Classic +classic.export.text = [accent]Mindustry[] ได้รับการอัปเดตครั้งใหญ่\nพบเซฟหรือแมพจากเวอร์ชั่น Classic (v3.5 build 40) คุณต้องการที่จะส่งออกข้อมูลไปยังโฟลเดอร์โฮมของโทรศัพท์ของคุณเพื่อที่จะใช้ในแอป Mindustry Classic หรือไม่? +quit.confirm = คุณแน่ใจหรือว่าจะออก? +quit.confirm.tutorial = คุณแน่ใจหรือว่าคุณกำลังทำอะไรอยู่?\nการสอนเล่นสามารถเล่นได้อีกครั้งใน[accent] ตั้งค่า->เกม->เล่นการสอนเล่นอีกครั้ง[] +loading = [accent]กำลังโหลด... +reloading = [accent]กำลังรีโหลดมอด... +saving = [accent]กำลังเซฟ... +cancelbuilding = [accent][[{0}][]เพื่อเคลียแผน +selectschematic = [accent][[{0}][]เพื่อเลือกและคัดลอก +pausebuilding = [accent][[{0}][]เพื่อหยุดการสร้างชั่วคราว +resumebuilding = [scarlet][[{0}][]เพื่อสร้างต่อ +wave = [accent]Wave {0} +wave.waiting = [lightgray]Wave ในอีก {0} +wave.waveInProgress = [lightgray]Wave กำลังดำเนินการ +waiting = [lightgray]กำลังรอ... +waiting.players = รอผู้เล่น... +wave.enemies = ศัตรูคงเหลือ [lightgray]{0} +wave.enemy = ศัตรูคงเหลือ [lightgray]{0} +loadimage = โหลดรูป +saveimage = เซฟรูป +unknown = ไม่ทราบ +custom = กำหนดเอง +builtin = Built-In +map.delete.confirm = คุณแน่ใจหรือว่าจะลบแมพนี้? การกระทำครั้งนี้ไม่สามารถย้อนกลับได้! +map.random = [accent]สุ่มแมพ +map.nospawn = แมพนี้ไม่มี core ที่จะให้ผู้เล่นเกิด! กรุณาใส่ core[accent] สีส้ม[] ใน editor +map.nospawn.pvp = แมพนี้ไม่มี core ของศัตรูสำหรับให้ผู้เล่นเกิด! กรุณาใส่ core[SCARLET] ที่ไม่ใช่สีส้ม[] ใน editor +map.nospawn.attack = แมพนี้ไม่มี core ของศัตรูสำหรับให้ผู้เล่นโจมตี! กรุณาใส่ core[SCARLET] สีแดง[] ใน editor +map.invalid = โหลดแมพผิดพลาด: ไฟล์แมพเสียหายหรือไม่ถูกต้อง +workshop.update = อัปเดตไอเท็ม +workshop.error = ผิดพลาดในการนำ workshop มา รายละเอียดดังนี้: {0} +map.publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่แมพนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA, มิฉนั้นแมพจะไม่ปรากฏ! +workshop.menu = เล์อกว่าจะทำอะไรกับไอเท็มนี้ +workshop.info = ข้อมูลไอเท็ม +changelog = สิ่งที่เปลี่ยนไป (ไม่จำเป็น): +eula = Steam EULA +missing = ไอเท็มนี้ถูกลบหรือย้าย\n[lightgray]ยกเลิกการเชื่อมต่อของ workshop listing แล้ว +publishing = [accent]กำลังเผยแพร่... +publish.confirm = คุณแน่ใจหรือว่าจะเผยแพร่สิ่งนี้?\n\n[lightgray]คุณต้องแน่ใจก่อนว่าคุณเห็นด้วยกับ Workshop EULA, มิฉนั้นไอเท็มของคุณจะไม่ปรากฏ! +publish.error = การเผยแพร่ไอเท็มดังต่อไปนี้ผิดพลาด: {0} +steam.error = ไม่สามารถเริ่ม Steam service ได้\nError: {0} + +editor.brush = แปรง +editor.openin = เปิดมน Editor +editor.oregen = การเกิดของแร่ +editor.oregen.info = การเกิดของแร่: +editor.mapinfo = ข้อมูลของแมพ +editor.author = ผู้สร้าง: +editor.description = คำอธิบาย: +editor.nodescription = แมพจำเป็นต้องมีคำอธิบายอย่างน้อย 4 ตัวอักษรจึงจะสามารถเผยแพร่ได้ +editor.waves = Waves: +editor.rules = กฎ: +editor.generation = การเกิด: +editor.ingame = แก้ไขในเกม +editor.publish.workshop = เผยแพร่บน Workshop +editor.newmap = แมพใหม่ +workshop = Workshop +waves.title = Waves +waves.remove = ลบ +waves.never = +waves.every = ทุกๆ +waves.waves = wave(s) +waves.perspawn = ต่อสปาวน์ +waves.to = to +waves.boss = บอส +waves.preview = พรีวิว +waves.edit = แก้ไข... +waves.copy = คัดลอกไปยังคลิปบอร์ด +waves.load = โหลดจากคลิปบอร์ด +waves.invalid = waves ในคลิปบอร์ดไม่ถูกต้อง +waves.copied = คัดลอก Waves แล้ว +waves.none = ไม่ได้กำหนดศัตรู\nwave layouts เปล่าจะถูกแทนที่โดย layout ค่าเริ่มต้นของเกม +editor.default = [lightgray]<ค่าเริ่่มต้น> +details = รสยละเอียด... +edit = แก้ไข... +editor.name = ชื่อ: +editor.spawn = สปาวน์ยูนิต +editor.removeunit = ลบยูนิต +editor.teams = ทีม +editor.errorload = โหลดไฟล์ผิดพลาด +editor.errorsave = เซฟไฟล์ผิดพลาด +editor.errorimage = ไฟล์นั้นคือไฟล์รูป ไม่ใช่แมพ\n\nหากคุณต้องการนำเข้าไฟล์แมพจากเวอร์ชั่น 3.5/build 40 ใช้ปุ่ม 'นำเข้าแมพ Legacy' ใน editor. +editor.errorlegacy = แมพนี้เก่าเกินไปและใช้ฟอร์แม็ตแมพ legacy ที่ไม่สนับสนุนแล้ว +editor.errornot = นี่ไม่ใช้ไฟล์แมพ +editor.errorheader = ไฟล์แมพนี้เสียหรือไม่ถูกต้อง +editor.errorname = แมพไม่มีการกำหนดชื่อ คุณกำลังโหลดไฟล์เซฟอยู่หรือป่าว? +editor.update = อัปเดต +editor.randomize = สุ่ม +editor.apply = ใช้ +editor.generate = การเกิด +editor.resize = เปลี่ยนขนาด +editor.loadmap = โหลดแมพ +editor.savemap = เซฟแมพ +editor.saved = เซฟเรียบร้อย! +editor.save.noname = แมพของคุณไม่มีชื่อ! สามารถตั้งชื่อได้ในเมนู 'ข้อมูลแมพ' +editor.save.overwrite = แมพของคุณไปทับกับแมพ built-in! เปลี่ยนชื่อได้ในเมนู 'ข้อมูลแมพ' +editor.import.exists = [scarlet]ไม่สามารถนำเข้าได้:[] มีแมพ built-in map ชื่อ '{0}' อยู่แล้ว! +editor.import = กำลังนำเข้า... +editor.importmap = นำเข้าแมพ +editor.importmap.description = นำเข้าแมพที่มีอยู่แล้ว +editor.importfile = นำเข้าไฟล์ +editor.importfile.description = นำเข้าแมพจากไฟล์ภายนอก +editor.importimage = นำเข้าแมพแบบ Legacy +editor.importimage.description = นำเข้าแมพจากไฟล์รูปภายนอก +editor.export = กำลังส่งออก... +editor.exportfile = ส่งออกไฟล์ +editor.exportfile.description = ส่งออกไฟล์แมพ +editor.exportimage = ส่งออกไฟล์รูป Terrain +editor.exportimage.description = ส่งออกไฟล์รูปแมพ +editor.loadimage = นำเข้า Terrain +editor.saveimage = ส่งออก Terrain +editor.unsaved = [scarlet]คุณมีการเปลี่ยนแปลงที่ยังไม่ได้เซฟ![]\nคุณแน่ใจหรือว่าจะออก? +editor.resizemap = เปลี่ยนขนาดของแมพ +editor.mapname = ชื่อแมพ: +editor.overwrite = [accent]ตำเตือน!\nแมพนี้จะเขียนทับกับแมพที่มีอยู่แล้ว +editor.overwrite.confirm = [scarlet]ตำเตือน![] มีแมพที่มีชื่อนี้อยู่แล้ว คุณแน่ใจหรือว่าจะเขียนทับมัน? +editor.exists = มีแมพที่มีชื่อนี้อยู่แล้ว +editor.selectmap = เลือกแมพที่จะโหลด: + +toolmode.replace = แทนที่ +toolmode.replace.description = วาดเฉพาะบนบล็อคตัน +toolmode.replaceall = แทนที่ทั้งหมด +toolmode.replaceall.description = แทนที่บล็อคทั้งหมดในแมพ +toolmode.orthogonal = มุมฉาก +toolmode.orthogonal.description = วาดเส้นมุมฉากเท่านั้น. +toolmode.square = สี่เหลี่ยม +toolmode.square.description = แปรงรูปสี่เหลี่ยม +toolmode.eraseores = ลบแร่ +toolmode.eraseores.description = ลบเฉพาะแร่เท่านั้น +toolmode.fillteams = เติมทีม +toolmode.fillteams.description = เติมทีมแทนที่จะเป็นบล็อค +toolmode.drawteams = วาดทีม +toolmode.drawteams.description = วาดทีมแทนที่จะเป็นบล็อค + +filters.empty = [lightgray]ไม่มีฟิลเตอร์! เพิ่มด้วยปุ่มด้านล่างนี้ +filter.distort = บิดเบือน +filter.noise = นอยส์ +filter.median = เฉลี่ย +filter.oremedian = เฉลี่ยแร่ +filter.blend = ผสมผสาน +filter.defaultores = แร่พื้นฐาน +filter.ore = แร่ +filter.rivernoise = นอยส์แม่น้ำ +filter.mirror = สะท้อน +filter.clear = เคลียร์ +filter.option.ignore = เพิกเฉย +filter.scatter = กระจาย +filter.terrain = พื้นผิว +filter.option.scale = มาตราส่วน +filter.option.chance = โอกาส +filter.option.mag = แม็คนิจูต +filter.option.threshold = Threshold +filter.option.circle-scale = สเกลวงกลม +filter.option.octaves = เลอะเลือน +filter.option.falloff = หลุด +filter.option.angle = มุม +filter.option.block = บล็อค +filter.option.floor = พื้น +filter.option.flooronto = พื้น Target +filter.option.wall = กำแพง +filter.option.ore = แร่ +filter.option.floor2 = พื้นชั้น 2 +filter.option.threshold2 = Threshold ชั้น 2 +filter.option.radius = รัศมี +filter.option.percentile = เปอร์เซ็น + +width = กว้าง: +height = สูง: +menu = เมนู +play = เล่น +campaign = แคมเปญ +load = โหลด +save = เซฟ +fps = FPS: {0} +ping = Ping: {0}ms +language.restart = กรุณารีสตาร์ทเพื่อที่จะให้เกมเปลี่ยนเป็นภาษาที่คุณเลือก +settings = ตั้งค่า +tutorial = สอนเล่น +tutorial.retake = เล่นการสอนเล่นอีกครั้ง +editor = Editor +mapeditor = Editor ของแมพ + +abandon = ทิ้ง +abandon.text = โซนนี้และทรัพยากรทั้งหมดจะกลายเป็นของศัตรู +locked = ล็อค +complete = [lightgray]สำเร็จ: +requirement.wave = ถึง Wave ที่ {0} ใน {1} +requirement.core = ทำลาย Core ของศัตรูใน {0} +requirement.unlock = ปลดล็อค {0} +resume = เล่นต่อในโซน:\n[lightgray]{0} +bestwave = [lightgray]Wave สูงสุด: {0} +launch = < ส่ง > +launch.title = ส่งเรียบร้อย +launch.next = [lightgray]โอกาสครั้งหน้าที่ wave {0} +launch.unable2 = [scarlet]ไม่สามารถส่งได้[] +launch.confirm = นี่จะส่งทรัพยากรทั้งหมดใน core ของคุณ\nคุณจะไม่สามารถกลับมาที่ฐานนี้ได้อีก +launch.skip.confirm = ถ้าคุณข้ามตอนนี้, คุณจะไม่สามารถส่งจนกว่าจะถึง waves ต่อๆไป +uncover = เปิดเผย +configure = ตั้งค่า Loadout +bannedblocks = Banned Blocks +addall = เพิ่มทั้งหมด +configure.locked = [lightgray]ปลดล็อคการตั้งค่า loadout: {0}. +configure.invalid = จำนวนต้อยู่ระหว่าง 0 ถึง {0}. +zone.unlocked = [lightgray]{0} ปลดล็อคแล้ว +zone.requirement.complete = ข้อเรียกร้องสำหรับ {0} สำเร็จแล้ว:[lightgray]\n{1} +zone.config.unlocked = Loadout ปลดล็อคแล้ว:[lightgray]\n{0} +zone.resources = [lightgray]ทรัพยากรที่พบ: +zone.objective = [lightgray]เป้าหมาย: [accent]{0} +zone.objective.survival = เอาชีวิตรอด +zone.objective.attack = ทำลาย Core ของศัตรู +add = เพิ่ม... +boss.health = เลือดบอส + +connectfail = [crimson]การเชื่อมต่อผิดพลาด:\n\n[accent]{0} +error.unreachable = เซิฟเวอร์ไม่สามารถเข้าถึงได้\nแน่ใจหรือว่าที่อยู่เขียนถูกต้อง? +error.invalidaddress = ที่อยู่ไม่ถูกต้อง +error.timedout = Timed out!\nเช็คให้แน่ใจว่า port forwarding ของโฮสต์เปิดอยู่และที่อยู่นั้นถูกต้อง! +error.mismatch = Packet error:\nอาจเกิดจากเวอร์ชั่นของ client/server ไม่ตรงกัน\nเช็คให้แน่ใจว่าเซิฟเวอร์ใช้ Mindustry เวอร์ชั่นล่าสุด! +error.alreadyconnected = เชื่อมต่ออยู่แล้ว +error.mapnotfound = ไม่พบไฟล์แมพ +error.io = Network I/O error. +error.any = Unknown network error. +error.bloom = ไม่สามารถเริ่มต้น bloom ได้\nอุปกรณ์ของคุณอาจไม่รองรับ + +zone.groundZero.name = Ground Zero +zone.desertWastes.name = Desert Wastes +zone.craters.name = The Craters +zone.frozenForest.name = Frozen Forest +zone.ruinousShores.name = Ruinous Shores +zone.stainedMountains.name = Stained Mountains +zone.desolateRift.name = Desolate Rift +zone.nuclearComplex.name = Nuclear Production Complex +zone.overgrowth.name = Overgrowth +zone.tarFields.name = Tar Fields +zone.saltFlats.name = Salt Flats +zone.impact0078.name = Impact 0078 +zone.crags.name = Crags +zone.fungalPass.name = Fungal Pass + +zone.groundZero.description = ตำแหน่งเริ่มต้นที่ดีที่สุด ภัยคุกคามจากศัตรูน้อย ทรัพยากรก็น้อยเช่นกัน\nรวบรวมตะกั่วและทองแดงให้ได้มากที่สุดเท่าที่จะทำได้\nแล้วเดินหน้าต่อ +zone.frozenForest.description = แม้แต่ที่นี่อยู่ใกล้กับภูเขา สปอร์ก็สามารถแพร่มาถึงได้. อุณภูมิที่เยือกเย็นไม่สามารถจำกัดวงของมันได้ตลอดไป.\n\nเริ่มลองใช้พลังงาน สร้างเครื่องกำเนิดไฟฟ้าเผาไหม้ เรียนรู้ที่จะใช้ menders. +zone.desertWastes.description = ของเสียพวกนี้กินบริเวณกว้าง คาดการณ์ไม่ได้ และมีสิ่งก่อสร้างที่ถูกถอดทิ้งอยู่\nมีถ่านหินอยู่ในบริเวณนี้. นำมันไปเผาเพื่อเปลี่ยนเป็นพลังงานหรือนำไปสังเคราะห์เป็นกราไฟต์\n\n[lightgray]ตำแหน่ง landing ไม่สามารถการันตีได้ +zone.saltFlats.description = ภายนอกเขตทะเลทรายเป็นที่ตั้งของ Salt Flats. พบทรัพยากรในบริเวณนี้ค่อนข้างน้อย\n\nศัตรูสร้างที่เก็บทรัพยากรไว้ที่นี่. กำจัด core ของพวกมัน. อย่าให้มีอะไรเหลือ +zone.craters.description = น้ำถูกเก็บสะสมในปล่องผู้เขาไฟนี้, เป็นสิ่งที่ตกทอดมาจากสงครามเก่า บุกเบิกพื้นที่ เก็บทราย เผากระจกเมต้า. ปั๊มน้ำมาใช้หล่อเย็นป้อมปืนและเครื่องขุด +zone.ruinousShores.description = อยู่ถัดไปจาก the wastes, คือเส้นชายทะเล. เมื่อก่อนนั้น, สถานที่นี้เป็นที่ตั้งของแนวป้องกันชายฝั่ง. ร่องรอยของมันหลงเหลือไม่มาก. เหลือแค่สิ่งก่อสร้างป้องกันพื้นฐานเท่านั้นที่ปราศจากอัตราย, อย่างอื่นทุกอย่างกลายเป็นเศษเหล็กทั้งหมด.\nขยายออกไปข้างนอกต่อไป ค้นพบกับเทศโนโลยีอีกครั้ง. +zone.stainedMountains.description = ถัดเข้าไปบนพื้นดิน จะพบกับภูเขาจำนวนหนึ่ง, ซึ่งยังคงบริสุทธิ์จากสปอร์\nขุดไทเทเนียมที่อุดมสมบูรณ์ในบริเวณนี้. เรียนรู้ที่จะใช้มัน.\n\nศัตรูที่นี่จะมามากขึ้น. อย่าให้พวกมันส่งยูนิตที่แข็งแกร่งที่สุด +zone.overgrowth.description = พื้นที่รก, ใกล้กับแหล่งที่มาของสปอร์.\nศัตรูได้ตั้งหน้าด่านที่นี่ สร้างยูนิตไททัน. ทำลายมัน เรียกคืนในสิ่งที่เราสูญเสียไป. +zone.tarFields.description = ภายนอกเขตของพื้นที่ผลิตน้ำมัน, อยู่ระหว่าภูเขาและทะเลทราย. หนึ่งในพื้นที่ที่มีบ่อน้ำมันดิบที่ใช้งานได้ \nถึงแม้ว่าจะถูกทิ้งร้าง, พื้นที่นี้ยังคงมีกำลังพลของศัตรูอยู่ใกล้ๆ. อย่าประเมิณพวกมันต่ำไป.\n\n[lightgray]วิจัยเทคโนโลยีแปรรูปน้ำมันถ้าเป็นไปได้ +zone.desolateRift.description = พื้นที่ที่อันตรายมาก เต็มไปด้วยทรัพยากร แต่มีพื้นที่น้อย. ความเสี่ยงวิบัตสูง. ออกไปให้เร็วที่สุด. อย่าให้ถูกหลอกจากช่วงเวลาที่ห่างกันมากในแต่ละการโจมตีของศัตรู +zone.nuclearComplex.description = โรงงานขุดและแปรรูปทอเรี่ยมเก่า, เหลือแค่ซากปรักหักพัง.\n[lightgray]วิจัยทอเรียมและการใช้งานที่มากมายของมัน.\n\nศัตรูที่นี่มาในจำนวนที่เยอะ คอยสอดส่องเพื่อหาจังหวะโจมตี +zone.fungalPass.description = พื้นที่ขั้นกลางระหว่างภูเขาสูงและ spore-ridden lands ที่ต่ำลงมา. ฐานทัพลาดตระเวนของศัตรูตั้งอยู่ที่นี่.\nทำลายมันซะ.\nใช้ยูนิต Dagger และ Crawler. ทำลาย core ทั้งสอง. +zone.impact0078.description = <ใส่คำบรรยายที่นี่> +zone.crags.description = <ใส่คำบรรยายที่นี่> + +settings.language = ภาษา +settings.data = ข้อมูลเกม +settings.reset = รีเซ็ตเป็นค่าเริ่มต้น +settings.rebind = Rebind +settings.controls = การควบคุม +settings.game = เกม +settings.sound = เสียง +settings.graphics = กราฟิก +settings.cleardata = เคลียร์ข้อมูลเกม... +settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! +settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ, แมพ, สิ่งที่ปลดล็อคแล้วและ keybinds.\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ +paused = [accent]< หยุดชั่วคราว > +clear = เคลียร์ +banned = [scarlet]แบน +yes = ใช่ +no = ไม่ +info.title = ข้อมูล +error.title = [crimson]มีบางอย่างผิดพลาดเกิดขึ้น +error.crashtitle = มีบางอย่างผิดพลาดเกิดขึ้น +blocks.input = นำเข้า +blocks.output = ส่งออก +blocks.booster = บูสเตอร์ +block.unknown = [lightgray]??? +blocks.powercapacity = ความจุพลังงาน +blocks.powershot = หน่วยพลังงาน/นัด +blocks.damage = ดาเมจ +blocks.targetsair = ยิงอากาศยาน +blocks.targetsground = ยิงภาคพื้นดิน +blocks.itemsmoved = ความเร็วเคลื่อนที่ +blocks.launchtime = เวลาระหว่างการส่ง +blocks.shootrange = ระยะยิง +blocks.size = ขนาด +blocks.liquidcapacity = จุของเหลว +blocks.powerrange = ระยะพลังงาน +blocks.powerconnections = จำนวนการเชื่อมต่อสูงสุด +blocks.poweruse = ใช้พลังงาน +blocks.powerdamage = หน่วยพลังงาน/ดาเมจ +blocks.itemcapacity = จุไอเท็ม +blocks.basepowergeneration = กำเนิดพลังงานพื้นฐาน +blocks.productiontime = เวลาที่ใช้ในการผลิต +blocks.repairtime = เวลาที่ใช้ในการซ่อมแซมให้สมบูรณ์ +blocks.speedincrease = เพิ่มความเร็ว +blocks.range = ระยะ +blocks.drilltier = ขุดได้ +blocks.drillspeed = ความเร็วขุดพื้นฐาน +blocks.boosteffect = แอฟเฟ็คของบูสต์ +blocks.maxunits = จำนวนยูนิตสูงสุด +blocks.health = เลือด +blocks.buildtime = เวลาในการสร้าง +blocks.buildcost = ใช้ +blocks.inaccuracy = ความคลาดเคลื่อน +blocks.shots = นัด +blocks.reload = นัด/วินาที +blocks.ammo = กระสุน + +bar.drilltierreq = จำเป็นต้องใช้เครื่องขุดที่ดีกว่า +bar.drillspeed = ความเร็วขุด: {0}/s +bar.pumpspeed = ความเร็วปั้ม: {0}/s +bar.efficiency = ประสิทธิภาพ: {0}% +bar.powerbalance = พลังงาน: {0}/s +bar.powerstored = เก็บแล้ว: {0}/{1} +bar.poweramount = พลังงาน: {0} +bar.poweroutput = พลังงานออก: {0} +bar.items = ไอเท็ม: {0} +bar.capacity = ความจุ: {0} +bar.liquid = ของเหลว +bar.heat = ความร้อน +bar.power = พลังงาน +bar.progress = ความคืบหน้าในการสร้าง +bar.spawned = จำนวนยูนิตทั้งหมด: {0}/{1} + ยูนิต +bar.input = นำเข้า +bar.output = ส่งออก + +bullet.damage = [stat]{0}[lightgray] ดาเมจ +bullet.splashdamage = [stat]{0}[lightgray] ดาเมจกระจาย ~[stat] {1}[lightgray] ช่อง +bullet.incendiary = [stat]ติดไฟ +bullet.homing = [stat]ติดตาม +bullet.shock = [stat]ช็อค +bullet.frag = [stat]แตกออก +bullet.knockback = [stat]{0}[lightgray] ดันกลับ +bullet.freezing = [stat]แช่แข็ง +bullet.tarred = [stat]เปื้อนน้ำมัน +bullet.multiplier = [stat]{0}[lightgray]x จำนวนกระสุนต่อ 1 ไอเท็ม +bullet.reload = [stat]{0}[lightgray]x ความเร็วยิง + +unit.blocks = บล็อค +unit.powersecond = หน่วยพลังงาน/วินาที +unit.liquidsecond = หน่วยของเหลว/วินาที +unit.itemssecond = ไอเท็ม/วินาที +unit.liquidunits = หน่วยของเหลว +unit.powerunits = หน่วยพลังงาน +unit.degrees = องศา +unit.seconds = วินาที +unit.persecond = /วินาที +unit.timesspeed = เท่าเร็วขึ้น +unit.percent = % +unit.items = ไอเท็ม +category.general = ทั่วไป +category.power = พลังงาน +category.liquids = ของเหลว +category.items = ไอเท็ม +category.crafting = นำเข้า/ส่งออก +category.shooting = การยิง +category.optional = การเพิ่มประสิทธิภาพทางเลือก +setting.landscape.name = ล็อค Landscape +setting.shadows.name = เงา +setting.blockreplace.name = แนะนำบล็อคโดยอัตโนมัติ +setting.linear.name = การกรองเชิงเส้น +setting.hints.name = คำแนะนำ +setting.buildautopause.name = หยุดสร้างชั่วคราวแบบอัตโนมัติ +setting.animatedwater.name = แอนิเมชั่นน้ำ +setting.animatedshields.name = แอนิเมชั่นเกราะ +setting.antialias.name = Antialias[lightgray] (จำเป็นต้องรีสตาร์ท)[] +setting.indicators.name = ตัวบอกศัตรู/พักพวก +setting.autotarget.name = เล็งเป้าอัตโนมัติ +setting.keyboard.name = การควบคุมแบบ เม้าส์+คีย์บอร์ด +setting.touchscreen.name = การควบคุมแบบหน้าจอสัมผัส +setting.fpscap.name = FPS +สูงสุด +setting.fpscap.none = ไม่มี +setting.fpscap.text = {0} FPS +setting.uiscale.name = ขนาด UI[lightgray] (จำเป็นต้องรีสตาร์ท)[] +setting.swapdiagonal.name = การวางเป็นเส้นทแยงเสมอ +setting.difficulty.training = ฝึกซ้อม +setting.difficulty.easy = ง่าย +setting.difficulty.normal = ปานกลาง +setting.difficulty.hard = ยาก +setting.difficulty.insane = ยากมาก +setting.difficulty.name = ระดับความยาก: +setting.screenshake.name = การสั่นของจอ +setting.effects.name = แสดงเอฟเฟ็ค +setting.destroyedblocks.name = แสดงบล็อคที่ถูกทำลาย +setting.conveyorpathfinding.name = Pathfinding +ของการวางสายพาน +setting.sensitivity.name = ความไวของตัวควบคุม +setting.saveinterval.name = ระยะห่าวระหว่างเซฟ +setting.seconds = {0} วินาที +setting.fullscreen.name = เต็มจอ +setting.borderlesswindow.name = วินโดว์แบบไร้ขอบ[lightgray] (อาจจะต้องรีตาร์ท) +setting.fps.name = แสดง FPS และ Ping +setting.vsync.name = VSync +setting.pixelate.name = Pixelate[lightgray] (ปิดใช้งานแอนิเมชั่น) +setting.minimap.name = แสดงมินิแมพ +setting.position.name = แสดงตำแหน่งของผู้เล่น +setting.musicvol.name = ระดับเสียงเพลง +setting.ambientvol.name = ระดับเสียงล้อมรอบ +setting.mutemusic.name = ปิดเพลง +setting.sfxvol.name = ระดับเสียง SFX +setting.mutesound.name = ปิดเสียง +setting.crashreport.name = ส่งรายงานการแครชแบบไม่ระบุตัวตน +setting.savecreate.name = สร้างเซฟโดยอัตโนมัติ +setting.publichost.name = การมองเห็นเซิฟเวอร์สาธารณะ +setting.chatopacity.name = ความโปร่งแสงของแชท +setting.lasersopacity.name = ความโปร่งแสงของเลเซอร์พลังงาน +setting.playerchat.name = แสดงบับเบิ้ลแชทของผู้เล่น +public.confirm = คุณต้องการให้เกมของคุณเปิดเป็นสาธารณะหรือไม่?\n[accent]ทุกคนจะสามารถเข้าร่วมเกมของคุณได้.\n[lightgray]คุณสามารถเปลี่ยนการตั้งค่านี้ได้ที่ ตั้งค่า->เกม->การมองเห็นเซิฟเวอร์สาธารณะ. +public.beta = เกมเวอร์ชั่นเบต้าไม่สามารถเปิดเซิฟเวอร์สาธารณะได้ +uiscale.reset = ขนาดของ UI มีการเปลี่ยนแปลง\nกด "โอเค" เพื่อยืนยันขนาดนี้.\n[scarlet]เปลี่ยนกลับไปเป็นแบบเดิมและออกในอีก[accent] {0}[] วินาที... +uiscale.cancel = ยกเลิกและออก +setting.bloom.name = Bloom +keybind.title = ตั้งค่าปุ่ม +keybinds.mobile = [scarlet]การตั้งค่าปุ่มส่วนใหญ่ไม่สามารถใช้ในมือถือได้. เฉพาะการเคลื่อนไหวพื้นฐานเท่านั้นที่ใช้ได้. +category.general.name = ทั่วไป +category.view.name = วิว +category.multiplayer.name = ผู้เล่นหลายคน +command.attack = โจมตี +command.rally = ชุมนุม +command.retreat = ถอยกลับ +keybind.clear_building.name = เคลียร์สิ่งก็สร้าง +keybind.press = กดปุ่มใดก็ได้... +keybind.press.axis = กดแกนหรือปุ่มใดก็ได้... +keybind.screenshot.name = แมพ Screenshot +keybind.move_x.name = เคลื่อนที่ในแกน x +keybind.move_y.name = เคลี่อนที่ในแกน y +keybind.mouse_move.name = ตามเม้าส์ +keybind.schematic_select.name = เลือกภูมิภาค +keybind.schematic_menu.name = เมนู Schematic +keybind.schematic_flip_x.name = กลับ Schematic ในแกน X +keybind.schematic_flip_y.name = กลับ Schematic ในแกน Y +keybind.fullscreen.name = เปิด/ปิด Fullscreen +keybind.select.name = เลือก/ยิง +keybind.diagonal_placement.name = วางเป็นแนวทแยง +keybind.pick.name = เลือกบล็อค +keybind.break_block.name = ทุบบล็อค +keybind.deselect.name = ยกเลิกการเบือก +keybind.shoot.name = ยิง +keybind.zoom_hold.name = ซูม กดค้าง +keybind.zoom.name = ซูม +keybind.menu.name = เมนู +keybind.pause.name = หยุดชั่วคราว +keybind.pause_building.name = หยุด/สร้างต่อ +keybind.minimap.name = มินิแมะ +keybind.dash.name = พุ่ง +keybind.chat.name = แชท +keybind.player_list.name = รายชื่อผู้เล่น +keybind.console.name = คอนโซล์ +keybind.rotate.name = หมุน +keybind.rotateplaced.name = หมุนที่มีอยู่ (กดค้าง) +keybind.toggle_menus.name = เปิด/ปิด เมนู +keybind.chat_history_prev.name = ประวัติแชทก่อนหน้า +keybind.chat_history_next.name = ประวัติแชทถัดไป +keybind.chat_scroll.name = เลื่อนแชท +keybind.drop_unit.name = ดรอปยูนิต +keybind.zoom_minimap.name = ซูมมินิแมพ +mode.help.title = คำอธิบายโหมด +mode.survival.name = เอาชีวิตรอด +mode.survival.description = โหมดปกติ. ทรัพยากรมีจำกัดและ wave มาโดยอัตโนมัติ.\n[gray]ต้องมีสปาวน์ของศัตรูเพื่อที่จะเล่น. +mode.sandbox.name = Sandbox +mode.sandbox.description = ทรัพยาดรไม่จำกัดและ wave ไม่จับเวลา. +mode.editor.name = Editor +mode.pvp.name = PvP +mode.pvp.description = สู้กับผู้เล่นอื่น.\n[gray]แมพจำเป็นต้องมี 2 core ที่ไม่ใช่สีเดียวกัน. +mode.attack.name = โจมตี +mode.attack.description = ทำลายฐานของศัตรู ไม่มี wave.\n[gray]จำเป็นต้องมี core สีแดงเพื่อเล่น. +mode.custom = กฎแบบกำหนดเอง + +rules.infiniteresources = ทรัพยากรไม่จำกัด +rules.wavetimer = ตัวตั้งเวลา Wave +rules.waves = Waves +rules.attack = โหมดการโจมตี +rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากรไม่จำกัด +rules.unitdrops = ยูนิตดรอป +rules.unitbuildspeedmultiplier = ตัวคูณความเร็วในการสร้างยูนิต +rules.unithealthmultiplier = ตัวคูณเลือดของยูนิต +rules.playerhealthmultiplier = ตัวคูณเลือดผู้เล่น +rules.playerdamagemultiplier = ตัวคูณดาเมจผู้เล่น +rules.unitdamagemultiplier = ตัวคูณดาเมจยูนิต +rules.enemycorebuildradius = วงห้ามสร้างของ Core ศัตรู:[lightgray] (ช่อง) +rules.respawntime = ความเร็วในการเกิดใหม่:[lightgray] (วินาที) +rules.wavespacing = ระยะเวลาระหว่าง wave:[lightgray] (วินาที) +rules.buildcostmultiplier = ตัวคูณจำนวนทรัพยากรในการสร้าง +rules.buildspeedmultiplier = ตัวคูณความเร็วในการสร้าง +rules.waitForWaveToEnd = Waves รอศัตรู +rules.dropzoneradius = รัศมี Drop Zone:[lightgray] (ช่อง) +rules.respawns = เกิดใหม่สูงสุดต่อ wave +rules.limitedRespawns = จำกัดการเกิดใหม่ +rules.title.waves = Waves +rules.title.respawns = เกิดใหม่ +rules.title.resourcesbuilding = ทรัพยากรและสิ่งก่อสร้าง +rules.title.player = ผู้เล่น +rules.title.enemy = ศัตรู +rules.title.unit = ยูนิต + +content.item.name = ไอเท็ม +content.liquid.name = ของเหลว +content.unit.name = ยูนิต +content.block.name = บล็อค +content.mech.name = เม็ค +item.copper.name = ทองแดง +item.lead.name = ตะกั่ว +item.coal.name = ถ่านหิน +item.graphite.name = กราไฟต์ +item.titanium.name = ไทเทเนี่ยม +item.thorium.name = ทอเรี่ยม +item.silicon.name = ซิลิกอน +item.plastanium.name = พลาสตาเนี่ยม +item.phase-fabric.name = ใยเฟส +item.surge-alloy.name = เสิร์จอัลลอย +item.spore-pod.name = สปอร์พอท +item.sand.name = ทราย +item.blast-compound.name = สารประกอบระเบิด +item.pyratite.name = ไฟราไทต์ +item.metaglass.name = กระจกเมต้า +item.scrap.name = เศษเหล็ก +liquid.water.name = น้ำ +liquid.slag.name = กากแร่ +liquid.oil.name = น้ำมัน +liquid.cryofluid.name = ไครโยฟลูอิด +mech.alpha-mech.name = อัลฟ้า +mech.alpha-mech.weapon = เฮฟวี้รีพีทเตอร์ +mech.alpha-mech.ability = รีเจเนเรชั่น +mech.delta-mech.name = เดลต้า +mech.delta-mech.weapon = เครื่องกำเนิดประกายไฟฟ้า +mech.delta-mech.ability = ปล่อย +mech.tau-mech.name = เทา +mech.tau-mech.weapon = รีสตัคเลเซอร์ +mech.tau-mech.ability = เบิสต์ซ่อมแซม +mech.omega-mech.name = โอเมก้า +mech.omega-mech.weapon = ฝูงขีปนาวุธ +mech.omega-mech.ability = ตัวเสริมเกราะ +mech.dart-ship.name = ลูกดอก (Dart) +mech.dart-ship.weapon = รีพีตเตอร์ +mech.javelin-ship.name = หอก (Javelin) +mech.javelin-ship.weapon = ขีปนาวุธเบิสต์ +mech.javelin-ship.ability = ดิสชาร์จบูสเตอร์ +mech.trident-ship.name = ตรีศูล (Trident) +mech.trident-ship.weapon = ห้องเก็บระเบิด +mech.glaive-ship.name = เกลฟว์ +mech.glaive-ship.weapon = รีพีตเตอร์ไฟ +item.explosiveness = [lightgray]ค่าการระเบิด: {0}% +item.flammability = [lightgray]ไวไฟ: {0}% +item.radioactivity = [lightgray]ค่ากัมมันตภาพรังสี: {0}% +unit.health = [lightgray]เลือด: {0} +unit.speed = [lightgray]ความเร็ว: {0} +mech.weapon = [lightgray]อาวุธ: {0} +mech.health = [lightgray]เลือด: {0} +mech.itemcapacity = [lightgray]ความจุไอเท็ม: {0} +mech.minespeed = [lightgray]ความเร็วการขุด: {0}% +mech.minepower = [lightgray]พลังการขุด: {0} +mech.ability = [lightgray]ความสามารถ: {0} +mech.buildspeed = [lightgray]ความเร็วการสร้าง: {0}% +liquid.heatcapacity = [lightgray]ความจุความร้อน: {0} +liquid.viscosity = [lightgray]ความเหนียว: {0} +liquid.temperature = [lightgray]อุณหภูมิ: {0} + +block.sand-boulder.name = ก้อนหินทราย +block.grass.name = หญ้า +block.salt.name = เกลือ +block.saltrocks.name = หินเกลือ +block.pebbles.name = ก้อนกรวด +block.tendrils.name = ไม้เลื้อย +block.sandrocks.name = หินทราย +block.spore-pine.name = ต้นสนสปอร์ +block.sporerocks.name = หินสปอร์ +block.rock.name = หิน +block.snowrock.name = หินหิมะ +block.snow-pine.name = ต้นสนหิมะ +block.shale.name = หินดินดาน +block.shale-boulder.name = ก้อนหินดินดาน +block.moss.name = ตะไคร่น้ำ +block.shrubs.name = พุ่มไม้ +block.spore-moss.name = พุ่มไม้สปอร์ +block.shalerocks.name = หิน +block.scrap-wall.name = กำแพงงเศษเหล็ก +block.scrap-wall-large.name = กำแพงเศษเหล็กขนาดใหญ่ +block.scrap-wall-huge.name = กำแพงเศษเหล็กขนาดใหญ่มาก +block.scrap-wall-gigantic.name = กำแพงเศษเหล็กขนาดยักษ์ +block.thruster.name = ตรัสเตอร์ +block.kiln.name = เตาเผา +block.graphite-press.name = เครื่องอัดกราไฟต์ +block.multi-press.name = มัลติเพรสต์ +block.constructing = {0} [lightgray](กำลังก่อสร้าง) +block.spawn.name = จุดเกิดศัตรู +block.core-shard.name = Core: ชาร์ด +block.core-foundation.name = Core: ฟาวเดชั่น +block.core-nucleus.name = Core: นิวเคลียส +block.deepwater.name = น้ำลึก +block.water.name = น้ำ +block.tainted-water.name = น้ำเสีย +block.darksand-tainted-water.name = น้ำเสียบนทรายดำ +block.tar.name = น้ำมันดิบ +block.stone.name = หิน +block.sand.name = ทราย +block.darksand.name = ทรายดำ +block.ice.name = น้ำแข็ง +block.snow.name = หิมะ +block.craters.name = หลุมอุกกาบาต +block.sand-water.name = น้ำบนทราย +block.darksand-water.name = น้าบนทรายดำ +block.char.name = ชาร์ +block.holostone.name = หินโฮโล่ +block.ice-snow.name = น้ำแข็งหิมะ +block.rocks.name = หิน +block.icerocks.name = หินน้ำแข็ง +block.snowrocks.name = หินหิมะ +block.dunerocks.name = หินเนินทราย +block.pine.name = ต้นสน +block.white-tree-dead.name = ต้นไม้ขาวตายแล้ว +block.white-tree.name = ต้มไม้ขาว +block.spore-cluster.name = กลุ่มสปอร์ +block.metal-floor.name = พื้นเหล็ก 1 +block.metal-floor-2.name = พื้นเหล็ก 2 +block.metal-floor-3.name = พื้นเหล็ก 3 +block.metal-floor-5.name = พื้นเหล็ก 4 +block.metal-floor-damaged.name = พื้นเหล็กได้รับความเสียหาย +block.dark-panel-1.name = แผ่นกระดานมืด 1 +block.dark-panel-2.name = แผ่นกระดานมืด 2 +block.dark-panel-3.name = แผ่นกระดานมืด 3 +block.dark-panel-4.name = แผ่นกระดานมืด 4 +block.dark-panel-5.name = แผ่นกระดานมืด 5 +block.dark-panel-6.name = แผ่นกระดานมืด 6 +block.dark-metal.name = เหล็กดำ +block.ignarock.name = หินอิกน่า +block.hotrock.name = หินร้อน +block.magmarock.name = หินแมกม่า +block.cliffs.name = หน้าผ่า +block.copper-wall.name = กำแพงทองแดง +block.copper-wall-large.name = กำแพงทองแดงขนาดใหญ่ +block.titanium-wall.name = กำแพงไทเทเนี่ยม +block.titanium-wall-large.name = กำแพงไทเทเนี่ยมขนาดใหญ่ +block.plastanium-wall.name = กำแพงพลาสตาเนี่ยม +block.plastanium-wall-large.name = กำแพงพลาสตาเนี่ยมขนาดใหญ่ +block.phase-wall.name = กำแพงเฟส +block.phase-wall-large.name = กำแพงเฟสขนาดใหญ่ +block.thorium-wall.name = กำแพงทอเรี่ยม +block.thorium-wall-large.name = กำแพงทอเรี่ยมขนาดใหญ่ +block.door.name = ประตู +block.door-large.name = ประตูขนาดใหญ่ +block.duo.name = ดูโอ +block.scorch.name = สคอร์ช +block.scatter.name = สแคทเทอร์ +block.hail.name = เฮแอล +block.lancer.name = แลนเซอร์ +block.conveyor.name = สายพาน +block.titanium-conveyor.name = สายพานไทเทเนี่ยม +block.armored-conveyor.name = สายพานเสริมเกราะ +block.armored-conveyor.description = เคลื่อนย้ายไอเท็มเร็วเท่ากับไทเทเนี่ยมแต่มีเกราะที่แข็งกว่า ไม่รับไอเท็มจากด้านข้างจากที่อื่นนอกจากสายพานด้วยกันเอง. +block.junction.name = ทางแยก +block.router.name = เร้าเตอร์ +block.distributor.name = เร้าเตอร์ขนาดใหญ่ +block.sorter.name = เครื่องแยก +block.inverted-sorter.name = เครื่องแยกกลับด้าน +block.message.name = ตัวเก็บข้อความ +block.overflow-gate.name = ประตูล้น +block.silicon-smelter.name = เตาเผาซิลิก้อน +block.phase-weaver.name = เครื่องทอเฟสต์ +block.pulverizer.name = เครื่องบด +block.cryofluidmixer.name = เครื่องผสมไครโยฟลูอิด +block.melter.name = เตาหลอม +block.incinerator.name = เตาเผาขยะ +block.spore-press.name = เครื่องอัดสปอร์ +block.separator.name = +เครื่องแยก +block.coal-centrifuge.name = เครื่องปั่นเหวี่งถ่านหิน +block.power-node.name = โหนดพลังงาน +block.power-node-large.name = โหนดพลังงานขนาดใหญ่ +block.surge-tower.name = เสาเสิร์จ +block.diode.name = ไดโอดแบตเตอรี่ +block.battery.name = แบตเตอรี่ +block.battery-large.name = แบตเตอรี่ขนาดใหญ่ +block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าเผาไหม้ +block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ +block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเชี่ยว +block.impact-reactor.name = เตาปฏิกรณ์อิมแพ็ค +block.mechanical-drill.name = เครื่องขุดเชิงกล +block.pneumatic-drill.name = เครื่องขุดนิวมาติก +block.laser-drill.name = เครื่องขุดเลเซอร์ +block.water-extractor.name = เครื่องขุดน้ำ +block.cultivator.name = เค้าติเวเตอร์ +block.dart-mech-pad.name = ฐานปล่อยเม็คอัลฟ้า +block.delta-mech-pad.name = ฐานปล่อยเม็คเดลต้า +block.javelin-ship-pad.name = ฐานปล่อยยานหอก (Javelin) +block.trident-ship-pad.name = ฐานปล่อยยานตรีศูล (Trident) +block.glaive-ship-pad.name = ฐานปล่อยยานเกลฟว์ +block.omega-mech-pad.name = ฐานปล่อยเม็คโอเมก้า +block.tau-mech-pad.name = ฐานปล่อยเม็คเทา (Tau) +block.conduit.name = รางน้ำ +block.mechanical-pump.name = ปั๊มเชิงกล +block.item-source.name = จุดกำเนิดไอเท็ม +block.item-void.name = จุดลบไอเท็ม +block.liquid-source.name = จุดกำเนิดของเหลว +block.power-void.name = จุดลบพลังงาน +block.power-source.name = พลังงานไม่จำกัด +block.unloader.name = ตัวถ่ายของ +block.vault.name = Vault +block.wave.name = เวฟ +block.swarmer.name = สวอร์มเมอร์ +block.salvo.name = ซาวโว +block.ripple.name = ริปเปิ้ล +block.phase-conveyor.name = สายพานเฟส +block.bridge-conveyor.name = สะพานสายพาน +block.plastanium-compressor.name = เครื่องอัดพลาสตาเนียม +block.pyratite-mixer.name = เครื่องผสมไพราไทต์ +block.blast-mixer.name = เครื่องผสมสารประกอบระเบิด +block.solar-panel.name = แผงโซล่าเซลล์ +block.solar-panel-large.name = แผงโซล่าเซลล์ขนาดใหญ่ +block.oil-extractor.name = เครื่องขุดน้ำมัน +block.command-center.name = ศูนย์สั่งการ +block.draug-factory.name = โรงงานผลิตโดรนขุดเจาะดราคจ์ +block.spirit-factory.name = โรงงานผลิตโดรนซ่อมแซมสปิริต +block.phantom-factory.name = โรงงานผลิตโดรนก่อสร้างแฟนทอม +block.wraith-factory.name = โรงงานผลิตยานไฟท์เตอร์ไวรท์ +block.ghoul-factory.name = โรงงานผลิตยานทิ้งระเบิดGhoul +block.dagger-factory.name = โรงงานผลิตแด็กเกอร์เม็ค +block.crawler-factory.name = โรงงานผลิตครอเลอร์เม็ค +block.titan-factory.name = โรงงานผลิตไททันเม็ค +block.fortress-factory.name = โรงงานผลิตฟอร์เทรสเม็ค +block.revenant-factory.name = โรงงานผลิตยานไฟต์เตอร์เรเวแนนท์ +block.repair-point.name = จุดซ่อมแซม +block.pulse-conduit.name = รางน้ำโพวส์ +block.phase-conduit.name = รางน้ำเฟส +block.liquid-router.name = เร้าเตอร์ของเหลว +block.liquid-tank.name = แทงค์เก็บของเหลว +block.liquid-junction.name = ทางแยกของเหลว +block.bridge-conduit.name = สะพานรางน้ำ +block.rotary-pump.name = ปั๊มโรตารี้ +block.thorium-reactor.name = เตาปฏิกรณ์ทอเรี่ยม +block.mass-driver.name = แมสไดรฟ์เวอร์ +block.blast-drill.name = เครื่องขุดแบบแอร์แบลสต์ +block.thermal-pump.name = ปั๊มเทอร์มอล +block.thermal-generator.name = เครื่องกำเนิดไฟฟ้าจากความร้อน +block.alloy-smelter.name = เตาเผาอัลลอย +block.mender.name = เมนเดอร์ +block.mend-projector.name = เมนโปรเจ็คเตอร์ +block.surge-wall.name = กำแพงเสิร์จ +block.surge-wall-large.name = กำแพงเสิร์จขนาดใหญ่ +block.cyclone.name = ไซโคลน +block.fuse.name = ฟิวส์ +block.shock-mine.name = กับระเบิดไฟฟ้าซ็อต +block.overdrive-projector.name = โอเวอร์ไดรฟ์โปรเจ็คเตอร์ +block.force-projector.name = ฟอร์สโปรเจ็คเตอร์ +block.arc.name = อาร์ค +block.rtg-generator.name = เครื่องกำเนิดไฟฟ้า อาร์ทีจี +block.spectre.name = สเปคเตร +block.meltdown.name = เมลท์ดาวน์ +block.container.name = ที่เก็บของ +block.launch-pad.name = ฐานส่งของ +block.launch-pad-large.name = ฐานส่งของขนาดใหญ่ +team.blue.name = น้ำเงิน +team.crux.name = แดง +team.sharded.name = ส้ม +team.orange.name = ส้ม +team.derelict.name = derelict +team.green.name = เขียว +team.purple.name = ม่วง +unit.spirit.name = โดรนซ่อมแซมสปิริต +unit.draug.name = โดรนขุดเจาะดราคจ์ +unit.phantom.name = โดรนก่อสร้างแฟนทอม +unit.dagger.name = แด็กเกอร์ +unit.crawler.name = ครอเลอร์ +unit.titan.name = ไททัน +unit.ghoul.name = ยานทิ้งระเบิดGhoul +unit.wraith.name = ยานไฟต์เตอร์ไวรท์ +unit.fortress.name = ฟอร์เทรส +unit.revenant.name = เรเวแนน +unit.eruptor.name = อีรัฟเตอร์ +unit.chaos-array.name = เคออสอาเรย์ +unit.eradicator.name = อีเรดิเคเตอร์ +unit.lich.name = ลิช +unit.reaper.name = รีฟเฟอร์ +tutorial.next = [lightgray]<กดเพื่อดำเนินการต่อ> +tutorial.intro = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nใช้ [[WASD] เพื่อเคลื่อนที่.\n[accent]กด [[Ctrl] ค้างระหว่างกลิ้งลูกกลิ้งเม้าส์[] เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น +tutorial.intro.mobile = คุณได้เข้าสู่[scarlet] การสอนเล่นของ Mindustry.[]\nเลื่อนหน้าจอเพื่อเคลื่อนที่.\n[accent]ใส่สองนิ้ว []เพื่อซูมเข้าและออก.\nเริ่มด้วยการ[accent] ขุดทองแดง[]. เคลื่อนที่ไปใกล้มัน, แล้วกดที่สายแร่ทองแดงใกล้ๆกับ core ของคุณ\n\n[accent]ทองแดง {0}/{1} ชิ้น +tutorial.drill = ขุดด้วยตัวเองนั้นไม่ค่อยมีประสิทธิภาพ.\n[accent]เครื่องขุด []สามารถขุดได้แบบอัตโนมัติ.\nกดที่แทปเครื่องขุดที่มุมล่างขวา.\nเลือก[accent] เครื่องขุดเชิงกล[]. วางมันบนสายแร่ทองแดงด้วยการคลิ๊ก.\n[accent]คลิ๊กขวา[] เพื่อหยุดการสร้าง. +tutorial.drill.mobile = ขุดด้วยตัวเองนั้นไม่ค่อยมีประสิทธิภาพ.\n[accent]เครื่องขุด []สามารถขุดได้แบบอัตโนมัติ.\nกดที่แทปเครื่องขุดที่มุมล่างขวา.\nเลือก[accent] เครื่องขุดเชิงกล[].\nวางมันบนสายแร่ทองแดงด้วยการกดแล้วกดที่[accent] เครื่องหมายถูก[] ด้านล่างเพื่อคอนเฟิร์ม.\nกด[accent] ปุ่ม X[] เพื่อยกเลิกการวาง. +tutorial.blockinfo = บล็อคแต่ละบล็อคจะมีแสต็ทที่ต่าง. เครื่องขุดแต่ละเครื่องจะขุดได้เฉพาะบางแร่.\nสามารถเช็คข้อมูลและแสต็ทของบล็อคได้โดย,[accent] กดที่ปุ่ม "?" เมื่อเลือกบล็อคนั้นๆในเมนูการสร้าง.[]\n\n[accent]เข้าไปในแสต็ทของเครื่องขุดเชิงกลชลสิ.[] +tutorial.conveyor = [accent]สายพาน[] ใช้สำหรับขนส่งไอเท็มไปยัง core.\nสร้างเส้นสายพานจากเครื่องขุดมายัง core สิ.\n[accent]กดปุ่มเม้าส์ค้างเพื่อจะสร้างเส้น.[]\nกด[accent] CTRL[] ค้างตอนลากเส้นเพื่อลากเส้นทแยง.\nใช้ลูกกลิ้งเม้าส์เพื่อหมุนบล็อคก่อนที่จะวาง.\n[accent]วางสายพาน 2 อันด้วยเครื่องมือลากเส้น แล้วส่งไอเท็มไปยัง core. +tutorial.conveyor.mobile = [accent]สายพาน[] ใช้สำหรับขนส่งไอเท็มไปยัง core.\nวางสายพาน 2 อันด้วยเครื่องมือลากเส้น แล้วส่งไอเท็มไปยัง core.\n[accent] ลากเส้นโดยกดที่หน้าจอค้างสัก 1-2 วินาที[] แล้วลากไปทางที่ต้องการสร้าง\n\n[accent]วางสายพาน 2 อันด้วยเครื่องมือลากเส้น แล้วส่งไอเท็มไปยัง core. +tutorial.turret = หลังจากทีาไอเท็มเข้า core แล้ว, เราจะสามารถใช้มันในการก่อสร้างได้.\nจงจำไว้ว่าไอเท็มบางอันเท่านั้นที่สามารถใช้ในการก่อสร้างได้.\nตัวอย่างไอเท็มที่ไม่ได้ใช่ในการก่อสร้างได้แก่[accent] ถ่านหิน[] และ[accent] เศษเหล็ก[], ไม่สามารถใส่ใน core ได้.\nสิ่งก่อสร้างเชิงป้องกันจำเป็นสำหรับการขับไล่[lightgray] ศัตรู[].\nสร้าง[accent] ป้อมปืนดูโอ้[] ใกล้กับฐานของคุณ. +tutorial.drillturret = ป้อมปืนดูโอ้ใช้[accent] กระสุนทองแดง []ในการยิง.\nวางเครื่องขุดใกล้กับป้อมปืน.\nชี้ทางสายพานให้เข้าป้อมปืนเพื่อที่จะเติมทองแดงให้มัน.\n\n[accent]ส่งกระสุนแล้ว: 0/1 +tutorial.pause = ระหว่างการต่อสู้, คุณสามารถ[accent]หยุดเกมชั่วคราวได้.[]\nคุณอาจจะทำคิวการสร้างระหว่างหยุดเกมชั่วคราว.\n\n[accent]กด space เพื่อหยุดเกมชั่วคราว. +tutorial.pause.mobile = ระหว่างการต่อสู้, คุณสามารถ[accent] หยุดเกมชั่วคราวได้.[]\nคุณอาจจะทำคิวการสร้างระหว่างหยุดเกมชั่วคราว.\n\n[accent]กดปุ่มที่มุมบนซ้ายเพื่อหยุดเกมชั่วคราว. +tutorial.unpause = กด Space อีกครั้งเพื่อเล่นต่อ. +tutorial.unpause.mobile = กดอีกครั้งเพื่อเล่นต่อ. +tutorial.breaking = บล็อดจำเป็นต้องทำลายบ่อยครั้ง.\n[accent]กดคลิ๊กขวาค้าง[] เพื่อทำลายบล็อคที่เลือก.[]\n\n[accent]ทำลายบล็อคเศษเหล็กทั้งหมดที่ยู่ทางด้านซ้ายของ core ของคุณโดยใช้การเลือกแบบคลุมพื้นที่. +tutorial.breaking.mobile = บล็อดจำเป็นต้องทำลายบ่อยครั้ง.\n[accent]เลือกโหลดทำลาย[], แล้วกดบล็อคที่ต้องการทำลายเพื่อเริ่มทำลายมัน.\nทำลายเป็นพื้นที่ด้วยการกดค้าง 1-2 วินาที[] แล้วลากคลุมพื้นที่ที่ต้องการ.\nกดเครื่องหมายถูกเพื่อยืนยันการทำลาย.\n\n[accent]ทำลายบล็อคเศษเหล็กทั้งหมดที่ยู่ทางด้านซ้ายของ core ของคุณโดยใช้การเลือกแบบคลุมพื้นที่. +tutorial.withdraw = ในบางเหตุการณ์, การนำไอเท็มออกจากบล็อคนั้นจำเป็น.\nวิธีทำคือ, [accent]กดที่บล็อค[] ที่มีไอเท็มอยู่, แล้ว [accent]กดไอเท็ม[] ในช่องเก็บของ.\nไอเท็มหลายๆอันสามารถนำออกมาได้โดย [accent]กดแล้วกดค้างที่ช่องเก็บของ[].\n\n[accent]นำทองแดงจำนวนหนึ่งออกจาก core.[] +tutorial.deposit = นำไอเท็มเข้าบล็อคโดยลากไอเท็มจากยานของคุณไปที่บล็อคที่ต้องการ.\n\n[accent]เอาทองแดงกลับเข้า core.[] +tutorial.waves = [lightgray]ศัตรู[] กำลังมา.\n\nปกป้อง core ของคุณเป็นเวลา 2 wave.[accent] คลิ๊ก[] เพื่อยิง.\nสร้างป้อมปืนและเครื่องขุดเพิ่ม ขุดทองแดงเพิ่ม. +tutorial.waves.mobile = [lightgray]ศัตรู[] กำลังมา.\n\nปกป้อง core ของคุณเป็นเวลา 2 wave. ยานของคุณจะยิงศตรูโดยอัตโนมัติ.\nสร้างป้อมปืนและเครื่องขุดเพิ่ม ขุดทองแดงเพิ่ม. +tutorial.launch = เมื่อ wave เฉพาะแล้ว, คุณจะสามารถ[accent] ส่ง core[], ทิ้งระบบป้องกันทั้งหมดและ[accent] ได้รับทรัพยากรทั้งหมดใน core.[]\nทรัพยากรพวกนี้สามารถนำไปใช้ในการวิจัยเทคโนโลยีใหม่.\n\n[accent]กดปุ่มส่ง. + +item.copper.description = วัสดุก่อสร้างพื้นฐาน. ใช้อย่างแพร่หลายในทุกๆบล็อค. +item.lead.description = ทรัพยากรพื้นฐานสำหรับผู้เริ่มต้นใหม่. ใช้อย่างแพร่หลายในอิเล็กทรอนิกส์และบล็อคขนย้ายของเหลว. +item.metaglass.description = ส่วนผสมของกระจกที่แข็งแรงมาก. ใช้อย่างแพร่หลายกับตัวจ่ายของเหลวและที่เก็บของ. +item.graphite.description = คาร์บอนไมเนอราไลซ์, ใช้เป็นกระสุนและฉนวนไฟฟ้า. +item.sand.description = ทรัพยาการทั่วไปที่ใช่แพร่หลายในการถลุง, ทั้งในอัลลอยและและเป็นตัวผสาน. +item.coal.description = ฟอสซิลของพืช, เกิดก่อนเมื่อนานมาแล้ว. ใช้อย่างแพร่หลายเป็นเชื้อเพลิงและผลิตทรัพยากร. +item.titanium.description = โลหะเบาหายาก ใช้อย่างแพร่หลายในการขนย้ายของเหลว, เครื่องขุดและอากาศยาน. +item.thorium.description = โลหะหนาแน่นและปล่อยกัมมัตภาพรังสี ใช้เป็นตัวช่วยโครงสร้างและเชื้อเพลิงนิวเคลียร์. +item.scrap.description = เศษเหลือจากสิ่งก่อสร้างและยูนิตเก่า. มีรองรอยของโลหะหลายชนิดอยู่. +item.silicon.description = สารกึ่งตัวนำที่มีประโยชน์มาก. ใช้ในแผงโซล่าเซลล์, อุปกรณ์อิเล็กทรอนิกที่ซับซ้อนและเป็นกระสุนป้อมปืนแบบติดตาม. +item.plastanium.description = วัสดุเบาและดัดได้ ใช้ในอากาศยานชั้นสูงและกระสุนกระจาย. +item.phase-fabric.description = สสารเกือบไร้น้ำหนัก ใช้ในอิเล็กทรอนิกส์ขั้นสูงและเทคโนโลยีซ่อมแซมตนเอง +item.surge-alloy.description = อัลลอยขั้นสูงที่มีคุณสมบัติทางไฟฟ้าจำเพาะ +item.spore-pod.description = กระเปาะของสปอร์สังเคราะห์, สั้งเคราะห์จากการรวมตัวของบรรยากาศ ใช้ในอุตสาหกรรม. ใช้ในการกลั่นเป็นน้ำมัน,ระเบิดและเชื้อเพลิง. +item.blast-compound.description = สารประกอบที่ไม่เสถียร ใช้ในระเบิด. สังเคราะห์จากสปอร์และสารระเหยอื่นๆ. ไม่แนะนำให้ใช้เป็นเชื้อเพลิง. +item.pyratite.description = สสารติดไฟง่าย ใช้ในอาวุธเพลิง. +liquid.water.description = ของเหลวที่มีประโยชน์ที่สุด ทั่วไปใช้เป็นตัวหล่อเย็นและในการจัดการของเสีย. +liquid.slag.description = โลหะหลายชนิดหลอมรวมกัน. สามารถนำไปแยกเพื่อเอาโลหะที่เป็นส่วนประกอบหรือพ่นใส่ศัตรูเป็นอาวุธ. +liquid.oil.description = ของเหลวใช้ในการผลิตวัสดุขั้นสูง. สามารถแปลงเเป็นถ่านหินเพือใช้เป็นเชื้องเพลิง หรือพ่นใส่ศัตรูแล้วจุดไฟเป็นอาวุธ. +liquid.cryofluid.description = ของเหลวเฉื่อยและไม่กัดกร่อน ผลิตจากน้ำและไทเทเนี่ยม. มีสมบัติการถ่ายเทความร้อนสูง. ใช้อย่างแพร่หลายในการหล่อเย็น. +mech.alpha-mech.description = เม็คควบคุมพื้นฐาน. มีรากฐานมาจากยูนิตแด๊กเกอร์, เพิ่มเกราะและความสามารถในการสร้าง. ทำดาเมจมากกว่ายานลูกดอก (Dart). +mech.delta-mech.description = เม็คที่เร็วและมีเกราะที่บาง สร้างมาเพื่อการต่อสู้แบบ hit-and-run (จู่โจมแล้วหนี). ทำดาเมจน้อยต่อสิ่งก่อสร้าง แต่สามารถฆ่าศัตรูกลุ่มใหญ่ได้อย่างรวดเร็วด้วยอาวุธอาร์คไฟฟ้า. +mech.tau-mech.description = เม็คสนับสนุน. ซ่อมแซมบล็อคของพันธมิตรด้วยการยิงใส่มัน. สามารถฟื้นฟูพันธมิตรในวงกลมระยะหนึ่ง. +mech.omega-mech.description = เม็คเกราะหนาและเทอะทะ, ผลิตมาเพื่อการจู่โจมแนวหน้า. เกราะสามารถกันดาเมจได้ถึง 90%. +mech.dart-ship.description = เม็คควบคุมพื้นฐาน. ค่อนข้างเร็วและเบา, แต่มีความสามารถในการต่อสู่ต่ำ เช่นเดียวกับความเร็วการขุด. +mech.javelin-ship.description = ยานต่อสู้แบบ hit-and-run (จู่โจมแล้วหนี). ถึงแม้ว่าจะช้า, แต่สามารถเร่งความเร็วได้มากถ้าบินโฉบผ่านด่านของศัตรู, ทำดาเมจค่อนข้างแรงด้วยไฟฟ้าและขีปนาวุธ. +mech.trident-ship.description = ยานทิ้งระเบิดหนักง, ผลิตเพื่อการก่อสร้างและทำลายแนวป้องกันของศัตรู. เกราะค่อนข้างหน้า. +mech.glaive-ship.description = ยานจู่โจมที่เกราะหนาและใหญ่. ติดด้วยรีพีทเตอร์ไฟ, คล่องแคลวมาก. +unit.draug.description = โดรนขุดเจาะดั้งเดิม. ผลิตง่าย. ขยายได้. ขุดทองแดงและตะกั่วโดยอัตโนมัติในบริเวณใกล้เคียง. ส่งทรัพยากรที่ขุดได้ไปยัง core ที่ใกล้ที่สุด. +unit.spirit.description = โดรนดราคจ์ที่ถูกปรับแต่ง, ออกแบบมาเพื่อการซ่อมแซมแทนการขุดเจาะ. ซ่อมแซมบล็อคที่โดนดาเมจโดยอัตโนมัติในบริเวณนั้น +unit.phantom.description = โดรนขั้นสูง. ติดตามผู้ใช้. ช่วยสร้างบล็อค. +unit.dagger.description = เม็คภาคพื้นดินพื้นฐานที่สุด. ผลิตง่าย. ทำลายล้างดีถ้าใช้เป็นฝูง. +unit.crawler.description = ยูนิตภาคพื้นดินประกอบด้วยเฟรมเปลือยและระเบิดขั้นรุนแรงติดด้านบน. ระเบิดเมื่อแตะต้องกับศัตรู. +unit.titan.description = ยูนิตเสริมเกราะภาคพื้นดินขั้นสูง. โจมตีทั้งภาคพื้นดินและอากาศ. มีปืนไฟระดับสคอร์ชติดตั้งอยู่. +unit.fortress.description = เม็คปืนใหญ่. มีปืนใหญ่ดัดแปลงประเภทเฮแอลติดจั้งอยู่ 2 กระบอกสำหรับการโจมตีสิ่งก่อสร้างและยูนิตของศัตรูจากระยะไกล. +unit.eruptor.description = เม็คหนักออกแบบมาเพื่อทำลายสิ่งก่อสร้าง. พ่นกากแร่ใส่แนวป้องกันของศัตรู, หลอมเหลวพวกมันและจุดสารระเหยให้ติดไฟ. +unit.wraith.description = ยูนิตอินเตอร์เซ็ปเตอร์แนว hit-and-run (จู่โจมแล้วหนี) ที่เร็ว. เล็งเป้าที่เครื่องกำเนิดไฟฟ้าทุกชนิด. +unit.ghoul.description = ยานทิ้งระเบิดปูพร่มหนัก (carpet bomber). ทะลวงผ่านสิ่งก่อสร้างศัตรู, เล็งเป้าที่จุดวิกฤตของสิ่งก่อสร้าง. +unit.revenant.description = ยานหนักยิงขีปนาวุธ. +block.message.description = เก็บข้อความ. ใช้สื่อสารกับพันธมิตร. +block.graphite-press.description = อัดก้อนถ่านหินให้เป็นแผ่นกราไฟต์บริสุทธิ์. +block.multi-press.description = เครื่องอัดกราไฟต์ที่ได้รับการอัปเกรด. ใช้น้ำและพลังงานในการแปรรูปถ่านหินให้เร็วและมีประสิทธิภาพมากขึ้น. +block.silicon-smelter.description = เผาทรายและถ่านหินบริสุทธิ์. ผลิตซิลิก้อน +block.kiln.description = เผาทรายและตะกั่วเป็นสารประกอบชื่อ กระจกเมต้า. จำเป็นต้องใช้พลังงานเล็กน้อยในการทำ. +block.plastanium-compressor.description = ผลิตพลาสตาเนี่ยมจากน้ำมันและไทเทเนี่ยม. +block.phase-weaver.description = สังเคราะห์ใยเฟสจากทอเรี่ยมที่มีรังสีและทราย. จำเป็นต้องใช้พลังงานจำนวนมากจึงจะทำงานง. +block.alloy-smelter.description = ผสมไทเทเนี่ยม, ตะกั่ว, ซิลิก้อนและทองแดงเพื่อที่จะผลิตเซิร์จอัลลอย. +block.cryofluidmixer.description = ผสมน้ำและผงไทเทเนี่ยมบริสุทธิ์เป็นไครโยฟลูอิด. สำคัญสำหรับเตาปฏิกรณ์ทอเรี่ยม. +block.blast-mixer.description = บอและผสมสปอร์กับไพไรต์เพื่อผลิตสารประกอบระเบิด. +block.pyratite-mixer.description = ผสมถ่านหิน, ตะกั่วและทรายเข้าด้วยกันเป็นไฟไรต์ที่ติดไฟได้ง่าย. +block.melter.description = หลอมเศษเหล็กเป็กกากแร่เพื่อใช้สำหรับกระบวนการต่อไปหรือใช้ในป้อมปืนเวฟ. +block.separator.description = แยกกากแร่ออกเป็นส่วนประกอบแร่ธาตุของมัน. ส่งออกแร่ผลลัพธ์ในรูปแบบที่เย็นลงแล้ว. +block.spore-press.description = อัดกระเปาะสปอร์ด้วยแรงกดมหาศาลเพื่อสังเคราะห์น้ำมัน. +block.pulverizer.description = บดเศษเหล็กให้เป็นทรายละเอียด. +block.coal-centrifuge.description = ทำให้น้ำมันแข็งตัวเป็นก้อนถ่านหิน. +block.incinerator.description = ทำลายไอเท็มหรือของเหลวทุกอย่างที่ได้รับมา. +block.power-void.description = ทิ้งพลังงานทั้งหมดที่ได้รับ. เฉพาะ Sandbox เท่านั้น. +block.power-source.description = ส่งออกพลังงานไม่จำกัด. เฉพาะ Sandbox เท่านั้น. +block.item-source.description = ส่งออกไอเท็มไม่จำกัด. เฉพาะ Sandbox เท่านั้น. +block.item-void.description = ทำลายทุกไอเท็ม . เฉพาะ Sandbox เท่านั้น. +block.liquid-source.description = ส่งออกของเหลวไม่จำกัด. เฉพาะ Sandbox เท่านั้น. +block.copper-wall.description = บล็อคป้องกันราคาถูก.\nมีประโยชน์สำหรับป้องกัน core และป้อมปืนใน wave แรกๆ. +block.copper-wall-large.description = บล็อคป้องกันราคาถูก.\nมีประโยชน์สำหรับป้องกัน core และป้อมปืนใน wave แรกๆ.\nคลอบคลุมหลายข่อง. +block.titanium-wall.description = บล็อคป้องกันแข็งแกร่งปานกลาง.\nป้องกันศัตรูได้ในระดับหนึ่ง. +block.titanium-wall-large.description = บล็อคป้องกันแข็งแกร่งปานกลาง.\nป้องกันศัตรูได้ในระดับหนึ่ง.\nคลอบคลุมหลายช่อง. +block.plastanium-wall.description = กำแพงพิเศษที่สามารถดูดซับไฟฟ้าและป้องกันการต่อไฟกับโหนดพลังงานโดยอัตโนมัติได้. +block.plastanium-wall-large.description = กำแพงพิเศษที่สามารถดูดซับไฟฟ้าและป้องกันการต่อไฟกับโหนดพลังงานโดยอัตโนมัติได้.\nคลอบคลุมหลายช่อง. +block.thorium-wall.description = บล็อคป้องกันที่แข็งแรง.\nป้องกันศัตรูได้อย่างดี. +block.thorium-wall-large.description = บล็อคป้องกันที่แข็งแรง.\nป้องกันศัตรูได้อย่างดี.\nคลอบคลุมหลายช่อง. +block.phase-wall.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact. +block.phase-wall-large.description = A wall coated with special phase-based reflective compound. Deflects most bullets upon impact.\nคลอบคลุมหลายช่อง. +block.surge-wall.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม. +block.surge-wall-large.description = บล็อคป้องกันที่มีทนทานสูง.\nสะสมพลังงานจากกระสุน, แล้วปล่อยออกมาแบบสุ่ม.\nคลอบคลุมหลายช่อง. +block.door.description = ประตูขนาดเล็ก. สามารถเปิดได้โดยการกด. +block.door-large.description = ประตูขนาดใหญ่. สามารถเปิดได้โดยการกด.\nคลอบคลุมหลายช่อง. +block.mender.description = ซ่อมแซมบล็อคในวงของมันเป็นระยะๆ. ช่วยซ่อมแซมแนวป้องกันระหว่าง wave.\nสามารถใช้ซิลิก้อนเพื่อเพิ่มรัศมีและประสิทธิภาพได้ +block.mend-projector.description = เมนเดอร์ที่ได้รับการอัปเกรด. ซ่อมแซมบล็อคในระยะของมัน.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพได้. +block.overdrive-projector.description = เพิ่มความเร็วของสิ่งก่อสร้างรอบๆ.\nสามารถใช้ใยเฟสเพื่อเพิ่มระยะและประสิทธิภาพ. +block.force-projector.description = สร้างสนามพลังงานหกเหลี่ยมรอบๆตัวเอง ป้องกันสิ่งก่อสร้างและยูนิตภายในสนามพลังงานจากดาเมจ.\nจะร้อนจัดถ้าได้รับดาเมจมากพอ. สามารถใช้สารหล่อเย็นมากันการร้อนจัดได้. สามารถเพิ่มขนาดสนามพลังด้วยใยเฟส. +block.shock-mine.description = ดาเมจศัตรูที่เหยียบ. แถบจะล่องหนต่อศัตรู. +block.conveyor.description = บล็อคขนส่งไอเท็มพื้นฐาน. เคลื่อนไอเท็มไปข้างหน้าและใส่ลงบล็อคโดยอัตโนมัติ. สามารถหมุนได้. +block.titanium-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. เคลื่อนไอเท็มเร็วกว่าสายพานทั่วไป. +block.junction.description = มีหน้าที่เป็นสะพานสำหรับสายพาน 2 สายข้ามกัน. มีประโยชน์สำหรับเวลาสายพาน 2 สายที่ขนไอเท็มมา 2 ชนิดไปยัง 2 สถานที่. +block.bridge-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ทำให้สามารถส่งไอเท็มข้ามบล็อคใดก็ได้ 3 ช่อง. +block.phase-conveyor.description = บล็อคขนส่งไอเท็มขั้นสูง. ใช้พลังงานเพื่อส่งไอเท็มไปยังสายพานเฟสอีกอัน ข้ามได้หลายช่อง. +block.sorter.description = แยกไอเท็ม. ถ้าไอเท็มตรงกับที่เลือกไว้, จะผ่านได้. แต่ถ้าไม่ตรง, ไอเท็มจะออกทางซ้ายหรือขวา (ใช้ทางที่ไอเท็มเข้าเป็นหลัก) +block.inverted-sorter.description = แยกไอเท็มคล้ายเครื่องแยกธรรมดา, แต่ไอเท็มที่เลือกจะออกข้างแทน. +block.router.description = รับไอเท็มแล้วส่งออก 3 ทางเท่ากัน. มีประโยชน์สำหรับแยกไอเท็มจากแหล่งเดียวไปหลายที่.\n\n[scarlet]อย่าวางไว้ติดกับทางส่งไอเท็มเข้าเพราะของออกจะไปอุดตันได้.[] +block.distributor.description = เร้าเตอร์ขั้นสูง. แยกไอเท็มออก 7 ทางอย่างเท่าๆกัน. +block.overflow-gate.description = ของจะออกจากข้างๆเมื่อทางข้างหน้ถูกบล็อคเท่านั้น. +block.mass-driver.description = บล็อคขนส่งไอเท็มขั้นสุดยอด. รวบรวมไอเท็มจำนวนหนึ่งแล้วยิงไปหาแมสไดรเวอร์อีกอันที่อยู่ไกลออกไป. ต้องใช้พลังงานในการใช้งาน. +block.mechanical-pump.description = ปั๊มราคาถูก เอ้าพุธต์ช้า แต่ไม่ใช้พลังงาน. +block.rotary-pump.description = ปั๊มขั้นสูง. ปั๊มของเหลวได้มากขึ้นแค่ใช้พลังงาน. +block.thermal-pump.description = ปั๊มขั้นสุดยอด. +block.conduit.description = บล็อคขนส่งของเหลวพื้นฐาน. เคลื่อนของเหลวไปข้างหน้า. ใช้ร่วมกับปั๊มและรางน้ำอื่นๆ. +block.pulse-conduit.description = บล็อคขนส่งของเหลวขั้นสูง. เคลื่อนย้ายของเหลวเร็วขึ้นและเก็บเยอะกว่ารางน้ำธรรมดา. +block.liquid-router.description = รับของเหลวจากทางเดียวแล้วส่งออก 3 ทางเท่าๆกัน. สามารถเก็บของ้หลวได้จำนวนหนึ่ง. มีประโยชน์สำหรับการแยกของเหลวจากแหล่งเดียวไปหลายที่. +block.liquid-tank.description = เก็บของเหลวจำนวนมาก. ใช่สำหรับสร้างบัฟเฟอร์ในเวลาที่ความต้องการของทรัพยากรไม่คงที่หรือเป็นตัวเซฟสำหรับบล็อคที่จำเป็นต้องใช้การหล่อเย็น. +block.liquid-junction.description = ทำหน้าที่เป็นสะพานสำหรับรางน้ำ 2 รางที่ข้ามกันที่มีของเหลว 2 ชนิด ซึ่งต้องการจะไปคนละที่. +block.bridge-conduit.description = บล็อคขนส่งของเหลวขั้นสูง. ขนส่งของเหลวข้ามบล็อคใดๆก็ได้ถึง 3 ช่อง. +block.phase-conduit.description = บล็อคขนส่งของเหลวขั้นสูง. ใช้พลังงานเพื่อขนส่งของเหลวไปที่รางน้ำเฟสข้ามหลายช่อง. +block.power-node.description = ส่งพลังงานไปยังโหลดพลังงานที่เชื้อมต่อ. โหนดจะรับพลังงานจากโหนดอื่นหรือแหล่งผลิตแล้วส่งไปยังบล็อคที่ติดกัน. +block.power-node-large.description = โหนดพลังงานขั้นสูง มีระยะเชื่อมต่อกว้างขึ้น. +block.surge-tower.description = โหนดพลังงานที่มีระยะเชื่อมต่อไกลมากแต่จำนสนการเชื่อมต่อน้อย. +block.diode.description = พลังงานแบตเตอรี่สามารถไหลผ่านบล็อคนี้ได้เพียงทางเดียว แต่เฉพาะเวลาที่อีกด้านมีพลังงานน้อยกว่าเท่านั้น. +block.battery.description = เก็บพลังงานเป็นบัฟเฟอร์เวลาที่มีพลังงานเกิน. และส่งออกพลังงานเมื่อพลังงานไม่พอ. +block.battery-large.description = เก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา. +block.combustion-generator.description = ผลิตพลังงานโดยการวัสดุติดไฟ เช่นถ่านหิน. +block.thermal-generator.description = ผลิตพลังงานเมื่อวานในที่ร้อน (บนหินร้อนหรือหินแม็คม่า) +block.turbine-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. +block.differential-generator.description = ผลิตไฟฟ้าจำนวนมาก. ใช้ความต่างของอุณหภูมิระหว่างไครโยฟลูอิดและไพไรต์ที่กำลังไหม้. +block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ. +block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย. +block.solar-panel-large.description = เวอร์ชั่นของแผงโซล่าเซลล์ที่มีประสิทธิภาพมากขึ้นกว่าแผงโซล่าเซลล์ธรรมดา. +block.thorium-reactor.description = ผลิตพลังงานจำนวนมากจากทอเรี่ยม. ตำเป็นต้องใช้สารหล่อเย็นตลอดเวลา. จะระเบิดอย่างรุนแรงหากไม่ได้รับสารหล่อเย็นในจำนวนที่ต้องการ. จำนวนพลังงานที่ผลิตขึ้นอยู่กับความเต็ม และผลิตพลังงานเริ่มต้นที่ความสามารถสูงสุด. +block.impact-reactor.description = เครื่องกำเนิดไฟฟ้าขั้นสูง, สามารถผลิตไฟฟ้าได้จำนวนมหาศาลที่ประสิทธิภาพสูงสุด. จำเป็นต้องใช้พลังงานจำนวนมากในการสตาร์ทเครื่อง. +block.mechanical-drill.description = เครื่องขุดราคาถูก. เมื่อวางบนบล็อคที่ถูกต้อง, จะส่งไอเท็มของมันออกมาเรื่อยๆแบบไม่มีที่สิ้นสุด. ขุดได้แค่ทรัพยากรพื้นฐาน. +block.pneumatic-drill.description = เครื่องขุดได้รับการปรับปรุง, สามารถขุดไทเทเนี่ยมได้. ขุดไวกว่าเครื่องขุดเชิงกล. +block.laser-drill.description = ขุดได้เร็วขึ้นด้วยเทคโนโลยีเลเซอร์ แต่ต้องใช้พลังงาน. สามารถขุดทอเรี่ยมได้. +block.blast-drill.description = เครื่องขุดขั้นสุดยอด. ใช้พลังงานจำนวนมาก. +block.water-extractor.description = ขุดน้ำบาดาล. ใช้ในพื้นที่ที่ไม่มีน้ำบนดินให้ใช้. +block.cultivator.description = รวบรวมสปอร์ในชั้นบรรยากาศเป็นกระเปาะสปอร์สำหรับอุตสาหกรรม. +block.oil-extractor.description = ใช้พลังงาน, ทรายและน้ำเพื่อขุดหาน้ำมัน. +block.core-shard.description = core รุ่นแรก. เมื่อถูกทำลาย การติดต่อกับพื้นที่นั้นทั้งหมดจะหายไป. อย่าให้มันเกิดขึ้น. +block.core-foundation.description = core รุ่นที่ 2 . เสริมเกราะมากขึ้น. เก็บของได้เยอะขึ้น. +block.core-nucleus.description = core รุ่นที่ 3 และเป็นรุ่นสุดท้าย. เสริมเกราะดีมาก. เก็บของได้มหาศาล. +block.vault.description = เก็บของแต่ละชนิดได้เยอะ. สามารถใช้ตัวถ่ายของในการดึงของออกมาได้. +block.container.description = เก็บของแต่ละชนิดได้น้อย. สามารถใช้ตัวถ่ายของในการดึงของออกมาได้. +block.unloader.description = ดึงของออกมาจากบล็อคที่ไม่ใช่บล็อคขนส่งใกล้เคียง. สามารถเปลี่ยนชนิดของของที่จะดึงได้โดยการกด. +block.launch-pad.description = ส่งของจำนวนหนึ่งได้เลยโดยไม่ต้องรอส่ง core. +block.launch-pad-large.description = ฐานส่งของเวอร์ชั่นพัฒนาแล้ว. เก็บไอเท็มเยอะขึ้น. ส่งของบ่อยขึ้น. +block.duo.description = ป้อมปืนราคาถูกขนาดเล็ก. มีประโยชน์สำหรับยูนิตภาคพื้นดิน. +block.scatter.description = ป้อมปืนต่อต้านอากาศยานหลัก. ยิงก้อนตะกั่วหรือเศษเหล็กใส่ศัตรู. +block.scorch.description = เผาศัตรูภาคพื้นดินที่อยู่ใกล้ๆ. มีประสิทธิภาพสูงสุดเมื่อใช้ในระยะใกล้. +block.hail.description = ป้อมปืนใหญ่ขนาดเล็ก. +block.wave.description = ป้อมปืนขนาดกลาง. พ่นของเหลวสานศัตรู. ดับไฟให้โดยอัตโนมัติถ้าใส่น้ำให้. +block.lancer.description = ป้อมปืนเลเซอร์ต่อต้านภาคพื้นดินขนาดกลาง. ชาร์จและยิงลำแสงพลังงานที่ทรงพลัง. +block.arc.description = ป้อมปืนไฟฟ้าระยะใกล้. ยิงสายฟ้าใส่ศัตรู. +block.swarmer.description = ป้อมยิงขีปนาวุธขนาดกลาง. โจมตีศัตรูทั้งอากาศและภาคพื้นดิน. ยิงขีปนาวุธขนิดติดตาม. +block.salvo.description = ป้อมปืนดูโอเวอร์ชั่นขั้นสูงกว่า. ระดมยิงกระสุนใส่ศัตรู. +block.fuse.description = ป้อมปืนระยะใกล้ขนาดใหญ่. ยิงลำแสงทะลุทะลวง 3 เส้นใส่ศัตรู. +block.ripple.description = ป้อมปืนใหญ่ที่มีพลังงานสูง. ยิงกระจุกของกระสุนใส่ศัตรูจาดระยะไกล. +block.cyclone.description = ป้อมปืนต่อต้านอากาศยานและต่อต้านภาคพื้นดิน. ยิงกระจุของกระสุนระเบิดใส่ยูนิตศัตรู. +block.spectre.description = ปืนใหญ่ลำกล้องคูขนาดยักษ์. ยิงกระสุนเจาะเกราะใส่ศัตรูทั้งบนอากาศและภาดพื้นดิน. +block.meltdown.description = ปืนใหญ่เลเซอร์ขนาดยักษ์. ชาร์จแล้วยิงลำแสงเลเซอร์ใส่ศัตรูที่อยู่ใกล้. จำเป็นต้องใช้สารหล่อเย็น. +block.command-center.description = สั่งการยูนิตพันธมิตรทั่วทั้งแมพ.\nสามารถสั่งให้ยูนิตมาชุมนุม, โจมตี core ศัตรู หรือถอยทีพกลับ core/โรงงาน. ถ้าไม่มี core ของศัตรูอยู่บริเวณนั้น, ยูนิตจะลาดตระเวนด้วยตัวเองหากได้รับคำสั่งให้โจมตี. +block.draug-factory.description = ผลิตโดรนขุดเจาะดราคจ์. +block.spirit-factory.description = ผลิตโดรนซ่อมแซมสปิริต. +block.phantom-factory.description = ผลิตโดรนก่อสร้างขั้นสูง. +block.wraith-factory.description = ผลิตยูนิตเร็ว โจมตีแบบ hit-and-run (จู่โจมแล้วหนี) +block.ghoul-factory.description = ผลิตยานทิ้งระเบิดปูพรมหนัก (heavy carpet bomber) +block.revenant-factory.description = ผลิตยูนิตที่ใช้ขีปนาวุธเป็นหลัก. +block.dagger-factory.description = ผลิตยูนิตภาคพื้นดินพื้นฐาน. +block.crawler-factory.description = ผลิตยูนิตพลีชีพเร็ว. +block.titan-factory.description = ผลิตยูนิตภาคพื้นดินเสริมเกราะขั้นสูง. +block.fortress-factory.description = ผลิตยูนิตหนักติดปืนใหญ่. +block.repair-point.description = ซ่อมแซมยูนิตที่อยู่ในรัศมีอย่างต่อเนื่อง. +block.dart-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คโจมตีพื้นฐาน.\nใช้โดยการกดเมื่อยืนทับมัน. +block.delta-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คเกราะบางโจมตีแบบ hit-and-run (จู่โจมแล้วหนี).\nใช้โดยการกดเมื่อยืนทับมัน. +block.tau-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คสนับสนุนขั้นสูง.\nใช้โดยการกดเมื่อยืนทับมัน. +block.omega-mech-pad.description = ใช้เปลี่ยนร่างเป็นเป็นเม็คใช้ขีปนาวุธเกราะหนา.\nใช้โดยการกดเมื่อยืนทับมัน. +block.javelin-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นอินเทอร์เซ็ปเตอร์เร็วแบะเกราะบาง.\nใช้โดยการกดเมื่อยืนทับมัน. +block.trident-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นยานทิ้งระเบิดสนับสนุน.\nใช้โดยการกดเมื่อยืนทับมัน. +block.glaive-ship-pad.description = ใช้เปลี่ยนร่างเป็นเป็นยานต่อสู้เกราะหนาขนาดใหญ่.\nใช้โดยการกดเมื่อยืนทับมัน. From d9aa9b6278677ad500336d53dacd7ebcffde5b4f Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 26 Nov 2019 23:32:30 -0500 Subject: [PATCH 006/107] Desktop scripting support --- build.gradle | 1 + core/src/io/anuke/mindustry/mod/Mod.java | 5 ---- core/src/io/anuke/mindustry/mod/Mods.java | 31 ++++++++++++++++++-- core/src/io/anuke/mindustry/mod/Scripts.java | 16 ++++++++++ gradle.properties | 2 +- 5 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 core/src/io/anuke/mindustry/mod/Scripts.java diff --git a/build.gradle b/build.gradle index 4e1252df97..226b21f891 100644 --- a/build.gradle +++ b/build.gradle @@ -254,6 +254,7 @@ project(":core"){ compileJava.dependsOn(preGen) compile "org.lz4:lz4-java:1.4.1" + compile "org.graalvm.js:js:19.3.0" compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") diff --git a/core/src/io/anuke/mindustry/mod/Mod.java b/core/src/io/anuke/mindustry/mod/Mod.java index 5ee0f699c4..aa4d8198f5 100644 --- a/core/src/io/anuke/mindustry/mod/Mod.java +++ b/core/src/io/anuke/mindustry/mod/Mod.java @@ -15,11 +15,6 @@ public class Mod{ } - /** Create any content needed here. */ - public void loadContent(){ - - } - /** Register any commands to be used on the server side, e.g. from the console. */ public void registerServerCommands(CommandHandler handler){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 37a35e6f53..0107e5072f 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -30,6 +30,7 @@ import static io.anuke.mindustry.Vars.*; public class Mods implements Loadable{ private Json json = new Json(); + private Scripts scripts = new Scripts(); private ContentParser parser = new ContentParser(); private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); @@ -362,6 +363,31 @@ public class Mods implements Loadable{ /** Creates all the content found in mod files. */ public void loadContent(){ + + Time.mark(); + + for(LoadedMod mod : loaded){ + if(mod.root.child("scripts").exists()){ + mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); + Log.info("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); + + for(FileHandle file : mod.scripts){ + try{ + scripts.run(file.readString()); + }catch(Throwable e){ + Core.app.post(() -> { + Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); + e.printStackTrace(); + if(!headless) ui.showException(e); + }); + break; + } + } + } + } + + Log.info("Time to initialize modded scripts: {0}", Time.elapsed()); + class LoadRun implements Comparable{ final ContentType type; final FileHandle file; @@ -414,9 +440,6 @@ public class Mods implements Loadable{ //this finishes parsing content fields parser.finishParsing(); - - //load content for code mods - each(Mod::loadContent); } /** @return all loaded mods. */ @@ -582,6 +605,8 @@ public class Mods implements Loadable{ public Array dependencies = new Array<>(); /** All missing dependencies of this mod as strings. */ public Array missingDependencies = new Array<>(); + /** Script files to run. */ + public Array scripts = new Array<>(); public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){ this.root = root; diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java new file mode 100644 index 0000000000..4de51215a0 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -0,0 +1,16 @@ +package io.anuke.mindustry.mod; + +import org.graalvm.polyglot.*; + +public class Scripts{ + //TODO allowHostAccess(...) is obviously insecure + private Context context = Context.newBuilder("js").allowHostClassLookup(s -> s.startsWith("io.anuke.mindustry")).allowHostAccess(HostAccess.ALL).build(); + + public Scripts(){ + context.eval("js", "console.log(\"Initialized JS context.\")"); + } + + public void run(String script){ + context.eval("js", script); + } +} diff --git a/gradle.properties b/gradle.properties index c5b304340a..8b7352fd6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=ed17a2654951d1131bb6af71db6dea588df55b19 +archash=c7f3d8125c8d13c0a31c5f14fdabdb3d0efbd676 From eabbd2fa32aa57ccfcca2b63ad8dd6453e19ca6c Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 27 Nov 2019 00:07:37 -0500 Subject: [PATCH 007/107] """security""" --- core/src/io/anuke/mindustry/mod/Scripts.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 4de51215a0..f55a52571d 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,10 +1,12 @@ package io.anuke.mindustry.mod; +import io.anuke.arc.files.*; import org.graalvm.polyglot.*; public class Scripts{ //TODO allowHostAccess(...) is obviously insecure - private Context context = Context.newBuilder("js").allowHostClassLookup(s -> s.startsWith("io.anuke.mindustry")).allowHostAccess(HostAccess.ALL).build(); + private Context context = Context.newBuilder("js").allowHostClassLookup(s -> s.startsWith("io.anuke.mindustry")) + .allowHostAccess(HostAccess.newBuilder().allowPublicAccess(true).denyAccess(FileHandle.class).build()).build(); public Scripts(){ context.eval("js", "console.log(\"Initialized JS context.\")"); From 57f9aeee8691d9067beea67d897116ef295f5849 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 27 Nov 2019 13:51:07 -0500 Subject: [PATCH 008/107] Public block fields / Better scripting --- build.gradle | 1 + core/assets/scripts/global.js | 360 ++++++++++++++++++ core/assets/scripts/wrapper.js | 9 + .../io/anuke/mindustry/input/PlaceMode.java | 2 +- .../io/anuke/mindustry/mod/ClassAccess.java | 8 + core/src/io/anuke/mindustry/mod/Mods.java | 7 +- core/src/io/anuke/mindustry/mod/Scripts.java | 32 +- .../mindustry/world/blocks/defense/Door.java | 8 +- .../world/blocks/defense/ForceProjector.java | 20 +- .../world/blocks/defense/MendProjector.java | 31 +- .../blocks/defense/OverdriveProjector.java | 28 +- .../world/blocks/defense/ShockMine.java | 12 +- .../world/blocks/defense/SurgeWall.java | 6 +- .../mindustry/world/blocks/defense/Wall.java | 2 +- .../defense/turrets/ArtilleryTurret.java | 2 +- .../blocks/defense/turrets/BurstTurret.java | 2 +- .../blocks/defense/turrets/ChargeTurret.java | 10 +- .../blocks/defense/turrets/CooledTurret.java | 4 +- .../blocks/defense/turrets/DoubleTurret.java | 2 +- .../blocks/defense/turrets/ItemTurret.java | 4 +- .../blocks/defense/turrets/LaserTurret.java | 4 +- .../blocks/defense/turrets/LiquidTurret.java | 2 +- .../blocks/defense/turrets/PowerTurret.java | 4 +- .../world/blocks/defense/turrets/Turret.java | 53 ++- .../distribution/BufferedItemBridge.java | 6 +- .../world/blocks/distribution/Conveyor.java | 2 +- .../world/blocks/distribution/ItemBridge.java | 10 +- .../world/blocks/distribution/Junction.java | 4 +- .../world/blocks/distribution/MassDriver.java | 22 +- .../blocks/distribution/OverflowGate.java | 2 +- .../world/blocks/distribution/Router.java | 2 +- .../world/blocks/distribution/Sorter.java | 2 +- .../world/blocks/liquid/ArmoredConduit.java | 2 +- .../world/blocks/liquid/Conduit.java | 8 +- .../blocks/liquid/LiquidOverflowGate.java | 2 +- .../world/blocks/power/ImpactReactor.java | 18 +- .../blocks/power/ItemLiquidGenerator.java | 20 +- .../world/blocks/power/LightBlock.java | 6 +- .../world/blocks/power/NuclearReactor.java | 26 +- .../world/blocks/power/PowerDiode.java | 4 +- .../world/blocks/power/PowerGenerator.java | 2 +- .../world/blocks/power/PowerNode.java | 10 +- .../world/blocks/power/ThermalGenerator.java | 2 +- .../world/blocks/production/Cultivator.java | 14 +- .../world/blocks/production/Drill.java | 31 +- .../world/blocks/production/Fracker.java | 8 +- .../blocks/production/GenericCrafter.java | 16 +- .../blocks/production/GenericSmelter.java | 4 +- .../world/blocks/production/Incinerator.java | 4 +- .../world/blocks/production/Pump.java | 2 +- .../world/blocks/production/SolidPump.java | 10 +- .../world/blocks/sandbox/LiquidSource.java | 2 +- .../world/blocks/storage/CoreBlock.java | 2 +- .../world/blocks/storage/LaunchPad.java | 4 +- .../world/blocks/storage/Unloader.java | 4 +- .../mindustry/world/blocks/units/MechPad.java | 2 +- .../world/blocks/units/RepairPoint.java | 12 +- .../world/blocks/units/UnitFactory.java | 12 +- tools/build.gradle | 8 +- .../mindustry/{ => tools}/BundleLauncher.java | 2 +- .../mindustry/{ => tools}/Generators.java | 4 +- .../io/anuke/mindustry/{ => tools}/Image.java | 4 +- .../mindustry/{ => tools}/ImagePacker.java | 3 +- .../mindustry/tools/ScriptStubGenerator.java | 60 +++ .../mindustry/{ => tools}/SquareMarcher.java | 2 +- .../anuke/mindustry/{ => tools}/Upscaler.java | 2 +- 66 files changed, 718 insertions(+), 257 deletions(-) create mode 100755 core/assets/scripts/global.js create mode 100755 core/assets/scripts/wrapper.js create mode 100644 core/src/io/anuke/mindustry/mod/ClassAccess.java rename tools/src/io/anuke/mindustry/{ => tools}/BundleLauncher.java (98%) rename tools/src/io/anuke/mindustry/{ => tools}/Generators.java (99%) rename tools/src/io/anuke/mindustry/{ => tools}/Image.java (97%) rename tools/src/io/anuke/mindustry/{ => tools}/ImagePacker.java (98%) create mode 100644 tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java rename tools/src/io/anuke/mindustry/{ => tools}/SquareMarcher.java (99%) rename tools/src/io/anuke/mindustry/{ => tools}/Upscaler.java (97%) diff --git a/build.gradle b/build.gradle index 226b21f891..0be76a33f2 100644 --- a/build.gradle +++ b/build.gradle @@ -299,6 +299,7 @@ project(":tools"){ compile "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-desktop" compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" + compile "org.reflections:reflections:0.9.11" compile arcModule("backends:backend-sdl") } diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js new file mode 100755 index 0000000000..ccca49d2c0 --- /dev/null +++ b/core/assets/scripts/global.js @@ -0,0 +1,360 @@ +//Generated class. Do not modify. +const Core = Java.type('io.anuke.arc.Core') +const Draw = Java.type('io.anuke.arc.graphics.g2d.Draw') +const TextureAtlas = Java.type('io.anuke.arc.graphics.g2d.TextureAtlas') +const TextureRegion = Java.type('io.anuke.arc.graphics.g2d.TextureRegion') +const Vars = Java.type('io.anuke.mindustry.Vars') +const BlockIndexer = Java.type('io.anuke.mindustry.ai.BlockIndexer') +const Pathfinder = Java.type('io.anuke.mindustry.ai.Pathfinder') +const WaveSpawner = Java.type('io.anuke.mindustry.ai.WaveSpawner') +const Blocks = Java.type('io.anuke.mindustry.content.Blocks') +const Bullets = Java.type('io.anuke.mindustry.content.Bullets') +const Fx = Java.type('io.anuke.mindustry.content.Fx') +const Items = Java.type('io.anuke.mindustry.content.Items') +const Liquids = Java.type('io.anuke.mindustry.content.Liquids') +const Loadouts = Java.type('io.anuke.mindustry.content.Loadouts') +const Mechs = Java.type('io.anuke.mindustry.content.Mechs') +const StatusEffects = Java.type('io.anuke.mindustry.content.StatusEffects') +const TechTree = Java.type('io.anuke.mindustry.content.TechTree') +const TypeIDs = Java.type('io.anuke.mindustry.content.TypeIDs') +const UnitTypes = Java.type('io.anuke.mindustry.content.UnitTypes') +const Zones = Java.type('io.anuke.mindustry.content.Zones') +const ContentLoader = Java.type('io.anuke.mindustry.core.ContentLoader') +const Control = Java.type('io.anuke.mindustry.core.Control') +const FileTree = Java.type('io.anuke.mindustry.core.FileTree') +const GameState = Java.type('io.anuke.mindustry.core.GameState') +const Logic = Java.type('io.anuke.mindustry.core.Logic') +const Platform = Java.type('io.anuke.mindustry.core.Platform') +const Renderer = Java.type('io.anuke.mindustry.core.Renderer') +const UI = Java.type('io.anuke.mindustry.core.UI') +const Version = Java.type('io.anuke.mindustry.core.Version') +const World = Java.type('io.anuke.mindustry.core.World') +const Content = Java.type('io.anuke.mindustry.ctype.Content') +const ContentList = Java.type('io.anuke.mindustry.ctype.ContentList') +const MappableContent = Java.type('io.anuke.mindustry.ctype.MappableContent') +const UnlockableContent = Java.type('io.anuke.mindustry.ctype.UnlockableContent') +const DrawOperation = Java.type('io.anuke.mindustry.editor.DrawOperation') +const EditorTile = Java.type('io.anuke.mindustry.editor.EditorTile') +const EditorTool = Java.type('io.anuke.mindustry.editor.EditorTool') +const MapEditor = Java.type('io.anuke.mindustry.editor.MapEditor') +const MapRenderer = Java.type('io.anuke.mindustry.editor.MapRenderer') +const OperationStack = Java.type('io.anuke.mindustry.editor.OperationStack') +const Damage = Java.type('io.anuke.mindustry.entities.Damage') +const Effects = Java.type('io.anuke.mindustry.entities.Effects') +const Entities = Java.type('io.anuke.mindustry.entities.Entities') +const EntityCollisions = Java.type('io.anuke.mindustry.entities.EntityCollisions') +const EntityGroup = Java.type('io.anuke.mindustry.entities.EntityGroup') +const Predict = Java.type('io.anuke.mindustry.entities.Predict') +const TargetPriority = Java.type('io.anuke.mindustry.entities.TargetPriority') +const Units = Java.type('io.anuke.mindustry.entities.Units') +const ArtilleryBulletType = Java.type('io.anuke.mindustry.entities.bullet.ArtilleryBulletType') +const BasicBulletType = Java.type('io.anuke.mindustry.entities.bullet.BasicBulletType') +const BombBulletType = Java.type('io.anuke.mindustry.entities.bullet.BombBulletType') +const BulletType = Java.type('io.anuke.mindustry.entities.bullet.BulletType') +const FlakBulletType = Java.type('io.anuke.mindustry.entities.bullet.FlakBulletType') +const HealBulletType = Java.type('io.anuke.mindustry.entities.bullet.HealBulletType') +const LiquidBulletType = Java.type('io.anuke.mindustry.entities.bullet.LiquidBulletType') +const MassDriverBolt = Java.type('io.anuke.mindustry.entities.bullet.MassDriverBolt') +const MissileBulletType = Java.type('io.anuke.mindustry.entities.bullet.MissileBulletType') +const Decal = Java.type('io.anuke.mindustry.entities.effect.Decal') +const Fire = Java.type('io.anuke.mindustry.entities.effect.Fire') +const GroundEffectEntity = Java.type('io.anuke.mindustry.entities.effect.GroundEffectEntity') +const ItemTransfer = Java.type('io.anuke.mindustry.entities.effect.ItemTransfer') +const Lightning = Java.type('io.anuke.mindustry.entities.effect.Lightning') +const Puddle = Java.type('io.anuke.mindustry.entities.effect.Puddle') +const RubbleDecal = Java.type('io.anuke.mindustry.entities.effect.RubbleDecal') +const ScorchDecal = Java.type('io.anuke.mindustry.entities.effect.ScorchDecal') +const AbsorbTrait = Java.type('io.anuke.mindustry.entities.traits.AbsorbTrait') +const BelowLiquidTrait = Java.type('io.anuke.mindustry.entities.traits.BelowLiquidTrait') +const BuilderMinerTrait = Java.type('io.anuke.mindustry.entities.traits.BuilderMinerTrait') +const BuilderTrait = Java.type('io.anuke.mindustry.entities.traits.BuilderTrait') +const DamageTrait = Java.type('io.anuke.mindustry.entities.traits.DamageTrait') +const DrawTrait = Java.type('io.anuke.mindustry.entities.traits.DrawTrait') +const Entity = Java.type('io.anuke.mindustry.entities.traits.Entity') +const HealthTrait = Java.type('io.anuke.mindustry.entities.traits.HealthTrait') +const KillerTrait = Java.type('io.anuke.mindustry.entities.traits.KillerTrait') +const MinerTrait = Java.type('io.anuke.mindustry.entities.traits.MinerTrait') +const MoveTrait = Java.type('io.anuke.mindustry.entities.traits.MoveTrait') +const SaveTrait = Java.type('io.anuke.mindustry.entities.traits.SaveTrait') +const Saveable = Java.type('io.anuke.mindustry.entities.traits.Saveable') +const ScaleTrait = Java.type('io.anuke.mindustry.entities.traits.ScaleTrait') +const ShooterTrait = Java.type('io.anuke.mindustry.entities.traits.ShooterTrait') +const SolidTrait = Java.type('io.anuke.mindustry.entities.traits.SolidTrait') +const SpawnerTrait = Java.type('io.anuke.mindustry.entities.traits.SpawnerTrait') +const SyncTrait = Java.type('io.anuke.mindustry.entities.traits.SyncTrait') +const TargetTrait = Java.type('io.anuke.mindustry.entities.traits.TargetTrait') +const TeamTrait = Java.type('io.anuke.mindustry.entities.traits.TeamTrait') +const TimeTrait = Java.type('io.anuke.mindustry.entities.traits.TimeTrait') +const TypeTrait = Java.type('io.anuke.mindustry.entities.traits.TypeTrait') +const VelocityTrait = Java.type('io.anuke.mindustry.entities.traits.VelocityTrait') +const BaseEntity = Java.type('io.anuke.mindustry.entities.type.BaseEntity') +const BaseUnit = Java.type('io.anuke.mindustry.entities.type.BaseUnit') +const Bullet = Java.type('io.anuke.mindustry.entities.type.Bullet') +const DestructibleEntity = Java.type('io.anuke.mindustry.entities.type.DestructibleEntity') +const EffectEntity = Java.type('io.anuke.mindustry.entities.type.EffectEntity') +const Player = Java.type('io.anuke.mindustry.entities.type.Player') +const SolidEntity = Java.type('io.anuke.mindustry.entities.type.SolidEntity') +const TileEntity = Java.type('io.anuke.mindustry.entities.type.TileEntity') +const TimedEntity = Java.type('io.anuke.mindustry.entities.type.TimedEntity') +const Unit = Java.type('io.anuke.mindustry.entities.type.Unit') +const BaseDrone = Java.type('io.anuke.mindustry.entities.type.base.BaseDrone') +const BuilderDrone = Java.type('io.anuke.mindustry.entities.type.base.BuilderDrone') +const Crawler = Java.type('io.anuke.mindustry.entities.type.base.Crawler') +const Dagger = Java.type('io.anuke.mindustry.entities.type.base.Dagger') +const Draug = Java.type('io.anuke.mindustry.entities.type.base.Draug') +const Eruptor = Java.type('io.anuke.mindustry.entities.type.base.Eruptor') +const FlyingUnit = Java.type('io.anuke.mindustry.entities.type.base.FlyingUnit') +const Fortress = Java.type('io.anuke.mindustry.entities.type.base.Fortress') +const Ghoul = Java.type('io.anuke.mindustry.entities.type.base.Ghoul') +const GroundUnit = Java.type('io.anuke.mindustry.entities.type.base.GroundUnit') +const MinerDrone = Java.type('io.anuke.mindustry.entities.type.base.MinerDrone') +const Phantom = Java.type('io.anuke.mindustry.entities.type.base.Phantom') +const RepairDrone = Java.type('io.anuke.mindustry.entities.type.base.RepairDrone') +const Revenant = Java.type('io.anuke.mindustry.entities.type.base.Revenant') +const Spirit = Java.type('io.anuke.mindustry.entities.type.base.Spirit') +const Titan = Java.type('io.anuke.mindustry.entities.type.base.Titan') +const Wraith = Java.type('io.anuke.mindustry.entities.type.base.Wraith') +const StateMachine = Java.type('io.anuke.mindustry.entities.units.StateMachine') +const Statuses = Java.type('io.anuke.mindustry.entities.units.Statuses') +const UnitCommand = Java.type('io.anuke.mindustry.entities.units.UnitCommand') +const UnitDrops = Java.type('io.anuke.mindustry.entities.units.UnitDrops') +const UnitState = Java.type('io.anuke.mindustry.entities.units.UnitState') +const DefaultWaves = Java.type('io.anuke.mindustry.game.DefaultWaves') +const Difficulty = Java.type('io.anuke.mindustry.game.Difficulty') +const EventType = Java.type('io.anuke.mindustry.game.EventType') +const Gamemode = Java.type('io.anuke.mindustry.game.Gamemode') +const GlobalData = Java.type('io.anuke.mindustry.game.GlobalData') +const LoopControl = Java.type('io.anuke.mindustry.game.LoopControl') +const MusicControl = Java.type('io.anuke.mindustry.game.MusicControl') +const Objective = Java.type('io.anuke.mindustry.game.Objective') +const Objectives = Java.type('io.anuke.mindustry.game.Objectives') +const Rules = Java.type('io.anuke.mindustry.game.Rules') +const Saves = Java.type('io.anuke.mindustry.game.Saves') +const Schematic = Java.type('io.anuke.mindustry.game.Schematic') +const Schematics = Java.type('io.anuke.mindustry.game.Schematics') +const SoundLoop = Java.type('io.anuke.mindustry.game.SoundLoop') +const SpawnGroup = Java.type('io.anuke.mindustry.game.SpawnGroup') +const Stats = Java.type('io.anuke.mindustry.game.Stats') +const Team = Java.type('io.anuke.mindustry.game.Team') +const Teams = Java.type('io.anuke.mindustry.game.Teams') +const Tutorial = Java.type('io.anuke.mindustry.game.Tutorial') +const BlockRenderer = Java.type('io.anuke.mindustry.graphics.BlockRenderer') +const Bloom = Java.type('io.anuke.mindustry.graphics.Bloom') +const CacheLayer = Java.type('io.anuke.mindustry.graphics.CacheLayer') +const Drawf = Java.type('io.anuke.mindustry.graphics.Drawf') +const FloorRenderer = Java.type('io.anuke.mindustry.graphics.FloorRenderer') +const IndexedRenderer = Java.type('io.anuke.mindustry.graphics.IndexedRenderer') +const Layer = Java.type('io.anuke.mindustry.graphics.Layer') +const LightRenderer = Java.type('io.anuke.mindustry.graphics.LightRenderer') +const MenuRenderer = Java.type('io.anuke.mindustry.graphics.MenuRenderer') +const MinimapRenderer = Java.type('io.anuke.mindustry.graphics.MinimapRenderer') +const MultiPacker = Java.type('io.anuke.mindustry.graphics.MultiPacker') +const OverlayRenderer = Java.type('io.anuke.mindustry.graphics.OverlayRenderer') +const Pal = Java.type('io.anuke.mindustry.graphics.Pal') +const Pixelator = Java.type('io.anuke.mindustry.graphics.Pixelator') +const Shaders = Java.type('io.anuke.mindustry.graphics.Shaders') +const Binding = Java.type('io.anuke.mindustry.input.Binding') +const DesktopInput = Java.type('io.anuke.mindustry.input.DesktopInput') +const InputHandler = Java.type('io.anuke.mindustry.input.InputHandler') +const MobileInput = Java.type('io.anuke.mindustry.input.MobileInput') +const PlaceMode = Java.type('io.anuke.mindustry.input.PlaceMode') +const Placement = Java.type('io.anuke.mindustry.input.Placement') +const Map = Java.type('io.anuke.mindustry.maps.Map') +const Maps = Java.type('io.anuke.mindustry.maps.Maps') +const BlendFilter = Java.type('io.anuke.mindustry.maps.filters.BlendFilter') +const ClearFilter = Java.type('io.anuke.mindustry.maps.filters.ClearFilter') +const DistortFilter = Java.type('io.anuke.mindustry.maps.filters.DistortFilter') +const FilterOption = Java.type('io.anuke.mindustry.maps.filters.FilterOption') +const GenerateFilter = Java.type('io.anuke.mindustry.maps.filters.GenerateFilter') +const MedianFilter = Java.type('io.anuke.mindustry.maps.filters.MedianFilter') +const MirrorFilter = Java.type('io.anuke.mindustry.maps.filters.MirrorFilter') +const NoiseFilter = Java.type('io.anuke.mindustry.maps.filters.NoiseFilter') +const OreFilter = Java.type('io.anuke.mindustry.maps.filters.OreFilter') +const OreMedianFilter = Java.type('io.anuke.mindustry.maps.filters.OreMedianFilter') +const RiverNoiseFilter = Java.type('io.anuke.mindustry.maps.filters.RiverNoiseFilter') +const ScatterFilter = Java.type('io.anuke.mindustry.maps.filters.ScatterFilter') +const TerrainFilter = Java.type('io.anuke.mindustry.maps.filters.TerrainFilter') +const BasicGenerator = Java.type('io.anuke.mindustry.maps.generators.BasicGenerator') +const Generator = Java.type('io.anuke.mindustry.maps.generators.Generator') +const MapGenerator = Java.type('io.anuke.mindustry.maps.generators.MapGenerator') +const RandomGenerator = Java.type('io.anuke.mindustry.maps.generators.RandomGenerator') +const DesertWastesGenerator = Java.type('io.anuke.mindustry.maps.zonegen.DesertWastesGenerator') +const OvergrowthGenerator = Java.type('io.anuke.mindustry.maps.zonegen.OvergrowthGenerator') +const Category = Java.type('io.anuke.mindustry.type.Category') +const ContentType = Java.type('io.anuke.mindustry.type.ContentType') +const Item = Java.type('io.anuke.mindustry.type.Item') +const ItemStack = Java.type('io.anuke.mindustry.type.ItemStack') +const ItemType = Java.type('io.anuke.mindustry.type.ItemType') +const Liquid = Java.type('io.anuke.mindustry.type.Liquid') +const LiquidStack = Java.type('io.anuke.mindustry.type.LiquidStack') +const Mech = Java.type('io.anuke.mindustry.type.Mech') +const Publishable = Java.type('io.anuke.mindustry.type.Publishable') +const StatusEffect = Java.type('io.anuke.mindustry.type.StatusEffect') +const TypeID = Java.type('io.anuke.mindustry.type.TypeID') +const UnitType = Java.type('io.anuke.mindustry.type.UnitType') +const Weapon = Java.type('io.anuke.mindustry.type.Weapon') +const WeatherEvent = Java.type('io.anuke.mindustry.type.WeatherEvent') +const Zone = Java.type('io.anuke.mindustry.type.Zone') +const Cicon = Java.type('io.anuke.mindustry.ui.Cicon') +const ContentDisplay = Java.type('io.anuke.mindustry.ui.ContentDisplay') +const Fonts = Java.type('io.anuke.mindustry.ui.Fonts') +const IconSize = Java.type('io.anuke.mindustry.ui.IconSize') +const IntFormat = Java.type('io.anuke.mindustry.ui.IntFormat') +const Links = Java.type('io.anuke.mindustry.ui.Links') +const Styles = Java.type('io.anuke.mindustry.ui.Styles') +const BlockConfigFragment = Java.type('io.anuke.mindustry.ui.fragments.BlockConfigFragment') +const BlockInventoryFragment = Java.type('io.anuke.mindustry.ui.fragments.BlockInventoryFragment') +const FadeInFragment = Java.type('io.anuke.mindustry.ui.fragments.FadeInFragment') +const Fragment = Java.type('io.anuke.mindustry.ui.fragments.Fragment') +const HudFragment = Java.type('io.anuke.mindustry.ui.fragments.HudFragment') +const LoadingFragment = Java.type('io.anuke.mindustry.ui.fragments.LoadingFragment') +const MenuFragment = Java.type('io.anuke.mindustry.ui.fragments.MenuFragment') +const OverlayFragment = Java.type('io.anuke.mindustry.ui.fragments.OverlayFragment') +const PlacementFragment = Java.type('io.anuke.mindustry.ui.fragments.PlacementFragment') +const PlayerListFragment = Java.type('io.anuke.mindustry.ui.fragments.PlayerListFragment') +const BranchTreeLayout = Java.type('io.anuke.mindustry.ui.layout.BranchTreeLayout') +const RadialTreeLayout = Java.type('io.anuke.mindustry.ui.layout.RadialTreeLayout') +const TreeLayout = Java.type('io.anuke.mindustry.ui.layout.TreeLayout') +const Block = Java.type('io.anuke.mindustry.world.Block') +const BlockStorage = Java.type('io.anuke.mindustry.world.BlockStorage') +const Build = Java.type('io.anuke.mindustry.world.Build') +const CachedTile = Java.type('io.anuke.mindustry.world.CachedTile') +const DirectionalItemBuffer = Java.type('io.anuke.mindustry.world.DirectionalItemBuffer') +const Edges = Java.type('io.anuke.mindustry.world.Edges') +const ItemBuffer = Java.type('io.anuke.mindustry.world.ItemBuffer') +const LegacyColorMapper = Java.type('io.anuke.mindustry.world.LegacyColorMapper') +const Pos = Java.type('io.anuke.mindustry.world.Pos') +const StaticTree = Java.type('io.anuke.mindustry.world.StaticTree') +const Tile = Java.type('io.anuke.mindustry.world.Tile') +const WorldContext = Java.type('io.anuke.mindustry.world.WorldContext') +const Attributes = Java.type('io.anuke.mindustry.world.blocks.Attributes') +const Autotiler = Java.type('io.anuke.mindustry.world.blocks.Autotiler') +const BlockPart = Java.type('io.anuke.mindustry.world.blocks.BlockPart') +const BuildBlock = Java.type('io.anuke.mindustry.world.blocks.BuildBlock') +const DoubleOverlayFloor = Java.type('io.anuke.mindustry.world.blocks.DoubleOverlayFloor') +const Floor = Java.type('io.anuke.mindustry.world.blocks.Floor') +const ItemSelection = Java.type('io.anuke.mindustry.world.blocks.ItemSelection') +const LiquidBlock = Java.type('io.anuke.mindustry.world.blocks.LiquidBlock') +const OreBlock = Java.type('io.anuke.mindustry.world.blocks.OreBlock') +const OverlayFloor = Java.type('io.anuke.mindustry.world.blocks.OverlayFloor') +const PowerBlock = Java.type('io.anuke.mindustry.world.blocks.PowerBlock') +const RespawnBlock = Java.type('io.anuke.mindustry.world.blocks.RespawnBlock') +const Rock = Java.type('io.anuke.mindustry.world.blocks.Rock') +const StaticWall = Java.type('io.anuke.mindustry.world.blocks.StaticWall') +const TreeBlock = Java.type('io.anuke.mindustry.world.blocks.TreeBlock') +const DeflectorWall = Java.type('io.anuke.mindustry.world.blocks.defense.DeflectorWall') +const Door = Java.type('io.anuke.mindustry.world.blocks.defense.Door') +const ForceProjector = Java.type('io.anuke.mindustry.world.blocks.defense.ForceProjector') +const MendProjector = Java.type('io.anuke.mindustry.world.blocks.defense.MendProjector') +const OverdriveProjector = Java.type('io.anuke.mindustry.world.blocks.defense.OverdriveProjector') +const ShockMine = Java.type('io.anuke.mindustry.world.blocks.defense.ShockMine') +const SurgeWall = Java.type('io.anuke.mindustry.world.blocks.defense.SurgeWall') +const Wall = Java.type('io.anuke.mindustry.world.blocks.defense.Wall') +const ArtilleryTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret') +const BurstTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret') +const ChargeTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret') +const CooledTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret') +const DoubleTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret') +const ItemTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret') +const LaserTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret') +const LiquidTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret') +const PowerTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret') +const Turret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.Turret') +const ArmoredConveyor = Java.type('io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor') +const BufferedItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge') +const Conveyor = Java.type('io.anuke.mindustry.world.blocks.distribution.Conveyor') +const ExtendingItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge') +const ItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.ItemBridge') +const Junction = Java.type('io.anuke.mindustry.world.blocks.distribution.Junction') +const MassDriver = Java.type('io.anuke.mindustry.world.blocks.distribution.MassDriver') +const OverflowGate = Java.type('io.anuke.mindustry.world.blocks.distribution.OverflowGate') +const Router = Java.type('io.anuke.mindustry.world.blocks.distribution.Router') +const Sorter = Java.type('io.anuke.mindustry.world.blocks.distribution.Sorter') +const ArmoredConduit = Java.type('io.anuke.mindustry.world.blocks.liquid.ArmoredConduit') +const Conduit = Java.type('io.anuke.mindustry.world.blocks.liquid.Conduit') +const LiquidBridge = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidBridge') +const LiquidExtendingBridge = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge') +const LiquidJunction = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidJunction') +const LiquidOverflowGate = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate') +const LiquidRouter = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidRouter') +const LiquidTank = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidTank') +const LogicBlock = Java.type('io.anuke.mindustry.world.blocks.logic.LogicBlock') +const MessageBlock = Java.type('io.anuke.mindustry.world.blocks.logic.MessageBlock') +const Battery = Java.type('io.anuke.mindustry.world.blocks.power.Battery') +const BurnerGenerator = Java.type('io.anuke.mindustry.world.blocks.power.BurnerGenerator') +const ConditionalConsumePower = Java.type('io.anuke.mindustry.world.blocks.power.ConditionalConsumePower') +const DecayGenerator = Java.type('io.anuke.mindustry.world.blocks.power.DecayGenerator') +const ImpactReactor = Java.type('io.anuke.mindustry.world.blocks.power.ImpactReactor') +const ItemLiquidGenerator = Java.type('io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator') +const LightBlock = Java.type('io.anuke.mindustry.world.blocks.power.LightBlock') +const NuclearReactor = Java.type('io.anuke.mindustry.world.blocks.power.NuclearReactor') +const PowerDiode = Java.type('io.anuke.mindustry.world.blocks.power.PowerDiode') +const PowerDistributor = Java.type('io.anuke.mindustry.world.blocks.power.PowerDistributor') +const PowerGenerator = Java.type('io.anuke.mindustry.world.blocks.power.PowerGenerator') +const PowerGraph = Java.type('io.anuke.mindustry.world.blocks.power.PowerGraph') +const PowerNode = Java.type('io.anuke.mindustry.world.blocks.power.PowerNode') +const SingleTypeGenerator = Java.type('io.anuke.mindustry.world.blocks.power.SingleTypeGenerator') +const SolarGenerator = Java.type('io.anuke.mindustry.world.blocks.power.SolarGenerator') +const ThermalGenerator = Java.type('io.anuke.mindustry.world.blocks.power.ThermalGenerator') +const Cultivator = Java.type('io.anuke.mindustry.world.blocks.production.Cultivator') +const Drill = Java.type('io.anuke.mindustry.world.blocks.production.Drill') +const Fracker = Java.type('io.anuke.mindustry.world.blocks.production.Fracker') +const GenericCrafter = Java.type('io.anuke.mindustry.world.blocks.production.GenericCrafter') +const GenericSmelter = Java.type('io.anuke.mindustry.world.blocks.production.GenericSmelter') +const Incinerator = Java.type('io.anuke.mindustry.world.blocks.production.Incinerator') +const LiquidConverter = Java.type('io.anuke.mindustry.world.blocks.production.LiquidConverter') +const Pump = Java.type('io.anuke.mindustry.world.blocks.production.Pump') +const Separator = Java.type('io.anuke.mindustry.world.blocks.production.Separator') +const SolidPump = Java.type('io.anuke.mindustry.world.blocks.production.SolidPump') +const ItemSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.ItemSource') +const ItemVoid = Java.type('io.anuke.mindustry.world.blocks.sandbox.ItemVoid') +const LiquidSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.LiquidSource') +const PowerSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.PowerSource') +const PowerVoid = Java.type('io.anuke.mindustry.world.blocks.sandbox.PowerVoid') +const CoreBlock = Java.type('io.anuke.mindustry.world.blocks.storage.CoreBlock') +const LaunchPad = Java.type('io.anuke.mindustry.world.blocks.storage.LaunchPad') +const StorageBlock = Java.type('io.anuke.mindustry.world.blocks.storage.StorageBlock') +const Unloader = Java.type('io.anuke.mindustry.world.blocks.storage.Unloader') +const Vault = Java.type('io.anuke.mindustry.world.blocks.storage.Vault') +const CommandCenter = Java.type('io.anuke.mindustry.world.blocks.units.CommandCenter') +const MechPad = Java.type('io.anuke.mindustry.world.blocks.units.MechPad') +const RallyPoint = Java.type('io.anuke.mindustry.world.blocks.units.RallyPoint') +const RepairPoint = Java.type('io.anuke.mindustry.world.blocks.units.RepairPoint') +const UnitFactory = Java.type('io.anuke.mindustry.world.blocks.units.UnitFactory') +const Consume = Java.type('io.anuke.mindustry.world.consumers.Consume') +const ConsumeItemFilter = Java.type('io.anuke.mindustry.world.consumers.ConsumeItemFilter') +const ConsumeItems = Java.type('io.anuke.mindustry.world.consumers.ConsumeItems') +const ConsumeLiquid = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquid') +const ConsumeLiquidBase = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquidBase') +const ConsumeLiquidFilter = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquidFilter') +const ConsumePower = Java.type('io.anuke.mindustry.world.consumers.ConsumePower') +const ConsumeType = Java.type('io.anuke.mindustry.world.consumers.ConsumeType') +const Consumers = Java.type('io.anuke.mindustry.world.consumers.Consumers') +const Attribute = Java.type('io.anuke.mindustry.world.meta.Attribute') +const BlockBars = Java.type('io.anuke.mindustry.world.meta.BlockBars') +const BlockFlag = Java.type('io.anuke.mindustry.world.meta.BlockFlag') +const BlockGroup = Java.type('io.anuke.mindustry.world.meta.BlockGroup') +const BlockStat = Java.type('io.anuke.mindustry.world.meta.BlockStat') +const BlockStats = Java.type('io.anuke.mindustry.world.meta.BlockStats') +const BuildVisibility = Java.type('io.anuke.mindustry.world.meta.BuildVisibility') +const PowerType = Java.type('io.anuke.mindustry.world.meta.PowerType') +const Producers = Java.type('io.anuke.mindustry.world.meta.Producers') +const StatCategory = Java.type('io.anuke.mindustry.world.meta.StatCategory') +const StatUnit = Java.type('io.anuke.mindustry.world.meta.StatUnit') +const StatValue = Java.type('io.anuke.mindustry.world.meta.StatValue') +const AmmoListValue = Java.type('io.anuke.mindustry.world.meta.values.AmmoListValue') +const BooleanValue = Java.type('io.anuke.mindustry.world.meta.values.BooleanValue') +const BoosterListValue = Java.type('io.anuke.mindustry.world.meta.values.BoosterListValue') +const ItemFilterValue = Java.type('io.anuke.mindustry.world.meta.values.ItemFilterValue') +const ItemListValue = Java.type('io.anuke.mindustry.world.meta.values.ItemListValue') +const LiquidFilterValue = Java.type('io.anuke.mindustry.world.meta.values.LiquidFilterValue') +const LiquidValue = Java.type('io.anuke.mindustry.world.meta.values.LiquidValue') +const NumberValue = Java.type('io.anuke.mindustry.world.meta.values.NumberValue') +const StringValue = Java.type('io.anuke.mindustry.world.meta.values.StringValue') +const BlockModule = Java.type('io.anuke.mindustry.world.modules.BlockModule') +const ConsumeModule = Java.type('io.anuke.mindustry.world.modules.ConsumeModule') +const ItemModule = Java.type('io.anuke.mindustry.world.modules.ItemModule') +const LiquidModule = Java.type('io.anuke.mindustry.world.modules.LiquidModule') +const PowerModule = Java.type('io.anuke.mindustry.world.modules.PowerModule') +const Produce = Java.type('io.anuke.mindustry.world.producers.Produce') +const ProduceItem = Java.type('io.anuke.mindustry.world.producers.ProduceItem') diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js new file mode 100755 index 0000000000..24bb6fcda7 --- /dev/null +++ b/core/assets/scripts/wrapper.js @@ -0,0 +1,9 @@ +this["$SCRIPT_NAME$"] = function(){ +$CODE$ +}; + +try{ + this["$SCRIPT_NAME$"](); +}catch(e){ + console.log(e) +} diff --git a/core/src/io/anuke/mindustry/input/PlaceMode.java b/core/src/io/anuke/mindustry/input/PlaceMode.java index 5ac66c5220..cb287caed6 100644 --- a/core/src/io/anuke/mindustry/input/PlaceMode.java +++ b/core/src/io/anuke/mindustry/input/PlaceMode.java @@ -1,5 +1,5 @@ package io.anuke.mindustry.input; -enum PlaceMode{ +public enum PlaceMode{ none, breaking, placing, schematicSelect } diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java new file mode 100644 index 0000000000..29c895c646 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -0,0 +1,8 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.collection.*; +//obviously autogenerated, do not touch +class ClassAccess{ + static final Array> allowedClasses = Array.with(io.anuke.arc.Core.class, io.anuke.arc.graphics.g2d.Draw.class, io.anuke.arc.graphics.g2d.TextureAtlas.class, io.anuke.arc.graphics.g2d.TextureRegion.class, io.anuke.mindustry.Vars.class, io.anuke.mindustry.ai.BlockIndexer.class, io.anuke.mindustry.ai.Pathfinder.class, io.anuke.mindustry.ai.WaveSpawner.class, io.anuke.mindustry.content.Blocks.class, io.anuke.mindustry.content.Bullets.class, io.anuke.mindustry.content.Fx.class, io.anuke.mindustry.content.Items.class, io.anuke.mindustry.content.Liquids.class, io.anuke.mindustry.content.Loadouts.class, io.anuke.mindustry.content.Mechs.class, io.anuke.mindustry.content.StatusEffects.class, io.anuke.mindustry.content.TechTree.class, io.anuke.mindustry.content.TypeIDs.class, io.anuke.mindustry.content.UnitTypes.class, io.anuke.mindustry.content.Zones.class, io.anuke.mindustry.core.ContentLoader.class, io.anuke.mindustry.core.Control.class, io.anuke.mindustry.core.FileTree.class, io.anuke.mindustry.core.GameState.class, io.anuke.mindustry.core.Logic.class, io.anuke.mindustry.core.Platform.class, io.anuke.mindustry.core.Renderer.class, io.anuke.mindustry.core.UI.class, io.anuke.mindustry.core.Version.class, io.anuke.mindustry.core.World.class, io.anuke.mindustry.ctype.Content.class, io.anuke.mindustry.ctype.ContentList.class, io.anuke.mindustry.ctype.MappableContent.class, io.anuke.mindustry.ctype.UnlockableContent.class, io.anuke.mindustry.editor.DrawOperation.class, io.anuke.mindustry.editor.EditorTile.class, io.anuke.mindustry.editor.EditorTool.class, io.anuke.mindustry.editor.MapEditor.class, io.anuke.mindustry.editor.MapRenderer.class, io.anuke.mindustry.editor.OperationStack.class, io.anuke.mindustry.entities.Damage.class, io.anuke.mindustry.entities.Effects.class, io.anuke.mindustry.entities.Entities.class, io.anuke.mindustry.entities.EntityCollisions.class, io.anuke.mindustry.entities.EntityGroup.class, io.anuke.mindustry.entities.Predict.class, io.anuke.mindustry.entities.TargetPriority.class, io.anuke.mindustry.entities.Units.class, io.anuke.mindustry.entities.bullet.ArtilleryBulletType.class, io.anuke.mindustry.entities.bullet.BasicBulletType.class, io.anuke.mindustry.entities.bullet.BombBulletType.class, io.anuke.mindustry.entities.bullet.BulletType.class, io.anuke.mindustry.entities.bullet.FlakBulletType.class, io.anuke.mindustry.entities.bullet.HealBulletType.class, io.anuke.mindustry.entities.bullet.LiquidBulletType.class, io.anuke.mindustry.entities.bullet.MassDriverBolt.class, io.anuke.mindustry.entities.bullet.MissileBulletType.class, io.anuke.mindustry.entities.effect.Decal.class, io.anuke.mindustry.entities.effect.Fire.class, io.anuke.mindustry.entities.effect.GroundEffectEntity.class, io.anuke.mindustry.entities.effect.ItemTransfer.class, io.anuke.mindustry.entities.effect.Lightning.class, io.anuke.mindustry.entities.effect.Puddle.class, io.anuke.mindustry.entities.effect.RubbleDecal.class, io.anuke.mindustry.entities.effect.ScorchDecal.class, io.anuke.mindustry.entities.traits.AbsorbTrait.class, io.anuke.mindustry.entities.traits.BelowLiquidTrait.class, io.anuke.mindustry.entities.traits.BuilderMinerTrait.class, io.anuke.mindustry.entities.traits.BuilderTrait.class, io.anuke.mindustry.entities.traits.DamageTrait.class, io.anuke.mindustry.entities.traits.DrawTrait.class, io.anuke.mindustry.entities.traits.Entity.class, io.anuke.mindustry.entities.traits.HealthTrait.class, io.anuke.mindustry.entities.traits.KillerTrait.class, io.anuke.mindustry.entities.traits.MinerTrait.class, io.anuke.mindustry.entities.traits.MoveTrait.class, io.anuke.mindustry.entities.traits.SaveTrait.class, io.anuke.mindustry.entities.traits.Saveable.class, io.anuke.mindustry.entities.traits.ScaleTrait.class, io.anuke.mindustry.entities.traits.ShooterTrait.class, io.anuke.mindustry.entities.traits.SolidTrait.class, io.anuke.mindustry.entities.traits.SpawnerTrait.class, io.anuke.mindustry.entities.traits.SyncTrait.class, io.anuke.mindustry.entities.traits.TargetTrait.class, io.anuke.mindustry.entities.traits.TeamTrait.class, io.anuke.mindustry.entities.traits.TimeTrait.class, io.anuke.mindustry.entities.traits.TypeTrait.class, io.anuke.mindustry.entities.traits.VelocityTrait.class, io.anuke.mindustry.entities.type.BaseEntity.class, io.anuke.mindustry.entities.type.BaseUnit.class, io.anuke.mindustry.entities.type.Bullet.class, io.anuke.mindustry.entities.type.DestructibleEntity.class, io.anuke.mindustry.entities.type.EffectEntity.class, io.anuke.mindustry.entities.type.Player.class, io.anuke.mindustry.entities.type.SolidEntity.class, io.anuke.mindustry.entities.type.TileEntity.class, io.anuke.mindustry.entities.type.TimedEntity.class, io.anuke.mindustry.entities.type.Unit.class, io.anuke.mindustry.entities.type.base.BaseDrone.class, io.anuke.mindustry.entities.type.base.BuilderDrone.class, io.anuke.mindustry.entities.type.base.Crawler.class, io.anuke.mindustry.entities.type.base.Dagger.class, io.anuke.mindustry.entities.type.base.Draug.class, io.anuke.mindustry.entities.type.base.Eruptor.class, io.anuke.mindustry.entities.type.base.FlyingUnit.class, io.anuke.mindustry.entities.type.base.Fortress.class, io.anuke.mindustry.entities.type.base.Ghoul.class, io.anuke.mindustry.entities.type.base.GroundUnit.class, io.anuke.mindustry.entities.type.base.MinerDrone.class, io.anuke.mindustry.entities.type.base.Phantom.class, io.anuke.mindustry.entities.type.base.RepairDrone.class, io.anuke.mindustry.entities.type.base.Revenant.class, io.anuke.mindustry.entities.type.base.Spirit.class, io.anuke.mindustry.entities.type.base.Titan.class, io.anuke.mindustry.entities.type.base.Wraith.class, io.anuke.mindustry.entities.units.StateMachine.class, io.anuke.mindustry.entities.units.Statuses.class, io.anuke.mindustry.entities.units.UnitCommand.class, io.anuke.mindustry.entities.units.UnitDrops.class, io.anuke.mindustry.entities.units.UnitState.class, io.anuke.mindustry.game.DefaultWaves.class, io.anuke.mindustry.game.Difficulty.class, io.anuke.mindustry.game.EventType.class, io.anuke.mindustry.game.Gamemode.class, io.anuke.mindustry.game.GlobalData.class, io.anuke.mindustry.game.LoopControl.class, io.anuke.mindustry.game.MusicControl.class, io.anuke.mindustry.game.Objective.class, io.anuke.mindustry.game.Objectives.class, io.anuke.mindustry.game.Rules.class, io.anuke.mindustry.game.Saves.class, io.anuke.mindustry.game.Schematic.class, io.anuke.mindustry.game.Schematics.class, io.anuke.mindustry.game.SoundLoop.class, io.anuke.mindustry.game.SpawnGroup.class, io.anuke.mindustry.game.Stats.class, io.anuke.mindustry.game.Team.class, io.anuke.mindustry.game.Teams.class, io.anuke.mindustry.game.Tutorial.class, io.anuke.mindustry.graphics.BlockRenderer.class, io.anuke.mindustry.graphics.Bloom.class, io.anuke.mindustry.graphics.CacheLayer.class, io.anuke.mindustry.graphics.Drawf.class, io.anuke.mindustry.graphics.FloorRenderer.class, io.anuke.mindustry.graphics.IndexedRenderer.class, io.anuke.mindustry.graphics.Layer.class, io.anuke.mindustry.graphics.LightRenderer.class, io.anuke.mindustry.graphics.MenuRenderer.class, io.anuke.mindustry.graphics.MinimapRenderer.class, io.anuke.mindustry.graphics.MultiPacker.class, io.anuke.mindustry.graphics.OverlayRenderer.class, io.anuke.mindustry.graphics.Pal.class, io.anuke.mindustry.graphics.Pixelator.class, io.anuke.mindustry.graphics.Shaders.class, io.anuke.mindustry.input.Binding.class, io.anuke.mindustry.input.DesktopInput.class, io.anuke.mindustry.input.InputHandler.class, io.anuke.mindustry.input.MobileInput.class, io.anuke.mindustry.input.PlaceMode.class, io.anuke.mindustry.input.Placement.class, io.anuke.mindustry.maps.Map.class, io.anuke.mindustry.maps.Maps.class, io.anuke.mindustry.maps.filters.BlendFilter.class, io.anuke.mindustry.maps.filters.ClearFilter.class, io.anuke.mindustry.maps.filters.DistortFilter.class, io.anuke.mindustry.maps.filters.FilterOption.class, io.anuke.mindustry.maps.filters.GenerateFilter.class, io.anuke.mindustry.maps.filters.MedianFilter.class, io.anuke.mindustry.maps.filters.MirrorFilter.class, io.anuke.mindustry.maps.filters.NoiseFilter.class, io.anuke.mindustry.maps.filters.OreFilter.class, io.anuke.mindustry.maps.filters.OreMedianFilter.class, io.anuke.mindustry.maps.filters.RiverNoiseFilter.class, io.anuke.mindustry.maps.filters.ScatterFilter.class, io.anuke.mindustry.maps.filters.TerrainFilter.class, io.anuke.mindustry.maps.generators.BasicGenerator.class, io.anuke.mindustry.maps.generators.Generator.class, io.anuke.mindustry.maps.generators.MapGenerator.class, io.anuke.mindustry.maps.generators.RandomGenerator.class, io.anuke.mindustry.maps.zonegen.DesertWastesGenerator.class, io.anuke.mindustry.maps.zonegen.OvergrowthGenerator.class, io.anuke.mindustry.type.Category.class, io.anuke.mindustry.type.ContentType.class, io.anuke.mindustry.type.Item.class, io.anuke.mindustry.type.ItemStack.class, io.anuke.mindustry.type.ItemType.class, io.anuke.mindustry.type.Liquid.class, io.anuke.mindustry.type.LiquidStack.class, io.anuke.mindustry.type.Mech.class, io.anuke.mindustry.type.Publishable.class, io.anuke.mindustry.type.StatusEffect.class, io.anuke.mindustry.type.TypeID.class, io.anuke.mindustry.type.UnitType.class, io.anuke.mindustry.type.Weapon.class, io.anuke.mindustry.type.WeatherEvent.class, io.anuke.mindustry.type.Zone.class, io.anuke.mindustry.ui.Cicon.class, io.anuke.mindustry.ui.ContentDisplay.class, io.anuke.mindustry.ui.Fonts.class, io.anuke.mindustry.ui.IconSize.class, io.anuke.mindustry.ui.IntFormat.class, io.anuke.mindustry.ui.Links.class, io.anuke.mindustry.ui.Styles.class, io.anuke.mindustry.ui.fragments.BlockConfigFragment.class, io.anuke.mindustry.ui.fragments.BlockInventoryFragment.class, io.anuke.mindustry.ui.fragments.FadeInFragment.class, io.anuke.mindustry.ui.fragments.Fragment.class, io.anuke.mindustry.ui.fragments.HudFragment.class, io.anuke.mindustry.ui.fragments.LoadingFragment.class, io.anuke.mindustry.ui.fragments.MenuFragment.class, io.anuke.mindustry.ui.fragments.OverlayFragment.class, io.anuke.mindustry.ui.fragments.PlacementFragment.class, io.anuke.mindustry.ui.fragments.PlayerListFragment.class, io.anuke.mindustry.ui.layout.BranchTreeLayout.class, io.anuke.mindustry.ui.layout.RadialTreeLayout.class, io.anuke.mindustry.ui.layout.TreeLayout.class, io.anuke.mindustry.world.Block.class, io.anuke.mindustry.world.BlockStorage.class, io.anuke.mindustry.world.Build.class, io.anuke.mindustry.world.CachedTile.class, io.anuke.mindustry.world.DirectionalItemBuffer.class, io.anuke.mindustry.world.Edges.class, io.anuke.mindustry.world.ItemBuffer.class, io.anuke.mindustry.world.LegacyColorMapper.class, io.anuke.mindustry.world.Pos.class, io.anuke.mindustry.world.StaticTree.class, io.anuke.mindustry.world.Tile.class, io.anuke.mindustry.world.WorldContext.class, io.anuke.mindustry.world.blocks.Attributes.class, io.anuke.mindustry.world.blocks.Autotiler.class, io.anuke.mindustry.world.blocks.BlockPart.class, io.anuke.mindustry.world.blocks.BuildBlock.class, io.anuke.mindustry.world.blocks.DoubleOverlayFloor.class, io.anuke.mindustry.world.blocks.Floor.class, io.anuke.mindustry.world.blocks.ItemSelection.class, io.anuke.mindustry.world.blocks.LiquidBlock.class, io.anuke.mindustry.world.blocks.OreBlock.class, io.anuke.mindustry.world.blocks.OverlayFloor.class, io.anuke.mindustry.world.blocks.PowerBlock.class, io.anuke.mindustry.world.blocks.RespawnBlock.class, io.anuke.mindustry.world.blocks.Rock.class, io.anuke.mindustry.world.blocks.StaticWall.class, io.anuke.mindustry.world.blocks.TreeBlock.class, io.anuke.mindustry.world.blocks.defense.DeflectorWall.class, io.anuke.mindustry.world.blocks.defense.Door.class, io.anuke.mindustry.world.blocks.defense.ForceProjector.class, io.anuke.mindustry.world.blocks.defense.MendProjector.class, io.anuke.mindustry.world.blocks.defense.OverdriveProjector.class, io.anuke.mindustry.world.blocks.defense.ShockMine.class, io.anuke.mindustry.world.blocks.defense.SurgeWall.class, io.anuke.mindustry.world.blocks.defense.Wall.class, io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.Turret.class, io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor.class, io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge.class, io.anuke.mindustry.world.blocks.distribution.Conveyor.class, io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge.class, io.anuke.mindustry.world.blocks.distribution.ItemBridge.class, io.anuke.mindustry.world.blocks.distribution.Junction.class, io.anuke.mindustry.world.blocks.distribution.MassDriver.class, io.anuke.mindustry.world.blocks.distribution.OverflowGate.class, io.anuke.mindustry.world.blocks.distribution.Router.class, io.anuke.mindustry.world.blocks.distribution.Sorter.class, io.anuke.mindustry.world.blocks.liquid.ArmoredConduit.class, io.anuke.mindustry.world.blocks.liquid.Conduit.class, io.anuke.mindustry.world.blocks.liquid.LiquidBridge.class, io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge.class, io.anuke.mindustry.world.blocks.liquid.LiquidJunction.class, io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate.class, io.anuke.mindustry.world.blocks.liquid.LiquidRouter.class, io.anuke.mindustry.world.blocks.liquid.LiquidTank.class, io.anuke.mindustry.world.blocks.logic.LogicBlock.class, io.anuke.mindustry.world.blocks.logic.MessageBlock.class, io.anuke.mindustry.world.blocks.power.Battery.class, io.anuke.mindustry.world.blocks.power.BurnerGenerator.class, io.anuke.mindustry.world.blocks.power.ConditionalConsumePower.class, io.anuke.mindustry.world.blocks.power.DecayGenerator.class, io.anuke.mindustry.world.blocks.power.ImpactReactor.class, io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator.class, io.anuke.mindustry.world.blocks.power.LightBlock.class, io.anuke.mindustry.world.blocks.power.NuclearReactor.class, io.anuke.mindustry.world.blocks.power.PowerDiode.class, io.anuke.mindustry.world.blocks.power.PowerDistributor.class, io.anuke.mindustry.world.blocks.power.PowerGenerator.class, io.anuke.mindustry.world.blocks.power.PowerGraph.class, io.anuke.mindustry.world.blocks.power.PowerNode.class, io.anuke.mindustry.world.blocks.power.SingleTypeGenerator.class, io.anuke.mindustry.world.blocks.power.SolarGenerator.class, io.anuke.mindustry.world.blocks.power.ThermalGenerator.class, io.anuke.mindustry.world.blocks.production.Cultivator.class, io.anuke.mindustry.world.blocks.production.Drill.class, io.anuke.mindustry.world.blocks.production.Fracker.class, io.anuke.mindustry.world.blocks.production.GenericCrafter.class, io.anuke.mindustry.world.blocks.production.GenericSmelter.class, io.anuke.mindustry.world.blocks.production.Incinerator.class, io.anuke.mindustry.world.blocks.production.LiquidConverter.class, io.anuke.mindustry.world.blocks.production.Pump.class, io.anuke.mindustry.world.blocks.production.Separator.class, io.anuke.mindustry.world.blocks.production.SolidPump.class, io.anuke.mindustry.world.blocks.sandbox.ItemSource.class, io.anuke.mindustry.world.blocks.sandbox.ItemVoid.class, io.anuke.mindustry.world.blocks.sandbox.LiquidSource.class, io.anuke.mindustry.world.blocks.sandbox.PowerSource.class, io.anuke.mindustry.world.blocks.sandbox.PowerVoid.class, io.anuke.mindustry.world.blocks.storage.CoreBlock.class, io.anuke.mindustry.world.blocks.storage.LaunchPad.class, io.anuke.mindustry.world.blocks.storage.StorageBlock.class, io.anuke.mindustry.world.blocks.storage.Unloader.class, io.anuke.mindustry.world.blocks.storage.Vault.class, io.anuke.mindustry.world.blocks.units.CommandCenter.class, io.anuke.mindustry.world.blocks.units.MechPad.class, io.anuke.mindustry.world.blocks.units.RallyPoint.class, io.anuke.mindustry.world.blocks.units.RepairPoint.class, io.anuke.mindustry.world.blocks.units.UnitFactory.class, io.anuke.mindustry.world.consumers.Consume.class, io.anuke.mindustry.world.consumers.ConsumeItemFilter.class, io.anuke.mindustry.world.consumers.ConsumeItems.class, io.anuke.mindustry.world.consumers.ConsumeLiquid.class, io.anuke.mindustry.world.consumers.ConsumeLiquidBase.class, io.anuke.mindustry.world.consumers.ConsumeLiquidFilter.class, io.anuke.mindustry.world.consumers.ConsumePower.class, io.anuke.mindustry.world.consumers.ConsumeType.class, io.anuke.mindustry.world.consumers.Consumers.class, io.anuke.mindustry.world.meta.Attribute.class, io.anuke.mindustry.world.meta.BlockBars.class, io.anuke.mindustry.world.meta.BlockFlag.class, io.anuke.mindustry.world.meta.BlockGroup.class, io.anuke.mindustry.world.meta.BlockStat.class, io.anuke.mindustry.world.meta.BlockStats.class, io.anuke.mindustry.world.meta.BuildVisibility.class, io.anuke.mindustry.world.meta.PowerType.class, io.anuke.mindustry.world.meta.Producers.class, io.anuke.mindustry.world.meta.StatCategory.class, io.anuke.mindustry.world.meta.StatUnit.class, io.anuke.mindustry.world.meta.StatValue.class, io.anuke.mindustry.world.meta.values.AmmoListValue.class, io.anuke.mindustry.world.meta.values.BooleanValue.class, io.anuke.mindustry.world.meta.values.BoosterListValue.class, io.anuke.mindustry.world.meta.values.ItemFilterValue.class, io.anuke.mindustry.world.meta.values.ItemListValue.class, io.anuke.mindustry.world.meta.values.LiquidFilterValue.class, io.anuke.mindustry.world.meta.values.LiquidValue.class, io.anuke.mindustry.world.meta.values.NumberValue.class, io.anuke.mindustry.world.meta.values.StringValue.class, io.anuke.mindustry.world.modules.BlockModule.class, io.anuke.mindustry.world.modules.ConsumeModule.class, io.anuke.mindustry.world.modules.ItemModule.class, io.anuke.mindustry.world.modules.LiquidModule.class, io.anuke.mindustry.world.modules.PowerModule.class, io.anuke.mindustry.world.producers.Produce.class, io.anuke.mindustry.world.producers.ProduceItem.class); + static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 0107e5072f..c73e1bbd5d 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -30,7 +30,7 @@ import static io.anuke.mindustry.Vars.*; public class Mods implements Loadable{ private Json json = new Json(); - private Scripts scripts = new Scripts(); + private Scripts scripts; private ContentParser parser = new ContentParser(); private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); @@ -373,7 +373,10 @@ public class Mods implements Loadable{ for(FileHandle file : mod.scripts){ try{ - scripts.run(file.readString()); + if(scripts == null){ + scripts = new Scripts(); + } + scripts.run(mod, file); }catch(Throwable e){ Core.app.post(() -> { Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index f55a52571d..de8b8a9564 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,18 +1,40 @@ package io.anuke.mindustry.mod; +import io.anuke.arc.*; import io.anuke.arc.files.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.mod.Mods.*; import org.graalvm.polyglot.*; public class Scripts{ - //TODO allowHostAccess(...) is obviously insecure - private Context context = Context.newBuilder("js").allowHostClassLookup(s -> s.startsWith("io.anuke.mindustry")) - .allowHostAccess(HostAccess.newBuilder().allowPublicAccess(true).denyAccess(FileHandle.class).build()).build(); + private final Context context; + private final String wrapper; public Scripts(){ - context.eval("js", "console.log(\"Initialized JS context.\")"); + Time.mark(); + Context.Builder builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); + + HostAccess.Builder hb = HostAccess.newBuilder(); + for(Class c : ClassAccess.allowedClasses){ + hb.allowImplementations(c); + Structs.each(hb::allowAccess, c.getConstructors()); + Structs.each(hb::allowAccess, c.getFields()); + Structs.each(hb::allowAccess, c.getMethods()); + } + builder.allowHostAccess(hb.build()); + + context = builder.build(); + wrapper = Core.files.internal("scripts/wrapper.js").readString(); + + run(Core.files.internal("scripts/global.js").readString()); + Log.info("Time to load script engine: {0}", Time.elapsed()); } - public void run(String script){ + public void run(LoadedMod mod, FileHandle file){ + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); + } + + private void run(String script){ context.eval("js", script); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java index b0c83fba9d..dc05d1ee58 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -18,11 +18,11 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class Door extends Wall{ - protected final Rectangle rect = new Rectangle(); + protected final static Rectangle rect = new Rectangle(); - protected int timerToggle = timers++; - protected Effect openfx = Fx.dooropen; - protected Effect closefx = Fx.doorclose; + public final int timerToggle = timers++; + public Effect openfx = Fx.dooropen; + public Effect closefx = Fx.doorclose; protected TextureRegion openRegion; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 4dce2d9db9..5b385578d1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -21,17 +21,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ForceProjector extends Block{ - protected int timerUse = timers++; - protected float phaseUseTime = 350f; + public final int timerUse = timers++; + public float phaseUseTime = 350f; - protected float phaseRadiusBoost = 80f; - protected float radius = 101.7f; - protected float breakage = 550f; - protected float cooldownNormal = 1.75f; - protected float cooldownLiquid = 1.5f; - protected float cooldownBrokenBase = 0.35f; - protected float basePowerDraw = 0.2f; - protected TextureRegion topRegion; + public float phaseRadiusBoost = 80f; + public float radius = 101.7f; + public float breakage = 550f; + public float cooldownNormal = 1.75f; + public float cooldownLiquid = 1.5f; + public float cooldownBrokenBase = 0.35f; + public float basePowerDraw = 0.2f; + public TextureRegion topRegion; private static Tile paramTile; private static ForceProjector paramBlock; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 5ba2461265..1d737a4900 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -18,19 +18,18 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MendProjector extends Block{ - private static Color color = Color.valueOf("84f491"); - private static Color phase = Color.valueOf("ffd59e"); - private static IntSet healed = new IntSet(); + private static final IntSet healed = new IntSet(); - protected int timerUse = timers++; - - protected TextureRegion topRegion; - protected float reload = 250f; - protected float range = 60f; - protected float healPercent = 12f; - protected float phaseBoost = 12f; - protected float phaseRangeBoost = 50f; - protected float useTime = 400f; + public final int timerUse = timers++; + public Color baseColor = Color.valueOf("84f491"); + public Color phaseColor = Color.valueOf("ffd59e"); + public TextureRegion topRegion; + public float reload = 250f; + public float range = 60f; + public float healPercent = 12f; + public float phaseBoost = 12f; + public float phaseRangeBoost = 50f; + public float useTime = 400f; public MendProjector(String name){ super(name); @@ -92,7 +91,7 @@ public class MendProjector extends Block{ if(other.getTeamID() == tile.getTeamID() && !healed.contains(other.pos()) && other.entity != null && other.entity.health < other.entity.maxHealth()){ other.entity.healBy(other.entity.maxHealth() * (healPercent + entity.phaseHeat * phaseBoost) / 100f * entity.efficiency()); - Effects.effect(Fx.healBlockFull, Tmp.c1.set(color).lerp(phase, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); + Effects.effect(Fx.healBlockFull, Tmp.c1.set(baseColor).lerp(phaseColor, entity.phaseHeat), other.drawx(), other.drawy(), other.block().size); healed.add(other.pos()); } } @@ -110,7 +109,7 @@ public class MendProjector extends Block{ MendEntity entity = tile.entity(); float realRange = range + entity.phaseHeat * phaseRangeBoost; - Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, color); + Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); } @Override @@ -120,7 +119,7 @@ public class MendProjector extends Block{ MendEntity entity = tile.entity(); float f = 1f - (Time.time() / 100f) % 1f; - Draw.color(color, phase, entity.phaseHeat); + Draw.color(baseColor, phaseColor, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); //Draw.blend(Blending.additive); Draw.rect(topRegion, tile.drawx(), tile.drawy()); @@ -135,7 +134,7 @@ public class MendProjector extends Block{ @Override public void drawLight(Tile tile){ - renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), baseColor, 0.7f * tile.entity.efficiency()); } class MendEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index cc8c99a54e..f1708354b5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -16,19 +16,19 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class OverdriveProjector extends Block{ - private static Color color = Color.valueOf("feb380"); - private static Color phase = Color.valueOf("ffd59e"); - private static IntSet healed = new IntSet(); + private static final IntSet healed = new IntSet(); - protected int timerUse = timers++; + public final int timerUse = timers++; - protected TextureRegion topRegion; - protected float reload = 60f; - protected float range = 80f; - protected float speedBoost = 1.5f; - protected float speedBoostPhase = 0.75f; - protected float useTime = 400f; - protected float phaseRangeBoost = 20f; + public TextureRegion topRegion; + public float reload = 60f; + public float range = 80f; + public float speedBoost = 1.5f; + public float speedBoostPhase = 0.75f; + public float useTime = 400f; + public float phaseRangeBoost = 20f; + public Color baseColor = Color.valueOf("feb380"); + public Color phaseColor = Color.valueOf("ffd59e"); public OverdriveProjector(String name){ super(name); @@ -69,7 +69,7 @@ public class OverdriveProjector extends Block{ @Override public void drawLight(Tile tile){ - renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), color, 0.7f * tile.entity.efficiency()); + renderer.lights.add(tile.drawx(), tile.drawy(), 50f * tile.entity.efficiency(), baseColor, 0.7f * tile.entity.efficiency()); } @Override @@ -118,7 +118,7 @@ public class OverdriveProjector extends Block{ OverdriveEntity entity = tile.entity(); float realRange = range + entity.phaseHeat * phaseRangeBoost; - Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, color); + Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); } @Override @@ -128,7 +128,7 @@ public class OverdriveProjector extends Block{ OverdriveEntity entity = tile.entity(); float f = 1f - (Time.time() / 100f) % 1f; - Draw.color(color, phase, entity.phaseHeat); + Draw.color(baseColor, phaseColor, entity.phaseHeat); Draw.alpha(entity.heat * Mathf.absin(Time.time(), 10f, 1f) * 0.5f); Draw.rect(topRegion, tile.drawx(), tile.drawy()); Draw.alpha(1f); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java index e834812f5a..de72043c7d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ShockMine.java @@ -11,13 +11,13 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class ShockMine extends Block{ - protected int timerDamage = timers++; + public final int timerDamage = timers++; - protected float cooldown = 80f; - protected float tileDamage = 5f; - protected float damage = 13; - protected int length = 10; - protected int tendrils = 6; + public float cooldown = 80f; + public float tileDamage = 5f; + public float damage = 13; + public int length = 10; + public int tendrils = 6; public ShockMine(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java index 0f51c74b40..a1c52ac823 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/SurgeWall.java @@ -7,9 +7,9 @@ import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.graphics.Pal; public class SurgeWall extends Wall{ - protected float lightningChance = 0.05f; - protected float lightningDamage = 15f; - protected int lightningLength = 17; + public float lightningChance = 0.05f; + public float lightningDamage = 15f; + public int lightningLength = 17; public SurgeWall(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java index 70d6b6f91f..8b60ffd0f2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Wall.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockGroup; public class Wall extends Block{ - protected int variants = 0; + public int variants = 0; public Wall(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java index 53ba8cbad4..f7095474c8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java @@ -13,7 +13,7 @@ import static io.anuke.mindustry.Vars.tilesize; * Artillery turrets have special shooting calculations done to hit targets. */ public class ArtilleryTurret extends ItemTurret{ - protected float velocityInaccuracy = 0f; + public float velocityInaccuracy = 0f; public ArtilleryTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java index d746227559..66775fb14e 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java @@ -8,7 +8,7 @@ import io.anuke.mindustry.world.Tile; import static io.anuke.mindustry.Vars.tilesize; public class BurstTurret extends ItemTurret{ - protected float burstSpacing = 5; + public float burstSpacing = 5; public BurstTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java index 3f02328eed..e6aac80ea9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -12,11 +12,11 @@ import static io.anuke.mindustry.Vars.tilesize; public class ChargeTurret extends PowerTurret{ - protected float chargeTime = 30f; - protected int chargeEffects = 5; - protected float chargeMaxDelay = 10f; - protected Effect chargeEffect = Fx.none; - protected Effect chargeBeginEffect = Fx.none; + public float chargeTime = 30f; + public int chargeEffects = 5; + public float chargeMaxDelay = 10f; + public Effect chargeEffect = Fx.none; + public Effect chargeBeginEffect = Fx.none; public ChargeTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 58038d857e..03c35de0d0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -17,8 +17,8 @@ import static io.anuke.mindustry.Vars.tilesize; public class CooledTurret extends Turret{ /** How much reload is lowered by for each unit of liquid of heat capacity. */ - protected float coolantMultiplier = 5f; - protected Effect coolEffect = Fx.fuelburn; + public float coolantMultiplier = 5f; + public Effect coolEffect = Fx.fuelburn; public CooledTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java index 2067bd285a..813280bb2f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.meta.StatUnit; import static io.anuke.mindustry.Vars.tilesize; public class DoubleTurret extends ItemTurret{ - protected float shotWidth = 2f; + public float shotWidth = 2f; public DoubleTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index dca1324e66..ea670a37e5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -22,8 +22,8 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ItemTurret extends CooledTurret{ - protected int maxAmmo = 30; - protected ObjectMap ammo = new ObjectMap<>(); + public int maxAmmo = 30; + public ObjectMap ammo = new ObjectMap<>(); public ItemTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 2766e79724..74e8490928 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -14,8 +14,8 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.tilesize; public class LaserTurret extends PowerTurret{ - protected float firingMoveFract = 0.25f; - protected float shootDuration = 100f; + public float firingMoveFract = 0.25f; + public float shootDuration = 100f; public LaserTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 28a33aa82a..83b9a75d8b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -15,7 +15,7 @@ import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; public class LiquidTurret extends Turret{ - protected ObjectMap ammo = new ObjectMap<>(); + public ObjectMap ammo = new ObjectMap<>(); public LiquidTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java index 7e4c54ace4..1eab2079a8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -7,8 +7,8 @@ import io.anuke.mindustry.world.meta.BlockStat; import io.anuke.mindustry.world.meta.StatUnit; public class PowerTurret extends CooledTurret{ - protected @NonNull BulletType shootType; - protected float powerUse = 1f; + public @NonNull BulletType shootType; + public float powerUse = 1f; public PowerTurret(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 05edbe5091..9f2cfa9ed6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -28,40 +28,39 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.tilesize; public abstract class Turret extends Block{ - protected static final int targetInterval = 20; + public final int timerTarget = timers++; + public int targetInterval = 20; - protected final int timerTarget = timers++; + public Color heatColor = Pal.turretHeat; + public Effect shootEffect = Fx.none; + public Effect smokeEffect = Fx.none; + public Effect ammoUseEffect = Fx.none; + public Sound shootSound = Sounds.shoot; - protected Color heatColor = Pal.turretHeat; - protected Effect shootEffect = Fx.none; - protected Effect smokeEffect = Fx.none; - protected Effect ammoUseEffect = Fx.none; - protected Sound shootSound = Sounds.shoot; - - protected int ammoPerShot = 1; - protected float ammoEjectBack = 1f; - protected float range = 50f; - protected float reload = 10f; - protected float inaccuracy = 0f; - protected int shots = 1; - protected float spread = 4f; - protected float recoil = 1f; - protected float restitution = 0.02f; - protected float cooldown = 0.02f; - protected float rotatespeed = 5f; //in degrees per tick - protected float shootCone = 8f; - protected float shootShake = 0f; - protected float xRand = 0f; - protected boolean targetAir = true; - protected boolean targetGround = true; + public int ammoPerShot = 1; + public float ammoEjectBack = 1f; + public float range = 50f; + public float reload = 10f; + public float inaccuracy = 0f; + public int shots = 1; + public float spread = 4f; + public float recoil = 1f; + public float restitution = 0.02f; + public float cooldown = 0.02f; + public float rotatespeed = 5f; //in degrees per tick + public float shootCone = 8f; + public float shootShake = 0f; + public float xRand = 0f; + public boolean targetAir = true; + public boolean targetGround = true; protected Vector2 tr = new Vector2(); protected Vector2 tr2 = new Vector2(); - protected TextureRegion baseRegion, heatRegion; + public TextureRegion baseRegion, heatRegion; - protected Cons2 drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); - protected Cons2 heatDrawer = (tile, entity) -> { + public Cons2 drawer = (tile, entity) -> Draw.rect(region, tile.drawx() + tr2.x, tile.drawy() + tr2.y, entity.rotation - 90); + public Cons2 heatDrawer = (tile, entity) -> { if(entity.heat <= 0.00001f) return; Draw.color(heatColor, entity.heat); Draw.blend(Blending.additive); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java index 4fc815676d..cb684c90f3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -7,10 +7,10 @@ import io.anuke.mindustry.world.*; import java.io.*; public class BufferedItemBridge extends ExtendingItemBridge{ - protected int timerAccept = timers++; + public final int timerAccept = timers++; - protected float speed = 40f; - protected int bufferCapacity = 50; + public float speed = 40f; + public int bufferCapacity = 50; public BufferedItemBridge(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index e05812d523..f046a63850 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -32,7 +32,7 @@ public class Conveyor extends Block implements Autotiler{ private final Vector2 tr2 = new Vector2(); private TextureRegion[][] regions = new TextureRegion[7][4]; - protected float speed = 0f; + public float speed = 0f; protected Conveyor(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 0d692a504d..8965a1be97 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -20,12 +20,12 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ItemBridge extends Block{ - protected int timerTransport = timers++; - protected int range; - protected float transportTime = 2f; - protected TextureRegion endRegion, bridgeRegion, arrowRegion; - protected BuildRequest otherReq; + public final int timerTransport = timers++; + public int range; + public float transportTime = 2f; + public TextureRegion endRegion, bridgeRegion, arrowRegion; + private static BuildRequest otherReq; private static int lastPlaced = Pos.invalid; public ItemBridge(String name){ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 7877317185..8fe62c1a05 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -17,8 +17,8 @@ import java.io.IOException; import static io.anuke.mindustry.Vars.content; public class Junction extends Block{ - protected float speed = 26; //frames taken to go through this junction - protected int capacity = 6; + public float speed = 26; //frames taken to go through this junction + public int capacity = 6; public Junction(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index c4a1aba990..f6799d7dc7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -20,17 +20,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class MassDriver extends Block{ - protected float range; - protected float rotateSpeed = 0.04f; - protected float translation = 7f; - protected int minDistribute = 10; - protected float knockback = 4f; - protected float reloadTime = 100f; - protected Effect shootEffect = Fx.shootBig2; - protected Effect smokeEffect = Fx.shootBigSmoke2; - protected Effect recieveEffect = Fx.mineBig; - protected float shake = 3f; - protected TextureRegion baseRegion; + public float range; + public float rotateSpeed = 0.04f; + public float translation = 7f; + public int minDistribute = 10; + public float knockback = 4f; + public float reloadTime = 100f; + public Effect shootEffect = Fx.shootBig2; + public Effect smokeEffect = Fx.shootBigSmoke2; + public Effect recieveEffect = Fx.mineBig; + public float shake = 3f; + public TextureRegion baseRegion; public MassDriver(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java index b25635e005..a510bae97c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -10,7 +10,7 @@ import io.anuke.mindustry.world.meta.BlockGroup; import java.io.*; public class OverflowGate extends Block{ - protected float speed = 1f; + public float speed = 1f; public OverflowGate(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java index fdff392743..c8e9fb441d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.BlockGroup; public class Router extends Block{ - protected float speed = 8f; + public float speed = 8f; public Router(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 13eb1224e8..60c88e77b1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -18,7 +18,7 @@ import static io.anuke.mindustry.Vars.content; public class Sorter extends Block{ private static Item lastItem; - protected boolean invert; + public boolean invert; public Sorter(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java index 7a50ef5f0a..d74087123c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.Edges; import io.anuke.mindustry.world.Tile; public class ArmoredConduit extends Conduit{ - protected TextureRegion capRegion; + public TextureRegion capRegion; public ArmoredConduit(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java index 80c2ab5baf..e68b58e48d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java @@ -16,12 +16,12 @@ import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.modules.*; public class Conduit extends LiquidBlock implements Autotiler{ - protected final int timerFlow = timers++; + public final int timerFlow = timers++; - protected TextureRegion[] topRegions = new TextureRegion[7]; - protected TextureRegion[] botRegions = new TextureRegion[7]; + public TextureRegion[] topRegions = new TextureRegion[7]; + public TextureRegion[] botRegions = new TextureRegion[7]; - protected float leakResistance = 1.5f; + public float leakResistance = 1.5f; public Conduit(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java index dafcef1508..3004835249 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidOverflowGate.java @@ -9,7 +9,7 @@ import io.anuke.mindustry.world.meta.*; //TODO implement later public class LiquidOverflowGate extends LiquidBlock{ - int topRegion; + public int topRegion; public LiquidOverflowGate(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index e1945f1609..77e2cf2ad2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -19,17 +19,17 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class ImpactReactor extends PowerGenerator{ - protected int timerUse = timers++; + public final int timerUse = timers++; - protected int plasmas = 4; - protected float warmupSpeed = 0.001f; - protected float itemDuration = 60f; - protected int explosionRadius = 50; - protected int explosionDamage = 2000; + public int plasmas = 4; + public float warmupSpeed = 0.001f; + public float itemDuration = 60f; + public int explosionRadius = 50; + public int explosionDamage = 2000; - protected Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); - protected int bottomRegion; - protected int[] plasmaRegions; + public Color plasma1 = Color.valueOf("ffd06b"), plasma2 = Color.valueOf("ff361b"); + public int bottomRegion; + public int[] plasmaRegions; public ImpactReactor(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 07effa5b30..7d4b378b2a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -20,20 +20,20 @@ import static io.anuke.mindustry.Vars.*; * Liquids will take priority over items. */ public class ItemLiquidGenerator extends PowerGenerator{ - protected float minItemEfficiency = 0.2f; + public float minItemEfficiency = 0.2f; /** The time in number of ticks during which a single item will produce power. */ - protected float itemDuration = 70f; + public float itemDuration = 70f; - protected float minLiquidEfficiency = 0.2f; + public float minLiquidEfficiency = 0.2f; /** Maximum liquid used per frame. */ - protected float maxLiquidGenerate = 0.4f; + public float maxLiquidGenerate = 0.4f; - protected Effect generateEffect = Fx.generatespark; - protected Effect explodeEffect = Fx.generatespark; - protected Color heatColor = Color.valueOf("ff9b59"); - protected TextureRegion topRegion, liquidRegion; - protected boolean randomlyExplode = true; - protected boolean defaults = false; + public Effect generateEffect = Fx.generatespark; + public Effect explodeEffect = Fx.generatespark; + public Color heatColor = Color.valueOf("ff9b59"); + public TextureRegion topRegion, liquidRegion; + public boolean randomlyExplode = true; + public boolean defaults = false; public ItemLiquidGenerator(boolean hasItems, boolean hasLiquids, String name){ this(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java index 0fc61676f2..06e1b257cb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java @@ -16,9 +16,9 @@ import static io.anuke.mindustry.Vars.*; public class LightBlock extends Block{ private static int lastColor = 0; - protected float brightness = 0.9f; - protected float radius = 200f; - protected int topRegion; + public float brightness = 0.9f; + public float radius = 200f; + public int topRegion; public LightBlock(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 2aa478a3bf..7ae1e4ca70 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -22,22 +22,22 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class NuclearReactor extends PowerGenerator{ - protected final int timerFuel = timers++; + public final int timerFuel = timers++; - protected final Vector2 tr = new Vector2(); + public final Vector2 tr = new Vector2(); - protected Color lightColor = Color.valueOf("7f19ea"); - protected Color coolColor = new Color(1, 1, 1, 0f); - protected Color hotColor = Color.valueOf("ff9575a3"); - protected float itemDuration = 120; //time to consume 1 fuel - protected float heating = 0.01f; //heating per frame * fullness - protected float smokeThreshold = 0.3f; //threshold at which block starts smoking - protected int explosionRadius = 40; - protected int explosionDamage = 1350; - protected float flashThreshold = 0.46f; //heat threshold at which the lights start flashing - protected float coolantPower = 0.5f; + public Color lightColor = Color.valueOf("7f19ea"); + public Color coolColor = new Color(1, 1, 1, 0f); + public Color hotColor = Color.valueOf("ff9575a3"); + public float itemDuration = 120; //time to consume 1 fuel + public float heating = 0.01f; //heating per frame * fullness + public float smokeThreshold = 0.3f; //threshold at which block starts smoking + public int explosionRadius = 40; + public int explosionDamage = 1350; + public float flashThreshold = 0.46f; //heat threshold at which the lights start flashing + public float coolantPower = 0.5f; - protected TextureRegion topRegion, lightsRegion; + public TextureRegion topRegion, lightsRegion; public NuclearReactor(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java index 08d621a09c..1dee0636a5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerDiode.java @@ -13,7 +13,7 @@ import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.mindustry.entities.traits.BuilderTrait; public class PowerDiode extends Block{ - protected TextureRegion arrow; + public TextureRegion arrow; public PowerDiode(String name){ super(name); @@ -50,7 +50,7 @@ public class PowerDiode extends Block{ } // battery % of the graph on either side, defaults to zero - protected float bar(Tile tile){ + public float bar(Tile tile){ return (tile != null && tile.block().hasPower) ? tile.entity.power.graph.getBatteryStored() / tile.entity.power.graph.getTotalBatteryCapacity() : 0f; } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index 9f0f21f008..04d3d99a7c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -13,7 +13,7 @@ import java.io.*; public class PowerGenerator extends PowerDistributor{ /** The amount of power produced per tick in case of an efficiency of 1.0, which represents 100%. */ - protected float powerProduction; + public float powerProduction; public BlockStat generationType = BlockStat.basePowerGeneration; public PowerGenerator(String name){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 8c3002c417..fa4d04dfb0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -21,12 +21,12 @@ import static io.anuke.mindustry.Vars.*; public class PowerNode extends PowerBlock{ protected static boolean returnValue = false; - protected ObjectSet graphs = new ObjectSet<>(); - protected Vector2 t1 = new Vector2(), t2 = new Vector2(); - protected TextureRegion laser, laserEnd; + protected final ObjectSet graphs = new ObjectSet<>(); + protected final Vector2 t1 = new Vector2(), t2 = new Vector2(); - protected float laserRange = 6; - protected int maxNodes = 3; + public TextureRegion laser, laserEnd; + public float laserRange = 6; + public int maxNodes = 3; public PowerNode(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java index b2d9576718..5bb3cce8d7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -12,7 +12,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.renderer; public class ThermalGenerator extends PowerGenerator{ - protected Effect generateEffect = Fx.none; + public Effect generateEffect = Fx.none; public ThermalGenerator(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index c3901d435c..4cf0a6b2f1 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -16,14 +16,14 @@ import io.anuke.mindustry.world.meta.Attribute; import java.io.*; public class Cultivator extends GenericCrafter{ - protected static final Color plantColor = Color.valueOf("5541b1"); - protected static final Color plantColorLight = Color.valueOf("7457ce"); - protected static final Color bottomColor = Color.valueOf("474747"); + public Color plantColor = Color.valueOf("5541b1"); + public Color plantColorLight = Color.valueOf("7457ce"); + public Color bottomColor = Color.valueOf("474747"); - protected TextureRegion middleRegion, topRegion; - protected RandomXS128 random = new RandomXS128(0); - protected float recurrence = 6f; - protected Attribute attribute = Attribute.spores; + public TextureRegion middleRegion, topRegion; + public RandomXS128 random = new RandomXS128(0); + public float recurrence = 6f; + public Attribute attribute = Attribute.spores; public Cultivator(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 309761830b..c4ee18715a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -21,41 +21,40 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; public class Drill extends Block{ - protected final static float hardnessDrillMultiplier = 50f; + public float hardnessDrillMultiplier = 50f; protected final ObjectIntMap oreCount = new ObjectIntMap<>(); protected final Array itemArray = new Array<>(); /** Maximum tier of blocks this drill can mine. */ - protected int tier; + public int tier; /** Base time to drill one ore, in frames. */ - protected float drillTime = 300; + public float drillTime = 300; /** How many times faster the drill will progress when boosted by liquid. */ - protected float liquidBoostIntensity = 1.6f; + public float liquidBoostIntensity = 1.6f; /** Speed at which the drill speeds up. */ - protected float warmupSpeed = 0.02f; + public float warmupSpeed = 0.02f; //return variables for countOre protected Item returnItem; protected int returnCount; /** Whether to draw the item this drill is mining. */ - protected boolean drawMineItem = false; + public boolean drawMineItem = false; /** Effect played when an item is produced. This is colored. */ - protected Effect drillEffect = Fx.mine; + public Effect drillEffect = Fx.mine; /** Speed the drill bit rotates at. */ - protected float rotateSpeed = 2f; + public float rotateSpeed = 2f; /** Effect randomly played while drilling. */ - protected Effect updateEffect = Fx.pulverizeSmall; + public Effect updateEffect = Fx.pulverizeSmall; /** Chance the update effect will appear. */ - protected float updateEffectChance = 0.02f; + public float updateEffectChance = 0.02f; - protected boolean drawRim = false; - - protected Color heatColor = Color.valueOf("ff5512"); - protected TextureRegion rimRegion; - protected TextureRegion rotatorRegion; - protected TextureRegion topRegion; + public boolean drawRim = false; + public Color heatColor = Color.valueOf("ff5512"); + public TextureRegion rimRegion; + public TextureRegion rotatorRegion; + public TextureRegion topRegion; public Drill(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index deb606eedd..4f79a420b5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -6,11 +6,11 @@ import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; public class Fracker extends SolidPump{ - protected final float itemUseTime = 100f; + public float itemUseTime = 100f; - protected TextureRegion liquidRegion; - protected TextureRegion rotatorRegion; - protected TextureRegion topRegion; + public TextureRegion liquidRegion; + public TextureRegion rotatorRegion; + public TextureRegion topRegion; public Fracker(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 1878ada116..7c19426838 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -17,16 +17,16 @@ import io.anuke.mindustry.world.meta.*; import java.io.*; public class GenericCrafter extends Block{ - protected ItemStack outputItem; - protected LiquidStack outputLiquid; + public ItemStack outputItem; + public LiquidStack outputLiquid; - protected float craftTime = 80; - protected Effect craftEffect = Fx.none; - protected Effect updateEffect = Fx.none; - protected float updateEffectChance = 0.04f; + public float craftTime = 80; + public Effect craftEffect = Fx.none; + public Effect updateEffect = Fx.none; + public float updateEffectChance = 0.04f; - protected Cons drawer = null; - protected Prov drawIcons = null; + public Cons drawer = null; + public Prov drawIcons = null; public GenericCrafter(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java index 828decc1e0..ba0c20bb75 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java @@ -11,8 +11,8 @@ import static io.anuke.mindustry.Vars.renderer; /** A GenericCrafter with a new glowing region drawn on top. */ public class GenericSmelter extends GenericCrafter{ - protected Color flameColor = Color.valueOf("ffc999"); - protected TextureRegion topRegion; + public Color flameColor = Color.valueOf("ffc999"); + public TextureRegion topRegion; public GenericSmelter(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java index fce368f246..57c00e5a2c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -15,8 +15,8 @@ import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; public class Incinerator extends Block{ - protected Effect effect = Fx.fuelburn; - protected Color flameColor = Color.valueOf("ffad9d"); + public Effect effect = Fx.fuelburn; + public Color flameColor = Color.valueOf("ffad9d"); public Incinerator(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java index 9b91d8b98f..9142cc49af 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Pump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Pump.java @@ -19,7 +19,7 @@ public class Pump extends LiquidBlock{ protected final Array drawTiles = new Array<>(); protected final Array updateTiles = new Array<>(); - protected final int timerContentCheck = timers++; + public final int timerContentCheck = timers++; /** Pump amount, total. */ protected float pumpAmount = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index bb6cb397cf..6a3e5d806c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -20,12 +20,12 @@ import io.anuke.mindustry.world.meta.BlockStat; * Pump that makes liquid from solids and takes in power. Only works on solid floor blocks. */ public class SolidPump extends Pump{ - protected Liquid result = Liquids.water; - protected Effect updateEffect = Fx.none; - protected float updateEffectChance = 0.02f; - protected float rotateSpeed = 1f; + public Liquid result = Liquids.water; + public Effect updateEffect = Fx.none; + public float updateEffectChance = 0.02f; + public float rotateSpeed = 1f; /** Attribute that is checked when calculating output. */ - protected Attribute attribute; + public Attribute attribute; public SolidPump(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java index 5513f462ec..ec3f325db2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -21,7 +21,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class LiquidSource extends Block{ - private static Liquid lastLiquid; + public static Liquid lastLiquid; public LiquidSource(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index c164e7011e..3ee36c332b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -24,7 +24,7 @@ import io.anuke.mindustry.world.modules.*; import static io.anuke.mindustry.Vars.*; public class CoreBlock extends StorageBlock{ - protected Mech mech = Mechs.starter; + public Mech mech = Mechs.starter; public CoreBlock(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java index 47973a9a8b..92aa7ae75c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/LaunchPad.java @@ -21,9 +21,9 @@ import static io.anuke.mindustry.Vars.data; import static io.anuke.mindustry.Vars.world; public class LaunchPad extends StorageBlock{ - protected final int timerLaunch = timers++; + public final int timerLaunch = timers++; /** Time inbetween launches. */ - protected float launchTime; + public float launchTime; public LaunchPad(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index f67701d4d5..b809fc351c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -15,8 +15,8 @@ import java.io.*; import static io.anuke.mindustry.Vars.content; public class Unloader extends Block{ - protected float speed = 1f; - protected final int timerUnload = timers++; + public float speed = 1f; + public final int timerUnload = timers++; private static Item lastItem; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index ef7314e00b..c5a07cdead 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -26,7 +26,7 @@ import static io.anuke.mindustry.Vars.*; public class MechPad extends Block{ public @NonNull Mech mech; - protected float buildTime = 60 * 5; + public float buildTime = 60 * 5; public MechPad(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index 6c5e8698b2..e02381d73d 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -19,13 +19,13 @@ import io.anuke.mindustry.world.meta.BlockFlag; public class RepairPoint extends Block{ private static Rectangle rect = new Rectangle(); - protected int timerTarget = timers++; + public int timerTarget = timers++; - protected float repairRadius = 50f; - protected float repairSpeed = 0.3f; - protected float powerUse; - protected TextureRegion baseRegion; - protected TextureRegion laser, laserEnd; + public float repairRadius = 50f; + public float repairSpeed = 0.3f; + public float powerUse; + public TextureRegion baseRegion; + public TextureRegion laser, laserEnd; public RepairPoint(String name){ super(name); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 678d43c10f..93e19b7266 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -27,12 +27,12 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public class UnitFactory extends Block{ - protected UnitType unitType; - protected float produceTime = 1000f; - protected float launchVelocity = 0f; - protected TextureRegion topRegion; - protected int maxSpawn = 4; - protected int[] capacities; + public UnitType unitType; + public float produceTime = 1000f; + public float launchVelocity = 0f; + public TextureRegion topRegion; + public int maxSpawn = 4; + public int[] capacities; public UnitFactory(String name){ super(name); diff --git a/tools/build.gradle b/tools/build.gradle index dff7745f5d..6a2825747a 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -297,7 +297,7 @@ task pack(dependsOn: classes){ //run generation task; generate all needed sprites file(genFolder).mkdirs() javaexec{ - main = "io.anuke.mindustry.ImagePacker" + main = "io.anuke.mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = genFolder @@ -310,7 +310,7 @@ task pack(dependsOn: classes){ } jvmArgs("-Djava.awt.headless=true") - main = "io.anuke.mindustry.Upscaler" + main = "io.anuke.mindustry.tools.Upscaler" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets-raw/sprites_out/ui/icons" @@ -351,7 +351,7 @@ task pack(dependsOn: classes){ task genSprites(dependsOn: classes, type: JavaExec){ finalizedBy 'antialiasGen' - main = "io.anuke.mindustry.ImagePacker" + main = "io.anuke.mindustry.tools.ImagePacker" classpath = sourceSets.main.runtimeClasspath jvmArgs("-Djava.awt.headless=true") standardInput = System.in @@ -361,7 +361,7 @@ task genSprites(dependsOn: classes, type: JavaExec){ task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() - main = "io.anuke.mindustry.BundleLauncher" + main = "io.anuke.mindustry.tools.BundleLauncher" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets/bundles/" diff --git a/tools/src/io/anuke/mindustry/BundleLauncher.java b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java similarity index 98% rename from tools/src/io/anuke/mindustry/BundleLauncher.java rename to tools/src/io/anuke/mindustry/tools/BundleLauncher.java index 3888f641da..7d99eadac2 100644 --- a/tools/src/io/anuke/mindustry/BundleLauncher.java +++ b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.OrderedMap; diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/tools/Generators.java similarity index 99% rename from tools/src/io/anuke/mindustry/Generators.java rename to tools/src/io/anuke/mindustry/tools/Generators.java index 718f994376..91887f0383 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/tools/Generators.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -6,7 +6,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.arc.util.noise.*; -import io.anuke.mindustry.ImagePacker.*; +import io.anuke.mindustry.tools.ImagePacker.*; import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; diff --git a/tools/src/io/anuke/mindustry/Image.java b/tools/src/io/anuke/mindustry/tools/Image.java similarity index 97% rename from tools/src/io/anuke/mindustry/Image.java rename to tools/src/io/anuke/mindustry/tools/Image.java index 30e06b8170..f7c987762b 100644 --- a/tools/src/io/anuke/mindustry/Image.java +++ b/tools/src/io/anuke/mindustry/tools/Image.java @@ -1,9 +1,9 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.util.Structs; -import io.anuke.mindustry.ImagePacker.GenRegion; +import io.anuke.mindustry.tools.ImagePacker.GenRegion; import javax.imageio.ImageIO; import java.awt.*; diff --git a/tools/src/io/anuke/mindustry/ImagePacker.java b/tools/src/io/anuke/mindustry/tools/ImagePacker.java similarity index 98% rename from tools/src/io/anuke/mindustry/ImagePacker.java rename to tools/src/io/anuke/mindustry/tools/ImagePacker.java index 200da5c602..7e4ff467a4 100644 --- a/tools/src/io/anuke/mindustry/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/tools/ImagePacker.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.Core; import io.anuke.arc.collection.ObjectMap; @@ -7,6 +7,7 @@ import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; import io.anuke.arc.util.*; import io.anuke.arc.util.Log.LogHandler; import io.anuke.arc.util.Log.NoopLogHandler; +import io.anuke.mindustry.*; import io.anuke.mindustry.core.ContentLoader; import javax.imageio.ImageIO; diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java new file mode 100644 index 0000000000..0543108297 --- /dev/null +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -0,0 +1,60 @@ +package io.anuke.mindustry.tools; + +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.util.*; +import org.reflections.*; +import org.reflections.scanners.*; +import org.reflections.util.*; + +import java.util.*; + +public class ScriptStubGenerator{ + + public static void main(String[] args){ + String base = "io.anuke.mindustry"; + Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); + Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer"); + Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class); + + String fileTemplate = "package io.anuke.mindustry.mod;\n" + + "\n" + + "import io.anuke.arc.collection.*;\n" + + "//obviously autogenerated, do not touch\n" + + "class ClassAccess{\n" + + "\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + + "\tstatic final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + + "}"; + + List classLoadersList = new LinkedList<>(); + classLoadersList.add(ClasspathHelper.contextClassLoader()); + classLoadersList.add(ClasspathHelper.staticClassLoader()); + + Reflections reflections = new Reflections(new ConfigurationBuilder() + .setScanners(new SubTypesScanner(false), new ResourcesScanner()) + .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) + .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("io.anuke.mindustry")))); + + Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); + classes.addAll(reflections.getSubTypesOf(Enum.class)); + classes.addAll(whitelist); + classes.sort(Structs.comparing(Class::getName)); + + classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.isMemberClass() || type.getCanonicalName() == null + || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); + + StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); + for(Class type : classes){ + result.append("const ").append(type.getSimpleName()).append(" = ").append("Java.type('").append(type.getCanonicalName()).append("')\n"); + } + + //Log.info(result); + + new FileHandle("core/assets/scripts/global.js").writeString(result.toString()); + new FileHandle("core/src/io/anuke/mindustry/mod/ClassAccess.java").writeString(fileTemplate + .replace("$ALLOWED_CLASSES$", classes.toString(", ", type -> type.getName() + ".class")) + .replace("$ALLOWED_CLASS_NAMES$", classes.toString(", ", type -> "\"" + type.getName() + "\""))); + } +} diff --git a/tools/src/io/anuke/mindustry/SquareMarcher.java b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java similarity index 99% rename from tools/src/io/anuke/mindustry/SquareMarcher.java rename to tools/src/io/anuke/mindustry/tools/SquareMarcher.java index 278f9543aa..c795637e25 100644 --- a/tools/src/io/anuke/mindustry/SquareMarcher.java +++ b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.Core; import io.anuke.arc.files.FileHandle; diff --git a/tools/src/io/anuke/mindustry/Upscaler.java b/tools/src/io/anuke/mindustry/tools/Upscaler.java similarity index 97% rename from tools/src/io/anuke/mindustry/Upscaler.java rename to tools/src/io/anuke/mindustry/tools/Upscaler.java index 12cc32ee3b..5101552ddb 100644 --- a/tools/src/io/anuke/mindustry/Upscaler.java +++ b/tools/src/io/anuke/mindustry/tools/Upscaler.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry; +package io.anuke.mindustry.tools; import io.anuke.arc.*; import io.anuke.arc.backends.sdl.*; From 3abcdf2063c979dad68e2591095dbcc487f436a2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Nov 2019 17:45:02 -0500 Subject: [PATCH 009/107] Better access --- core/assets/scripts/base.js | 1 + core/assets/scripts/global.js | 3 +++ core/src/io/anuke/mindustry/mod/ClassAccess.java | 1 - core/src/io/anuke/mindustry/mod/Scripts.java | 11 ++++++----- .../io/anuke/mindustry/tools/ScriptStubGenerator.java | 4 +++- 5 files changed, 13 insertions(+), 7 deletions(-) create mode 100755 core/assets/scripts/base.js diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js new file mode 100755 index 0000000000..1213c82bf4 --- /dev/null +++ b/core/assets/scripts/base.js @@ -0,0 +1 @@ +const extend = Java.extend diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index ccca49d2c0..77c453a135 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -358,3 +358,6 @@ const LiquidModule = Java.type('io.anuke.mindustry.world.modules.LiquidModule') const PowerModule = Java.type('io.anuke.mindustry.world.modules.PowerModule') const Produce = Java.type('io.anuke.mindustry.world.producers.Produce') const ProduceItem = Java.type('io.anuke.mindustry.world.producers.ProduceItem') + +const extend = Java.extend + diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 29c895c646..0735c24f40 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,6 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch class ClassAccess{ - static final Array> allowedClasses = Array.with(io.anuke.arc.Core.class, io.anuke.arc.graphics.g2d.Draw.class, io.anuke.arc.graphics.g2d.TextureAtlas.class, io.anuke.arc.graphics.g2d.TextureRegion.class, io.anuke.mindustry.Vars.class, io.anuke.mindustry.ai.BlockIndexer.class, io.anuke.mindustry.ai.Pathfinder.class, io.anuke.mindustry.ai.WaveSpawner.class, io.anuke.mindustry.content.Blocks.class, io.anuke.mindustry.content.Bullets.class, io.anuke.mindustry.content.Fx.class, io.anuke.mindustry.content.Items.class, io.anuke.mindustry.content.Liquids.class, io.anuke.mindustry.content.Loadouts.class, io.anuke.mindustry.content.Mechs.class, io.anuke.mindustry.content.StatusEffects.class, io.anuke.mindustry.content.TechTree.class, io.anuke.mindustry.content.TypeIDs.class, io.anuke.mindustry.content.UnitTypes.class, io.anuke.mindustry.content.Zones.class, io.anuke.mindustry.core.ContentLoader.class, io.anuke.mindustry.core.Control.class, io.anuke.mindustry.core.FileTree.class, io.anuke.mindustry.core.GameState.class, io.anuke.mindustry.core.Logic.class, io.anuke.mindustry.core.Platform.class, io.anuke.mindustry.core.Renderer.class, io.anuke.mindustry.core.UI.class, io.anuke.mindustry.core.Version.class, io.anuke.mindustry.core.World.class, io.anuke.mindustry.ctype.Content.class, io.anuke.mindustry.ctype.ContentList.class, io.anuke.mindustry.ctype.MappableContent.class, io.anuke.mindustry.ctype.UnlockableContent.class, io.anuke.mindustry.editor.DrawOperation.class, io.anuke.mindustry.editor.EditorTile.class, io.anuke.mindustry.editor.EditorTool.class, io.anuke.mindustry.editor.MapEditor.class, io.anuke.mindustry.editor.MapRenderer.class, io.anuke.mindustry.editor.OperationStack.class, io.anuke.mindustry.entities.Damage.class, io.anuke.mindustry.entities.Effects.class, io.anuke.mindustry.entities.Entities.class, io.anuke.mindustry.entities.EntityCollisions.class, io.anuke.mindustry.entities.EntityGroup.class, io.anuke.mindustry.entities.Predict.class, io.anuke.mindustry.entities.TargetPriority.class, io.anuke.mindustry.entities.Units.class, io.anuke.mindustry.entities.bullet.ArtilleryBulletType.class, io.anuke.mindustry.entities.bullet.BasicBulletType.class, io.anuke.mindustry.entities.bullet.BombBulletType.class, io.anuke.mindustry.entities.bullet.BulletType.class, io.anuke.mindustry.entities.bullet.FlakBulletType.class, io.anuke.mindustry.entities.bullet.HealBulletType.class, io.anuke.mindustry.entities.bullet.LiquidBulletType.class, io.anuke.mindustry.entities.bullet.MassDriverBolt.class, io.anuke.mindustry.entities.bullet.MissileBulletType.class, io.anuke.mindustry.entities.effect.Decal.class, io.anuke.mindustry.entities.effect.Fire.class, io.anuke.mindustry.entities.effect.GroundEffectEntity.class, io.anuke.mindustry.entities.effect.ItemTransfer.class, io.anuke.mindustry.entities.effect.Lightning.class, io.anuke.mindustry.entities.effect.Puddle.class, io.anuke.mindustry.entities.effect.RubbleDecal.class, io.anuke.mindustry.entities.effect.ScorchDecal.class, io.anuke.mindustry.entities.traits.AbsorbTrait.class, io.anuke.mindustry.entities.traits.BelowLiquidTrait.class, io.anuke.mindustry.entities.traits.BuilderMinerTrait.class, io.anuke.mindustry.entities.traits.BuilderTrait.class, io.anuke.mindustry.entities.traits.DamageTrait.class, io.anuke.mindustry.entities.traits.DrawTrait.class, io.anuke.mindustry.entities.traits.Entity.class, io.anuke.mindustry.entities.traits.HealthTrait.class, io.anuke.mindustry.entities.traits.KillerTrait.class, io.anuke.mindustry.entities.traits.MinerTrait.class, io.anuke.mindustry.entities.traits.MoveTrait.class, io.anuke.mindustry.entities.traits.SaveTrait.class, io.anuke.mindustry.entities.traits.Saveable.class, io.anuke.mindustry.entities.traits.ScaleTrait.class, io.anuke.mindustry.entities.traits.ShooterTrait.class, io.anuke.mindustry.entities.traits.SolidTrait.class, io.anuke.mindustry.entities.traits.SpawnerTrait.class, io.anuke.mindustry.entities.traits.SyncTrait.class, io.anuke.mindustry.entities.traits.TargetTrait.class, io.anuke.mindustry.entities.traits.TeamTrait.class, io.anuke.mindustry.entities.traits.TimeTrait.class, io.anuke.mindustry.entities.traits.TypeTrait.class, io.anuke.mindustry.entities.traits.VelocityTrait.class, io.anuke.mindustry.entities.type.BaseEntity.class, io.anuke.mindustry.entities.type.BaseUnit.class, io.anuke.mindustry.entities.type.Bullet.class, io.anuke.mindustry.entities.type.DestructibleEntity.class, io.anuke.mindustry.entities.type.EffectEntity.class, io.anuke.mindustry.entities.type.Player.class, io.anuke.mindustry.entities.type.SolidEntity.class, io.anuke.mindustry.entities.type.TileEntity.class, io.anuke.mindustry.entities.type.TimedEntity.class, io.anuke.mindustry.entities.type.Unit.class, io.anuke.mindustry.entities.type.base.BaseDrone.class, io.anuke.mindustry.entities.type.base.BuilderDrone.class, io.anuke.mindustry.entities.type.base.Crawler.class, io.anuke.mindustry.entities.type.base.Dagger.class, io.anuke.mindustry.entities.type.base.Draug.class, io.anuke.mindustry.entities.type.base.Eruptor.class, io.anuke.mindustry.entities.type.base.FlyingUnit.class, io.anuke.mindustry.entities.type.base.Fortress.class, io.anuke.mindustry.entities.type.base.Ghoul.class, io.anuke.mindustry.entities.type.base.GroundUnit.class, io.anuke.mindustry.entities.type.base.MinerDrone.class, io.anuke.mindustry.entities.type.base.Phantom.class, io.anuke.mindustry.entities.type.base.RepairDrone.class, io.anuke.mindustry.entities.type.base.Revenant.class, io.anuke.mindustry.entities.type.base.Spirit.class, io.anuke.mindustry.entities.type.base.Titan.class, io.anuke.mindustry.entities.type.base.Wraith.class, io.anuke.mindustry.entities.units.StateMachine.class, io.anuke.mindustry.entities.units.Statuses.class, io.anuke.mindustry.entities.units.UnitCommand.class, io.anuke.mindustry.entities.units.UnitDrops.class, io.anuke.mindustry.entities.units.UnitState.class, io.anuke.mindustry.game.DefaultWaves.class, io.anuke.mindustry.game.Difficulty.class, io.anuke.mindustry.game.EventType.class, io.anuke.mindustry.game.Gamemode.class, io.anuke.mindustry.game.GlobalData.class, io.anuke.mindustry.game.LoopControl.class, io.anuke.mindustry.game.MusicControl.class, io.anuke.mindustry.game.Objective.class, io.anuke.mindustry.game.Objectives.class, io.anuke.mindustry.game.Rules.class, io.anuke.mindustry.game.Saves.class, io.anuke.mindustry.game.Schematic.class, io.anuke.mindustry.game.Schematics.class, io.anuke.mindustry.game.SoundLoop.class, io.anuke.mindustry.game.SpawnGroup.class, io.anuke.mindustry.game.Stats.class, io.anuke.mindustry.game.Team.class, io.anuke.mindustry.game.Teams.class, io.anuke.mindustry.game.Tutorial.class, io.anuke.mindustry.graphics.BlockRenderer.class, io.anuke.mindustry.graphics.Bloom.class, io.anuke.mindustry.graphics.CacheLayer.class, io.anuke.mindustry.graphics.Drawf.class, io.anuke.mindustry.graphics.FloorRenderer.class, io.anuke.mindustry.graphics.IndexedRenderer.class, io.anuke.mindustry.graphics.Layer.class, io.anuke.mindustry.graphics.LightRenderer.class, io.anuke.mindustry.graphics.MenuRenderer.class, io.anuke.mindustry.graphics.MinimapRenderer.class, io.anuke.mindustry.graphics.MultiPacker.class, io.anuke.mindustry.graphics.OverlayRenderer.class, io.anuke.mindustry.graphics.Pal.class, io.anuke.mindustry.graphics.Pixelator.class, io.anuke.mindustry.graphics.Shaders.class, io.anuke.mindustry.input.Binding.class, io.anuke.mindustry.input.DesktopInput.class, io.anuke.mindustry.input.InputHandler.class, io.anuke.mindustry.input.MobileInput.class, io.anuke.mindustry.input.PlaceMode.class, io.anuke.mindustry.input.Placement.class, io.anuke.mindustry.maps.Map.class, io.anuke.mindustry.maps.Maps.class, io.anuke.mindustry.maps.filters.BlendFilter.class, io.anuke.mindustry.maps.filters.ClearFilter.class, io.anuke.mindustry.maps.filters.DistortFilter.class, io.anuke.mindustry.maps.filters.FilterOption.class, io.anuke.mindustry.maps.filters.GenerateFilter.class, io.anuke.mindustry.maps.filters.MedianFilter.class, io.anuke.mindustry.maps.filters.MirrorFilter.class, io.anuke.mindustry.maps.filters.NoiseFilter.class, io.anuke.mindustry.maps.filters.OreFilter.class, io.anuke.mindustry.maps.filters.OreMedianFilter.class, io.anuke.mindustry.maps.filters.RiverNoiseFilter.class, io.anuke.mindustry.maps.filters.ScatterFilter.class, io.anuke.mindustry.maps.filters.TerrainFilter.class, io.anuke.mindustry.maps.generators.BasicGenerator.class, io.anuke.mindustry.maps.generators.Generator.class, io.anuke.mindustry.maps.generators.MapGenerator.class, io.anuke.mindustry.maps.generators.RandomGenerator.class, io.anuke.mindustry.maps.zonegen.DesertWastesGenerator.class, io.anuke.mindustry.maps.zonegen.OvergrowthGenerator.class, io.anuke.mindustry.type.Category.class, io.anuke.mindustry.type.ContentType.class, io.anuke.mindustry.type.Item.class, io.anuke.mindustry.type.ItemStack.class, io.anuke.mindustry.type.ItemType.class, io.anuke.mindustry.type.Liquid.class, io.anuke.mindustry.type.LiquidStack.class, io.anuke.mindustry.type.Mech.class, io.anuke.mindustry.type.Publishable.class, io.anuke.mindustry.type.StatusEffect.class, io.anuke.mindustry.type.TypeID.class, io.anuke.mindustry.type.UnitType.class, io.anuke.mindustry.type.Weapon.class, io.anuke.mindustry.type.WeatherEvent.class, io.anuke.mindustry.type.Zone.class, io.anuke.mindustry.ui.Cicon.class, io.anuke.mindustry.ui.ContentDisplay.class, io.anuke.mindustry.ui.Fonts.class, io.anuke.mindustry.ui.IconSize.class, io.anuke.mindustry.ui.IntFormat.class, io.anuke.mindustry.ui.Links.class, io.anuke.mindustry.ui.Styles.class, io.anuke.mindustry.ui.fragments.BlockConfigFragment.class, io.anuke.mindustry.ui.fragments.BlockInventoryFragment.class, io.anuke.mindustry.ui.fragments.FadeInFragment.class, io.anuke.mindustry.ui.fragments.Fragment.class, io.anuke.mindustry.ui.fragments.HudFragment.class, io.anuke.mindustry.ui.fragments.LoadingFragment.class, io.anuke.mindustry.ui.fragments.MenuFragment.class, io.anuke.mindustry.ui.fragments.OverlayFragment.class, io.anuke.mindustry.ui.fragments.PlacementFragment.class, io.anuke.mindustry.ui.fragments.PlayerListFragment.class, io.anuke.mindustry.ui.layout.BranchTreeLayout.class, io.anuke.mindustry.ui.layout.RadialTreeLayout.class, io.anuke.mindustry.ui.layout.TreeLayout.class, io.anuke.mindustry.world.Block.class, io.anuke.mindustry.world.BlockStorage.class, io.anuke.mindustry.world.Build.class, io.anuke.mindustry.world.CachedTile.class, io.anuke.mindustry.world.DirectionalItemBuffer.class, io.anuke.mindustry.world.Edges.class, io.anuke.mindustry.world.ItemBuffer.class, io.anuke.mindustry.world.LegacyColorMapper.class, io.anuke.mindustry.world.Pos.class, io.anuke.mindustry.world.StaticTree.class, io.anuke.mindustry.world.Tile.class, io.anuke.mindustry.world.WorldContext.class, io.anuke.mindustry.world.blocks.Attributes.class, io.anuke.mindustry.world.blocks.Autotiler.class, io.anuke.mindustry.world.blocks.BlockPart.class, io.anuke.mindustry.world.blocks.BuildBlock.class, io.anuke.mindustry.world.blocks.DoubleOverlayFloor.class, io.anuke.mindustry.world.blocks.Floor.class, io.anuke.mindustry.world.blocks.ItemSelection.class, io.anuke.mindustry.world.blocks.LiquidBlock.class, io.anuke.mindustry.world.blocks.OreBlock.class, io.anuke.mindustry.world.blocks.OverlayFloor.class, io.anuke.mindustry.world.blocks.PowerBlock.class, io.anuke.mindustry.world.blocks.RespawnBlock.class, io.anuke.mindustry.world.blocks.Rock.class, io.anuke.mindustry.world.blocks.StaticWall.class, io.anuke.mindustry.world.blocks.TreeBlock.class, io.anuke.mindustry.world.blocks.defense.DeflectorWall.class, io.anuke.mindustry.world.blocks.defense.Door.class, io.anuke.mindustry.world.blocks.defense.ForceProjector.class, io.anuke.mindustry.world.blocks.defense.MendProjector.class, io.anuke.mindustry.world.blocks.defense.OverdriveProjector.class, io.anuke.mindustry.world.blocks.defense.ShockMine.class, io.anuke.mindustry.world.blocks.defense.SurgeWall.class, io.anuke.mindustry.world.blocks.defense.Wall.class, io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret.class, io.anuke.mindustry.world.blocks.defense.turrets.Turret.class, io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor.class, io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge.class, io.anuke.mindustry.world.blocks.distribution.Conveyor.class, io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge.class, io.anuke.mindustry.world.blocks.distribution.ItemBridge.class, io.anuke.mindustry.world.blocks.distribution.Junction.class, io.anuke.mindustry.world.blocks.distribution.MassDriver.class, io.anuke.mindustry.world.blocks.distribution.OverflowGate.class, io.anuke.mindustry.world.blocks.distribution.Router.class, io.anuke.mindustry.world.blocks.distribution.Sorter.class, io.anuke.mindustry.world.blocks.liquid.ArmoredConduit.class, io.anuke.mindustry.world.blocks.liquid.Conduit.class, io.anuke.mindustry.world.blocks.liquid.LiquidBridge.class, io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge.class, io.anuke.mindustry.world.blocks.liquid.LiquidJunction.class, io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate.class, io.anuke.mindustry.world.blocks.liquid.LiquidRouter.class, io.anuke.mindustry.world.blocks.liquid.LiquidTank.class, io.anuke.mindustry.world.blocks.logic.LogicBlock.class, io.anuke.mindustry.world.blocks.logic.MessageBlock.class, io.anuke.mindustry.world.blocks.power.Battery.class, io.anuke.mindustry.world.blocks.power.BurnerGenerator.class, io.anuke.mindustry.world.blocks.power.ConditionalConsumePower.class, io.anuke.mindustry.world.blocks.power.DecayGenerator.class, io.anuke.mindustry.world.blocks.power.ImpactReactor.class, io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator.class, io.anuke.mindustry.world.blocks.power.LightBlock.class, io.anuke.mindustry.world.blocks.power.NuclearReactor.class, io.anuke.mindustry.world.blocks.power.PowerDiode.class, io.anuke.mindustry.world.blocks.power.PowerDistributor.class, io.anuke.mindustry.world.blocks.power.PowerGenerator.class, io.anuke.mindustry.world.blocks.power.PowerGraph.class, io.anuke.mindustry.world.blocks.power.PowerNode.class, io.anuke.mindustry.world.blocks.power.SingleTypeGenerator.class, io.anuke.mindustry.world.blocks.power.SolarGenerator.class, io.anuke.mindustry.world.blocks.power.ThermalGenerator.class, io.anuke.mindustry.world.blocks.production.Cultivator.class, io.anuke.mindustry.world.blocks.production.Drill.class, io.anuke.mindustry.world.blocks.production.Fracker.class, io.anuke.mindustry.world.blocks.production.GenericCrafter.class, io.anuke.mindustry.world.blocks.production.GenericSmelter.class, io.anuke.mindustry.world.blocks.production.Incinerator.class, io.anuke.mindustry.world.blocks.production.LiquidConverter.class, io.anuke.mindustry.world.blocks.production.Pump.class, io.anuke.mindustry.world.blocks.production.Separator.class, io.anuke.mindustry.world.blocks.production.SolidPump.class, io.anuke.mindustry.world.blocks.sandbox.ItemSource.class, io.anuke.mindustry.world.blocks.sandbox.ItemVoid.class, io.anuke.mindustry.world.blocks.sandbox.LiquidSource.class, io.anuke.mindustry.world.blocks.sandbox.PowerSource.class, io.anuke.mindustry.world.blocks.sandbox.PowerVoid.class, io.anuke.mindustry.world.blocks.storage.CoreBlock.class, io.anuke.mindustry.world.blocks.storage.LaunchPad.class, io.anuke.mindustry.world.blocks.storage.StorageBlock.class, io.anuke.mindustry.world.blocks.storage.Unloader.class, io.anuke.mindustry.world.blocks.storage.Vault.class, io.anuke.mindustry.world.blocks.units.CommandCenter.class, io.anuke.mindustry.world.blocks.units.MechPad.class, io.anuke.mindustry.world.blocks.units.RallyPoint.class, io.anuke.mindustry.world.blocks.units.RepairPoint.class, io.anuke.mindustry.world.blocks.units.UnitFactory.class, io.anuke.mindustry.world.consumers.Consume.class, io.anuke.mindustry.world.consumers.ConsumeItemFilter.class, io.anuke.mindustry.world.consumers.ConsumeItems.class, io.anuke.mindustry.world.consumers.ConsumeLiquid.class, io.anuke.mindustry.world.consumers.ConsumeLiquidBase.class, io.anuke.mindustry.world.consumers.ConsumeLiquidFilter.class, io.anuke.mindustry.world.consumers.ConsumePower.class, io.anuke.mindustry.world.consumers.ConsumeType.class, io.anuke.mindustry.world.consumers.Consumers.class, io.anuke.mindustry.world.meta.Attribute.class, io.anuke.mindustry.world.meta.BlockBars.class, io.anuke.mindustry.world.meta.BlockFlag.class, io.anuke.mindustry.world.meta.BlockGroup.class, io.anuke.mindustry.world.meta.BlockStat.class, io.anuke.mindustry.world.meta.BlockStats.class, io.anuke.mindustry.world.meta.BuildVisibility.class, io.anuke.mindustry.world.meta.PowerType.class, io.anuke.mindustry.world.meta.Producers.class, io.anuke.mindustry.world.meta.StatCategory.class, io.anuke.mindustry.world.meta.StatUnit.class, io.anuke.mindustry.world.meta.StatValue.class, io.anuke.mindustry.world.meta.values.AmmoListValue.class, io.anuke.mindustry.world.meta.values.BooleanValue.class, io.anuke.mindustry.world.meta.values.BoosterListValue.class, io.anuke.mindustry.world.meta.values.ItemFilterValue.class, io.anuke.mindustry.world.meta.values.ItemListValue.class, io.anuke.mindustry.world.meta.values.LiquidFilterValue.class, io.anuke.mindustry.world.meta.values.LiquidValue.class, io.anuke.mindustry.world.meta.values.NumberValue.class, io.anuke.mindustry.world.meta.values.StringValue.class, io.anuke.mindustry.world.modules.BlockModule.class, io.anuke.mindustry.world.modules.ConsumeModule.class, io.anuke.mindustry.world.modules.ItemModule.class, io.anuke.mindustry.world.modules.LiquidModule.class, io.anuke.mindustry.world.modules.PowerModule.class, io.anuke.mindustry.world.producers.Produce.class, io.anuke.mindustry.world.producers.ProduceItem.class); static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index de8b8a9564..cf62098f22 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -6,7 +6,10 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.mod.Mods.*; import org.graalvm.polyglot.*; +import java.io.*; + public class Scripts{ + private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class}; private final Context context; private final String wrapper; @@ -15,11 +18,9 @@ public class Scripts{ Context.Builder builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); HostAccess.Builder hb = HostAccess.newBuilder(); - for(Class c : ClassAccess.allowedClasses){ - hb.allowImplementations(c); - Structs.each(hb::allowAccess, c.getConstructors()); - Structs.each(hb::allowAccess, c.getFields()); - Structs.each(hb::allowAccess, c.getMethods()); + hb.allowPublicAccess(true); + for(Class c : denied){ + hb.denyAccess(c); } builder.allowHostAccess(hb.build()); diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 0543108297..cbc6a511fd 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -24,7 +24,7 @@ public class ScriptStubGenerator{ "import io.anuke.arc.collection.*;\n" + "//obviously autogenerated, do not touch\n" + "class ClassAccess{\n" + - "\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + + //"\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + "\tstatic final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + "}"; @@ -50,6 +50,8 @@ public class ScriptStubGenerator{ result.append("const ").append(type.getSimpleName()).append(" = ").append("Java.type('").append(type.getCanonicalName()).append("')\n"); } + result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); + //Log.info(result); new FileHandle("core/assets/scripts/global.js").writeString(result.toString()); From ceae04aa5b6b503779c05d99d34dfb4aacbbd98d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Nov 2019 18:30:39 -0500 Subject: [PATCH 010/107] Desktop-specific scripting --- build.gradle | 2 +- .../src/io/anuke/mindustry/core/Platform.java | 6 +++ .../io/anuke/mindustry/mod/ClassAccess.java | 4 +- core/src/io/anuke/mindustry/mod/Mods.java | 2 +- core/src/io/anuke/mindustry/mod/Scripts.java | 31 +------------- .../mindustry/desktop/DesktopLauncher.java | 6 +++ .../anuke/mindustry/desktop/GraalScripts.java | 42 +++++++++++++++++++ 7 files changed, 59 insertions(+), 34 deletions(-) create mode 100644 desktop/src/io/anuke/mindustry/desktop/GraalScripts.java diff --git a/build.gradle b/build.gradle index 0be76a33f2..81497eb4a4 100644 --- a/build.gradle +++ b/build.gradle @@ -154,6 +154,7 @@ project(":desktop"){ compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "com.github.Anuken:steamworks4j:$steamworksVersion" + compile "org.graalvm.js:js:19.3.0" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -254,7 +255,6 @@ project(":core"){ compileJava.dependsOn(preGen) compile "org.lz4:lz4-java:1.4.1" - compile "org.graalvm.js:js:19.3.0" compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 50875d426d..6650bff718 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -8,6 +8,7 @@ import io.anuke.arc.func.*; import io.anuke.arc.math.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; @@ -45,6 +46,11 @@ public interface Platform{ return new ArcNetImpl(); } + /** Gets the scripting implementation. */ + default Scripts createScripts(){ + return new Scripts(); + } + /** Add a text input dialog that should show up after the field is tapped. */ default void addDialog(TextField field){ addDialog(field, 16); diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 0735c24f40..7482d2b65b 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -2,6 +2,6 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch -class ClassAccess{ - static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); +public class ClassAccess{ + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index c73e1bbd5d..d6660dd5ff 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -374,7 +374,7 @@ public class Mods implements Loadable{ for(FileHandle file : mod.scripts){ try{ if(scripts == null){ - scripts = new Scripts(); + scripts = platform.createScripts(); } scripts.run(mod, file); }catch(Throwable e){ diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index cf62098f22..d9e4cadbdd 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,41 +1,12 @@ package io.anuke.mindustry.mod; -import io.anuke.arc.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.mindustry.mod.Mods.*; -import org.graalvm.polyglot.*; - -import java.io.*; public class Scripts{ - private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class}; - private final Context context; - private final String wrapper; - - public Scripts(){ - Time.mark(); - Context.Builder builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); - - HostAccess.Builder hb = HostAccess.newBuilder(); - hb.allowPublicAccess(true); - for(Class c : denied){ - hb.denyAccess(c); - } - builder.allowHostAccess(hb.build()); - - context = builder.build(); - wrapper = Core.files.internal("scripts/wrapper.js").readString(); - - run(Core.files.internal("scripts/global.js").readString()); - Log.info("Time to load script engine: {0}", Time.elapsed()); - } public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); - } - - private void run(String script){ - context.eval("js", script); + Log.info("Skipping {0} (no scripting implenmentation)", file); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 1bea20db40..fb4269f092 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -22,6 +22,7 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.Version; import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; @@ -264,6 +265,11 @@ public class DesktopLauncher extends ClientLauncher{ }); } + @Override + public Scripts createScripts(){ + return new GraalScripts(); + } + @Override public Array getWorkshopContent(Class type){ return !steam ? super.getWorkshopContent(type) : SVars.workshop.getWorkshopFiles(type); diff --git a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java new file mode 100644 index 0000000000..b0eb8a6445 --- /dev/null +++ b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java @@ -0,0 +1,42 @@ +package io.anuke.mindustry.desktop; + +import io.anuke.arc.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.mod.Mods.*; +import org.graalvm.polyglot.*; + +import java.io.*; + +public class GraalScripts extends Scripts{ + private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; + private final Context context; + private final String wrapper; + + public GraalScripts(){ + Time.mark(); + Context.Builder builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); + + HostAccess.Builder hb = HostAccess.newBuilder(); + hb.allowPublicAccess(true); + for(Class c : denied){ + hb.denyAccess(c); + } + builder.allowHostAccess(hb.build()); + + context = builder.build(); + wrapper = Core.files.internal("scripts/wrapper.js").readString(); + + run(Core.files.internal("scripts/global.js").readString()); + Log.info("Time to load script engine: {0}", Time.elapsed()); + } + + public void run(LoadedMod mod, FileHandle file){ + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); + } + + private void run(String script){ + context.eval("js", script); + } +} From b21c25bccf5ad99096e132d55178bb9082f74e9c Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 30 Nov 2019 22:15:30 -0500 Subject: [PATCH 011/107] Added features that don't work --- build.gradle | 1 + desktop/src/io/anuke/mindustry/desktop/GraalScripts.java | 1 + 2 files changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 81497eb4a4..cb1d616b1a 100644 --- a/build.gradle +++ b/build.gradle @@ -155,6 +155,7 @@ project(":desktop"){ compile "com.github.Anuken:steamworks4j:$steamworksVersion" compile "org.graalvm.js:js:19.3.0" + compile "org.graalvm.sdk:graal-sdk:19.3.0" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' diff --git a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java index b0eb8a6445..33ad4001ec 100644 --- a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java +++ b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java @@ -24,6 +24,7 @@ public class GraalScripts extends Scripts{ hb.denyAccess(c); } builder.allowHostAccess(hb.build()); + builder.allowExperimentalOptions(true).option("js.syntax-extensions", "true"); context = builder.build(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); From b6915a04834af724a71a4f4d36cd962ad5fb309a Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 1 Dec 2019 01:30:40 -0500 Subject: [PATCH 012/107] Fixed script load crash --- core/src/io/anuke/mindustry/mod/Mods.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index d6660dd5ff..ff6c47b3af 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -381,7 +381,7 @@ public class Mods implements Loadable{ Core.app.post(() -> { Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); e.printStackTrace(); - if(!headless) ui.showException(e); + //if(!headless) ui.showException(e); }); break; } From 77e0e46a1716dd452e80a790dca81f2392dc8519 Mon Sep 17 00:00:00 2001 From: itskatt Date: Sun, 1 Dec 2019 16:52:39 +0100 Subject: [PATCH 013/107] Update the French Translation --- core/assets/bundles/bundle_fr.properties | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index f4464dd977..3810968e76 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -99,6 +99,7 @@ mod.enabled = [lightgray]Activé mod.disabled = [scarlet]Désactivé mod.disable = Désactiver mod.delete.error = Unable to delete mod. File may be in use. +mod.requiresversion = [scarlet]Version du jeu requise: [accent]{0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer @@ -496,6 +497,7 @@ settings.language = Langue settings.data = Données du Jeu settings.reset = Valeurs par Défaut settings.rebind = Réattribuer +settings.resetKey = Réinitialiser settings.controls = Contrôles settings.game = Jeu settings.sound = Son @@ -589,6 +591,8 @@ unit.persecond = /sec unit.timesspeed = x vitesse unit.percent = % unit.items = objets +unit.thousands = k +unit.millions = mil category.general = Général category.power = Énergie category.liquids = Liquides @@ -1084,7 +1088,7 @@ mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poign mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques. mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts. -mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger. Il a néanmoins peu d'attaque et une faible vitesse de minage. +mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger, et possède une vitesse de minage rapide. Néanmoins, ses capacitées d'attaque sont faibles. mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles. mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé. mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable. From 0e7c403bd8359c501155b49e5ef03eaf1932f58e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 1 Dec 2019 12:32:35 -0500 Subject: [PATCH 014/107] Tweaks --- build.gradle | 7 +++++-- core/assets/scripts/global.js | 1 + core/assets/scripts/wrapper.js | 2 +- core/src/io/anuke/mindustry/mod/ClassAccess.java | 2 +- core/src/io/anuke/mindustry/mod/Scripts.java | 4 ++++ .../io/anuke/mindustry/desktop/GraalScripts.java | 13 ++++++++++++- .../anuke/mindustry/tools/ScriptStubGenerator.java | 6 +++--- 7 files changed, 27 insertions(+), 8 deletions(-) diff --git a/build.gradle b/build.gradle index cb1d616b1a..58321ffa55 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ allprojects{ gdxVersion = '1.9.10' roboVMVersion = '2.3.8' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' + graalVersion = '19.3.0' arcHash = null loadVersionProps = { @@ -154,8 +155,10 @@ project(":desktop"){ compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "com.github.Anuken:steamworks4j:$steamworksVersion" - compile "org.graalvm.js:js:19.3.0" - compile "org.graalvm.sdk:graal-sdk:19.3.0" + compile "org.graalvm.js:js:${graalVersion}" + compile "org.graalvm.sdk:graal-sdk:${graalVersion}" + compile "org.graalvm.truffle:truffle-api:${graalVersion}" + compile "org.graalvm.regex:regex:${graalVersion}" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 77c453a135..b95b1fdc4e 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -3,6 +3,7 @@ const Core = Java.type('io.anuke.arc.Core') const Draw = Java.type('io.anuke.arc.graphics.g2d.Draw') const TextureAtlas = Java.type('io.anuke.arc.graphics.g2d.TextureAtlas') const TextureRegion = Java.type('io.anuke.arc.graphics.g2d.TextureRegion') +const Time = Java.type('io.anuke.arc.util.Time') const Vars = Java.type('io.anuke.mindustry.Vars') const BlockIndexer = Java.type('io.anuke.mindustry.ai.BlockIndexer') const Pathfinder = Java.type('io.anuke.mindustry.ai.Pathfinder') diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js index 24bb6fcda7..3eaf663690 100755 --- a/core/assets/scripts/wrapper.js +++ b/core/assets/scripts/wrapper.js @@ -5,5 +5,5 @@ $CODE$ try{ this["$SCRIPT_NAME$"](); }catch(e){ - console.log(e) + print(e) } diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 7482d2b65b..b77cffda44 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index d9e4cadbdd..007e0ae75a 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -9,4 +9,8 @@ public class Scripts{ public void run(LoadedMod mod, FileHandle file){ Log.info("Skipping {0} (no scripting implenmentation)", file); } + + public String runConsole(String text){ + return "No scripting engine available."; + } } diff --git a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java index 33ad4001ec..e3c5337a43 100644 --- a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java +++ b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java @@ -13,10 +13,12 @@ public class GraalScripts extends Scripts{ private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; private final Context context; private final String wrapper; + private final Context.Builder builder; + private Context console; public GraalScripts(){ Time.mark(); - Context.Builder builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); + builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); HostAccess.Builder hb = HostAccess.newBuilder(); hb.allowPublicAccess(true); @@ -33,10 +35,19 @@ public class GraalScripts extends Scripts{ Log.info("Time to load script engine: {0}", Time.elapsed()); } + @Override public void run(LoadedMod mod, FileHandle file){ run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); } + @Override + public String runConsole(String text){ + if(console == null){ + console = builder.build(); + } + return console.eval("js", text).toString(); + } + private void run(String script){ context.eval("js", script); } diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index cbc6a511fd..be5a25def5 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -17,15 +17,15 @@ public class ScriptStubGenerator{ String base = "io.anuke.mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer"); - Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class); + Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + "import io.anuke.arc.collection.*;\n" + "//obviously autogenerated, do not touch\n" + - "class ClassAccess{\n" + + "public class ClassAccess{\n" + //"\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + - "\tstatic final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + + "\tpublic static final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + "}"; List classLoadersList = new LinkedList<>(); From 04d3c40baa5d86258a01f5d4d4d9319da1384294 Mon Sep 17 00:00:00 2001 From: itskatt <48765398+itskatt@users.noreply.github.com> Date: Sun, 1 Dec 2019 18:36:25 +0100 Subject: [PATCH 015/107] Apply suggestions from review Co-Authored-By: YaFou <33806646+YaFou@users.noreply.github.com> --- core/assets/bundles/bundle_fr.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index 3810968e76..dfe1cd16ef 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -99,7 +99,7 @@ mod.enabled = [lightgray]Activé mod.disabled = [scarlet]Désactivé mod.disable = Désactiver mod.delete.error = Unable to delete mod. File may be in use. -mod.requiresversion = [scarlet]Version du jeu requise: [accent]{0} +mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0} mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.nowdisabled = [scarlet]Le mod '{0}' a des dépendances manquantes:[accent] {1}\n[lightgray]Ces mods doivent d'abord être téléchargés.\nCe mod sera automatiquement désactivé. mod.enable = Activer @@ -1088,7 +1088,7 @@ mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poign mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques. mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts. -mech.dart-ship.description = Le vaisseau standard. Raisonnablement rapide et léger, et possède une vitesse de minage rapide. Néanmoins, ses capacitées d'attaque sont faibles. +mech.dart-ship.description = Le vaisseau standard. Il est raisonnablement rapide, léger et possède une vitesse de minage rapide. Néanmoins, ses capacitées d'attaque sont faibles. mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles. mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé. mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable. From e66ecb6c90970f19c81c37251bb66b8a450e1bb4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 1 Dec 2019 12:50:11 -0500 Subject: [PATCH 016/107] Removed unnecessary option --- desktop/src/io/anuke/mindustry/desktop/GraalScripts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java index e3c5337a43..842cbbacb9 100644 --- a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java +++ b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java @@ -26,7 +26,7 @@ public class GraalScripts extends Scripts{ hb.denyAccess(c); } builder.allowHostAccess(hb.build()); - builder.allowExperimentalOptions(true).option("js.syntax-extensions", "true"); + builder.allowExperimentalOptions(true); context = builder.build(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); From 9cb55b9745fb2b773552bf65d673b3b1015a07bd Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 1 Dec 2019 14:21:47 -0500 Subject: [PATCH 017/107] a mess --- build.gradle | 3 --- core/assets/scripts/global.js | 20 +++++++++++++++++++ .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- .../mindustry/tools/ScriptStubGenerator.java | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 58321ffa55..5a8f887498 100644 --- a/build.gradle +++ b/build.gradle @@ -156,9 +156,6 @@ project(":desktop"){ compile "com.github.Anuken:steamworks4j:$steamworksVersion" compile "org.graalvm.js:js:${graalVersion}" - compile "org.graalvm.sdk:graal-sdk:${graalVersion}" - compile "org.graalvm.truffle:truffle-api:${graalVersion}" - compile "org.graalvm.regex:regex:${graalVersion}" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index b95b1fdc4e..f3523ae837 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -1,5 +1,25 @@ //Generated class. Do not modify. const Core = Java.type('io.anuke.arc.Core') +const Boolc = Java.type('io.anuke.arc.func.Boolc') +const Boolf = Java.type('io.anuke.arc.func.Boolf') +const Boolf2 = Java.type('io.anuke.arc.func.Boolf2') +const Boolp = Java.type('io.anuke.arc.func.Boolp') +const Cons = Java.type('io.anuke.arc.func.Cons') +const Cons2 = Java.type('io.anuke.arc.func.Cons2') +const Floatc = Java.type('io.anuke.arc.func.Floatc') +const Floatc2 = Java.type('io.anuke.arc.func.Floatc2') +const Floatc4 = Java.type('io.anuke.arc.func.Floatc4') +const Floatf = Java.type('io.anuke.arc.func.Floatf') +const Floatp = Java.type('io.anuke.arc.func.Floatp') +const Func = Java.type('io.anuke.arc.func.Func') +const Func2 = Java.type('io.anuke.arc.func.Func2') +const Func3 = Java.type('io.anuke.arc.func.Func3') +const Intc = Java.type('io.anuke.arc.func.Intc') +const Intc2 = Java.type('io.anuke.arc.func.Intc2') +const Intc4 = Java.type('io.anuke.arc.func.Intc4') +const Intf = Java.type('io.anuke.arc.func.Intf') +const Intp = Java.type('io.anuke.arc.func.Intp') +const Prov = Java.type('io.anuke.arc.func.Prov') const Draw = Java.type('io.anuke.arc.graphics.g2d.Draw') const TextureAtlas = Java.type('io.anuke.arc.graphics.g2d.TextureAtlas') const TextureRegion = Java.type('io.anuke.arc.graphics.g2d.TextureRegion') diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index b77cffda44..223eddb7ed 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); } \ No newline at end of file diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index be5a25def5..dc5a909504 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -35,7 +35,7 @@ public class ScriptStubGenerator{ Reflections reflections = new Reflections(new ConfigurationBuilder() .setScanners(new SubTypesScanner(false), new ResourcesScanner()) .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) - .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("io.anuke.mindustry")))); + .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("io.anuke.mindustry")).include(FilterBuilder.prefix("io.anuke.arc.func")))); Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); classes.addAll(reflections.getSubTypesOf(Enum.class)); From 5788c27aaa62e692384467ab55b00e36bf466288 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 3 Dec 2019 01:01:18 -0500 Subject: [PATCH 018/107] hmmm --- build.gradle | 3 +- core/src/io/anuke/mindustry/mod/Scripts.java | 31 +++++++++-- .../mindustry/desktop/DesktopLauncher.java | 8 +-- .../anuke/mindustry/desktop/GraalScripts.java | 54 ------------------- gradle.properties | 2 +- 5 files changed, 31 insertions(+), 67 deletions(-) delete mode 100644 desktop/src/io/anuke/mindustry/desktop/GraalScripts.java diff --git a/build.gradle b/build.gradle index 5a8f887498..7bb0e486b0 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,6 @@ allprojects{ gdxVersion = '1.9.10' roboVMVersion = '2.3.8' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' - graalVersion = '19.3.0' arcHash = null loadVersionProps = { @@ -155,7 +154,6 @@ project(":desktop"){ compile "com.badlogicgames.gdx:gdx-freetype-platform:$gdxVersion:natives-desktop" compile "com.github.Anuken:steamworks4j:$steamworksVersion" - compile "org.graalvm.js:js:${graalVersion}" compile arcModule("backends:backend-sdl") compile 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -259,6 +257,7 @@ project(":core"){ compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") + compile "org.mozilla:rhino:1.7.11" if(localArc() && debugged()) compile arcModule("extensions:recorder") compileOnly project(":annotations") diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 007e0ae75a..d5be037ede 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,16 +1,41 @@ package io.anuke.mindustry.mod; +import io.anuke.arc.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.mod.Mods.*; +import org.mozilla.javascript.*; + +import java.io.*; public class Scripts{ + private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; + private final Context context; + private final String wrapper; + private Context console; + private Scriptable scope; + + public Scripts(){ + Time.mark(); + + context = Context.enter(); + if(Vars.mobile){ + context.setOptimizationLevel(-1); + } + + scope = context.initStandardObjects(); + wrapper = Core.files.internal("scripts/wrapper.js").readString(); + + run(wrapper); + Log.info("Time to load script engine: {0}", Time.elapsed()); + } public void run(LoadedMod mod, FileHandle file){ - Log.info("Skipping {0} (no scripting implenmentation)", file); + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); } - public String runConsole(String text){ - return "No scripting engine available."; + private void run(String script){ + Log.info(context.evaluateString(scope, script, "???", 0, null)); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index fb4269f092..eb216b724e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -19,10 +19,9 @@ import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; -import io.anuke.mindustry.core.Version; +import io.anuke.mindustry.core.*; import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.mod.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; @@ -265,11 +264,6 @@ public class DesktopLauncher extends ClientLauncher{ }); } - @Override - public Scripts createScripts(){ - return new GraalScripts(); - } - @Override public Array getWorkshopContent(Class type){ return !steam ? super.getWorkshopContent(type) : SVars.workshop.getWorkshopFiles(type); diff --git a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java b/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java deleted file mode 100644 index 842cbbacb9..0000000000 --- a/desktop/src/io/anuke/mindustry/desktop/GraalScripts.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.anuke.mindustry.desktop; - -import io.anuke.arc.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.mod.Mods.*; -import org.graalvm.polyglot.*; - -import java.io.*; - -public class GraalScripts extends Scripts{ - private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; - private final Context context; - private final String wrapper; - private final Context.Builder builder; - private Context console; - - public GraalScripts(){ - Time.mark(); - builder = Context.newBuilder("js").allowHostClassLookup(ClassAccess.allowedClassNames::contains); - - HostAccess.Builder hb = HostAccess.newBuilder(); - hb.allowPublicAccess(true); - for(Class c : denied){ - hb.denyAccess(c); - } - builder.allowHostAccess(hb.build()); - builder.allowExperimentalOptions(true); - - context = builder.build(); - wrapper = Core.files.internal("scripts/wrapper.js").readString(); - - run(Core.files.internal("scripts/global.js").readString()); - Log.info("Time to load script engine: {0}", Time.elapsed()); - } - - @Override - public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); - } - - @Override - public String runConsole(String text){ - if(console == null){ - console = builder.build(); - } - return console.eval("js", text).toString(); - } - - private void run(String script){ - context.eval("js", script); - } -} diff --git a/gradle.properties b/gradle.properties index 8b7352fd6a..be214e2f30 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=c7f3d8125c8d13c0a31c5f14fdabdb3d0efbd676 +archash=680d8dfc055a1336c06b32d7d4429661e6c6fddd From 1e3bfba31a993364d034f0d218c4e00929e72301 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 3 Dec 2019 17:16:23 -0500 Subject: [PATCH 019/107] this engine is also broken --- core/assets/scripts/base.js | 8 +- core/assets/scripts/global.js | 767 +++++++++--------- core/src/io/anuke/mindustry/mod/Scripts.java | 10 +- .../mindustry/tools/ScriptStubGenerator.java | 7 +- 4 files changed, 401 insertions(+), 391 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 1213c82bf4..96c3ecc154 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -1 +1,7 @@ -const extend = Java.extend +const print = function(obj){ + java.lang.System.out.println(obj ? String(obj) : "null") +} + +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index f3523ae837..d4629cb454 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -1,384 +1,389 @@ //Generated class. Do not modify. -const Core = Java.type('io.anuke.arc.Core') -const Boolc = Java.type('io.anuke.arc.func.Boolc') -const Boolf = Java.type('io.anuke.arc.func.Boolf') -const Boolf2 = Java.type('io.anuke.arc.func.Boolf2') -const Boolp = Java.type('io.anuke.arc.func.Boolp') -const Cons = Java.type('io.anuke.arc.func.Cons') -const Cons2 = Java.type('io.anuke.arc.func.Cons2') -const Floatc = Java.type('io.anuke.arc.func.Floatc') -const Floatc2 = Java.type('io.anuke.arc.func.Floatc2') -const Floatc4 = Java.type('io.anuke.arc.func.Floatc4') -const Floatf = Java.type('io.anuke.arc.func.Floatf') -const Floatp = Java.type('io.anuke.arc.func.Floatp') -const Func = Java.type('io.anuke.arc.func.Func') -const Func2 = Java.type('io.anuke.arc.func.Func2') -const Func3 = Java.type('io.anuke.arc.func.Func3') -const Intc = Java.type('io.anuke.arc.func.Intc') -const Intc2 = Java.type('io.anuke.arc.func.Intc2') -const Intc4 = Java.type('io.anuke.arc.func.Intc4') -const Intf = Java.type('io.anuke.arc.func.Intf') -const Intp = Java.type('io.anuke.arc.func.Intp') -const Prov = Java.type('io.anuke.arc.func.Prov') -const Draw = Java.type('io.anuke.arc.graphics.g2d.Draw') -const TextureAtlas = Java.type('io.anuke.arc.graphics.g2d.TextureAtlas') -const TextureRegion = Java.type('io.anuke.arc.graphics.g2d.TextureRegion') -const Time = Java.type('io.anuke.arc.util.Time') -const Vars = Java.type('io.anuke.mindustry.Vars') -const BlockIndexer = Java.type('io.anuke.mindustry.ai.BlockIndexer') -const Pathfinder = Java.type('io.anuke.mindustry.ai.Pathfinder') -const WaveSpawner = Java.type('io.anuke.mindustry.ai.WaveSpawner') -const Blocks = Java.type('io.anuke.mindustry.content.Blocks') -const Bullets = Java.type('io.anuke.mindustry.content.Bullets') -const Fx = Java.type('io.anuke.mindustry.content.Fx') -const Items = Java.type('io.anuke.mindustry.content.Items') -const Liquids = Java.type('io.anuke.mindustry.content.Liquids') -const Loadouts = Java.type('io.anuke.mindustry.content.Loadouts') -const Mechs = Java.type('io.anuke.mindustry.content.Mechs') -const StatusEffects = Java.type('io.anuke.mindustry.content.StatusEffects') -const TechTree = Java.type('io.anuke.mindustry.content.TechTree') -const TypeIDs = Java.type('io.anuke.mindustry.content.TypeIDs') -const UnitTypes = Java.type('io.anuke.mindustry.content.UnitTypes') -const Zones = Java.type('io.anuke.mindustry.content.Zones') -const ContentLoader = Java.type('io.anuke.mindustry.core.ContentLoader') -const Control = Java.type('io.anuke.mindustry.core.Control') -const FileTree = Java.type('io.anuke.mindustry.core.FileTree') -const GameState = Java.type('io.anuke.mindustry.core.GameState') -const Logic = Java.type('io.anuke.mindustry.core.Logic') -const Platform = Java.type('io.anuke.mindustry.core.Platform') -const Renderer = Java.type('io.anuke.mindustry.core.Renderer') -const UI = Java.type('io.anuke.mindustry.core.UI') -const Version = Java.type('io.anuke.mindustry.core.Version') -const World = Java.type('io.anuke.mindustry.core.World') -const Content = Java.type('io.anuke.mindustry.ctype.Content') -const ContentList = Java.type('io.anuke.mindustry.ctype.ContentList') -const MappableContent = Java.type('io.anuke.mindustry.ctype.MappableContent') -const UnlockableContent = Java.type('io.anuke.mindustry.ctype.UnlockableContent') -const DrawOperation = Java.type('io.anuke.mindustry.editor.DrawOperation') -const EditorTile = Java.type('io.anuke.mindustry.editor.EditorTile') -const EditorTool = Java.type('io.anuke.mindustry.editor.EditorTool') -const MapEditor = Java.type('io.anuke.mindustry.editor.MapEditor') -const MapRenderer = Java.type('io.anuke.mindustry.editor.MapRenderer') -const OperationStack = Java.type('io.anuke.mindustry.editor.OperationStack') -const Damage = Java.type('io.anuke.mindustry.entities.Damage') -const Effects = Java.type('io.anuke.mindustry.entities.Effects') -const Entities = Java.type('io.anuke.mindustry.entities.Entities') -const EntityCollisions = Java.type('io.anuke.mindustry.entities.EntityCollisions') -const EntityGroup = Java.type('io.anuke.mindustry.entities.EntityGroup') -const Predict = Java.type('io.anuke.mindustry.entities.Predict') -const TargetPriority = Java.type('io.anuke.mindustry.entities.TargetPriority') -const Units = Java.type('io.anuke.mindustry.entities.Units') -const ArtilleryBulletType = Java.type('io.anuke.mindustry.entities.bullet.ArtilleryBulletType') -const BasicBulletType = Java.type('io.anuke.mindustry.entities.bullet.BasicBulletType') -const BombBulletType = Java.type('io.anuke.mindustry.entities.bullet.BombBulletType') -const BulletType = Java.type('io.anuke.mindustry.entities.bullet.BulletType') -const FlakBulletType = Java.type('io.anuke.mindustry.entities.bullet.FlakBulletType') -const HealBulletType = Java.type('io.anuke.mindustry.entities.bullet.HealBulletType') -const LiquidBulletType = Java.type('io.anuke.mindustry.entities.bullet.LiquidBulletType') -const MassDriverBolt = Java.type('io.anuke.mindustry.entities.bullet.MassDriverBolt') -const MissileBulletType = Java.type('io.anuke.mindustry.entities.bullet.MissileBulletType') -const Decal = Java.type('io.anuke.mindustry.entities.effect.Decal') -const Fire = Java.type('io.anuke.mindustry.entities.effect.Fire') -const GroundEffectEntity = Java.type('io.anuke.mindustry.entities.effect.GroundEffectEntity') -const ItemTransfer = Java.type('io.anuke.mindustry.entities.effect.ItemTransfer') -const Lightning = Java.type('io.anuke.mindustry.entities.effect.Lightning') -const Puddle = Java.type('io.anuke.mindustry.entities.effect.Puddle') -const RubbleDecal = Java.type('io.anuke.mindustry.entities.effect.RubbleDecal') -const ScorchDecal = Java.type('io.anuke.mindustry.entities.effect.ScorchDecal') -const AbsorbTrait = Java.type('io.anuke.mindustry.entities.traits.AbsorbTrait') -const BelowLiquidTrait = Java.type('io.anuke.mindustry.entities.traits.BelowLiquidTrait') -const BuilderMinerTrait = Java.type('io.anuke.mindustry.entities.traits.BuilderMinerTrait') -const BuilderTrait = Java.type('io.anuke.mindustry.entities.traits.BuilderTrait') -const DamageTrait = Java.type('io.anuke.mindustry.entities.traits.DamageTrait') -const DrawTrait = Java.type('io.anuke.mindustry.entities.traits.DrawTrait') -const Entity = Java.type('io.anuke.mindustry.entities.traits.Entity') -const HealthTrait = Java.type('io.anuke.mindustry.entities.traits.HealthTrait') -const KillerTrait = Java.type('io.anuke.mindustry.entities.traits.KillerTrait') -const MinerTrait = Java.type('io.anuke.mindustry.entities.traits.MinerTrait') -const MoveTrait = Java.type('io.anuke.mindustry.entities.traits.MoveTrait') -const SaveTrait = Java.type('io.anuke.mindustry.entities.traits.SaveTrait') -const Saveable = Java.type('io.anuke.mindustry.entities.traits.Saveable') -const ScaleTrait = Java.type('io.anuke.mindustry.entities.traits.ScaleTrait') -const ShooterTrait = Java.type('io.anuke.mindustry.entities.traits.ShooterTrait') -const SolidTrait = Java.type('io.anuke.mindustry.entities.traits.SolidTrait') -const SpawnerTrait = Java.type('io.anuke.mindustry.entities.traits.SpawnerTrait') -const SyncTrait = Java.type('io.anuke.mindustry.entities.traits.SyncTrait') -const TargetTrait = Java.type('io.anuke.mindustry.entities.traits.TargetTrait') -const TeamTrait = Java.type('io.anuke.mindustry.entities.traits.TeamTrait') -const TimeTrait = Java.type('io.anuke.mindustry.entities.traits.TimeTrait') -const TypeTrait = Java.type('io.anuke.mindustry.entities.traits.TypeTrait') -const VelocityTrait = Java.type('io.anuke.mindustry.entities.traits.VelocityTrait') -const BaseEntity = Java.type('io.anuke.mindustry.entities.type.BaseEntity') -const BaseUnit = Java.type('io.anuke.mindustry.entities.type.BaseUnit') -const Bullet = Java.type('io.anuke.mindustry.entities.type.Bullet') -const DestructibleEntity = Java.type('io.anuke.mindustry.entities.type.DestructibleEntity') -const EffectEntity = Java.type('io.anuke.mindustry.entities.type.EffectEntity') -const Player = Java.type('io.anuke.mindustry.entities.type.Player') -const SolidEntity = Java.type('io.anuke.mindustry.entities.type.SolidEntity') -const TileEntity = Java.type('io.anuke.mindustry.entities.type.TileEntity') -const TimedEntity = Java.type('io.anuke.mindustry.entities.type.TimedEntity') -const Unit = Java.type('io.anuke.mindustry.entities.type.Unit') -const BaseDrone = Java.type('io.anuke.mindustry.entities.type.base.BaseDrone') -const BuilderDrone = Java.type('io.anuke.mindustry.entities.type.base.BuilderDrone') -const Crawler = Java.type('io.anuke.mindustry.entities.type.base.Crawler') -const Dagger = Java.type('io.anuke.mindustry.entities.type.base.Dagger') -const Draug = Java.type('io.anuke.mindustry.entities.type.base.Draug') -const Eruptor = Java.type('io.anuke.mindustry.entities.type.base.Eruptor') -const FlyingUnit = Java.type('io.anuke.mindustry.entities.type.base.FlyingUnit') -const Fortress = Java.type('io.anuke.mindustry.entities.type.base.Fortress') -const Ghoul = Java.type('io.anuke.mindustry.entities.type.base.Ghoul') -const GroundUnit = Java.type('io.anuke.mindustry.entities.type.base.GroundUnit') -const MinerDrone = Java.type('io.anuke.mindustry.entities.type.base.MinerDrone') -const Phantom = Java.type('io.anuke.mindustry.entities.type.base.Phantom') -const RepairDrone = Java.type('io.anuke.mindustry.entities.type.base.RepairDrone') -const Revenant = Java.type('io.anuke.mindustry.entities.type.base.Revenant') -const Spirit = Java.type('io.anuke.mindustry.entities.type.base.Spirit') -const Titan = Java.type('io.anuke.mindustry.entities.type.base.Titan') -const Wraith = Java.type('io.anuke.mindustry.entities.type.base.Wraith') -const StateMachine = Java.type('io.anuke.mindustry.entities.units.StateMachine') -const Statuses = Java.type('io.anuke.mindustry.entities.units.Statuses') -const UnitCommand = Java.type('io.anuke.mindustry.entities.units.UnitCommand') -const UnitDrops = Java.type('io.anuke.mindustry.entities.units.UnitDrops') -const UnitState = Java.type('io.anuke.mindustry.entities.units.UnitState') -const DefaultWaves = Java.type('io.anuke.mindustry.game.DefaultWaves') -const Difficulty = Java.type('io.anuke.mindustry.game.Difficulty') -const EventType = Java.type('io.anuke.mindustry.game.EventType') -const Gamemode = Java.type('io.anuke.mindustry.game.Gamemode') -const GlobalData = Java.type('io.anuke.mindustry.game.GlobalData') -const LoopControl = Java.type('io.anuke.mindustry.game.LoopControl') -const MusicControl = Java.type('io.anuke.mindustry.game.MusicControl') -const Objective = Java.type('io.anuke.mindustry.game.Objective') -const Objectives = Java.type('io.anuke.mindustry.game.Objectives') -const Rules = Java.type('io.anuke.mindustry.game.Rules') -const Saves = Java.type('io.anuke.mindustry.game.Saves') -const Schematic = Java.type('io.anuke.mindustry.game.Schematic') -const Schematics = Java.type('io.anuke.mindustry.game.Schematics') -const SoundLoop = Java.type('io.anuke.mindustry.game.SoundLoop') -const SpawnGroup = Java.type('io.anuke.mindustry.game.SpawnGroup') -const Stats = Java.type('io.anuke.mindustry.game.Stats') -const Team = Java.type('io.anuke.mindustry.game.Team') -const Teams = Java.type('io.anuke.mindustry.game.Teams') -const Tutorial = Java.type('io.anuke.mindustry.game.Tutorial') -const BlockRenderer = Java.type('io.anuke.mindustry.graphics.BlockRenderer') -const Bloom = Java.type('io.anuke.mindustry.graphics.Bloom') -const CacheLayer = Java.type('io.anuke.mindustry.graphics.CacheLayer') -const Drawf = Java.type('io.anuke.mindustry.graphics.Drawf') -const FloorRenderer = Java.type('io.anuke.mindustry.graphics.FloorRenderer') -const IndexedRenderer = Java.type('io.anuke.mindustry.graphics.IndexedRenderer') -const Layer = Java.type('io.anuke.mindustry.graphics.Layer') -const LightRenderer = Java.type('io.anuke.mindustry.graphics.LightRenderer') -const MenuRenderer = Java.type('io.anuke.mindustry.graphics.MenuRenderer') -const MinimapRenderer = Java.type('io.anuke.mindustry.graphics.MinimapRenderer') -const MultiPacker = Java.type('io.anuke.mindustry.graphics.MultiPacker') -const OverlayRenderer = Java.type('io.anuke.mindustry.graphics.OverlayRenderer') -const Pal = Java.type('io.anuke.mindustry.graphics.Pal') -const Pixelator = Java.type('io.anuke.mindustry.graphics.Pixelator') -const Shaders = Java.type('io.anuke.mindustry.graphics.Shaders') -const Binding = Java.type('io.anuke.mindustry.input.Binding') -const DesktopInput = Java.type('io.anuke.mindustry.input.DesktopInput') -const InputHandler = Java.type('io.anuke.mindustry.input.InputHandler') -const MobileInput = Java.type('io.anuke.mindustry.input.MobileInput') -const PlaceMode = Java.type('io.anuke.mindustry.input.PlaceMode') -const Placement = Java.type('io.anuke.mindustry.input.Placement') -const Map = Java.type('io.anuke.mindustry.maps.Map') -const Maps = Java.type('io.anuke.mindustry.maps.Maps') -const BlendFilter = Java.type('io.anuke.mindustry.maps.filters.BlendFilter') -const ClearFilter = Java.type('io.anuke.mindustry.maps.filters.ClearFilter') -const DistortFilter = Java.type('io.anuke.mindustry.maps.filters.DistortFilter') -const FilterOption = Java.type('io.anuke.mindustry.maps.filters.FilterOption') -const GenerateFilter = Java.type('io.anuke.mindustry.maps.filters.GenerateFilter') -const MedianFilter = Java.type('io.anuke.mindustry.maps.filters.MedianFilter') -const MirrorFilter = Java.type('io.anuke.mindustry.maps.filters.MirrorFilter') -const NoiseFilter = Java.type('io.anuke.mindustry.maps.filters.NoiseFilter') -const OreFilter = Java.type('io.anuke.mindustry.maps.filters.OreFilter') -const OreMedianFilter = Java.type('io.anuke.mindustry.maps.filters.OreMedianFilter') -const RiverNoiseFilter = Java.type('io.anuke.mindustry.maps.filters.RiverNoiseFilter') -const ScatterFilter = Java.type('io.anuke.mindustry.maps.filters.ScatterFilter') -const TerrainFilter = Java.type('io.anuke.mindustry.maps.filters.TerrainFilter') -const BasicGenerator = Java.type('io.anuke.mindustry.maps.generators.BasicGenerator') -const Generator = Java.type('io.anuke.mindustry.maps.generators.Generator') -const MapGenerator = Java.type('io.anuke.mindustry.maps.generators.MapGenerator') -const RandomGenerator = Java.type('io.anuke.mindustry.maps.generators.RandomGenerator') -const DesertWastesGenerator = Java.type('io.anuke.mindustry.maps.zonegen.DesertWastesGenerator') -const OvergrowthGenerator = Java.type('io.anuke.mindustry.maps.zonegen.OvergrowthGenerator') -const Category = Java.type('io.anuke.mindustry.type.Category') -const ContentType = Java.type('io.anuke.mindustry.type.ContentType') -const Item = Java.type('io.anuke.mindustry.type.Item') -const ItemStack = Java.type('io.anuke.mindustry.type.ItemStack') -const ItemType = Java.type('io.anuke.mindustry.type.ItemType') -const Liquid = Java.type('io.anuke.mindustry.type.Liquid') -const LiquidStack = Java.type('io.anuke.mindustry.type.LiquidStack') -const Mech = Java.type('io.anuke.mindustry.type.Mech') -const Publishable = Java.type('io.anuke.mindustry.type.Publishable') -const StatusEffect = Java.type('io.anuke.mindustry.type.StatusEffect') -const TypeID = Java.type('io.anuke.mindustry.type.TypeID') -const UnitType = Java.type('io.anuke.mindustry.type.UnitType') -const Weapon = Java.type('io.anuke.mindustry.type.Weapon') -const WeatherEvent = Java.type('io.anuke.mindustry.type.WeatherEvent') -const Zone = Java.type('io.anuke.mindustry.type.Zone') -const Cicon = Java.type('io.anuke.mindustry.ui.Cicon') -const ContentDisplay = Java.type('io.anuke.mindustry.ui.ContentDisplay') -const Fonts = Java.type('io.anuke.mindustry.ui.Fonts') -const IconSize = Java.type('io.anuke.mindustry.ui.IconSize') -const IntFormat = Java.type('io.anuke.mindustry.ui.IntFormat') -const Links = Java.type('io.anuke.mindustry.ui.Links') -const Styles = Java.type('io.anuke.mindustry.ui.Styles') -const BlockConfigFragment = Java.type('io.anuke.mindustry.ui.fragments.BlockConfigFragment') -const BlockInventoryFragment = Java.type('io.anuke.mindustry.ui.fragments.BlockInventoryFragment') -const FadeInFragment = Java.type('io.anuke.mindustry.ui.fragments.FadeInFragment') -const Fragment = Java.type('io.anuke.mindustry.ui.fragments.Fragment') -const HudFragment = Java.type('io.anuke.mindustry.ui.fragments.HudFragment') -const LoadingFragment = Java.type('io.anuke.mindustry.ui.fragments.LoadingFragment') -const MenuFragment = Java.type('io.anuke.mindustry.ui.fragments.MenuFragment') -const OverlayFragment = Java.type('io.anuke.mindustry.ui.fragments.OverlayFragment') -const PlacementFragment = Java.type('io.anuke.mindustry.ui.fragments.PlacementFragment') -const PlayerListFragment = Java.type('io.anuke.mindustry.ui.fragments.PlayerListFragment') -const BranchTreeLayout = Java.type('io.anuke.mindustry.ui.layout.BranchTreeLayout') -const RadialTreeLayout = Java.type('io.anuke.mindustry.ui.layout.RadialTreeLayout') -const TreeLayout = Java.type('io.anuke.mindustry.ui.layout.TreeLayout') -const Block = Java.type('io.anuke.mindustry.world.Block') -const BlockStorage = Java.type('io.anuke.mindustry.world.BlockStorage') -const Build = Java.type('io.anuke.mindustry.world.Build') -const CachedTile = Java.type('io.anuke.mindustry.world.CachedTile') -const DirectionalItemBuffer = Java.type('io.anuke.mindustry.world.DirectionalItemBuffer') -const Edges = Java.type('io.anuke.mindustry.world.Edges') -const ItemBuffer = Java.type('io.anuke.mindustry.world.ItemBuffer') -const LegacyColorMapper = Java.type('io.anuke.mindustry.world.LegacyColorMapper') -const Pos = Java.type('io.anuke.mindustry.world.Pos') -const StaticTree = Java.type('io.anuke.mindustry.world.StaticTree') -const Tile = Java.type('io.anuke.mindustry.world.Tile') -const WorldContext = Java.type('io.anuke.mindustry.world.WorldContext') -const Attributes = Java.type('io.anuke.mindustry.world.blocks.Attributes') -const Autotiler = Java.type('io.anuke.mindustry.world.blocks.Autotiler') -const BlockPart = Java.type('io.anuke.mindustry.world.blocks.BlockPart') -const BuildBlock = Java.type('io.anuke.mindustry.world.blocks.BuildBlock') -const DoubleOverlayFloor = Java.type('io.anuke.mindustry.world.blocks.DoubleOverlayFloor') -const Floor = Java.type('io.anuke.mindustry.world.blocks.Floor') -const ItemSelection = Java.type('io.anuke.mindustry.world.blocks.ItemSelection') -const LiquidBlock = Java.type('io.anuke.mindustry.world.blocks.LiquidBlock') -const OreBlock = Java.type('io.anuke.mindustry.world.blocks.OreBlock') -const OverlayFloor = Java.type('io.anuke.mindustry.world.blocks.OverlayFloor') -const PowerBlock = Java.type('io.anuke.mindustry.world.blocks.PowerBlock') -const RespawnBlock = Java.type('io.anuke.mindustry.world.blocks.RespawnBlock') -const Rock = Java.type('io.anuke.mindustry.world.blocks.Rock') -const StaticWall = Java.type('io.anuke.mindustry.world.blocks.StaticWall') -const TreeBlock = Java.type('io.anuke.mindustry.world.blocks.TreeBlock') -const DeflectorWall = Java.type('io.anuke.mindustry.world.blocks.defense.DeflectorWall') -const Door = Java.type('io.anuke.mindustry.world.blocks.defense.Door') -const ForceProjector = Java.type('io.anuke.mindustry.world.blocks.defense.ForceProjector') -const MendProjector = Java.type('io.anuke.mindustry.world.blocks.defense.MendProjector') -const OverdriveProjector = Java.type('io.anuke.mindustry.world.blocks.defense.OverdriveProjector') -const ShockMine = Java.type('io.anuke.mindustry.world.blocks.defense.ShockMine') -const SurgeWall = Java.type('io.anuke.mindustry.world.blocks.defense.SurgeWall') -const Wall = Java.type('io.anuke.mindustry.world.blocks.defense.Wall') -const ArtilleryTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret') -const BurstTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret') -const ChargeTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret') -const CooledTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret') -const DoubleTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret') -const ItemTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret') -const LaserTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret') -const LiquidTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret') -const PowerTurret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret') -const Turret = Java.type('io.anuke.mindustry.world.blocks.defense.turrets.Turret') -const ArmoredConveyor = Java.type('io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor') -const BufferedItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge') -const Conveyor = Java.type('io.anuke.mindustry.world.blocks.distribution.Conveyor') -const ExtendingItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge') -const ItemBridge = Java.type('io.anuke.mindustry.world.blocks.distribution.ItemBridge') -const Junction = Java.type('io.anuke.mindustry.world.blocks.distribution.Junction') -const MassDriver = Java.type('io.anuke.mindustry.world.blocks.distribution.MassDriver') -const OverflowGate = Java.type('io.anuke.mindustry.world.blocks.distribution.OverflowGate') -const Router = Java.type('io.anuke.mindustry.world.blocks.distribution.Router') -const Sorter = Java.type('io.anuke.mindustry.world.blocks.distribution.Sorter') -const ArmoredConduit = Java.type('io.anuke.mindustry.world.blocks.liquid.ArmoredConduit') -const Conduit = Java.type('io.anuke.mindustry.world.blocks.liquid.Conduit') -const LiquidBridge = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidBridge') -const LiquidExtendingBridge = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge') -const LiquidJunction = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidJunction') -const LiquidOverflowGate = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate') -const LiquidRouter = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidRouter') -const LiquidTank = Java.type('io.anuke.mindustry.world.blocks.liquid.LiquidTank') -const LogicBlock = Java.type('io.anuke.mindustry.world.blocks.logic.LogicBlock') -const MessageBlock = Java.type('io.anuke.mindustry.world.blocks.logic.MessageBlock') -const Battery = Java.type('io.anuke.mindustry.world.blocks.power.Battery') -const BurnerGenerator = Java.type('io.anuke.mindustry.world.blocks.power.BurnerGenerator') -const ConditionalConsumePower = Java.type('io.anuke.mindustry.world.blocks.power.ConditionalConsumePower') -const DecayGenerator = Java.type('io.anuke.mindustry.world.blocks.power.DecayGenerator') -const ImpactReactor = Java.type('io.anuke.mindustry.world.blocks.power.ImpactReactor') -const ItemLiquidGenerator = Java.type('io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator') -const LightBlock = Java.type('io.anuke.mindustry.world.blocks.power.LightBlock') -const NuclearReactor = Java.type('io.anuke.mindustry.world.blocks.power.NuclearReactor') -const PowerDiode = Java.type('io.anuke.mindustry.world.blocks.power.PowerDiode') -const PowerDistributor = Java.type('io.anuke.mindustry.world.blocks.power.PowerDistributor') -const PowerGenerator = Java.type('io.anuke.mindustry.world.blocks.power.PowerGenerator') -const PowerGraph = Java.type('io.anuke.mindustry.world.blocks.power.PowerGraph') -const PowerNode = Java.type('io.anuke.mindustry.world.blocks.power.PowerNode') -const SingleTypeGenerator = Java.type('io.anuke.mindustry.world.blocks.power.SingleTypeGenerator') -const SolarGenerator = Java.type('io.anuke.mindustry.world.blocks.power.SolarGenerator') -const ThermalGenerator = Java.type('io.anuke.mindustry.world.blocks.power.ThermalGenerator') -const Cultivator = Java.type('io.anuke.mindustry.world.blocks.production.Cultivator') -const Drill = Java.type('io.anuke.mindustry.world.blocks.production.Drill') -const Fracker = Java.type('io.anuke.mindustry.world.blocks.production.Fracker') -const GenericCrafter = Java.type('io.anuke.mindustry.world.blocks.production.GenericCrafter') -const GenericSmelter = Java.type('io.anuke.mindustry.world.blocks.production.GenericSmelter') -const Incinerator = Java.type('io.anuke.mindustry.world.blocks.production.Incinerator') -const LiquidConverter = Java.type('io.anuke.mindustry.world.blocks.production.LiquidConverter') -const Pump = Java.type('io.anuke.mindustry.world.blocks.production.Pump') -const Separator = Java.type('io.anuke.mindustry.world.blocks.production.Separator') -const SolidPump = Java.type('io.anuke.mindustry.world.blocks.production.SolidPump') -const ItemSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.ItemSource') -const ItemVoid = Java.type('io.anuke.mindustry.world.blocks.sandbox.ItemVoid') -const LiquidSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.LiquidSource') -const PowerSource = Java.type('io.anuke.mindustry.world.blocks.sandbox.PowerSource') -const PowerVoid = Java.type('io.anuke.mindustry.world.blocks.sandbox.PowerVoid') -const CoreBlock = Java.type('io.anuke.mindustry.world.blocks.storage.CoreBlock') -const LaunchPad = Java.type('io.anuke.mindustry.world.blocks.storage.LaunchPad') -const StorageBlock = Java.type('io.anuke.mindustry.world.blocks.storage.StorageBlock') -const Unloader = Java.type('io.anuke.mindustry.world.blocks.storage.Unloader') -const Vault = Java.type('io.anuke.mindustry.world.blocks.storage.Vault') -const CommandCenter = Java.type('io.anuke.mindustry.world.blocks.units.CommandCenter') -const MechPad = Java.type('io.anuke.mindustry.world.blocks.units.MechPad') -const RallyPoint = Java.type('io.anuke.mindustry.world.blocks.units.RallyPoint') -const RepairPoint = Java.type('io.anuke.mindustry.world.blocks.units.RepairPoint') -const UnitFactory = Java.type('io.anuke.mindustry.world.blocks.units.UnitFactory') -const Consume = Java.type('io.anuke.mindustry.world.consumers.Consume') -const ConsumeItemFilter = Java.type('io.anuke.mindustry.world.consumers.ConsumeItemFilter') -const ConsumeItems = Java.type('io.anuke.mindustry.world.consumers.ConsumeItems') -const ConsumeLiquid = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquid') -const ConsumeLiquidBase = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquidBase') -const ConsumeLiquidFilter = Java.type('io.anuke.mindustry.world.consumers.ConsumeLiquidFilter') -const ConsumePower = Java.type('io.anuke.mindustry.world.consumers.ConsumePower') -const ConsumeType = Java.type('io.anuke.mindustry.world.consumers.ConsumeType') -const Consumers = Java.type('io.anuke.mindustry.world.consumers.Consumers') -const Attribute = Java.type('io.anuke.mindustry.world.meta.Attribute') -const BlockBars = Java.type('io.anuke.mindustry.world.meta.BlockBars') -const BlockFlag = Java.type('io.anuke.mindustry.world.meta.BlockFlag') -const BlockGroup = Java.type('io.anuke.mindustry.world.meta.BlockGroup') -const BlockStat = Java.type('io.anuke.mindustry.world.meta.BlockStat') -const BlockStats = Java.type('io.anuke.mindustry.world.meta.BlockStats') -const BuildVisibility = Java.type('io.anuke.mindustry.world.meta.BuildVisibility') -const PowerType = Java.type('io.anuke.mindustry.world.meta.PowerType') -const Producers = Java.type('io.anuke.mindustry.world.meta.Producers') -const StatCategory = Java.type('io.anuke.mindustry.world.meta.StatCategory') -const StatUnit = Java.type('io.anuke.mindustry.world.meta.StatUnit') -const StatValue = Java.type('io.anuke.mindustry.world.meta.StatValue') -const AmmoListValue = Java.type('io.anuke.mindustry.world.meta.values.AmmoListValue') -const BooleanValue = Java.type('io.anuke.mindustry.world.meta.values.BooleanValue') -const BoosterListValue = Java.type('io.anuke.mindustry.world.meta.values.BoosterListValue') -const ItemFilterValue = Java.type('io.anuke.mindustry.world.meta.values.ItemFilterValue') -const ItemListValue = Java.type('io.anuke.mindustry.world.meta.values.ItemListValue') -const LiquidFilterValue = Java.type('io.anuke.mindustry.world.meta.values.LiquidFilterValue') -const LiquidValue = Java.type('io.anuke.mindustry.world.meta.values.LiquidValue') -const NumberValue = Java.type('io.anuke.mindustry.world.meta.values.NumberValue') -const StringValue = Java.type('io.anuke.mindustry.world.meta.values.StringValue') -const BlockModule = Java.type('io.anuke.mindustry.world.modules.BlockModule') -const ConsumeModule = Java.type('io.anuke.mindustry.world.modules.ConsumeModule') -const ItemModule = Java.type('io.anuke.mindustry.world.modules.ItemModule') -const LiquidModule = Java.type('io.anuke.mindustry.world.modules.LiquidModule') -const PowerModule = Java.type('io.anuke.mindustry.world.modules.PowerModule') -const Produce = Java.type('io.anuke.mindustry.world.producers.Produce') -const ProduceItem = Java.type('io.anuke.mindustry.world.producers.ProduceItem') -const extend = Java.extend +const print = function(obj){ + java.lang.System.out.println(obj ? String(obj) : "null") +} +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} +const Core = Packages.io.anuke.arc.Core +const Boolc = Packages.io.anuke.arc.func.Boolc +const Boolf = Packages.io.anuke.arc.func.Boolf +const Boolf2 = Packages.io.anuke.arc.func.Boolf2 +const Boolp = Packages.io.anuke.arc.func.Boolp +const Cons = Packages.io.anuke.arc.func.Cons +const Cons2 = Packages.io.anuke.arc.func.Cons2 +const Floatc = Packages.io.anuke.arc.func.Floatc +const Floatc2 = Packages.io.anuke.arc.func.Floatc2 +const Floatc4 = Packages.io.anuke.arc.func.Floatc4 +const Floatf = Packages.io.anuke.arc.func.Floatf +const Floatp = Packages.io.anuke.arc.func.Floatp +const Func = Packages.io.anuke.arc.func.Func +const Func2 = Packages.io.anuke.arc.func.Func2 +const Func3 = Packages.io.anuke.arc.func.Func3 +const Intc = Packages.io.anuke.arc.func.Intc +const Intc2 = Packages.io.anuke.arc.func.Intc2 +const Intc4 = Packages.io.anuke.arc.func.Intc4 +const Intf = Packages.io.anuke.arc.func.Intf +const Intp = Packages.io.anuke.arc.func.Intp +const Prov = Packages.io.anuke.arc.func.Prov +const Draw = Packages.io.anuke.arc.graphics.g2d.Draw +const TextureAtlas = Packages.io.anuke.arc.graphics.g2d.TextureAtlas +const TextureRegion = Packages.io.anuke.arc.graphics.g2d.TextureRegion +const Time = Packages.io.anuke.arc.util.Time +const Vars = Packages.io.anuke.mindustry.Vars +const BlockIndexer = Packages.io.anuke.mindustry.ai.BlockIndexer +const Pathfinder = Packages.io.anuke.mindustry.ai.Pathfinder +const WaveSpawner = Packages.io.anuke.mindustry.ai.WaveSpawner +const Blocks = Packages.io.anuke.mindustry.content.Blocks +const Bullets = Packages.io.anuke.mindustry.content.Bullets +const Fx = Packages.io.anuke.mindustry.content.Fx +const Items = Packages.io.anuke.mindustry.content.Items +const Liquids = Packages.io.anuke.mindustry.content.Liquids +const Loadouts = Packages.io.anuke.mindustry.content.Loadouts +const Mechs = Packages.io.anuke.mindustry.content.Mechs +const StatusEffects = Packages.io.anuke.mindustry.content.StatusEffects +const TechTree = Packages.io.anuke.mindustry.content.TechTree +const TypeIDs = Packages.io.anuke.mindustry.content.TypeIDs +const UnitTypes = Packages.io.anuke.mindustry.content.UnitTypes +const Zones = Packages.io.anuke.mindustry.content.Zones +const ContentLoader = Packages.io.anuke.mindustry.core.ContentLoader +const Control = Packages.io.anuke.mindustry.core.Control +const FileTree = Packages.io.anuke.mindustry.core.FileTree +const GameState = Packages.io.anuke.mindustry.core.GameState +const Logic = Packages.io.anuke.mindustry.core.Logic +const Platform = Packages.io.anuke.mindustry.core.Platform +const Renderer = Packages.io.anuke.mindustry.core.Renderer +const UI = Packages.io.anuke.mindustry.core.UI +const Version = Packages.io.anuke.mindustry.core.Version +const World = Packages.io.anuke.mindustry.core.World +const Content = Packages.io.anuke.mindustry.ctype.Content +const ContentList = Packages.io.anuke.mindustry.ctype.ContentList +const MappableContent = Packages.io.anuke.mindustry.ctype.MappableContent +const UnlockableContent = Packages.io.anuke.mindustry.ctype.UnlockableContent +const DrawOperation = Packages.io.anuke.mindustry.editor.DrawOperation +const EditorTile = Packages.io.anuke.mindustry.editor.EditorTile +const EditorTool = Packages.io.anuke.mindustry.editor.EditorTool +const MapEditor = Packages.io.anuke.mindustry.editor.MapEditor +const MapRenderer = Packages.io.anuke.mindustry.editor.MapRenderer +const OperationStack = Packages.io.anuke.mindustry.editor.OperationStack +const Damage = Packages.io.anuke.mindustry.entities.Damage +const Effects = Packages.io.anuke.mindustry.entities.Effects +const Entities = Packages.io.anuke.mindustry.entities.Entities +const EntityCollisions = Packages.io.anuke.mindustry.entities.EntityCollisions +const EntityGroup = Packages.io.anuke.mindustry.entities.EntityGroup +const Predict = Packages.io.anuke.mindustry.entities.Predict +const TargetPriority = Packages.io.anuke.mindustry.entities.TargetPriority +const Units = Packages.io.anuke.mindustry.entities.Units +const ArtilleryBulletType = Packages.io.anuke.mindustry.entities.bullet.ArtilleryBulletType +const BasicBulletType = Packages.io.anuke.mindustry.entities.bullet.BasicBulletType +const BombBulletType = Packages.io.anuke.mindustry.entities.bullet.BombBulletType +const BulletType = Packages.io.anuke.mindustry.entities.bullet.BulletType +const FlakBulletType = Packages.io.anuke.mindustry.entities.bullet.FlakBulletType +const HealBulletType = Packages.io.anuke.mindustry.entities.bullet.HealBulletType +const LiquidBulletType = Packages.io.anuke.mindustry.entities.bullet.LiquidBulletType +const MassDriverBolt = Packages.io.anuke.mindustry.entities.bullet.MassDriverBolt +const MissileBulletType = Packages.io.anuke.mindustry.entities.bullet.MissileBulletType +const Decal = Packages.io.anuke.mindustry.entities.effect.Decal +const Fire = Packages.io.anuke.mindustry.entities.effect.Fire +const GroundEffectEntity = Packages.io.anuke.mindustry.entities.effect.GroundEffectEntity +const ItemTransfer = Packages.io.anuke.mindustry.entities.effect.ItemTransfer +const Lightning = Packages.io.anuke.mindustry.entities.effect.Lightning +const Puddle = Packages.io.anuke.mindustry.entities.effect.Puddle +const RubbleDecal = Packages.io.anuke.mindustry.entities.effect.RubbleDecal +const ScorchDecal = Packages.io.anuke.mindustry.entities.effect.ScorchDecal +const AbsorbTrait = Packages.io.anuke.mindustry.entities.traits.AbsorbTrait +const BelowLiquidTrait = Packages.io.anuke.mindustry.entities.traits.BelowLiquidTrait +const BuilderMinerTrait = Packages.io.anuke.mindustry.entities.traits.BuilderMinerTrait +const BuilderTrait = Packages.io.anuke.mindustry.entities.traits.BuilderTrait +const DamageTrait = Packages.io.anuke.mindustry.entities.traits.DamageTrait +const DrawTrait = Packages.io.anuke.mindustry.entities.traits.DrawTrait +const Entity = Packages.io.anuke.mindustry.entities.traits.Entity +const HealthTrait = Packages.io.anuke.mindustry.entities.traits.HealthTrait +const KillerTrait = Packages.io.anuke.mindustry.entities.traits.KillerTrait +const MinerTrait = Packages.io.anuke.mindustry.entities.traits.MinerTrait +const MoveTrait = Packages.io.anuke.mindustry.entities.traits.MoveTrait +const SaveTrait = Packages.io.anuke.mindustry.entities.traits.SaveTrait +const Saveable = Packages.io.anuke.mindustry.entities.traits.Saveable +const ScaleTrait = Packages.io.anuke.mindustry.entities.traits.ScaleTrait +const ShooterTrait = Packages.io.anuke.mindustry.entities.traits.ShooterTrait +const SolidTrait = Packages.io.anuke.mindustry.entities.traits.SolidTrait +const SpawnerTrait = Packages.io.anuke.mindustry.entities.traits.SpawnerTrait +const SyncTrait = Packages.io.anuke.mindustry.entities.traits.SyncTrait +const TargetTrait = Packages.io.anuke.mindustry.entities.traits.TargetTrait +const TeamTrait = Packages.io.anuke.mindustry.entities.traits.TeamTrait +const TimeTrait = Packages.io.anuke.mindustry.entities.traits.TimeTrait +const TypeTrait = Packages.io.anuke.mindustry.entities.traits.TypeTrait +const VelocityTrait = Packages.io.anuke.mindustry.entities.traits.VelocityTrait +const BaseEntity = Packages.io.anuke.mindustry.entities.type.BaseEntity +const BaseUnit = Packages.io.anuke.mindustry.entities.type.BaseUnit +const Bullet = Packages.io.anuke.mindustry.entities.type.Bullet +const DestructibleEntity = Packages.io.anuke.mindustry.entities.type.DestructibleEntity +const EffectEntity = Packages.io.anuke.mindustry.entities.type.EffectEntity +const Player = Packages.io.anuke.mindustry.entities.type.Player +const SolidEntity = Packages.io.anuke.mindustry.entities.type.SolidEntity +const TileEntity = Packages.io.anuke.mindustry.entities.type.TileEntity +const TimedEntity = Packages.io.anuke.mindustry.entities.type.TimedEntity +const Unit = Packages.io.anuke.mindustry.entities.type.Unit +const BaseDrone = Packages.io.anuke.mindustry.entities.type.base.BaseDrone +const BuilderDrone = Packages.io.anuke.mindustry.entities.type.base.BuilderDrone +const Crawler = Packages.io.anuke.mindustry.entities.type.base.Crawler +const Dagger = Packages.io.anuke.mindustry.entities.type.base.Dagger +const Draug = Packages.io.anuke.mindustry.entities.type.base.Draug +const Eruptor = Packages.io.anuke.mindustry.entities.type.base.Eruptor +const FlyingUnit = Packages.io.anuke.mindustry.entities.type.base.FlyingUnit +const Fortress = Packages.io.anuke.mindustry.entities.type.base.Fortress +const Ghoul = Packages.io.anuke.mindustry.entities.type.base.Ghoul +const GroundUnit = Packages.io.anuke.mindustry.entities.type.base.GroundUnit +const MinerDrone = Packages.io.anuke.mindustry.entities.type.base.MinerDrone +const Phantom = Packages.io.anuke.mindustry.entities.type.base.Phantom +const RepairDrone = Packages.io.anuke.mindustry.entities.type.base.RepairDrone +const Revenant = Packages.io.anuke.mindustry.entities.type.base.Revenant +const Spirit = Packages.io.anuke.mindustry.entities.type.base.Spirit +const Titan = Packages.io.anuke.mindustry.entities.type.base.Titan +const Wraith = Packages.io.anuke.mindustry.entities.type.base.Wraith +const StateMachine = Packages.io.anuke.mindustry.entities.units.StateMachine +const Statuses = Packages.io.anuke.mindustry.entities.units.Statuses +const UnitCommand = Packages.io.anuke.mindustry.entities.units.UnitCommand +const UnitDrops = Packages.io.anuke.mindustry.entities.units.UnitDrops +const UnitState = Packages.io.anuke.mindustry.entities.units.UnitState +const DefaultWaves = Packages.io.anuke.mindustry.game.DefaultWaves +const Difficulty = Packages.io.anuke.mindustry.game.Difficulty +const EventType = Packages.io.anuke.mindustry.game.EventType +const Gamemode = Packages.io.anuke.mindustry.game.Gamemode +const GlobalData = Packages.io.anuke.mindustry.game.GlobalData +const LoopControl = Packages.io.anuke.mindustry.game.LoopControl +const MusicControl = Packages.io.anuke.mindustry.game.MusicControl +const Objective = Packages.io.anuke.mindustry.game.Objective +const Objectives = Packages.io.anuke.mindustry.game.Objectives +const Rules = Packages.io.anuke.mindustry.game.Rules +const Saves = Packages.io.anuke.mindustry.game.Saves +const Schematic = Packages.io.anuke.mindustry.game.Schematic +const Schematics = Packages.io.anuke.mindustry.game.Schematics +const SoundLoop = Packages.io.anuke.mindustry.game.SoundLoop +const SpawnGroup = Packages.io.anuke.mindustry.game.SpawnGroup +const Stats = Packages.io.anuke.mindustry.game.Stats +const Team = Packages.io.anuke.mindustry.game.Team +const Teams = Packages.io.anuke.mindustry.game.Teams +const Tutorial = Packages.io.anuke.mindustry.game.Tutorial +const BlockRenderer = Packages.io.anuke.mindustry.graphics.BlockRenderer +const Bloom = Packages.io.anuke.mindustry.graphics.Bloom +const CacheLayer = Packages.io.anuke.mindustry.graphics.CacheLayer +const Drawf = Packages.io.anuke.mindustry.graphics.Drawf +const FloorRenderer = Packages.io.anuke.mindustry.graphics.FloorRenderer +const IndexedRenderer = Packages.io.anuke.mindustry.graphics.IndexedRenderer +const Layer = Packages.io.anuke.mindustry.graphics.Layer +const LightRenderer = Packages.io.anuke.mindustry.graphics.LightRenderer +const MenuRenderer = Packages.io.anuke.mindustry.graphics.MenuRenderer +const MinimapRenderer = Packages.io.anuke.mindustry.graphics.MinimapRenderer +const MultiPacker = Packages.io.anuke.mindustry.graphics.MultiPacker +const OverlayRenderer = Packages.io.anuke.mindustry.graphics.OverlayRenderer +const Pal = Packages.io.anuke.mindustry.graphics.Pal +const Pixelator = Packages.io.anuke.mindustry.graphics.Pixelator +const Shaders = Packages.io.anuke.mindustry.graphics.Shaders +const Binding = Packages.io.anuke.mindustry.input.Binding +const DesktopInput = Packages.io.anuke.mindustry.input.DesktopInput +const InputHandler = Packages.io.anuke.mindustry.input.InputHandler +const MobileInput = Packages.io.anuke.mindustry.input.MobileInput +const PlaceMode = Packages.io.anuke.mindustry.input.PlaceMode +const Placement = Packages.io.anuke.mindustry.input.Placement +const Map = Packages.io.anuke.mindustry.maps.Map +const Maps = Packages.io.anuke.mindustry.maps.Maps +const BlendFilter = Packages.io.anuke.mindustry.maps.filters.BlendFilter +const ClearFilter = Packages.io.anuke.mindustry.maps.filters.ClearFilter +const DistortFilter = Packages.io.anuke.mindustry.maps.filters.DistortFilter +const FilterOption = Packages.io.anuke.mindustry.maps.filters.FilterOption +const GenerateFilter = Packages.io.anuke.mindustry.maps.filters.GenerateFilter +const MedianFilter = Packages.io.anuke.mindustry.maps.filters.MedianFilter +const MirrorFilter = Packages.io.anuke.mindustry.maps.filters.MirrorFilter +const NoiseFilter = Packages.io.anuke.mindustry.maps.filters.NoiseFilter +const OreFilter = Packages.io.anuke.mindustry.maps.filters.OreFilter +const OreMedianFilter = Packages.io.anuke.mindustry.maps.filters.OreMedianFilter +const RiverNoiseFilter = Packages.io.anuke.mindustry.maps.filters.RiverNoiseFilter +const ScatterFilter = Packages.io.anuke.mindustry.maps.filters.ScatterFilter +const TerrainFilter = Packages.io.anuke.mindustry.maps.filters.TerrainFilter +const BasicGenerator = Packages.io.anuke.mindustry.maps.generators.BasicGenerator +const Generator = Packages.io.anuke.mindustry.maps.generators.Generator +const MapGenerator = Packages.io.anuke.mindustry.maps.generators.MapGenerator +const RandomGenerator = Packages.io.anuke.mindustry.maps.generators.RandomGenerator +const DesertWastesGenerator = Packages.io.anuke.mindustry.maps.zonegen.DesertWastesGenerator +const OvergrowthGenerator = Packages.io.anuke.mindustry.maps.zonegen.OvergrowthGenerator +const Category = Packages.io.anuke.mindustry.type.Category +const ContentType = Packages.io.anuke.mindustry.type.ContentType +const Item = Packages.io.anuke.mindustry.type.Item +const ItemStack = Packages.io.anuke.mindustry.type.ItemStack +const ItemType = Packages.io.anuke.mindustry.type.ItemType +const Liquid = Packages.io.anuke.mindustry.type.Liquid +const LiquidStack = Packages.io.anuke.mindustry.type.LiquidStack +const Mech = Packages.io.anuke.mindustry.type.Mech +const Publishable = Packages.io.anuke.mindustry.type.Publishable +const StatusEffect = Packages.io.anuke.mindustry.type.StatusEffect +const TypeID = Packages.io.anuke.mindustry.type.TypeID +const UnitType = Packages.io.anuke.mindustry.type.UnitType +const Weapon = Packages.io.anuke.mindustry.type.Weapon +const WeatherEvent = Packages.io.anuke.mindustry.type.WeatherEvent +const Zone = Packages.io.anuke.mindustry.type.Zone +const Cicon = Packages.io.anuke.mindustry.ui.Cicon +const ContentDisplay = Packages.io.anuke.mindustry.ui.ContentDisplay +const Fonts = Packages.io.anuke.mindustry.ui.Fonts +const IconSize = Packages.io.anuke.mindustry.ui.IconSize +const IntFormat = Packages.io.anuke.mindustry.ui.IntFormat +const Links = Packages.io.anuke.mindustry.ui.Links +const Styles = Packages.io.anuke.mindustry.ui.Styles +const BlockConfigFragment = Packages.io.anuke.mindustry.ui.fragments.BlockConfigFragment +const BlockInventoryFragment = Packages.io.anuke.mindustry.ui.fragments.BlockInventoryFragment +const FadeInFragment = Packages.io.anuke.mindustry.ui.fragments.FadeInFragment +const Fragment = Packages.io.anuke.mindustry.ui.fragments.Fragment +const HudFragment = Packages.io.anuke.mindustry.ui.fragments.HudFragment +const LoadingFragment = Packages.io.anuke.mindustry.ui.fragments.LoadingFragment +const MenuFragment = Packages.io.anuke.mindustry.ui.fragments.MenuFragment +const OverlayFragment = Packages.io.anuke.mindustry.ui.fragments.OverlayFragment +const PlacementFragment = Packages.io.anuke.mindustry.ui.fragments.PlacementFragment +const PlayerListFragment = Packages.io.anuke.mindustry.ui.fragments.PlayerListFragment +const BranchTreeLayout = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout +const RadialTreeLayout = Packages.io.anuke.mindustry.ui.layout.RadialTreeLayout +const TreeLayout = Packages.io.anuke.mindustry.ui.layout.TreeLayout +const Block = Packages.io.anuke.mindustry.world.Block +const BlockStorage = Packages.io.anuke.mindustry.world.BlockStorage +const Build = Packages.io.anuke.mindustry.world.Build +const CachedTile = Packages.io.anuke.mindustry.world.CachedTile +const DirectionalItemBuffer = Packages.io.anuke.mindustry.world.DirectionalItemBuffer +const Edges = Packages.io.anuke.mindustry.world.Edges +const ItemBuffer = Packages.io.anuke.mindustry.world.ItemBuffer +const LegacyColorMapper = Packages.io.anuke.mindustry.world.LegacyColorMapper +const Pos = Packages.io.anuke.mindustry.world.Pos +const StaticTree = Packages.io.anuke.mindustry.world.StaticTree +const Tile = Packages.io.anuke.mindustry.world.Tile +const WorldContext = Packages.io.anuke.mindustry.world.WorldContext +const Attributes = Packages.io.anuke.mindustry.world.blocks.Attributes +const Autotiler = Packages.io.anuke.mindustry.world.blocks.Autotiler +const BlockPart = Packages.io.anuke.mindustry.world.blocks.BlockPart +const BuildBlock = Packages.io.anuke.mindustry.world.blocks.BuildBlock +const DoubleOverlayFloor = Packages.io.anuke.mindustry.world.blocks.DoubleOverlayFloor +const Floor = Packages.io.anuke.mindustry.world.blocks.Floor +const ItemSelection = Packages.io.anuke.mindustry.world.blocks.ItemSelection +const LiquidBlock = Packages.io.anuke.mindustry.world.blocks.LiquidBlock +const OreBlock = Packages.io.anuke.mindustry.world.blocks.OreBlock +const OverlayFloor = Packages.io.anuke.mindustry.world.blocks.OverlayFloor +const PowerBlock = Packages.io.anuke.mindustry.world.blocks.PowerBlock +const RespawnBlock = Packages.io.anuke.mindustry.world.blocks.RespawnBlock +const Rock = Packages.io.anuke.mindustry.world.blocks.Rock +const StaticWall = Packages.io.anuke.mindustry.world.blocks.StaticWall +const TreeBlock = Packages.io.anuke.mindustry.world.blocks.TreeBlock +const DeflectorWall = Packages.io.anuke.mindustry.world.blocks.defense.DeflectorWall +const Door = Packages.io.anuke.mindustry.world.blocks.defense.Door +const ForceProjector = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector +const MendProjector = Packages.io.anuke.mindustry.world.blocks.defense.MendProjector +const OverdriveProjector = Packages.io.anuke.mindustry.world.blocks.defense.OverdriveProjector +const ShockMine = Packages.io.anuke.mindustry.world.blocks.defense.ShockMine +const SurgeWall = Packages.io.anuke.mindustry.world.blocks.defense.SurgeWall +const Wall = Packages.io.anuke.mindustry.world.blocks.defense.Wall +const ArtilleryTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret +const BurstTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret +const ChargeTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret +const CooledTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret +const DoubleTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret +const ItemTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret +const LaserTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret +const LiquidTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret +const PowerTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret +const Turret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret +const ArmoredConveyor = Packages.io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor +const BufferedItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge +const Conveyor = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor +const ExtendingItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge +const ItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ItemBridge +const Junction = Packages.io.anuke.mindustry.world.blocks.distribution.Junction +const MassDriver = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver +const OverflowGate = Packages.io.anuke.mindustry.world.blocks.distribution.OverflowGate +const Router = Packages.io.anuke.mindustry.world.blocks.distribution.Router +const Sorter = Packages.io.anuke.mindustry.world.blocks.distribution.Sorter +const ArmoredConduit = Packages.io.anuke.mindustry.world.blocks.liquid.ArmoredConduit +const Conduit = Packages.io.anuke.mindustry.world.blocks.liquid.Conduit +const LiquidBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidBridge +const LiquidExtendingBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge +const LiquidJunction = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidJunction +const LiquidOverflowGate = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate +const LiquidRouter = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidRouter +const LiquidTank = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidTank +const LogicBlock = Packages.io.anuke.mindustry.world.blocks.logic.LogicBlock +const MessageBlock = Packages.io.anuke.mindustry.world.blocks.logic.MessageBlock +const Battery = Packages.io.anuke.mindustry.world.blocks.power.Battery +const BurnerGenerator = Packages.io.anuke.mindustry.world.blocks.power.BurnerGenerator +const ConditionalConsumePower = Packages.io.anuke.mindustry.world.blocks.power.ConditionalConsumePower +const DecayGenerator = Packages.io.anuke.mindustry.world.blocks.power.DecayGenerator +const ImpactReactor = Packages.io.anuke.mindustry.world.blocks.power.ImpactReactor +const ItemLiquidGenerator = Packages.io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator +const LightBlock = Packages.io.anuke.mindustry.world.blocks.power.LightBlock +const NuclearReactor = Packages.io.anuke.mindustry.world.blocks.power.NuclearReactor +const PowerDiode = Packages.io.anuke.mindustry.world.blocks.power.PowerDiode +const PowerDistributor = Packages.io.anuke.mindustry.world.blocks.power.PowerDistributor +const PowerGenerator = Packages.io.anuke.mindustry.world.blocks.power.PowerGenerator +const PowerGraph = Packages.io.anuke.mindustry.world.blocks.power.PowerGraph +const PowerNode = Packages.io.anuke.mindustry.world.blocks.power.PowerNode +const SingleTypeGenerator = Packages.io.anuke.mindustry.world.blocks.power.SingleTypeGenerator +const SolarGenerator = Packages.io.anuke.mindustry.world.blocks.power.SolarGenerator +const ThermalGenerator = Packages.io.anuke.mindustry.world.blocks.power.ThermalGenerator +const Cultivator = Packages.io.anuke.mindustry.world.blocks.production.Cultivator +const Drill = Packages.io.anuke.mindustry.world.blocks.production.Drill +const Fracker = Packages.io.anuke.mindustry.world.blocks.production.Fracker +const GenericCrafter = Packages.io.anuke.mindustry.world.blocks.production.GenericCrafter +const GenericSmelter = Packages.io.anuke.mindustry.world.blocks.production.GenericSmelter +const Incinerator = Packages.io.anuke.mindustry.world.blocks.production.Incinerator +const LiquidConverter = Packages.io.anuke.mindustry.world.blocks.production.LiquidConverter +const Pump = Packages.io.anuke.mindustry.world.blocks.production.Pump +const Separator = Packages.io.anuke.mindustry.world.blocks.production.Separator +const SolidPump = Packages.io.anuke.mindustry.world.blocks.production.SolidPump +const ItemSource = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemSource +const ItemVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemVoid +const LiquidSource = Packages.io.anuke.mindustry.world.blocks.sandbox.LiquidSource +const PowerSource = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerSource +const PowerVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerVoid +const CoreBlock = Packages.io.anuke.mindustry.world.blocks.storage.CoreBlock +const LaunchPad = Packages.io.anuke.mindustry.world.blocks.storage.LaunchPad +const StorageBlock = Packages.io.anuke.mindustry.world.blocks.storage.StorageBlock +const Unloader = Packages.io.anuke.mindustry.world.blocks.storage.Unloader +const Vault = Packages.io.anuke.mindustry.world.blocks.storage.Vault +const CommandCenter = Packages.io.anuke.mindustry.world.blocks.units.CommandCenter +const MechPad = Packages.io.anuke.mindustry.world.blocks.units.MechPad +const RallyPoint = Packages.io.anuke.mindustry.world.blocks.units.RallyPoint +const RepairPoint = Packages.io.anuke.mindustry.world.blocks.units.RepairPoint +const UnitFactory = Packages.io.anuke.mindustry.world.blocks.units.UnitFactory +const Consume = Packages.io.anuke.mindustry.world.consumers.Consume +const ConsumeItemFilter = Packages.io.anuke.mindustry.world.consumers.ConsumeItemFilter +const ConsumeItems = Packages.io.anuke.mindustry.world.consumers.ConsumeItems +const ConsumeLiquid = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquid +const ConsumeLiquidBase = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquidBase +const ConsumeLiquidFilter = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquidFilter +const ConsumePower = Packages.io.anuke.mindustry.world.consumers.ConsumePower +const ConsumeType = Packages.io.anuke.mindustry.world.consumers.ConsumeType +const Consumers = Packages.io.anuke.mindustry.world.consumers.Consumers +const Attribute = Packages.io.anuke.mindustry.world.meta.Attribute +const BlockBars = Packages.io.anuke.mindustry.world.meta.BlockBars +const BlockFlag = Packages.io.anuke.mindustry.world.meta.BlockFlag +const BlockGroup = Packages.io.anuke.mindustry.world.meta.BlockGroup +const BlockStat = Packages.io.anuke.mindustry.world.meta.BlockStat +const BlockStats = Packages.io.anuke.mindustry.world.meta.BlockStats +const BuildVisibility = Packages.io.anuke.mindustry.world.meta.BuildVisibility +const PowerType = Packages.io.anuke.mindustry.world.meta.PowerType +const Producers = Packages.io.anuke.mindustry.world.meta.Producers +const StatCategory = Packages.io.anuke.mindustry.world.meta.StatCategory +const StatUnit = Packages.io.anuke.mindustry.world.meta.StatUnit +const StatValue = Packages.io.anuke.mindustry.world.meta.StatValue +const AmmoListValue = Packages.io.anuke.mindustry.world.meta.values.AmmoListValue +const BooleanValue = Packages.io.anuke.mindustry.world.meta.values.BooleanValue +const BoosterListValue = Packages.io.anuke.mindustry.world.meta.values.BoosterListValue +const ItemFilterValue = Packages.io.anuke.mindustry.world.meta.values.ItemFilterValue +const ItemListValue = Packages.io.anuke.mindustry.world.meta.values.ItemListValue +const LiquidFilterValue = Packages.io.anuke.mindustry.world.meta.values.LiquidFilterValue +const LiquidValue = Packages.io.anuke.mindustry.world.meta.values.LiquidValue +const NumberValue = Packages.io.anuke.mindustry.world.meta.values.NumberValue +const StringValue = Packages.io.anuke.mindustry.world.meta.values.StringValue +const BlockModule = Packages.io.anuke.mindustry.world.modules.BlockModule +const ConsumeModule = Packages.io.anuke.mindustry.world.modules.ConsumeModule +const ItemModule = Packages.io.anuke.mindustry.world.modules.ItemModule +const LiquidModule = Packages.io.anuke.mindustry.world.modules.LiquidModule +const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule +const Produce = Packages.io.anuke.mindustry.world.producers.Produce +const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index d5be037ede..055e1bda8e 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -13,7 +13,6 @@ public class Scripts{ private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; private final Context context; private final String wrapper; - private Context console; private Scriptable scope; public Scripts(){ @@ -24,18 +23,19 @@ public class Scripts{ context.setOptimizationLevel(-1); } + //context.setClassShutter(ClassAccess.allowedClassNames::contains); scope = context.initStandardObjects(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); - run(wrapper); + run(Core.files.internal("scripts/global.js").readString(), "global.js"); Log.info("Time to load script engine: {0}", Time.elapsed()); } public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString())); + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()), file.name()); } - private void run(String script){ - Log.info(context.evaluateString(scope, script, "???", 0, null)); + private void run(String script, String file){ + context.evaluateString(scope, script, file, 1, null); } } diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index dc5a909504..8841a07be3 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -46,11 +46,10 @@ public class ScriptStubGenerator{ || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); - for(Class type : classes){ - result.append("const ").append(type.getSimpleName()).append(" = ").append("Java.type('").append(type.getCanonicalName()).append("')\n"); - } - result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); + for(Class type : classes){ + result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); + } //Log.info(result); From c08aa1f3d6e9d5832f7685e7f8cbab117d0744d3 Mon Sep 17 00:00:00 2001 From: Martin Gebert Date: Tue, 3 Dec 2019 23:16:58 +0100 Subject: [PATCH 020/107] add and fix some German translations --- core/assets/bundles/bundle_de.properties | 85 +++++++++++++++--------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 4d21b8d8db..349e521572 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -3,7 +3,7 @@ credits = Danksagungen contributors = Übersetzer und Mitwirkende discord = Trete dem Mindustry Discord bei! link.discord.description = Der offizielle Mindustry Discord-Chatroom -link.reddit.description = The Mindustry subreddit +link.reddit.description = Der Mindustry Subreddit link.github.description = Quellcode des Spiels link.changelog.description = Liste der Änderungen link.dev-builds.description = Entwicklungs-Builds (instabil) @@ -68,7 +68,7 @@ position = Position close = Schließen website = Website quit = Verlassen -save.quit = Save & Quit +save.quit = Speichern & Beenden maps = Karten maps.browse = Browse Maps continue = Weiter @@ -87,7 +87,7 @@ mods = Mods mods.none = [LIGHT_GRAY]No mods found! mods.guide = Modding Guide mods.report = Report Bug -mods.openfolder = Open Mod Folder +mods.openfolder = Mod Verzeichnis öffnen mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable @@ -97,8 +97,8 @@ mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[ligh mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Reload Required -mod.import = Import Mod -mod.import.github = Import GitHub Mod +mod.import = Mod importieren +mod.import.github = GitHub Mod importieren mod.remove.confirm = This mod will be deleted. mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} @@ -133,16 +133,16 @@ server.kicked.idInUse = Du bist bereits auf dem Server! Anmeldungen mit zwei Acc server.kicked.customClient = Der Server akzeptiert keine Custom Builds von Mindustry. Lade dir die offizielle Version herunter. server.kicked.gameover = Game Over! server.versions = Deine Version:[accent] {0}[]\nServerversion:[accent] {1}[] -host.info = Der [accent]host[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalem Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du Leuten die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stell sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. -join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalem Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemand per IP verbinden willst musst du den Host nach seiner IP fragen. +host.info = Der [accent]Server hosten[]-Knopf startet einen Server auf den Ports [scarlet]6567[] und [scarlet]6568.[]\nJeder im gleichen [LIGHT_GRAY]W-Lan oder lokalen Netzwerk[] sollte deinen Server in seiner Server Liste sehen können.\n\nWenn du anderen die Verbindung über IP ermöglichen willst, benötigst du [accent]Port-Forwarding[].\n\n[LIGHT_GRAY]Hinweis: Falls es Probleme mit der Verbindung im Netzwerk gibt, stelle sicher, dass Mindustry in deinen Firewall Einstellungen Zugriff auf das lokale Netzwerk hat. +join.info = Hier kannst du eine [accent]Server-IP[] eingeben um dich zu verbinden oder Server im [accent]lokalen Netzwerk[] entdecken und dich mit ihnen verbinden.\nSowohl Spielen über das lokale Netzwerk als auch Spielen über das Internet werden unterstützt.\n\n[LIGHT_GRAY]Hinweis: Es gibt keine globale Server Liste; Wenn du dich mit jemandem per IP verbinden willst, musst du den Host nach seiner IP fragen. hostserver = Server hosten invitefriends = Invite Friends hostserver.mobile = Host\nSpiel -host = Host +host = Server hosten hosting = [accent] Server wird geöffnet ... hosts.refresh = Aktualisieren hosts.discovering = Suche nach LAN-Spielen -hosts.discovering.any = Discovering games +hosts.discovering.any = Suche nach Spielen server.refreshing = Server wird aktualisiert hosts.none = [lightgray] Keine LAN-Spiele gefunden! host.invalid = [scarlet] Kann keine Verbindung zum Host herstellen. @@ -225,15 +225,15 @@ cancel = Abbruch openlink = Link öffnen copylink = Kopiere Link back = Zurück -data.export = Export Data -data.import = Import Data +data.export = Daten exportieren +data.import = Daten importieren data.exported = Data exported. data.invalid = This isn't valid game data. data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. classic.export = Export Classic Data classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Willst du wirklich aufhören? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +quit.confirm.tutorial = Willst du das Tutorial wirklich abbrechen?\nDu kannst es unter[accent] Einstellungen->Spiel->Tutorial wiederholen[] erneut spielen. loading = [accent]Wird geladen... reloading = [accent]Reloading Mods... saving = [accent]Speichere... @@ -326,14 +326,14 @@ editor.saved = Gespeichert! editor.save.noname = Deine Karte hat keinen Namen! Setze einen Namen im [accent]Karten Info[] Menu. editor.save.overwrite = Deine Karte überschreibt eine built-in Karte! Wähle einen anderen Karten Namen im [accent]'Karten info'[] Menu. editor.import.exists = [scarlet]Fehler beim Import:[] Ein built-in Karte namens '{0}' existiert bereits! -editor.import = Import... +editor.import = Importieren... editor.importmap = Importiere Karte editor.importmap.description = Importiere von einer bestehenden Karte editor.importfile = Importiere Datei editor.importfile.description = Importiere aus einer Karten Datei editor.importimage = Importiere Terrain Bild editor.importimage.description = Importiere aus einer Terrain Bild Datei -editor.export = Export... +editor.export = Exportieren... editor.exportfile = Export in Datei editor.exportfile.description = Exportiere in eine Karten Datei editor.exportimage = Export in Terrain Bild Datei @@ -404,7 +404,7 @@ ping = Ping: {0}ms language.restart = Bitte Starte dein Spiel neu, damit die Sprach-Einstellung aktiv wird. settings = Einstellungen tutorial = Tutorial -tutorial.retake = Re-Take Tutorial +tutorial.retake = Tutorial wiederholen editor = Editor mapeditor = Karten Editor abandon = Aufgeben @@ -424,8 +424,8 @@ launch.confirm = Dies wird alle Ressourcen in deinen Kern übertragen.\nDu kanns launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Freischalten configure = Startitems festlegen -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Gesperrte Blöcke +addall = Alle hinzufügen configure.locked = [LIGHT_GRAY]Erreiche Welle {0}\n, um Startitems festlegen zu können. configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [LIGHT_GRAY]{0} freigeschaltet. @@ -476,26 +476,26 @@ zone.fungalPass.description = A transition area between high mountains and lower zone.impact0078.description = zone.crags.description = settings.language = Sprache -settings.data = Game Data +settings.data = Spieldaten settings.reset = Auf Standard zurücksetzen settings.rebind = Zuweisen settings.controls = Steuerung settings.game = Spiel settings.sound = Audio -settings.graphics = Grafiken +settings.graphics = Grafik settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]Warnung![]\nDas wird jegliche Spieldaten zurücksetzen inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Nachdem du 'OK' drückst wird alles zurückgesetzt und das Spiel schließt sich automatisch. paused = Pausiert -clear = Clear +clear = Leeren banned = [scarlet]Banned yes = Ja no = Nein info.title = [accent]Info error.title = [crimson] Ein Fehler ist aufgetreten error.crashtitle = Ein Fehler ist aufgetreten! -blocks.input = Input -blocks.output = Output +blocks.input = Eingang +blocks.output = Ausgang blocks.booster = Verstärkung block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Kapazität @@ -524,12 +524,12 @@ blocks.boosteffect = Verstärkungseffekt blocks.maxunits = Max aktive Einheiten blocks.health = Lebenspunkte blocks.buildtime = Baudauer -blocks.buildcost = Build Cost +blocks.buildcost = Baukosten blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde blocks.ammo = Munition -bar.drilltierreq = Better Drill Required +bar.drilltierreq = besserer Bohrer benötigt bar.drillspeed = Bohrgeschwindigkeit: {0}/s bar.pumpspeed = Pump Speed: {0}/s bar.efficiency = Effizienz: {0}% @@ -554,7 +554,7 @@ bullet.knockback = [stat]{0}[lightgray] zurückstoßend bullet.freezing = [stat]gefrierend bullet.tarred = [stat]geteert bullet.multiplier = [stat]{0}[lightgray]x Munition Multiplikator -bullet.reload = [stat]{0}[lightgray]x neu laden +bullet.reload = [stat]{0}[lightgray]x Feuerrate unit.blocks = Blöcke unit.powersecond = Stromeinheiten/Sekunde unit.liquidsecond = Flüssigkeitseinheiten/Sekunde @@ -599,25 +599,28 @@ setting.difficulty.insane = Unmöglich setting.difficulty.name = Schwierigkeit setting.screenshake.name = Bildschirmwackeln setting.effects.name = Effekte anzeigen -setting.destroyedblocks.name = Display Destroyed Blocks -setting.conveyorpathfinding.name = Conveyor Placement Pathfinding +setting.destroyedblocks.name = Zerstörte Blöcke anzeigen +setting.conveyorpathfinding.name = Automatische Wegfindung beim Bau von Förderbändern setting.sensitivity.name = Controller-Empfindlichkeit setting.saveinterval.name = Autosave Häufigkeit setting.seconds = {0} Sekunden +setting.blockselecttimeout.name = Block Auswahl Timeout +setting.milliseconds = {0} Millisekunden setting.fullscreen.name = Vollbild setting.borderlesswindow.name = Randloses Fenster[LIGHT_GRAY] (Neustart teilweise erforderlich) setting.fps.name = Zeige FPS +setting.blockselectkeys.name = Block Shortcuts anzeigen setting.vsync.name = VSync setting.pixelate.name = Verpixeln [LIGHT_GRAY](Könnte die Leistung beeinträchtigen) setting.minimap.name = Zeige die Minimap -setting.position.name = Show Player Position +setting.position.name = Spieler-Position anzeigen setting.musicvol.name = Musiklautstärke setting.ambientvol.name = Ambient Volume setting.mutemusic.name = Musik stummschalten setting.sfxvol.name = Audioeffekt-Lautstärke setting.mutesound.name = Audioeffekte stummschalten setting.crashreport.name = Anonyme Absturzberichte senden -setting.savecreate.name = Auto-Create Saves +setting.savecreate.name = Automatisch Speicherstände anlegen setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Deckkraft setting.lasersopacity.name = Power Laser Opacity @@ -635,17 +638,34 @@ category.multiplayer.name = Mehrspieler command.attack = Angreifen command.rally = Rally command.retreat = Rückzug +placement.blockselectkeys = \n[lightgray]Shortcut: [{0}, keybind.clear_building.name = Clear Building keybind.press = Drücke eine Taste... keybind.press.axis = Drücke eine Taste oder bewege eine Achse... keybind.screenshot.name = Karten Screenshot keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse -keybind.schematic_select.name = Select Region +keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Schematic Menu keybind.schematic_flip_x.name = Flip Schematic X keybind.schematic_flip_y.name = Flip Schematic Y -keybind.fullscreen.name = Toggle Fullscreen +keybind.category_prev.name = Vorige Kategorie +keybind.category_next.name = Nächste Kategorie +keybind.block_select_left.name = Block-Auswahl nach links +keybind.block_select_right.name = Block-Auswahl nach rechts +keybind.block_select_up.name = Block-Auswahl nach oben +keybind.block_select_down.name = Block-Auswahl nach unten +keybind.block_select_01.name = Kategorie/Block 1 auswählen +keybind.block_select_02.name = Kategorie/Block 2 auswählen +keybind.block_select_03.name = Kategorie/Block 3 auswählen +keybind.block_select_04.name = Kategorie/Block 4 auswählen +keybind.block_select_05.name = Kategorie/Block 5 auswählen +keybind.block_select_06.name = Kategorie/Block 6 auswählen +keybind.block_select_07.name = Kategorie/Block 7 auswählen +keybind.block_select_08.name = Kategorie/Block 8 auswählen +keybind.block_select_09.name = Kategorie/Block 9 auswählen +keybind.block_select_10.name = Kategorie/Block 10 auswählen +keybind.fullscreen.name = Vollbild umschalten keybind.select.name = Auswählen/Schießen keybind.diagonal_placement.name = Diagonal platzieren keybind.pick.name = Block Auswählen @@ -710,7 +730,7 @@ rules.title.unit = Einheiten content.item.name = Materialien content.liquid.name = Flüssigkeiten content.unit.name = Einheiten -content.block.name = Blocks +content.block.name = Blöcke content.mech.name = Mechs item.copper.name = Kupfer item.lead.name = Blei @@ -753,6 +773,7 @@ mech.trident-ship.name = Trident mech.trident-ship.weapon = Bombenschacht mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Flammen-Mehrlader +item.corestorable = [lightgray]Im Kern speicherbar: {0} item.explosiveness = [LIGHT_GRAY]Explosivität: {0} item.flammability = [LIGHT_GRAY]Entflammbarkeit: {0} item.radioactivity = [LIGHT_GRAY]Radioaktivität: {0} From c85847567d8c1e15cf3496db3638a4b7c4735187 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 3 Dec 2019 18:03:21 -0500 Subject: [PATCH 021/107] h --- core/assets/scripts/global.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index d4629cb454..36da0b86b2 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -386,4 +386,8 @@ const ItemModule = Packages.io.anuke.mindustry.world.modules.ItemModule const LiquidModule = Packages.io.anuke.mindustry.world.modules.LiquidModule const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule const Produce = Packages.io.anuke.mindustry.world.producers.Produce -const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem \ No newline at end of file +const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem + +var r = new JavaAdapter(Block, {}); + +print(r.update) \ No newline at end of file From ba982a73b800cdfffc2f9e2ec2c5b6fe33fa43d0 Mon Sep 17 00:00:00 2001 From: itskatt <48765398+itskatt@users.noreply.github.com> Date: Wed, 4 Dec 2019 19:59:51 +0100 Subject: [PATCH 022/107] Remove e Co-Authored-By: Paulao17 --- core/assets/bundles/bundle_fr.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index dfe1cd16ef..b6d9e879a0 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -1088,7 +1088,7 @@ mech.alpha-mech.description = Le mécha standard. Est basé sur une unité Poign mech.delta-mech.description = Un mécha rapide, avec une armure légère, conçu pour les attaques de frappe. Il inflige, par contre, peu de dégâts aux structures. Néanmoins il peut tuer de grand groupes d'ennemis très rapidement avec ses arcs électriques. mech.tau-mech.description = Un mécha de support. Soigne les blocs alliés en tirant dessus. Il peut aussi éteindre les feux et soigner ses alliés en zone avec sa compétence. mech.omega-mech.description = Un mécha cuirassé et large fait pour les assauts frontaux. Sa compétence lui permet de bloquer 90% des dégâts. -mech.dart-ship.description = Le vaisseau standard. Il est raisonnablement rapide, léger et possède une vitesse de minage rapide. Néanmoins, ses capacitées d'attaque sont faibles. +mech.dart-ship.description = Le vaisseau standard. Il est raisonnablement rapide, léger et possède une vitesse de minage rapide. Néanmoins, ses capacités d'attaque sont faibles. mech.javelin-ship.description = Un vaisseau de frappe éclair qui, bien que lent au départ, peut accélérer pour atteindre de très grandes vitesses et voler jusqu'aux avant-postes ennemis, faisant d'énormes dégâts avec ses arc électriques obtenus à vitesse maximum et ses missiles. mech.trident-ship.description = Un bombardier lourd, conçu pour la construction et pour la destruction des fortifications ennemies. Assez bien blindé. mech.glaive-ship.description = Un grand vaisseau de combat cuirassé. Équipé avec un fusil automatique à munitions incendiaires. Est très maniable. From 50a6071cfcfcde5bcaaa8a1f52ddaaa2e9355be8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 6 Dec 2019 14:07:18 -0500 Subject: [PATCH 023/107] Fixed maps not reloading on mod reload --- core/src/io/anuke/mindustry/maps/Maps.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 500932d6b6..a966edf9e2 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -84,6 +84,8 @@ public class Maps{ maps.sort(); }); + Events.on(ContentReloadEvent.class, event -> reload()); + if(Core.assets != null){ ((CustomLoader)Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; } From 2b49c300f866b9ef6f5cfd9d2367de476a5e23cd Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 6 Dec 2019 21:57:47 -0500 Subject: [PATCH 024/107] Security / Android compat / Functional extension --- android/build.gradle | 1 + .../io/anuke/mindustry/AndroidLauncher.java | 8 ++- build.gradle | 1 + core/assets/bundles/bundle.properties | 1 + core/assets/scripts/base.js | 6 +-- core/assets/scripts/global.js | 11 ++-- core/assets/scripts/wrapper.js | 9 +--- .../io/anuke/mindustry/ClientLauncher.java | 8 ++- .../anuke/mindustry/core/ContentLoader.java | 52 +++++++++++-------- .../src/io/anuke/mindustry/core/Platform.java | 5 ++ .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 17 ++++-- core/src/io/anuke/mindustry/mod/Scripts.java | 38 ++++++++++---- gradle.properties | 2 +- .../mindustry/tools/ScriptStubGenerator.java | 3 +- 15 files changed, 106 insertions(+), 58 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index 5486155564..5d438dc30c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,6 +28,7 @@ dependencies{ implementation project(":core") implementation arcModule("backends:backend-android") + implementation 'com.faendir.rhino:rhino-android:1.5.2' natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 627a782dd3..e8e3223a19 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -9,10 +9,11 @@ import android.os.Build.*; import android.os.*; import android.provider.Settings.*; import android.telephony.*; +import com.faendir.rhino_android.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; import io.anuke.arc.files.*; -import io.anuke.arc.func.Cons; +import io.anuke.arc.func.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.arc.util.serialization.*; @@ -65,6 +66,11 @@ public class AndroidLauncher extends AndroidApplication{ } } + @Override + public org.mozilla.javascript.Context getScriptContext(){ + return new RhinoAndroidHelper(Core.files.local("script-output").file()).enterContext(); + } + @Override public void shareFile(FileHandle file){ } diff --git a/build.gradle b/build.gradle index 7bb0e486b0..9681be921b 100644 --- a/build.gradle +++ b/build.gradle @@ -254,6 +254,7 @@ project(":core"){ compileJava.dependsOn(preGen) compile "org.lz4:lz4-java:1.4.1" + compile "org.javadelight:delight-rhino-sandbox:0.0.10" compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 26d75701c6..735e88c553 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -26,6 +26,7 @@ load.image = Images load.content = Content load.system = System load.mod = Mods +load.scripts = Scripts schematic = Schematic schematic.add = Save Schematic... diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 96c3ecc154..c3932ee92c 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -2,6 +2,6 @@ const print = function(obj){ java.lang.System.out.println(obj ? String(obj) : "null") } -const extend = function(classType, params){ - return new JavaAdapter(classType, params) -} \ No newline at end of file +const extend = function(classType, name, params){ + return new JavaAdapter(classType, params, name) +} diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 36da0b86b2..0c4e49a298 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -4,9 +4,10 @@ const print = function(obj){ java.lang.System.out.println(obj ? String(obj) : "null") } -const extend = function(classType, params){ - return new JavaAdapter(classType, params) +const extend = function(classType, name, params){ + return new JavaAdapter(classType, params, name) } + const Core = Packages.io.anuke.arc.Core const Boolc = Packages.io.anuke.arc.func.Boolc const Boolf = Packages.io.anuke.arc.func.Boolf @@ -387,7 +388,5 @@ const LiquidModule = Packages.io.anuke.mindustry.world.modules.LiquidModule const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule const Produce = Packages.io.anuke.mindustry.world.producers.Produce const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem - -var r = new JavaAdapter(Block, {}); - -print(r.update) \ No newline at end of file +const PrintStream = Packages.java.io.PrintStream +const System = Packages.java.lang.System diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js index 3eaf663690..cfe44f4074 100755 --- a/core/assets/scripts/wrapper.js +++ b/core/assets/scripts/wrapper.js @@ -1,9 +1,2 @@ -this["$SCRIPT_NAME$"] = function(){ -$CODE$ -}; -try{ - this["$SCRIPT_NAME$"](); -}catch(e){ - print(e) -} +$CODE$ diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 6abff04782..96190b6701 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -69,6 +69,11 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Musics.load(); Sounds.load(); + assets.loadRun("scriptinit", Scripts.class, () -> {}, () -> { + content.createContent(false); + mods.loadScripts(); + }); + assets.loadRun("contentcreate", Content.class, () -> { content.createContent(); content.loadColors(); @@ -193,7 +198,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform if(assets.getCurrentLoading() != null){ String name = assets.getCurrentLoading().fileName.toLowerCase(); - String key = name.contains("content") ? "content" : name.contains("mod") ? "mods" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; + String key = name.contains("script") ? "scripts" : name.contains("content") ? "content" : name.contains("mod") ? "mods" : name.contains("msav") || + name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - Scl.scl(10f), Align.center); } } diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index bc4d0dac81..cb5ef8d49c 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -53,35 +53,45 @@ public class ContentLoader{ /** Creates all content types. */ public void createContent(){ + createContent(true); + } + + /** Creates all content types. */ + public void createContent(boolean load){ if(loaded){ Log.info("Content already loaded, skipping."); return; } - for(ContentType type : ContentType.values()){ - contentMap[type.ordinal()] = new Array<>(); - contentNameMap[type.ordinal()] = new ObjectMap<>(); - } - - for(ContentList list : content){ - list.load(); - } - - if(mods != null){ - mods.loadContent(); - } - - //check up ID mapping, make sure it's linear - for(Array arr : contentMap){ - for(int i = 0; i < arr.size; i++){ - int id = arr.get(i).id; - if(id != i){ - throw new IllegalArgumentException("Out-of-order IDs for content '" + arr.get(i) + "' (expected " + i + " but got " + id + ")"); - } + if(contentMap[0] == null){ + for(ContentType type : ContentType.values()){ + contentMap[type.ordinal()] = new Array<>(); + contentNameMap[type.ordinal()] = new ObjectMap<>(); } } - loaded = true; + if(load){ + + for(ContentList list : content){ + list.load(); + } + + if(mods != null){ + mods.loadContent(); + } + + //check up ID mapping, make sure it's linear + for(Array arr : contentMap){ + for(int i = 0; i < arr.size; i++){ + int id = arr.get(i).id; + if(id != i){ + throw new IllegalArgumentException("Out-of-order IDs for content '" + arr.get(i) + "' (expected " + i + " but got " + id + ")"); + } + } + } + + loaded = true; + } } /** Logs content statistics.*/ diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 6650bff718..84630e3926 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -13,6 +13,7 @@ import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.dialogs.*; +import org.mozilla.javascript.*; import static io.anuke.mindustry.Vars.mobile; @@ -51,6 +52,10 @@ public interface Platform{ return new Scripts(); } + default Context getScriptContext(){ + return Context.enter(); + } + /** Add a text input dialog that should show up after the field is tapped. */ default void addDialog(TextField field){ addDialog(field, 16); diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 223eddb7ed..2dec3d6759 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index ff6c47b3af..d00962604c 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -30,7 +30,7 @@ import static io.anuke.mindustry.Vars.*; public class Mods implements Loadable{ private Json json = new Json(); - private Scripts scripts; + private @Nullable Scripts scripts; private ContentParser parser = new ContentParser(); private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); @@ -348,6 +348,12 @@ public class Mods implements Loadable{ Sounds.dispose(); Sounds.load(); Core.assets.finishLoading(); + if(scripts != null){ + scripts.dispose(); + scripts = null; + } + content.createContent(false); + loadScripts(); content.clear(); content.createContent(); loadAsync(); @@ -361,9 +367,8 @@ public class Mods implements Loadable{ Events.fire(new ContentReloadEvent()); } - /** Creates all the content found in mod files. */ - public void loadContent(){ - + /** This must be run on the main thread! */ + public void loadScripts(){ Time.mark(); for(LoadedMod mod : loaded){ @@ -390,6 +395,10 @@ public class Mods implements Loadable{ } Log.info("Time to initialize modded scripts: {0}", Time.elapsed()); + } + + /** Creates all the content found in mod files. */ + public void loadContent(){ class LoadRun implements Comparable{ final ContentType type; diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 055e1bda8e..d9425299f6 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -7,10 +7,7 @@ import io.anuke.mindustry.*; import io.anuke.mindustry.mod.Mods.*; import org.mozilla.javascript.*; -import java.io.*; - -public class Scripts{ - private static final Class[] denied = {FileHandle.class, InputStream.class, File.class, Scripts.class, Files.class, ClassAccess.class}; +public class Scripts implements Disposable{ private final Context context; private final String wrapper; private Scriptable scope; @@ -18,12 +15,26 @@ public class Scripts{ public Scripts(){ Time.mark(); - context = Context.enter(); - if(Vars.mobile){ - context.setOptimizationLevel(-1); - } + context = Vars.platform.getScriptContext(); + context.setClassShutter(type -> ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream")); + context.setErrorReporter(new ErrorReporter(){ + @Override + public void warning(String message, String sourceName, int line, String lineSource, int lineOffset){ + + } + + @Override + public void error(String message, String sourceName, int line, String lineSource, int lineOffset){ + Log.info(message + "@" + sourceName + ":" + line); + } + + @Override + public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource, int lineOffset){ + Log.info(message + "@" + sourceName + ":" + line); + return null; + } + }); - //context.setClassShutter(ClassAccess.allowedClassNames::contains); scope = context.initStandardObjects(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); @@ -32,10 +43,15 @@ public class Scripts{ } public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" +file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()), file.name()); + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" + file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()), file.name()); } private void run(String script, String file){ - context.evaluateString(scope, script, file, 1, null); + context.evaluateString(scope, script, file, 1, null); + } + + @Override + public void dispose(){ + Context.exit(); } } diff --git a/gradle.properties b/gradle.properties index be214e2f30..f39d88dacf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=680d8dfc055a1336c06b32d7d4429661e6c6fddd +archash=7c853686fcf7fac56405919817d7f8caef00c0f2 diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 8841a07be3..81493e6858 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -9,6 +9,7 @@ import org.reflections.*; import org.reflections.scanners.*; import org.reflections.util.*; +import java.io.*; import java.util.*; public class ScriptStubGenerator{ @@ -17,7 +18,7 @@ public class ScriptStubGenerator{ String base = "io.anuke.mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer"); - Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class); + Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + From f3a5798a7f6bc780006133e64b065fbc3bb4667c Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 6 Dec 2019 22:24:32 -0500 Subject: [PATCH 025/107] Various fixes --- build.gradle | 1 - core/assets/scripts/base.js | 6 +- core/assets/scripts/global.js | 161 +++++++++++++++++- .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- core/src/io/anuke/mindustry/mod/Scripts.java | 17 -- gradle.properties | 2 +- .../mindustry/tools/ScriptStubGenerator.java | 11 +- 7 files changed, 176 insertions(+), 24 deletions(-) diff --git a/build.gradle b/build.gradle index 9681be921b..7bb0e486b0 100644 --- a/build.gradle +++ b/build.gradle @@ -254,7 +254,6 @@ project(":core"){ compileJava.dependsOn(preGen) compile "org.lz4:lz4-java:1.4.1" - compile "org.javadelight:delight-rhino-sandbox:0.0.10" compile arcModule("arc-core") compile arcModule("extensions:freetype") compile arcModule("extensions:arcnet") diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index c3932ee92c..677d4e996d 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -2,6 +2,10 @@ const print = function(obj){ java.lang.System.out.println(obj ? String(obj) : "null") } -const extend = function(classType, name, params){ +const extendContent = function(classType, name, params){ return new JavaAdapter(classType, params, name) } + +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 0c4e49a298..2ecfeb5774 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -4,10 +4,14 @@ const print = function(obj){ java.lang.System.out.println(obj ? String(obj) : "null") } -const extend = function(classType, name, params){ +const extendContent = function(classType, name, params){ return new JavaAdapter(classType, params, name) } +const extend = function(classType, params){ + return new JavaAdapter(classType, params) +} + const Core = Packages.io.anuke.arc.Core const Boolc = Packages.io.anuke.arc.func.Boolc const Boolf = Packages.io.anuke.arc.func.Boolf @@ -30,12 +34,18 @@ const Intf = Packages.io.anuke.arc.func.Intf const Intp = Packages.io.anuke.arc.func.Intp const Prov = Packages.io.anuke.arc.func.Prov const Draw = Packages.io.anuke.arc.graphics.g2d.Draw +const Fill = Packages.io.anuke.arc.graphics.g2d.Fill +const Lines = Packages.io.anuke.arc.graphics.g2d.Lines const TextureAtlas = Packages.io.anuke.arc.graphics.g2d.TextureAtlas +const AtlasRegion = Packages.io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion const TextureRegion = Packages.io.anuke.arc.graphics.g2d.TextureRegion const Time = Packages.io.anuke.arc.util.Time const Vars = Packages.io.anuke.mindustry.Vars const BlockIndexer = Packages.io.anuke.mindustry.ai.BlockIndexer const Pathfinder = Packages.io.anuke.mindustry.ai.Pathfinder +const PathData = Packages.io.anuke.mindustry.ai.Pathfinder.PathData +const PathTarget = Packages.io.anuke.mindustry.ai.Pathfinder.PathTarget +const PathTileStruct = Packages.io.anuke.mindustry.ai.Pathfinder.PathTileStruct const WaveSpawner = Packages.io.anuke.mindustry.ai.WaveSpawner const Blocks = Packages.io.anuke.mindustry.content.Blocks const Bullets = Packages.io.anuke.mindustry.content.Bullets @@ -46,6 +56,7 @@ const Loadouts = Packages.io.anuke.mindustry.content.Loadouts const Mechs = Packages.io.anuke.mindustry.content.Mechs const StatusEffects = Packages.io.anuke.mindustry.content.StatusEffects const TechTree = Packages.io.anuke.mindustry.content.TechTree +const TechNode = Packages.io.anuke.mindustry.content.TechTree.TechNode const TypeIDs = Packages.io.anuke.mindustry.content.TypeIDs const UnitTypes = Packages.io.anuke.mindustry.content.UnitTypes const Zones = Packages.io.anuke.mindustry.content.Zones @@ -53,24 +64,35 @@ const ContentLoader = Packages.io.anuke.mindustry.core.ContentLoader const Control = Packages.io.anuke.mindustry.core.Control const FileTree = Packages.io.anuke.mindustry.core.FileTree const GameState = Packages.io.anuke.mindustry.core.GameState +const State = Packages.io.anuke.mindustry.core.GameState.State const Logic = Packages.io.anuke.mindustry.core.Logic const Platform = Packages.io.anuke.mindustry.core.Platform const Renderer = Packages.io.anuke.mindustry.core.Renderer const UI = Packages.io.anuke.mindustry.core.UI const Version = Packages.io.anuke.mindustry.core.Version const World = Packages.io.anuke.mindustry.core.World +const Raycaster = Packages.io.anuke.mindustry.core.World.Raycaster const Content = Packages.io.anuke.mindustry.ctype.Content const ContentList = Packages.io.anuke.mindustry.ctype.ContentList const MappableContent = Packages.io.anuke.mindustry.ctype.MappableContent const UnlockableContent = Packages.io.anuke.mindustry.ctype.UnlockableContent const DrawOperation = Packages.io.anuke.mindustry.editor.DrawOperation +const OpType = Packages.io.anuke.mindustry.editor.DrawOperation.OpType +const TileOpStruct = Packages.io.anuke.mindustry.editor.DrawOperation.TileOpStruct const EditorTile = Packages.io.anuke.mindustry.editor.EditorTile const EditorTool = Packages.io.anuke.mindustry.editor.EditorTool const MapEditor = Packages.io.anuke.mindustry.editor.MapEditor +const Context = Packages.io.anuke.mindustry.editor.MapEditor.Context const MapRenderer = Packages.io.anuke.mindustry.editor.MapRenderer const OperationStack = Packages.io.anuke.mindustry.editor.OperationStack const Damage = Packages.io.anuke.mindustry.entities.Damage +const PropCellStruct = Packages.io.anuke.mindustry.entities.Damage.PropCellStruct const Effects = Packages.io.anuke.mindustry.entities.Effects +const Effect = Packages.io.anuke.mindustry.entities.Effects.Effect +const EffectContainer = Packages.io.anuke.mindustry.entities.Effects.EffectContainer +const EffectProvider = Packages.io.anuke.mindustry.entities.Effects.EffectProvider +const EffectRenderer = Packages.io.anuke.mindustry.entities.Effects.EffectRenderer +const ScreenshakeProvider = Packages.io.anuke.mindustry.entities.Effects.ScreenshakeProvider const Entities = Packages.io.anuke.mindustry.entities.Entities const EntityCollisions = Packages.io.anuke.mindustry.entities.EntityCollisions const EntityGroup = Packages.io.anuke.mindustry.entities.EntityGroup @@ -89,6 +111,7 @@ const MissileBulletType = Packages.io.anuke.mindustry.entities.bullet.MissileBul const Decal = Packages.io.anuke.mindustry.entities.effect.Decal const Fire = Packages.io.anuke.mindustry.entities.effect.Fire const GroundEffectEntity = Packages.io.anuke.mindustry.entities.effect.GroundEffectEntity +const GroundEffect = Packages.io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect const ItemTransfer = Packages.io.anuke.mindustry.entities.effect.ItemTransfer const Lightning = Packages.io.anuke.mindustry.entities.effect.Lightning const Puddle = Packages.io.anuke.mindustry.entities.effect.Puddle @@ -98,6 +121,8 @@ const AbsorbTrait = Packages.io.anuke.mindustry.entities.traits.AbsorbTrait const BelowLiquidTrait = Packages.io.anuke.mindustry.entities.traits.BelowLiquidTrait const BuilderMinerTrait = Packages.io.anuke.mindustry.entities.traits.BuilderMinerTrait const BuilderTrait = Packages.io.anuke.mindustry.entities.traits.BuilderTrait +const BuildDataStatic = Packages.io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic +const BuildRequest = Packages.io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest const DamageTrait = Packages.io.anuke.mindustry.entities.traits.DamageTrait const DrawTrait = Packages.io.anuke.mindustry.entities.traits.DrawTrait const Entity = Packages.io.anuke.mindustry.entities.traits.Entity @@ -146,28 +171,87 @@ const Titan = Packages.io.anuke.mindustry.entities.type.base.Titan const Wraith = Packages.io.anuke.mindustry.entities.type.base.Wraith const StateMachine = Packages.io.anuke.mindustry.entities.units.StateMachine const Statuses = Packages.io.anuke.mindustry.entities.units.Statuses +const StatusEntry = Packages.io.anuke.mindustry.entities.units.Statuses.StatusEntry const UnitCommand = Packages.io.anuke.mindustry.entities.units.UnitCommand const UnitDrops = Packages.io.anuke.mindustry.entities.units.UnitDrops const UnitState = Packages.io.anuke.mindustry.entities.units.UnitState const DefaultWaves = Packages.io.anuke.mindustry.game.DefaultWaves const Difficulty = Packages.io.anuke.mindustry.game.Difficulty const EventType = Packages.io.anuke.mindustry.game.EventType +const BlockBuildBeginEvent = Packages.io.anuke.mindustry.game.EventType.BlockBuildBeginEvent +const BlockBuildEndEvent = Packages.io.anuke.mindustry.game.EventType.BlockBuildEndEvent +const BlockDestroyEvent = Packages.io.anuke.mindustry.game.EventType.BlockDestroyEvent +const BlockInfoEvent = Packages.io.anuke.mindustry.game.EventType.BlockInfoEvent +const BuildSelectEvent = Packages.io.anuke.mindustry.game.EventType.BuildSelectEvent +const ClientLoadEvent = Packages.io.anuke.mindustry.game.EventType.ClientLoadEvent +const CommandIssueEvent = Packages.io.anuke.mindustry.game.EventType.CommandIssueEvent +const ContentReloadEvent = Packages.io.anuke.mindustry.game.EventType.ContentReloadEvent +const CoreItemDeliverEvent = Packages.io.anuke.mindustry.game.EventType.CoreItemDeliverEvent +const DepositEvent = Packages.io.anuke.mindustry.game.EventType.DepositEvent +const DisposeEvent = Packages.io.anuke.mindustry.game.EventType.DisposeEvent +const GameOverEvent = Packages.io.anuke.mindustry.game.EventType.GameOverEvent +const LaunchEvent = Packages.io.anuke.mindustry.game.EventType.LaunchEvent +const LaunchItemEvent = Packages.io.anuke.mindustry.game.EventType.LaunchItemEvent +const LineConfirmEvent = Packages.io.anuke.mindustry.game.EventType.LineConfirmEvent +const LoseEvent = Packages.io.anuke.mindustry.game.EventType.LoseEvent +const MapMakeEvent = Packages.io.anuke.mindustry.game.EventType.MapMakeEvent +const MapPublishEvent = Packages.io.anuke.mindustry.game.EventType.MapPublishEvent +const MechChangeEvent = Packages.io.anuke.mindustry.game.EventType.MechChangeEvent +const PlayEvent = Packages.io.anuke.mindustry.game.EventType.PlayEvent +const PlayerBanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerBanEvent +const PlayerChatEvent = Packages.io.anuke.mindustry.game.EventType.PlayerChatEvent +const PlayerConnect = Packages.io.anuke.mindustry.game.EventType.PlayerConnect +const PlayerIpBanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerIpBanEvent +const PlayerIpUnbanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerIpUnbanEvent +const PlayerJoin = Packages.io.anuke.mindustry.game.EventType.PlayerJoin +const PlayerLeave = Packages.io.anuke.mindustry.game.EventType.PlayerLeave +const PlayerUnbanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerUnbanEvent +const ResearchEvent = Packages.io.anuke.mindustry.game.EventType.ResearchEvent +const ResetEvent = Packages.io.anuke.mindustry.game.EventType.ResetEvent +const ResizeEvent = Packages.io.anuke.mindustry.game.EventType.ResizeEvent +const StateChangeEvent = Packages.io.anuke.mindustry.game.EventType.StateChangeEvent +const TapConfigEvent = Packages.io.anuke.mindustry.game.EventType.TapConfigEvent +const TapEvent = Packages.io.anuke.mindustry.game.EventType.TapEvent +const TileChangeEvent = Packages.io.anuke.mindustry.game.EventType.TileChangeEvent +const Trigger = Packages.io.anuke.mindustry.game.EventType.Trigger +const TurretAmmoDeliverEvent = Packages.io.anuke.mindustry.game.EventType.TurretAmmoDeliverEvent +const UnitCreateEvent = Packages.io.anuke.mindustry.game.EventType.UnitCreateEvent +const UnitDestroyEvent = Packages.io.anuke.mindustry.game.EventType.UnitDestroyEvent +const UnlockEvent = Packages.io.anuke.mindustry.game.EventType.UnlockEvent +const WaveEvent = Packages.io.anuke.mindustry.game.EventType.WaveEvent +const WinEvent = Packages.io.anuke.mindustry.game.EventType.WinEvent +const WithdrawEvent = Packages.io.anuke.mindustry.game.EventType.WithdrawEvent +const WorldLoadEvent = Packages.io.anuke.mindustry.game.EventType.WorldLoadEvent +const ZoneConfigureCompleteEvent = Packages.io.anuke.mindustry.game.EventType.ZoneConfigureCompleteEvent +const ZoneRequireCompleteEvent = Packages.io.anuke.mindustry.game.EventType.ZoneRequireCompleteEvent const Gamemode = Packages.io.anuke.mindustry.game.Gamemode const GlobalData = Packages.io.anuke.mindustry.game.GlobalData const LoopControl = Packages.io.anuke.mindustry.game.LoopControl const MusicControl = Packages.io.anuke.mindustry.game.MusicControl const Objective = Packages.io.anuke.mindustry.game.Objective const Objectives = Packages.io.anuke.mindustry.game.Objectives +const Launched = Packages.io.anuke.mindustry.game.Objectives.Launched +const Unlock = Packages.io.anuke.mindustry.game.Objectives.Unlock +const Wave = Packages.io.anuke.mindustry.game.Objectives.Wave +const ZoneObjective = Packages.io.anuke.mindustry.game.Objectives.ZoneObjective +const ZoneWave = Packages.io.anuke.mindustry.game.Objectives.ZoneWave const Rules = Packages.io.anuke.mindustry.game.Rules const Saves = Packages.io.anuke.mindustry.game.Saves +const SaveSlot = Packages.io.anuke.mindustry.game.Saves.SaveSlot const Schematic = Packages.io.anuke.mindustry.game.Schematic +const Stile = Packages.io.anuke.mindustry.game.Schematic.Stile const Schematics = Packages.io.anuke.mindustry.game.Schematics const SoundLoop = Packages.io.anuke.mindustry.game.SoundLoop const SpawnGroup = Packages.io.anuke.mindustry.game.SpawnGroup const Stats = Packages.io.anuke.mindustry.game.Stats +const Rank = Packages.io.anuke.mindustry.game.Stats.Rank +const RankResult = Packages.io.anuke.mindustry.game.Stats.RankResult const Team = Packages.io.anuke.mindustry.game.Team const Teams = Packages.io.anuke.mindustry.game.Teams +const BrokenBlock = Packages.io.anuke.mindustry.game.Teams.BrokenBlock +const TeamData = Packages.io.anuke.mindustry.game.Teams.TeamData const Tutorial = Packages.io.anuke.mindustry.game.Tutorial +const TutorialStage = Packages.io.anuke.mindustry.game.Tutorial.TutorialStage const BlockRenderer = Packages.io.anuke.mindustry.graphics.BlockRenderer const Bloom = Packages.io.anuke.mindustry.graphics.Bloom const CacheLayer = Packages.io.anuke.mindustry.graphics.CacheLayer @@ -179,6 +263,7 @@ const LightRenderer = Packages.io.anuke.mindustry.graphics.LightRenderer const MenuRenderer = Packages.io.anuke.mindustry.graphics.MenuRenderer const MinimapRenderer = Packages.io.anuke.mindustry.graphics.MinimapRenderer const MultiPacker = Packages.io.anuke.mindustry.graphics.MultiPacker +const PageType = Packages.io.anuke.mindustry.graphics.MultiPacker.PageType const OverlayRenderer = Packages.io.anuke.mindustry.graphics.OverlayRenderer const Pal = Packages.io.anuke.mindustry.graphics.Pal const Pixelator = Packages.io.anuke.mindustry.graphics.Pixelator @@ -186,16 +271,27 @@ const Shaders = Packages.io.anuke.mindustry.graphics.Shaders const Binding = Packages.io.anuke.mindustry.input.Binding const DesktopInput = Packages.io.anuke.mindustry.input.DesktopInput const InputHandler = Packages.io.anuke.mindustry.input.InputHandler +const PlaceLine = Packages.io.anuke.mindustry.input.InputHandler.PlaceLine const MobileInput = Packages.io.anuke.mindustry.input.MobileInput const PlaceMode = Packages.io.anuke.mindustry.input.PlaceMode const Placement = Packages.io.anuke.mindustry.input.Placement +const DistanceHeuristic = Packages.io.anuke.mindustry.input.Placement.DistanceHeuristic +const NormalizeDrawResult = Packages.io.anuke.mindustry.input.Placement.NormalizeDrawResult +const NormalizeResult = Packages.io.anuke.mindustry.input.Placement.NormalizeResult +const TileHueristic = Packages.io.anuke.mindustry.input.Placement.TileHueristic const Map = Packages.io.anuke.mindustry.maps.Map const Maps = Packages.io.anuke.mindustry.maps.Maps +const MapProvider = Packages.io.anuke.mindustry.maps.Maps.MapProvider +const ShuffleMode = Packages.io.anuke.mindustry.maps.Maps.ShuffleMode const BlendFilter = Packages.io.anuke.mindustry.maps.filters.BlendFilter const ClearFilter = Packages.io.anuke.mindustry.maps.filters.ClearFilter const DistortFilter = Packages.io.anuke.mindustry.maps.filters.DistortFilter const FilterOption = Packages.io.anuke.mindustry.maps.filters.FilterOption +const BlockOption = Packages.io.anuke.mindustry.maps.filters.FilterOption.BlockOption +const SliderOption = Packages.io.anuke.mindustry.maps.filters.FilterOption.SliderOption const GenerateFilter = Packages.io.anuke.mindustry.maps.filters.GenerateFilter +const GenerateInput = Packages.io.anuke.mindustry.maps.filters.GenerateFilter.GenerateInput +const TileProvider = Packages.io.anuke.mindustry.maps.filters.GenerateFilter.GenerateInput.TileProvider const MedianFilter = Packages.io.anuke.mindustry.maps.filters.MedianFilter const MirrorFilter = Packages.io.anuke.mindustry.maps.filters.MirrorFilter const NoiseFilter = Packages.io.anuke.mindustry.maps.filters.NoiseFilter @@ -207,6 +303,7 @@ const TerrainFilter = Packages.io.anuke.mindustry.maps.filters.TerrainFilter const BasicGenerator = Packages.io.anuke.mindustry.maps.generators.BasicGenerator const Generator = Packages.io.anuke.mindustry.maps.generators.Generator const MapGenerator = Packages.io.anuke.mindustry.maps.generators.MapGenerator +const Decoration = Packages.io.anuke.mindustry.maps.generators.MapGenerator.Decoration const RandomGenerator = Packages.io.anuke.mindustry.maps.generators.RandomGenerator const DesertWastesGenerator = Packages.io.anuke.mindustry.maps.zonegen.DesertWastesGenerator const OvergrowthGenerator = Packages.io.anuke.mindustry.maps.zonegen.OvergrowthGenerator @@ -220,6 +317,7 @@ const LiquidStack = Packages.io.anuke.mindustry.type.LiquidStack const Mech = Packages.io.anuke.mindustry.type.Mech const Publishable = Packages.io.anuke.mindustry.type.Publishable const StatusEffect = Packages.io.anuke.mindustry.type.StatusEffect +const TransitionHandler = Packages.io.anuke.mindustry.type.StatusEffect.TransitionHandler const TypeID = Packages.io.anuke.mindustry.type.TypeID const UnitType = Packages.io.anuke.mindustry.type.UnitType const Weapon = Packages.io.anuke.mindustry.type.Weapon @@ -231,7 +329,13 @@ const Fonts = Packages.io.anuke.mindustry.ui.Fonts const IconSize = Packages.io.anuke.mindustry.ui.IconSize const IntFormat = Packages.io.anuke.mindustry.ui.IntFormat const Links = Packages.io.anuke.mindustry.ui.Links +const LinkEntry = Packages.io.anuke.mindustry.ui.Links.LinkEntry const Styles = Packages.io.anuke.mindustry.ui.Styles +const ZoneNode = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog.ZoneNode +const FileHistory = Packages.io.anuke.mindustry.ui.dialogs.FileChooser.FileHistory +const Server = Packages.io.anuke.mindustry.ui.dialogs.JoinDialog.Server +const LayoutNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.LayoutNode +const TechTreeNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.TechTreeNode const BlockConfigFragment = Packages.io.anuke.mindustry.ui.fragments.BlockConfigFragment const BlockInventoryFragment = Packages.io.anuke.mindustry.ui.fragments.BlockInventoryFragment const FadeInFragment = Packages.io.anuke.mindustry.ui.fragments.FadeInFragment @@ -243,24 +347,31 @@ const OverlayFragment = Packages.io.anuke.mindustry.ui.fragments.OverlayFragment const PlacementFragment = Packages.io.anuke.mindustry.ui.fragments.PlacementFragment const PlayerListFragment = Packages.io.anuke.mindustry.ui.fragments.PlayerListFragment const BranchTreeLayout = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout +const TreeAlignment = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout.TreeAlignment +const TreeLocation = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout.TreeLocation const RadialTreeLayout = Packages.io.anuke.mindustry.ui.layout.RadialTreeLayout const TreeLayout = Packages.io.anuke.mindustry.ui.layout.TreeLayout +const TreeNode = Packages.io.anuke.mindustry.ui.layout.TreeLayout.TreeNode const Block = Packages.io.anuke.mindustry.world.Block const BlockStorage = Packages.io.anuke.mindustry.world.BlockStorage const Build = Packages.io.anuke.mindustry.world.Build const CachedTile = Packages.io.anuke.mindustry.world.CachedTile const DirectionalItemBuffer = Packages.io.anuke.mindustry.world.DirectionalItemBuffer +const BufferItemStruct = Packages.io.anuke.mindustry.world.DirectionalItemBuffer.BufferItemStruct const Edges = Packages.io.anuke.mindustry.world.Edges const ItemBuffer = Packages.io.anuke.mindustry.world.ItemBuffer const LegacyColorMapper = Packages.io.anuke.mindustry.world.LegacyColorMapper +const LegacyBlock = Packages.io.anuke.mindustry.world.LegacyColorMapper.LegacyBlock const Pos = Packages.io.anuke.mindustry.world.Pos const StaticTree = Packages.io.anuke.mindustry.world.StaticTree const Tile = Packages.io.anuke.mindustry.world.Tile const WorldContext = Packages.io.anuke.mindustry.world.WorldContext const Attributes = Packages.io.anuke.mindustry.world.blocks.Attributes const Autotiler = Packages.io.anuke.mindustry.world.blocks.Autotiler +const AutotilerHolder = Packages.io.anuke.mindustry.world.blocks.Autotiler.AutotilerHolder const BlockPart = Packages.io.anuke.mindustry.world.blocks.BlockPart const BuildBlock = Packages.io.anuke.mindustry.world.blocks.BuildBlock +const BuildEntity = Packages.io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity const DoubleOverlayFloor = Packages.io.anuke.mindustry.world.blocks.DoubleOverlayFloor const Floor = Packages.io.anuke.mindustry.world.blocks.Floor const ItemSelection = Packages.io.anuke.mindustry.world.blocks.ItemSelection @@ -273,35 +384,58 @@ const Rock = Packages.io.anuke.mindustry.world.blocks.Rock const StaticWall = Packages.io.anuke.mindustry.world.blocks.StaticWall const TreeBlock = Packages.io.anuke.mindustry.world.blocks.TreeBlock const DeflectorWall = Packages.io.anuke.mindustry.world.blocks.defense.DeflectorWall +const DeflectorEntity = Packages.io.anuke.mindustry.world.blocks.defense.DeflectorWall.DeflectorEntity const Door = Packages.io.anuke.mindustry.world.blocks.defense.Door +const DoorEntity = Packages.io.anuke.mindustry.world.blocks.defense.Door.DoorEntity const ForceProjector = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector +const ForceEntity = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector.ForceEntity +const ShieldEntity = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity const MendProjector = Packages.io.anuke.mindustry.world.blocks.defense.MendProjector +const MendEntity = Packages.io.anuke.mindustry.world.blocks.defense.MendProjector.MendEntity const OverdriveProjector = Packages.io.anuke.mindustry.world.blocks.defense.OverdriveProjector +const OverdriveEntity = Packages.io.anuke.mindustry.world.blocks.defense.OverdriveProjector.OverdriveEntity const ShockMine = Packages.io.anuke.mindustry.world.blocks.defense.ShockMine const SurgeWall = Packages.io.anuke.mindustry.world.blocks.defense.SurgeWall const Wall = Packages.io.anuke.mindustry.world.blocks.defense.Wall const ArtilleryTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret const BurstTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret const ChargeTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret +const LaserTurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret.LaserTurretEntity const CooledTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret const DoubleTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret const ItemTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret +const ItemEntry = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.ItemEntry +const ItemTurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.ItemTurretEntity const LaserTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret const LiquidTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret const PowerTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret const Turret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret +const AmmoEntry = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret.AmmoEntry +const TurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret.TurretEntity const ArmoredConveyor = Packages.io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor const BufferedItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge +const BufferedItemBridgeEntity = Packages.io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge.BufferedItemBridgeEntity const Conveyor = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor +const ConveyorEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor.ConveyorEntity +const ItemPos = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor.ItemPos const ExtendingItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge const ItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ItemBridge +const ItemBridgeEntity = Packages.io.anuke.mindustry.world.blocks.distribution.ItemBridge.ItemBridgeEntity const Junction = Packages.io.anuke.mindustry.world.blocks.distribution.Junction +const JunctionEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Junction.JunctionEntity const MassDriver = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver +const DriverBulletData = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData +const DriverState = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverState +const MassDriverEntity = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.MassDriverEntity const OverflowGate = Packages.io.anuke.mindustry.world.blocks.distribution.OverflowGate +const OverflowGateEntity = Packages.io.anuke.mindustry.world.blocks.distribution.OverflowGate.OverflowGateEntity const Router = Packages.io.anuke.mindustry.world.blocks.distribution.Router +const RouterEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Router.RouterEntity const Sorter = Packages.io.anuke.mindustry.world.blocks.distribution.Sorter +const SorterEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Sorter.SorterEntity const ArmoredConduit = Packages.io.anuke.mindustry.world.blocks.liquid.ArmoredConduit const Conduit = Packages.io.anuke.mindustry.world.blocks.liquid.Conduit +const ConduitEntity = Packages.io.anuke.mindustry.world.blocks.liquid.Conduit.ConduitEntity const LiquidBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidBridge const LiquidExtendingBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge const LiquidJunction = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidJunction @@ -310,47 +444,68 @@ const LiquidRouter = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidRoute const LiquidTank = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidTank const LogicBlock = Packages.io.anuke.mindustry.world.blocks.logic.LogicBlock const MessageBlock = Packages.io.anuke.mindustry.world.blocks.logic.MessageBlock +const MessageBlockEntity = Packages.io.anuke.mindustry.world.blocks.logic.MessageBlock.MessageBlockEntity const Battery = Packages.io.anuke.mindustry.world.blocks.power.Battery const BurnerGenerator = Packages.io.anuke.mindustry.world.blocks.power.BurnerGenerator const ConditionalConsumePower = Packages.io.anuke.mindustry.world.blocks.power.ConditionalConsumePower const DecayGenerator = Packages.io.anuke.mindustry.world.blocks.power.DecayGenerator const ImpactReactor = Packages.io.anuke.mindustry.world.blocks.power.ImpactReactor +const FusionReactorEntity = Packages.io.anuke.mindustry.world.blocks.power.ImpactReactor.FusionReactorEntity const ItemLiquidGenerator = Packages.io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator +const ItemLiquidGeneratorEntity = Packages.io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator.ItemLiquidGeneratorEntity const LightBlock = Packages.io.anuke.mindustry.world.blocks.power.LightBlock +const LightEntity = Packages.io.anuke.mindustry.world.blocks.power.LightBlock.LightEntity const NuclearReactor = Packages.io.anuke.mindustry.world.blocks.power.NuclearReactor +const NuclearReactorEntity = Packages.io.anuke.mindustry.world.blocks.power.NuclearReactor.NuclearReactorEntity const PowerDiode = Packages.io.anuke.mindustry.world.blocks.power.PowerDiode const PowerDistributor = Packages.io.anuke.mindustry.world.blocks.power.PowerDistributor const PowerGenerator = Packages.io.anuke.mindustry.world.blocks.power.PowerGenerator +const GeneratorEntity = Packages.io.anuke.mindustry.world.blocks.power.PowerGenerator.GeneratorEntity const PowerGraph = Packages.io.anuke.mindustry.world.blocks.power.PowerGraph const PowerNode = Packages.io.anuke.mindustry.world.blocks.power.PowerNode const SingleTypeGenerator = Packages.io.anuke.mindustry.world.blocks.power.SingleTypeGenerator const SolarGenerator = Packages.io.anuke.mindustry.world.blocks.power.SolarGenerator const ThermalGenerator = Packages.io.anuke.mindustry.world.blocks.power.ThermalGenerator const Cultivator = Packages.io.anuke.mindustry.world.blocks.production.Cultivator +const CultivatorEntity = Packages.io.anuke.mindustry.world.blocks.production.Cultivator.CultivatorEntity const Drill = Packages.io.anuke.mindustry.world.blocks.production.Drill +const DrillEntity = Packages.io.anuke.mindustry.world.blocks.production.Drill.DrillEntity const Fracker = Packages.io.anuke.mindustry.world.blocks.production.Fracker +const FrackerEntity = Packages.io.anuke.mindustry.world.blocks.production.Fracker.FrackerEntity const GenericCrafter = Packages.io.anuke.mindustry.world.blocks.production.GenericCrafter +const GenericCrafterEntity = Packages.io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity const GenericSmelter = Packages.io.anuke.mindustry.world.blocks.production.GenericSmelter const Incinerator = Packages.io.anuke.mindustry.world.blocks.production.Incinerator +const IncineratorEntity = Packages.io.anuke.mindustry.world.blocks.production.Incinerator.IncineratorEntity const LiquidConverter = Packages.io.anuke.mindustry.world.blocks.production.LiquidConverter const Pump = Packages.io.anuke.mindustry.world.blocks.production.Pump const Separator = Packages.io.anuke.mindustry.world.blocks.production.Separator const SolidPump = Packages.io.anuke.mindustry.world.blocks.production.SolidPump +const SolidPumpEntity = Packages.io.anuke.mindustry.world.blocks.production.SolidPump.SolidPumpEntity const ItemSource = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemSource +const ItemSourceEntity = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemSource.ItemSourceEntity const ItemVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemVoid const LiquidSource = Packages.io.anuke.mindustry.world.blocks.sandbox.LiquidSource +const LiquidSourceEntity = Packages.io.anuke.mindustry.world.blocks.sandbox.LiquidSource.LiquidSourceEntity const PowerSource = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerSource const PowerVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerVoid const CoreBlock = Packages.io.anuke.mindustry.world.blocks.storage.CoreBlock +const CoreEntity = Packages.io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity const LaunchPad = Packages.io.anuke.mindustry.world.blocks.storage.LaunchPad const StorageBlock = Packages.io.anuke.mindustry.world.blocks.storage.StorageBlock +const StorageBlockEntity = Packages.io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageBlockEntity const Unloader = Packages.io.anuke.mindustry.world.blocks.storage.Unloader +const UnloaderEntity = Packages.io.anuke.mindustry.world.blocks.storage.Unloader.UnloaderEntity const Vault = Packages.io.anuke.mindustry.world.blocks.storage.Vault const CommandCenter = Packages.io.anuke.mindustry.world.blocks.units.CommandCenter +const CommandCenterEntity = Packages.io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity const MechPad = Packages.io.anuke.mindustry.world.blocks.units.MechPad +const MechFactoryEntity = Packages.io.anuke.mindustry.world.blocks.units.MechPad.MechFactoryEntity const RallyPoint = Packages.io.anuke.mindustry.world.blocks.units.RallyPoint const RepairPoint = Packages.io.anuke.mindustry.world.blocks.units.RepairPoint +const RepairPointEntity = Packages.io.anuke.mindustry.world.blocks.units.RepairPoint.RepairPointEntity const UnitFactory = Packages.io.anuke.mindustry.world.blocks.units.UnitFactory +const UnitFactoryEntity = Packages.io.anuke.mindustry.world.blocks.units.UnitFactory.UnitFactoryEntity const Consume = Packages.io.anuke.mindustry.world.consumers.Consume const ConsumeItemFilter = Packages.io.anuke.mindustry.world.consumers.ConsumeItemFilter const ConsumeItems = Packages.io.anuke.mindustry.world.consumers.ConsumeItems @@ -384,7 +539,11 @@ const StringValue = Packages.io.anuke.mindustry.world.meta.values.StringValue const BlockModule = Packages.io.anuke.mindustry.world.modules.BlockModule const ConsumeModule = Packages.io.anuke.mindustry.world.modules.ConsumeModule const ItemModule = Packages.io.anuke.mindustry.world.modules.ItemModule +const ItemCalculator = Packages.io.anuke.mindustry.world.modules.ItemModule.ItemCalculator +const ItemConsumer = Packages.io.anuke.mindustry.world.modules.ItemModule.ItemConsumer const LiquidModule = Packages.io.anuke.mindustry.world.modules.LiquidModule +const LiquidCalculator = Packages.io.anuke.mindustry.world.modules.LiquidModule.LiquidCalculator +const LiquidConsumer = Packages.io.anuke.mindustry.world.modules.LiquidModule.LiquidConsumer const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule const Produce = Packages.io.anuke.mindustry.world.producers.Produce const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 2dec3d6759..562bcd6b8f 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index d9425299f6..2795e43eea 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -17,23 +17,6 @@ public class Scripts implements Disposable{ context = Vars.platform.getScriptContext(); context.setClassShutter(type -> ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream")); - context.setErrorReporter(new ErrorReporter(){ - @Override - public void warning(String message, String sourceName, int line, String lineSource, int lineOffset){ - - } - - @Override - public void error(String message, String sourceName, int line, String lineSource, int lineOffset){ - Log.info(message + "@" + sourceName + ":" + line); - } - - @Override - public EvaluatorException runtimeError(String message, String sourceName, int line, String lineSource, int lineOffset){ - Log.info(message + "@" + sourceName + ":" + line); - return null; - } - }); scope = context.initStandardObjects(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); diff --git a/gradle.properties b/gradle.properties index f39d88dacf..f61b492a7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=7c853686fcf7fac56405919817d7f8caef00c0f2 +archash=ef6d1485c36346e008ac6818ec972e7781f9ba8d diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 81493e6858..5971faed5d 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -2,14 +2,17 @@ package io.anuke.mindustry.tools; import io.anuke.arc.*; import io.anuke.arc.collection.*; +import io.anuke.arc.collection.Array; import io.anuke.arc.files.*; import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.graphics.g2d.TextureAtlas.*; import io.anuke.arc.util.*; import org.reflections.*; import org.reflections.scanners.*; import org.reflections.util.*; import java.io.*; +import java.lang.reflect.*; import java.util.*; public class ScriptStubGenerator{ @@ -18,7 +21,7 @@ public class ScriptStubGenerator{ String base = "io.anuke.mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer"); - Array> whitelist = Array.with(Draw.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class); + Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + @@ -43,13 +46,17 @@ public class ScriptStubGenerator{ classes.addAll(whitelist); classes.sort(Structs.comparing(Class::getName)); - classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.isMemberClass() || type.getCanonicalName() == null + classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); + classes.distinct(); + ObjectSet used = ObjectSet.with(); StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); for(Class type : classes){ + if(used.contains(type.getSimpleName())) continue; result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); + used.add(type.getSimpleName()); } //Log.info(result); From 96aa3ccee0b63066a019a85ecc719bf713feffbb Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 00:34:27 -0500 Subject: [PATCH 026/107] Various improvements --- core/assets/scripts/base.js | 2 +- core/assets/scripts/global.js | 77 +++++++++++++------ core/assets/scripts/wrapper.js | 2 +- .../src/io/anuke/mindustry/core/Platform.java | 4 +- .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- core/src/io/anuke/mindustry/mod/Scripts.java | 2 +- .../mindustry/tools/ScriptStubGenerator.java | 15 ++-- 7 files changed, 72 insertions(+), 32 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 677d4e996d..d689453537 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -3,7 +3,7 @@ const print = function(obj){ } const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) + return new JavaAdapter(classType, params, modName + "-" + name) } const extend = function(classType, params){ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 2ecfeb5774..fab665ed72 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -5,7 +5,7 @@ const print = function(obj){ } const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, name) + return new JavaAdapter(classType, params, modName + "-" + name) } const extend = function(classType, params){ @@ -13,26 +13,6 @@ const extend = function(classType, params){ } const Core = Packages.io.anuke.arc.Core -const Boolc = Packages.io.anuke.arc.func.Boolc -const Boolf = Packages.io.anuke.arc.func.Boolf -const Boolf2 = Packages.io.anuke.arc.func.Boolf2 -const Boolp = Packages.io.anuke.arc.func.Boolp -const Cons = Packages.io.anuke.arc.func.Cons -const Cons2 = Packages.io.anuke.arc.func.Cons2 -const Floatc = Packages.io.anuke.arc.func.Floatc -const Floatc2 = Packages.io.anuke.arc.func.Floatc2 -const Floatc4 = Packages.io.anuke.arc.func.Floatc4 -const Floatf = Packages.io.anuke.arc.func.Floatf -const Floatp = Packages.io.anuke.arc.func.Floatp -const Func = Packages.io.anuke.arc.func.Func -const Func2 = Packages.io.anuke.arc.func.Func2 -const Func3 = Packages.io.anuke.arc.func.Func3 -const Intc = Packages.io.anuke.arc.func.Intc -const Intc2 = Packages.io.anuke.arc.func.Intc2 -const Intc4 = Packages.io.anuke.arc.func.Intc4 -const Intf = Packages.io.anuke.arc.func.Intf -const Intp = Packages.io.anuke.arc.func.Intp -const Prov = Packages.io.anuke.arc.func.Prov const Draw = Packages.io.anuke.arc.graphics.g2d.Draw const Fill = Packages.io.anuke.arc.graphics.g2d.Fill const Lines = Packages.io.anuke.arc.graphics.g2d.Lines @@ -83,8 +63,16 @@ const EditorTile = Packages.io.anuke.mindustry.editor.EditorTile const EditorTool = Packages.io.anuke.mindustry.editor.EditorTool const MapEditor = Packages.io.anuke.mindustry.editor.MapEditor const Context = Packages.io.anuke.mindustry.editor.MapEditor.Context +const MapEditorDialog = Packages.io.anuke.mindustry.editor.MapEditorDialog +const MapGenerateDialog = Packages.io.anuke.mindustry.editor.MapGenerateDialog +const MapInfoDialog = Packages.io.anuke.mindustry.editor.MapInfoDialog +const MapLoadDialog = Packages.io.anuke.mindustry.editor.MapLoadDialog const MapRenderer = Packages.io.anuke.mindustry.editor.MapRenderer +const MapResizeDialog = Packages.io.anuke.mindustry.editor.MapResizeDialog +const MapSaveDialog = Packages.io.anuke.mindustry.editor.MapSaveDialog +const MapView = Packages.io.anuke.mindustry.editor.MapView const OperationStack = Packages.io.anuke.mindustry.editor.OperationStack +const WaveInfoDialog = Packages.io.anuke.mindustry.editor.WaveInfoDialog const Damage = Packages.io.anuke.mindustry.entities.Damage const PropCellStruct = Packages.io.anuke.mindustry.entities.Damage.PropCellStruct const Effects = Packages.io.anuke.mindustry.entities.Effects @@ -323,21 +311,67 @@ const UnitType = Packages.io.anuke.mindustry.type.UnitType const Weapon = Packages.io.anuke.mindustry.type.Weapon const WeatherEvent = Packages.io.anuke.mindustry.type.WeatherEvent const Zone = Packages.io.anuke.mindustry.type.Zone +const Bar = Packages.io.anuke.mindustry.ui.Bar +const BorderImage = Packages.io.anuke.mindustry.ui.BorderImage const Cicon = Packages.io.anuke.mindustry.ui.Cicon const ContentDisplay = Packages.io.anuke.mindustry.ui.ContentDisplay const Fonts = Packages.io.anuke.mindustry.ui.Fonts +const GridImage = Packages.io.anuke.mindustry.ui.GridImage const IconSize = Packages.io.anuke.mindustry.ui.IconSize const IntFormat = Packages.io.anuke.mindustry.ui.IntFormat +const ItemDisplay = Packages.io.anuke.mindustry.ui.ItemDisplay +const ItemImage = Packages.io.anuke.mindustry.ui.ItemImage +const ItemsDisplay = Packages.io.anuke.mindustry.ui.ItemsDisplay const Links = Packages.io.anuke.mindustry.ui.Links const LinkEntry = Packages.io.anuke.mindustry.ui.Links.LinkEntry +const LiquidDisplay = Packages.io.anuke.mindustry.ui.LiquidDisplay +const Minimap = Packages.io.anuke.mindustry.ui.Minimap +const MobileButton = Packages.io.anuke.mindustry.ui.MobileButton +const MultiReqImage = Packages.io.anuke.mindustry.ui.MultiReqImage +const ReqImage = Packages.io.anuke.mindustry.ui.ReqImage const Styles = Packages.io.anuke.mindustry.ui.Styles +const AboutDialog = Packages.io.anuke.mindustry.ui.dialogs.AboutDialog +const AdminsDialog = Packages.io.anuke.mindustry.ui.dialogs.AdminsDialog +const BansDialog = Packages.io.anuke.mindustry.ui.dialogs.BansDialog +const ColorPicker = Packages.io.anuke.mindustry.ui.dialogs.ColorPicker +const ContentInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.ContentInfoDialog +const ControlsDialog = Packages.io.anuke.mindustry.ui.dialogs.ControlsDialog +const CustomGameDialog = Packages.io.anuke.mindustry.ui.dialogs.CustomGameDialog +const CustomRulesDialog = Packages.io.anuke.mindustry.ui.dialogs.CustomRulesDialog +const DatabaseDialog = Packages.io.anuke.mindustry.ui.dialogs.DatabaseDialog +const DeployDialog = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog +const View = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog.View const ZoneNode = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog.ZoneNode +const DiscordDialog = Packages.io.anuke.mindustry.ui.dialogs.DiscordDialog +const FileChooser = Packages.io.anuke.mindustry.ui.dialogs.FileChooser const FileHistory = Packages.io.anuke.mindustry.ui.dialogs.FileChooser.FileHistory +const FloatingDialog = Packages.io.anuke.mindustry.ui.dialogs.FloatingDialog +const GameOverDialog = Packages.io.anuke.mindustry.ui.dialogs.GameOverDialog +const HostDialog = Packages.io.anuke.mindustry.ui.dialogs.HostDialog +const JoinDialog = Packages.io.anuke.mindustry.ui.dialogs.JoinDialog const Server = Packages.io.anuke.mindustry.ui.dialogs.JoinDialog.Server +const LanguageDialog = Packages.io.anuke.mindustry.ui.dialogs.LanguageDialog +const LoadDialog = Packages.io.anuke.mindustry.ui.dialogs.LoadDialog +const LoadoutDialog = Packages.io.anuke.mindustry.ui.dialogs.LoadoutDialog +const MapPlayDialog = Packages.io.anuke.mindustry.ui.dialogs.MapPlayDialog +const MapsDialog = Packages.io.anuke.mindustry.ui.dialogs.MapsDialog +const MinimapDialog = Packages.io.anuke.mindustry.ui.dialogs.MinimapDialog +const ModsDialog = Packages.io.anuke.mindustry.ui.dialogs.ModsDialog +const PaletteDialog = Packages.io.anuke.mindustry.ui.dialogs.PaletteDialog +const PausedDialog = Packages.io.anuke.mindustry.ui.dialogs.PausedDialog +const SaveDialog = Packages.io.anuke.mindustry.ui.dialogs.SaveDialog +const SchematicsDialog = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog +const SchematicImage = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog.SchematicImage +const SchematicInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog.SchematicInfoDialog +const SettingsMenuDialog = Packages.io.anuke.mindustry.ui.dialogs.SettingsMenuDialog +const TechTreeDialog = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog const LayoutNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.LayoutNode const TechTreeNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.TechTreeNode +const TraceDialog = Packages.io.anuke.mindustry.ui.dialogs.TraceDialog +const ZoneInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.ZoneInfoDialog const BlockConfigFragment = Packages.io.anuke.mindustry.ui.fragments.BlockConfigFragment const BlockInventoryFragment = Packages.io.anuke.mindustry.ui.fragments.BlockInventoryFragment +const ChatFragment = Packages.io.anuke.mindustry.ui.fragments.ChatFragment const FadeInFragment = Packages.io.anuke.mindustry.ui.fragments.FadeInFragment const Fragment = Packages.io.anuke.mindustry.ui.fragments.Fragment const HudFragment = Packages.io.anuke.mindustry.ui.fragments.HudFragment @@ -548,4 +582,3 @@ const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule const Produce = Packages.io.anuke.mindustry.world.producers.Produce const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem const PrintStream = Packages.java.io.PrintStream -const System = Packages.java.lang.System diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js index cfe44f4074..121d306d71 100755 --- a/core/assets/scripts/wrapper.js +++ b/core/assets/scripts/wrapper.js @@ -1,2 +1,2 @@ - +modName = "$MOD_NAME$" $CODE$ diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index 84630e3926..b4798fa704 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -53,7 +53,9 @@ public interface Platform{ } default Context getScriptContext(){ - return Context.enter(); + Context c = Context.enter(); + c.setOptimizationLevel(9); + return c; } /** Add a text input dialog that should show up after the field is tapped. */ diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 562bcd6b8f..9c21d684f7 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 2795e43eea..2ee6b1bbbf 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -26,7 +26,7 @@ public class Scripts implements Disposable{ } public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" + file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()), file.name()); + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" + file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); } private void run(String script, String file){ diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 5971faed5d..9701743a64 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -1,8 +1,8 @@ package io.anuke.mindustry.tools; import io.anuke.arc.*; -import io.anuke.arc.collection.*; import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.*; @@ -20,8 +20,9 @@ public class ScriptStubGenerator{ public static void main(String[] args){ String base = "io.anuke.mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); - Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer"); - Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class); + Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); + Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class); + Array nopackage = Array.with("io.anuke.arc.func", "java.lang"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + @@ -39,7 +40,11 @@ public class ScriptStubGenerator{ Reflections reflections = new Reflections(new ConfigurationBuilder() .setScanners(new SubTypesScanner(false), new ResourcesScanner()) .setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0]))) - .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("io.anuke.mindustry")).include(FilterBuilder.prefix("io.anuke.arc.func")))); + .filterInputsBy(new FilterBuilder() + .include(FilterBuilder.prefix("io.anuke.mindustry")) + .include(FilterBuilder.prefix("io.anuke.arc.func")) + .include(FilterBuilder.prefix("io.anuke.arc.scene")) + )); Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); classes.addAll(reflections.getSubTypesOf(Enum.class)); @@ -54,7 +59,7 @@ public class ScriptStubGenerator{ StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); for(Class type : classes){ - if(used.contains(type.getSimpleName())) continue; + if(used.contains(type.getSimpleName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); used.add(type.getSimpleName()); } From 93fd6c5bd6f5d5dc0ea594769864c03631a8e07e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 01:51:09 -0500 Subject: [PATCH 027/107] Removed massive import wall --- core/assets/scripts/global.js | 570 ------------------ .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- .../mindustry/tools/ScriptStubGenerator.java | 4 +- 3 files changed, 4 insertions(+), 572 deletions(-) diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index fab665ed72..96a1775e91 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -12,573 +12,3 @@ const extend = function(classType, params){ return new JavaAdapter(classType, params) } -const Core = Packages.io.anuke.arc.Core -const Draw = Packages.io.anuke.arc.graphics.g2d.Draw -const Fill = Packages.io.anuke.arc.graphics.g2d.Fill -const Lines = Packages.io.anuke.arc.graphics.g2d.Lines -const TextureAtlas = Packages.io.anuke.arc.graphics.g2d.TextureAtlas -const AtlasRegion = Packages.io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion -const TextureRegion = Packages.io.anuke.arc.graphics.g2d.TextureRegion -const Time = Packages.io.anuke.arc.util.Time -const Vars = Packages.io.anuke.mindustry.Vars -const BlockIndexer = Packages.io.anuke.mindustry.ai.BlockIndexer -const Pathfinder = Packages.io.anuke.mindustry.ai.Pathfinder -const PathData = Packages.io.anuke.mindustry.ai.Pathfinder.PathData -const PathTarget = Packages.io.anuke.mindustry.ai.Pathfinder.PathTarget -const PathTileStruct = Packages.io.anuke.mindustry.ai.Pathfinder.PathTileStruct -const WaveSpawner = Packages.io.anuke.mindustry.ai.WaveSpawner -const Blocks = Packages.io.anuke.mindustry.content.Blocks -const Bullets = Packages.io.anuke.mindustry.content.Bullets -const Fx = Packages.io.anuke.mindustry.content.Fx -const Items = Packages.io.anuke.mindustry.content.Items -const Liquids = Packages.io.anuke.mindustry.content.Liquids -const Loadouts = Packages.io.anuke.mindustry.content.Loadouts -const Mechs = Packages.io.anuke.mindustry.content.Mechs -const StatusEffects = Packages.io.anuke.mindustry.content.StatusEffects -const TechTree = Packages.io.anuke.mindustry.content.TechTree -const TechNode = Packages.io.anuke.mindustry.content.TechTree.TechNode -const TypeIDs = Packages.io.anuke.mindustry.content.TypeIDs -const UnitTypes = Packages.io.anuke.mindustry.content.UnitTypes -const Zones = Packages.io.anuke.mindustry.content.Zones -const ContentLoader = Packages.io.anuke.mindustry.core.ContentLoader -const Control = Packages.io.anuke.mindustry.core.Control -const FileTree = Packages.io.anuke.mindustry.core.FileTree -const GameState = Packages.io.anuke.mindustry.core.GameState -const State = Packages.io.anuke.mindustry.core.GameState.State -const Logic = Packages.io.anuke.mindustry.core.Logic -const Platform = Packages.io.anuke.mindustry.core.Platform -const Renderer = Packages.io.anuke.mindustry.core.Renderer -const UI = Packages.io.anuke.mindustry.core.UI -const Version = Packages.io.anuke.mindustry.core.Version -const World = Packages.io.anuke.mindustry.core.World -const Raycaster = Packages.io.anuke.mindustry.core.World.Raycaster -const Content = Packages.io.anuke.mindustry.ctype.Content -const ContentList = Packages.io.anuke.mindustry.ctype.ContentList -const MappableContent = Packages.io.anuke.mindustry.ctype.MappableContent -const UnlockableContent = Packages.io.anuke.mindustry.ctype.UnlockableContent -const DrawOperation = Packages.io.anuke.mindustry.editor.DrawOperation -const OpType = Packages.io.anuke.mindustry.editor.DrawOperation.OpType -const TileOpStruct = Packages.io.anuke.mindustry.editor.DrawOperation.TileOpStruct -const EditorTile = Packages.io.anuke.mindustry.editor.EditorTile -const EditorTool = Packages.io.anuke.mindustry.editor.EditorTool -const MapEditor = Packages.io.anuke.mindustry.editor.MapEditor -const Context = Packages.io.anuke.mindustry.editor.MapEditor.Context -const MapEditorDialog = Packages.io.anuke.mindustry.editor.MapEditorDialog -const MapGenerateDialog = Packages.io.anuke.mindustry.editor.MapGenerateDialog -const MapInfoDialog = Packages.io.anuke.mindustry.editor.MapInfoDialog -const MapLoadDialog = Packages.io.anuke.mindustry.editor.MapLoadDialog -const MapRenderer = Packages.io.anuke.mindustry.editor.MapRenderer -const MapResizeDialog = Packages.io.anuke.mindustry.editor.MapResizeDialog -const MapSaveDialog = Packages.io.anuke.mindustry.editor.MapSaveDialog -const MapView = Packages.io.anuke.mindustry.editor.MapView -const OperationStack = Packages.io.anuke.mindustry.editor.OperationStack -const WaveInfoDialog = Packages.io.anuke.mindustry.editor.WaveInfoDialog -const Damage = Packages.io.anuke.mindustry.entities.Damage -const PropCellStruct = Packages.io.anuke.mindustry.entities.Damage.PropCellStruct -const Effects = Packages.io.anuke.mindustry.entities.Effects -const Effect = Packages.io.anuke.mindustry.entities.Effects.Effect -const EffectContainer = Packages.io.anuke.mindustry.entities.Effects.EffectContainer -const EffectProvider = Packages.io.anuke.mindustry.entities.Effects.EffectProvider -const EffectRenderer = Packages.io.anuke.mindustry.entities.Effects.EffectRenderer -const ScreenshakeProvider = Packages.io.anuke.mindustry.entities.Effects.ScreenshakeProvider -const Entities = Packages.io.anuke.mindustry.entities.Entities -const EntityCollisions = Packages.io.anuke.mindustry.entities.EntityCollisions -const EntityGroup = Packages.io.anuke.mindustry.entities.EntityGroup -const Predict = Packages.io.anuke.mindustry.entities.Predict -const TargetPriority = Packages.io.anuke.mindustry.entities.TargetPriority -const Units = Packages.io.anuke.mindustry.entities.Units -const ArtilleryBulletType = Packages.io.anuke.mindustry.entities.bullet.ArtilleryBulletType -const BasicBulletType = Packages.io.anuke.mindustry.entities.bullet.BasicBulletType -const BombBulletType = Packages.io.anuke.mindustry.entities.bullet.BombBulletType -const BulletType = Packages.io.anuke.mindustry.entities.bullet.BulletType -const FlakBulletType = Packages.io.anuke.mindustry.entities.bullet.FlakBulletType -const HealBulletType = Packages.io.anuke.mindustry.entities.bullet.HealBulletType -const LiquidBulletType = Packages.io.anuke.mindustry.entities.bullet.LiquidBulletType -const MassDriverBolt = Packages.io.anuke.mindustry.entities.bullet.MassDriverBolt -const MissileBulletType = Packages.io.anuke.mindustry.entities.bullet.MissileBulletType -const Decal = Packages.io.anuke.mindustry.entities.effect.Decal -const Fire = Packages.io.anuke.mindustry.entities.effect.Fire -const GroundEffectEntity = Packages.io.anuke.mindustry.entities.effect.GroundEffectEntity -const GroundEffect = Packages.io.anuke.mindustry.entities.effect.GroundEffectEntity.GroundEffect -const ItemTransfer = Packages.io.anuke.mindustry.entities.effect.ItemTransfer -const Lightning = Packages.io.anuke.mindustry.entities.effect.Lightning -const Puddle = Packages.io.anuke.mindustry.entities.effect.Puddle -const RubbleDecal = Packages.io.anuke.mindustry.entities.effect.RubbleDecal -const ScorchDecal = Packages.io.anuke.mindustry.entities.effect.ScorchDecal -const AbsorbTrait = Packages.io.anuke.mindustry.entities.traits.AbsorbTrait -const BelowLiquidTrait = Packages.io.anuke.mindustry.entities.traits.BelowLiquidTrait -const BuilderMinerTrait = Packages.io.anuke.mindustry.entities.traits.BuilderMinerTrait -const BuilderTrait = Packages.io.anuke.mindustry.entities.traits.BuilderTrait -const BuildDataStatic = Packages.io.anuke.mindustry.entities.traits.BuilderTrait.BuildDataStatic -const BuildRequest = Packages.io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest -const DamageTrait = Packages.io.anuke.mindustry.entities.traits.DamageTrait -const DrawTrait = Packages.io.anuke.mindustry.entities.traits.DrawTrait -const Entity = Packages.io.anuke.mindustry.entities.traits.Entity -const HealthTrait = Packages.io.anuke.mindustry.entities.traits.HealthTrait -const KillerTrait = Packages.io.anuke.mindustry.entities.traits.KillerTrait -const MinerTrait = Packages.io.anuke.mindustry.entities.traits.MinerTrait -const MoveTrait = Packages.io.anuke.mindustry.entities.traits.MoveTrait -const SaveTrait = Packages.io.anuke.mindustry.entities.traits.SaveTrait -const Saveable = Packages.io.anuke.mindustry.entities.traits.Saveable -const ScaleTrait = Packages.io.anuke.mindustry.entities.traits.ScaleTrait -const ShooterTrait = Packages.io.anuke.mindustry.entities.traits.ShooterTrait -const SolidTrait = Packages.io.anuke.mindustry.entities.traits.SolidTrait -const SpawnerTrait = Packages.io.anuke.mindustry.entities.traits.SpawnerTrait -const SyncTrait = Packages.io.anuke.mindustry.entities.traits.SyncTrait -const TargetTrait = Packages.io.anuke.mindustry.entities.traits.TargetTrait -const TeamTrait = Packages.io.anuke.mindustry.entities.traits.TeamTrait -const TimeTrait = Packages.io.anuke.mindustry.entities.traits.TimeTrait -const TypeTrait = Packages.io.anuke.mindustry.entities.traits.TypeTrait -const VelocityTrait = Packages.io.anuke.mindustry.entities.traits.VelocityTrait -const BaseEntity = Packages.io.anuke.mindustry.entities.type.BaseEntity -const BaseUnit = Packages.io.anuke.mindustry.entities.type.BaseUnit -const Bullet = Packages.io.anuke.mindustry.entities.type.Bullet -const DestructibleEntity = Packages.io.anuke.mindustry.entities.type.DestructibleEntity -const EffectEntity = Packages.io.anuke.mindustry.entities.type.EffectEntity -const Player = Packages.io.anuke.mindustry.entities.type.Player -const SolidEntity = Packages.io.anuke.mindustry.entities.type.SolidEntity -const TileEntity = Packages.io.anuke.mindustry.entities.type.TileEntity -const TimedEntity = Packages.io.anuke.mindustry.entities.type.TimedEntity -const Unit = Packages.io.anuke.mindustry.entities.type.Unit -const BaseDrone = Packages.io.anuke.mindustry.entities.type.base.BaseDrone -const BuilderDrone = Packages.io.anuke.mindustry.entities.type.base.BuilderDrone -const Crawler = Packages.io.anuke.mindustry.entities.type.base.Crawler -const Dagger = Packages.io.anuke.mindustry.entities.type.base.Dagger -const Draug = Packages.io.anuke.mindustry.entities.type.base.Draug -const Eruptor = Packages.io.anuke.mindustry.entities.type.base.Eruptor -const FlyingUnit = Packages.io.anuke.mindustry.entities.type.base.FlyingUnit -const Fortress = Packages.io.anuke.mindustry.entities.type.base.Fortress -const Ghoul = Packages.io.anuke.mindustry.entities.type.base.Ghoul -const GroundUnit = Packages.io.anuke.mindustry.entities.type.base.GroundUnit -const MinerDrone = Packages.io.anuke.mindustry.entities.type.base.MinerDrone -const Phantom = Packages.io.anuke.mindustry.entities.type.base.Phantom -const RepairDrone = Packages.io.anuke.mindustry.entities.type.base.RepairDrone -const Revenant = Packages.io.anuke.mindustry.entities.type.base.Revenant -const Spirit = Packages.io.anuke.mindustry.entities.type.base.Spirit -const Titan = Packages.io.anuke.mindustry.entities.type.base.Titan -const Wraith = Packages.io.anuke.mindustry.entities.type.base.Wraith -const StateMachine = Packages.io.anuke.mindustry.entities.units.StateMachine -const Statuses = Packages.io.anuke.mindustry.entities.units.Statuses -const StatusEntry = Packages.io.anuke.mindustry.entities.units.Statuses.StatusEntry -const UnitCommand = Packages.io.anuke.mindustry.entities.units.UnitCommand -const UnitDrops = Packages.io.anuke.mindustry.entities.units.UnitDrops -const UnitState = Packages.io.anuke.mindustry.entities.units.UnitState -const DefaultWaves = Packages.io.anuke.mindustry.game.DefaultWaves -const Difficulty = Packages.io.anuke.mindustry.game.Difficulty -const EventType = Packages.io.anuke.mindustry.game.EventType -const BlockBuildBeginEvent = Packages.io.anuke.mindustry.game.EventType.BlockBuildBeginEvent -const BlockBuildEndEvent = Packages.io.anuke.mindustry.game.EventType.BlockBuildEndEvent -const BlockDestroyEvent = Packages.io.anuke.mindustry.game.EventType.BlockDestroyEvent -const BlockInfoEvent = Packages.io.anuke.mindustry.game.EventType.BlockInfoEvent -const BuildSelectEvent = Packages.io.anuke.mindustry.game.EventType.BuildSelectEvent -const ClientLoadEvent = Packages.io.anuke.mindustry.game.EventType.ClientLoadEvent -const CommandIssueEvent = Packages.io.anuke.mindustry.game.EventType.CommandIssueEvent -const ContentReloadEvent = Packages.io.anuke.mindustry.game.EventType.ContentReloadEvent -const CoreItemDeliverEvent = Packages.io.anuke.mindustry.game.EventType.CoreItemDeliverEvent -const DepositEvent = Packages.io.anuke.mindustry.game.EventType.DepositEvent -const DisposeEvent = Packages.io.anuke.mindustry.game.EventType.DisposeEvent -const GameOverEvent = Packages.io.anuke.mindustry.game.EventType.GameOverEvent -const LaunchEvent = Packages.io.anuke.mindustry.game.EventType.LaunchEvent -const LaunchItemEvent = Packages.io.anuke.mindustry.game.EventType.LaunchItemEvent -const LineConfirmEvent = Packages.io.anuke.mindustry.game.EventType.LineConfirmEvent -const LoseEvent = Packages.io.anuke.mindustry.game.EventType.LoseEvent -const MapMakeEvent = Packages.io.anuke.mindustry.game.EventType.MapMakeEvent -const MapPublishEvent = Packages.io.anuke.mindustry.game.EventType.MapPublishEvent -const MechChangeEvent = Packages.io.anuke.mindustry.game.EventType.MechChangeEvent -const PlayEvent = Packages.io.anuke.mindustry.game.EventType.PlayEvent -const PlayerBanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerBanEvent -const PlayerChatEvent = Packages.io.anuke.mindustry.game.EventType.PlayerChatEvent -const PlayerConnect = Packages.io.anuke.mindustry.game.EventType.PlayerConnect -const PlayerIpBanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerIpBanEvent -const PlayerIpUnbanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerIpUnbanEvent -const PlayerJoin = Packages.io.anuke.mindustry.game.EventType.PlayerJoin -const PlayerLeave = Packages.io.anuke.mindustry.game.EventType.PlayerLeave -const PlayerUnbanEvent = Packages.io.anuke.mindustry.game.EventType.PlayerUnbanEvent -const ResearchEvent = Packages.io.anuke.mindustry.game.EventType.ResearchEvent -const ResetEvent = Packages.io.anuke.mindustry.game.EventType.ResetEvent -const ResizeEvent = Packages.io.anuke.mindustry.game.EventType.ResizeEvent -const StateChangeEvent = Packages.io.anuke.mindustry.game.EventType.StateChangeEvent -const TapConfigEvent = Packages.io.anuke.mindustry.game.EventType.TapConfigEvent -const TapEvent = Packages.io.anuke.mindustry.game.EventType.TapEvent -const TileChangeEvent = Packages.io.anuke.mindustry.game.EventType.TileChangeEvent -const Trigger = Packages.io.anuke.mindustry.game.EventType.Trigger -const TurretAmmoDeliverEvent = Packages.io.anuke.mindustry.game.EventType.TurretAmmoDeliverEvent -const UnitCreateEvent = Packages.io.anuke.mindustry.game.EventType.UnitCreateEvent -const UnitDestroyEvent = Packages.io.anuke.mindustry.game.EventType.UnitDestroyEvent -const UnlockEvent = Packages.io.anuke.mindustry.game.EventType.UnlockEvent -const WaveEvent = Packages.io.anuke.mindustry.game.EventType.WaveEvent -const WinEvent = Packages.io.anuke.mindustry.game.EventType.WinEvent -const WithdrawEvent = Packages.io.anuke.mindustry.game.EventType.WithdrawEvent -const WorldLoadEvent = Packages.io.anuke.mindustry.game.EventType.WorldLoadEvent -const ZoneConfigureCompleteEvent = Packages.io.anuke.mindustry.game.EventType.ZoneConfigureCompleteEvent -const ZoneRequireCompleteEvent = Packages.io.anuke.mindustry.game.EventType.ZoneRequireCompleteEvent -const Gamemode = Packages.io.anuke.mindustry.game.Gamemode -const GlobalData = Packages.io.anuke.mindustry.game.GlobalData -const LoopControl = Packages.io.anuke.mindustry.game.LoopControl -const MusicControl = Packages.io.anuke.mindustry.game.MusicControl -const Objective = Packages.io.anuke.mindustry.game.Objective -const Objectives = Packages.io.anuke.mindustry.game.Objectives -const Launched = Packages.io.anuke.mindustry.game.Objectives.Launched -const Unlock = Packages.io.anuke.mindustry.game.Objectives.Unlock -const Wave = Packages.io.anuke.mindustry.game.Objectives.Wave -const ZoneObjective = Packages.io.anuke.mindustry.game.Objectives.ZoneObjective -const ZoneWave = Packages.io.anuke.mindustry.game.Objectives.ZoneWave -const Rules = Packages.io.anuke.mindustry.game.Rules -const Saves = Packages.io.anuke.mindustry.game.Saves -const SaveSlot = Packages.io.anuke.mindustry.game.Saves.SaveSlot -const Schematic = Packages.io.anuke.mindustry.game.Schematic -const Stile = Packages.io.anuke.mindustry.game.Schematic.Stile -const Schematics = Packages.io.anuke.mindustry.game.Schematics -const SoundLoop = Packages.io.anuke.mindustry.game.SoundLoop -const SpawnGroup = Packages.io.anuke.mindustry.game.SpawnGroup -const Stats = Packages.io.anuke.mindustry.game.Stats -const Rank = Packages.io.anuke.mindustry.game.Stats.Rank -const RankResult = Packages.io.anuke.mindustry.game.Stats.RankResult -const Team = Packages.io.anuke.mindustry.game.Team -const Teams = Packages.io.anuke.mindustry.game.Teams -const BrokenBlock = Packages.io.anuke.mindustry.game.Teams.BrokenBlock -const TeamData = Packages.io.anuke.mindustry.game.Teams.TeamData -const Tutorial = Packages.io.anuke.mindustry.game.Tutorial -const TutorialStage = Packages.io.anuke.mindustry.game.Tutorial.TutorialStage -const BlockRenderer = Packages.io.anuke.mindustry.graphics.BlockRenderer -const Bloom = Packages.io.anuke.mindustry.graphics.Bloom -const CacheLayer = Packages.io.anuke.mindustry.graphics.CacheLayer -const Drawf = Packages.io.anuke.mindustry.graphics.Drawf -const FloorRenderer = Packages.io.anuke.mindustry.graphics.FloorRenderer -const IndexedRenderer = Packages.io.anuke.mindustry.graphics.IndexedRenderer -const Layer = Packages.io.anuke.mindustry.graphics.Layer -const LightRenderer = Packages.io.anuke.mindustry.graphics.LightRenderer -const MenuRenderer = Packages.io.anuke.mindustry.graphics.MenuRenderer -const MinimapRenderer = Packages.io.anuke.mindustry.graphics.MinimapRenderer -const MultiPacker = Packages.io.anuke.mindustry.graphics.MultiPacker -const PageType = Packages.io.anuke.mindustry.graphics.MultiPacker.PageType -const OverlayRenderer = Packages.io.anuke.mindustry.graphics.OverlayRenderer -const Pal = Packages.io.anuke.mindustry.graphics.Pal -const Pixelator = Packages.io.anuke.mindustry.graphics.Pixelator -const Shaders = Packages.io.anuke.mindustry.graphics.Shaders -const Binding = Packages.io.anuke.mindustry.input.Binding -const DesktopInput = Packages.io.anuke.mindustry.input.DesktopInput -const InputHandler = Packages.io.anuke.mindustry.input.InputHandler -const PlaceLine = Packages.io.anuke.mindustry.input.InputHandler.PlaceLine -const MobileInput = Packages.io.anuke.mindustry.input.MobileInput -const PlaceMode = Packages.io.anuke.mindustry.input.PlaceMode -const Placement = Packages.io.anuke.mindustry.input.Placement -const DistanceHeuristic = Packages.io.anuke.mindustry.input.Placement.DistanceHeuristic -const NormalizeDrawResult = Packages.io.anuke.mindustry.input.Placement.NormalizeDrawResult -const NormalizeResult = Packages.io.anuke.mindustry.input.Placement.NormalizeResult -const TileHueristic = Packages.io.anuke.mindustry.input.Placement.TileHueristic -const Map = Packages.io.anuke.mindustry.maps.Map -const Maps = Packages.io.anuke.mindustry.maps.Maps -const MapProvider = Packages.io.anuke.mindustry.maps.Maps.MapProvider -const ShuffleMode = Packages.io.anuke.mindustry.maps.Maps.ShuffleMode -const BlendFilter = Packages.io.anuke.mindustry.maps.filters.BlendFilter -const ClearFilter = Packages.io.anuke.mindustry.maps.filters.ClearFilter -const DistortFilter = Packages.io.anuke.mindustry.maps.filters.DistortFilter -const FilterOption = Packages.io.anuke.mindustry.maps.filters.FilterOption -const BlockOption = Packages.io.anuke.mindustry.maps.filters.FilterOption.BlockOption -const SliderOption = Packages.io.anuke.mindustry.maps.filters.FilterOption.SliderOption -const GenerateFilter = Packages.io.anuke.mindustry.maps.filters.GenerateFilter -const GenerateInput = Packages.io.anuke.mindustry.maps.filters.GenerateFilter.GenerateInput -const TileProvider = Packages.io.anuke.mindustry.maps.filters.GenerateFilter.GenerateInput.TileProvider -const MedianFilter = Packages.io.anuke.mindustry.maps.filters.MedianFilter -const MirrorFilter = Packages.io.anuke.mindustry.maps.filters.MirrorFilter -const NoiseFilter = Packages.io.anuke.mindustry.maps.filters.NoiseFilter -const OreFilter = Packages.io.anuke.mindustry.maps.filters.OreFilter -const OreMedianFilter = Packages.io.anuke.mindustry.maps.filters.OreMedianFilter -const RiverNoiseFilter = Packages.io.anuke.mindustry.maps.filters.RiverNoiseFilter -const ScatterFilter = Packages.io.anuke.mindustry.maps.filters.ScatterFilter -const TerrainFilter = Packages.io.anuke.mindustry.maps.filters.TerrainFilter -const BasicGenerator = Packages.io.anuke.mindustry.maps.generators.BasicGenerator -const Generator = Packages.io.anuke.mindustry.maps.generators.Generator -const MapGenerator = Packages.io.anuke.mindustry.maps.generators.MapGenerator -const Decoration = Packages.io.anuke.mindustry.maps.generators.MapGenerator.Decoration -const RandomGenerator = Packages.io.anuke.mindustry.maps.generators.RandomGenerator -const DesertWastesGenerator = Packages.io.anuke.mindustry.maps.zonegen.DesertWastesGenerator -const OvergrowthGenerator = Packages.io.anuke.mindustry.maps.zonegen.OvergrowthGenerator -const Category = Packages.io.anuke.mindustry.type.Category -const ContentType = Packages.io.anuke.mindustry.type.ContentType -const Item = Packages.io.anuke.mindustry.type.Item -const ItemStack = Packages.io.anuke.mindustry.type.ItemStack -const ItemType = Packages.io.anuke.mindustry.type.ItemType -const Liquid = Packages.io.anuke.mindustry.type.Liquid -const LiquidStack = Packages.io.anuke.mindustry.type.LiquidStack -const Mech = Packages.io.anuke.mindustry.type.Mech -const Publishable = Packages.io.anuke.mindustry.type.Publishable -const StatusEffect = Packages.io.anuke.mindustry.type.StatusEffect -const TransitionHandler = Packages.io.anuke.mindustry.type.StatusEffect.TransitionHandler -const TypeID = Packages.io.anuke.mindustry.type.TypeID -const UnitType = Packages.io.anuke.mindustry.type.UnitType -const Weapon = Packages.io.anuke.mindustry.type.Weapon -const WeatherEvent = Packages.io.anuke.mindustry.type.WeatherEvent -const Zone = Packages.io.anuke.mindustry.type.Zone -const Bar = Packages.io.anuke.mindustry.ui.Bar -const BorderImage = Packages.io.anuke.mindustry.ui.BorderImage -const Cicon = Packages.io.anuke.mindustry.ui.Cicon -const ContentDisplay = Packages.io.anuke.mindustry.ui.ContentDisplay -const Fonts = Packages.io.anuke.mindustry.ui.Fonts -const GridImage = Packages.io.anuke.mindustry.ui.GridImage -const IconSize = Packages.io.anuke.mindustry.ui.IconSize -const IntFormat = Packages.io.anuke.mindustry.ui.IntFormat -const ItemDisplay = Packages.io.anuke.mindustry.ui.ItemDisplay -const ItemImage = Packages.io.anuke.mindustry.ui.ItemImage -const ItemsDisplay = Packages.io.anuke.mindustry.ui.ItemsDisplay -const Links = Packages.io.anuke.mindustry.ui.Links -const LinkEntry = Packages.io.anuke.mindustry.ui.Links.LinkEntry -const LiquidDisplay = Packages.io.anuke.mindustry.ui.LiquidDisplay -const Minimap = Packages.io.anuke.mindustry.ui.Minimap -const MobileButton = Packages.io.anuke.mindustry.ui.MobileButton -const MultiReqImage = Packages.io.anuke.mindustry.ui.MultiReqImage -const ReqImage = Packages.io.anuke.mindustry.ui.ReqImage -const Styles = Packages.io.anuke.mindustry.ui.Styles -const AboutDialog = Packages.io.anuke.mindustry.ui.dialogs.AboutDialog -const AdminsDialog = Packages.io.anuke.mindustry.ui.dialogs.AdminsDialog -const BansDialog = Packages.io.anuke.mindustry.ui.dialogs.BansDialog -const ColorPicker = Packages.io.anuke.mindustry.ui.dialogs.ColorPicker -const ContentInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.ContentInfoDialog -const ControlsDialog = Packages.io.anuke.mindustry.ui.dialogs.ControlsDialog -const CustomGameDialog = Packages.io.anuke.mindustry.ui.dialogs.CustomGameDialog -const CustomRulesDialog = Packages.io.anuke.mindustry.ui.dialogs.CustomRulesDialog -const DatabaseDialog = Packages.io.anuke.mindustry.ui.dialogs.DatabaseDialog -const DeployDialog = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog -const View = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog.View -const ZoneNode = Packages.io.anuke.mindustry.ui.dialogs.DeployDialog.ZoneNode -const DiscordDialog = Packages.io.anuke.mindustry.ui.dialogs.DiscordDialog -const FileChooser = Packages.io.anuke.mindustry.ui.dialogs.FileChooser -const FileHistory = Packages.io.anuke.mindustry.ui.dialogs.FileChooser.FileHistory -const FloatingDialog = Packages.io.anuke.mindustry.ui.dialogs.FloatingDialog -const GameOverDialog = Packages.io.anuke.mindustry.ui.dialogs.GameOverDialog -const HostDialog = Packages.io.anuke.mindustry.ui.dialogs.HostDialog -const JoinDialog = Packages.io.anuke.mindustry.ui.dialogs.JoinDialog -const Server = Packages.io.anuke.mindustry.ui.dialogs.JoinDialog.Server -const LanguageDialog = Packages.io.anuke.mindustry.ui.dialogs.LanguageDialog -const LoadDialog = Packages.io.anuke.mindustry.ui.dialogs.LoadDialog -const LoadoutDialog = Packages.io.anuke.mindustry.ui.dialogs.LoadoutDialog -const MapPlayDialog = Packages.io.anuke.mindustry.ui.dialogs.MapPlayDialog -const MapsDialog = Packages.io.anuke.mindustry.ui.dialogs.MapsDialog -const MinimapDialog = Packages.io.anuke.mindustry.ui.dialogs.MinimapDialog -const ModsDialog = Packages.io.anuke.mindustry.ui.dialogs.ModsDialog -const PaletteDialog = Packages.io.anuke.mindustry.ui.dialogs.PaletteDialog -const PausedDialog = Packages.io.anuke.mindustry.ui.dialogs.PausedDialog -const SaveDialog = Packages.io.anuke.mindustry.ui.dialogs.SaveDialog -const SchematicsDialog = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog -const SchematicImage = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog.SchematicImage -const SchematicInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.SchematicsDialog.SchematicInfoDialog -const SettingsMenuDialog = Packages.io.anuke.mindustry.ui.dialogs.SettingsMenuDialog -const TechTreeDialog = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog -const LayoutNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.LayoutNode -const TechTreeNode = Packages.io.anuke.mindustry.ui.dialogs.TechTreeDialog.TechTreeNode -const TraceDialog = Packages.io.anuke.mindustry.ui.dialogs.TraceDialog -const ZoneInfoDialog = Packages.io.anuke.mindustry.ui.dialogs.ZoneInfoDialog -const BlockConfigFragment = Packages.io.anuke.mindustry.ui.fragments.BlockConfigFragment -const BlockInventoryFragment = Packages.io.anuke.mindustry.ui.fragments.BlockInventoryFragment -const ChatFragment = Packages.io.anuke.mindustry.ui.fragments.ChatFragment -const FadeInFragment = Packages.io.anuke.mindustry.ui.fragments.FadeInFragment -const Fragment = Packages.io.anuke.mindustry.ui.fragments.Fragment -const HudFragment = Packages.io.anuke.mindustry.ui.fragments.HudFragment -const LoadingFragment = Packages.io.anuke.mindustry.ui.fragments.LoadingFragment -const MenuFragment = Packages.io.anuke.mindustry.ui.fragments.MenuFragment -const OverlayFragment = Packages.io.anuke.mindustry.ui.fragments.OverlayFragment -const PlacementFragment = Packages.io.anuke.mindustry.ui.fragments.PlacementFragment -const PlayerListFragment = Packages.io.anuke.mindustry.ui.fragments.PlayerListFragment -const BranchTreeLayout = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout -const TreeAlignment = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout.TreeAlignment -const TreeLocation = Packages.io.anuke.mindustry.ui.layout.BranchTreeLayout.TreeLocation -const RadialTreeLayout = Packages.io.anuke.mindustry.ui.layout.RadialTreeLayout -const TreeLayout = Packages.io.anuke.mindustry.ui.layout.TreeLayout -const TreeNode = Packages.io.anuke.mindustry.ui.layout.TreeLayout.TreeNode -const Block = Packages.io.anuke.mindustry.world.Block -const BlockStorage = Packages.io.anuke.mindustry.world.BlockStorage -const Build = Packages.io.anuke.mindustry.world.Build -const CachedTile = Packages.io.anuke.mindustry.world.CachedTile -const DirectionalItemBuffer = Packages.io.anuke.mindustry.world.DirectionalItemBuffer -const BufferItemStruct = Packages.io.anuke.mindustry.world.DirectionalItemBuffer.BufferItemStruct -const Edges = Packages.io.anuke.mindustry.world.Edges -const ItemBuffer = Packages.io.anuke.mindustry.world.ItemBuffer -const LegacyColorMapper = Packages.io.anuke.mindustry.world.LegacyColorMapper -const LegacyBlock = Packages.io.anuke.mindustry.world.LegacyColorMapper.LegacyBlock -const Pos = Packages.io.anuke.mindustry.world.Pos -const StaticTree = Packages.io.anuke.mindustry.world.StaticTree -const Tile = Packages.io.anuke.mindustry.world.Tile -const WorldContext = Packages.io.anuke.mindustry.world.WorldContext -const Attributes = Packages.io.anuke.mindustry.world.blocks.Attributes -const Autotiler = Packages.io.anuke.mindustry.world.blocks.Autotiler -const AutotilerHolder = Packages.io.anuke.mindustry.world.blocks.Autotiler.AutotilerHolder -const BlockPart = Packages.io.anuke.mindustry.world.blocks.BlockPart -const BuildBlock = Packages.io.anuke.mindustry.world.blocks.BuildBlock -const BuildEntity = Packages.io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity -const DoubleOverlayFloor = Packages.io.anuke.mindustry.world.blocks.DoubleOverlayFloor -const Floor = Packages.io.anuke.mindustry.world.blocks.Floor -const ItemSelection = Packages.io.anuke.mindustry.world.blocks.ItemSelection -const LiquidBlock = Packages.io.anuke.mindustry.world.blocks.LiquidBlock -const OreBlock = Packages.io.anuke.mindustry.world.blocks.OreBlock -const OverlayFloor = Packages.io.anuke.mindustry.world.blocks.OverlayFloor -const PowerBlock = Packages.io.anuke.mindustry.world.blocks.PowerBlock -const RespawnBlock = Packages.io.anuke.mindustry.world.blocks.RespawnBlock -const Rock = Packages.io.anuke.mindustry.world.blocks.Rock -const StaticWall = Packages.io.anuke.mindustry.world.blocks.StaticWall -const TreeBlock = Packages.io.anuke.mindustry.world.blocks.TreeBlock -const DeflectorWall = Packages.io.anuke.mindustry.world.blocks.defense.DeflectorWall -const DeflectorEntity = Packages.io.anuke.mindustry.world.blocks.defense.DeflectorWall.DeflectorEntity -const Door = Packages.io.anuke.mindustry.world.blocks.defense.Door -const DoorEntity = Packages.io.anuke.mindustry.world.blocks.defense.Door.DoorEntity -const ForceProjector = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector -const ForceEntity = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector.ForceEntity -const ShieldEntity = Packages.io.anuke.mindustry.world.blocks.defense.ForceProjector.ShieldEntity -const MendProjector = Packages.io.anuke.mindustry.world.blocks.defense.MendProjector -const MendEntity = Packages.io.anuke.mindustry.world.blocks.defense.MendProjector.MendEntity -const OverdriveProjector = Packages.io.anuke.mindustry.world.blocks.defense.OverdriveProjector -const OverdriveEntity = Packages.io.anuke.mindustry.world.blocks.defense.OverdriveProjector.OverdriveEntity -const ShockMine = Packages.io.anuke.mindustry.world.blocks.defense.ShockMine -const SurgeWall = Packages.io.anuke.mindustry.world.blocks.defense.SurgeWall -const Wall = Packages.io.anuke.mindustry.world.blocks.defense.Wall -const ArtilleryTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret -const BurstTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret -const ChargeTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret -const LaserTurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret.LaserTurretEntity -const CooledTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret -const DoubleTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret -const ItemTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret -const ItemEntry = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.ItemEntry -const ItemTurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret.ItemTurretEntity -const LaserTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret -const LiquidTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret -const PowerTurret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret -const Turret = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret -const AmmoEntry = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret.AmmoEntry -const TurretEntity = Packages.io.anuke.mindustry.world.blocks.defense.turrets.Turret.TurretEntity -const ArmoredConveyor = Packages.io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor -const BufferedItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge -const BufferedItemBridgeEntity = Packages.io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge.BufferedItemBridgeEntity -const Conveyor = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor -const ConveyorEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor.ConveyorEntity -const ItemPos = Packages.io.anuke.mindustry.world.blocks.distribution.Conveyor.ItemPos -const ExtendingItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge -const ItemBridge = Packages.io.anuke.mindustry.world.blocks.distribution.ItemBridge -const ItemBridgeEntity = Packages.io.anuke.mindustry.world.blocks.distribution.ItemBridge.ItemBridgeEntity -const Junction = Packages.io.anuke.mindustry.world.blocks.distribution.Junction -const JunctionEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Junction.JunctionEntity -const MassDriver = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver -const DriverBulletData = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverBulletData -const DriverState = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.DriverState -const MassDriverEntity = Packages.io.anuke.mindustry.world.blocks.distribution.MassDriver.MassDriverEntity -const OverflowGate = Packages.io.anuke.mindustry.world.blocks.distribution.OverflowGate -const OverflowGateEntity = Packages.io.anuke.mindustry.world.blocks.distribution.OverflowGate.OverflowGateEntity -const Router = Packages.io.anuke.mindustry.world.blocks.distribution.Router -const RouterEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Router.RouterEntity -const Sorter = Packages.io.anuke.mindustry.world.blocks.distribution.Sorter -const SorterEntity = Packages.io.anuke.mindustry.world.blocks.distribution.Sorter.SorterEntity -const ArmoredConduit = Packages.io.anuke.mindustry.world.blocks.liquid.ArmoredConduit -const Conduit = Packages.io.anuke.mindustry.world.blocks.liquid.Conduit -const ConduitEntity = Packages.io.anuke.mindustry.world.blocks.liquid.Conduit.ConduitEntity -const LiquidBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidBridge -const LiquidExtendingBridge = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge -const LiquidJunction = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidJunction -const LiquidOverflowGate = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate -const LiquidRouter = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidRouter -const LiquidTank = Packages.io.anuke.mindustry.world.blocks.liquid.LiquidTank -const LogicBlock = Packages.io.anuke.mindustry.world.blocks.logic.LogicBlock -const MessageBlock = Packages.io.anuke.mindustry.world.blocks.logic.MessageBlock -const MessageBlockEntity = Packages.io.anuke.mindustry.world.blocks.logic.MessageBlock.MessageBlockEntity -const Battery = Packages.io.anuke.mindustry.world.blocks.power.Battery -const BurnerGenerator = Packages.io.anuke.mindustry.world.blocks.power.BurnerGenerator -const ConditionalConsumePower = Packages.io.anuke.mindustry.world.blocks.power.ConditionalConsumePower -const DecayGenerator = Packages.io.anuke.mindustry.world.blocks.power.DecayGenerator -const ImpactReactor = Packages.io.anuke.mindustry.world.blocks.power.ImpactReactor -const FusionReactorEntity = Packages.io.anuke.mindustry.world.blocks.power.ImpactReactor.FusionReactorEntity -const ItemLiquidGenerator = Packages.io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator -const ItemLiquidGeneratorEntity = Packages.io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator.ItemLiquidGeneratorEntity -const LightBlock = Packages.io.anuke.mindustry.world.blocks.power.LightBlock -const LightEntity = Packages.io.anuke.mindustry.world.blocks.power.LightBlock.LightEntity -const NuclearReactor = Packages.io.anuke.mindustry.world.blocks.power.NuclearReactor -const NuclearReactorEntity = Packages.io.anuke.mindustry.world.blocks.power.NuclearReactor.NuclearReactorEntity -const PowerDiode = Packages.io.anuke.mindustry.world.blocks.power.PowerDiode -const PowerDistributor = Packages.io.anuke.mindustry.world.blocks.power.PowerDistributor -const PowerGenerator = Packages.io.anuke.mindustry.world.blocks.power.PowerGenerator -const GeneratorEntity = Packages.io.anuke.mindustry.world.blocks.power.PowerGenerator.GeneratorEntity -const PowerGraph = Packages.io.anuke.mindustry.world.blocks.power.PowerGraph -const PowerNode = Packages.io.anuke.mindustry.world.blocks.power.PowerNode -const SingleTypeGenerator = Packages.io.anuke.mindustry.world.blocks.power.SingleTypeGenerator -const SolarGenerator = Packages.io.anuke.mindustry.world.blocks.power.SolarGenerator -const ThermalGenerator = Packages.io.anuke.mindustry.world.blocks.power.ThermalGenerator -const Cultivator = Packages.io.anuke.mindustry.world.blocks.production.Cultivator -const CultivatorEntity = Packages.io.anuke.mindustry.world.blocks.production.Cultivator.CultivatorEntity -const Drill = Packages.io.anuke.mindustry.world.blocks.production.Drill -const DrillEntity = Packages.io.anuke.mindustry.world.blocks.production.Drill.DrillEntity -const Fracker = Packages.io.anuke.mindustry.world.blocks.production.Fracker -const FrackerEntity = Packages.io.anuke.mindustry.world.blocks.production.Fracker.FrackerEntity -const GenericCrafter = Packages.io.anuke.mindustry.world.blocks.production.GenericCrafter -const GenericCrafterEntity = Packages.io.anuke.mindustry.world.blocks.production.GenericCrafter.GenericCrafterEntity -const GenericSmelter = Packages.io.anuke.mindustry.world.blocks.production.GenericSmelter -const Incinerator = Packages.io.anuke.mindustry.world.blocks.production.Incinerator -const IncineratorEntity = Packages.io.anuke.mindustry.world.blocks.production.Incinerator.IncineratorEntity -const LiquidConverter = Packages.io.anuke.mindustry.world.blocks.production.LiquidConverter -const Pump = Packages.io.anuke.mindustry.world.blocks.production.Pump -const Separator = Packages.io.anuke.mindustry.world.blocks.production.Separator -const SolidPump = Packages.io.anuke.mindustry.world.blocks.production.SolidPump -const SolidPumpEntity = Packages.io.anuke.mindustry.world.blocks.production.SolidPump.SolidPumpEntity -const ItemSource = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemSource -const ItemSourceEntity = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemSource.ItemSourceEntity -const ItemVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.ItemVoid -const LiquidSource = Packages.io.anuke.mindustry.world.blocks.sandbox.LiquidSource -const LiquidSourceEntity = Packages.io.anuke.mindustry.world.blocks.sandbox.LiquidSource.LiquidSourceEntity -const PowerSource = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerSource -const PowerVoid = Packages.io.anuke.mindustry.world.blocks.sandbox.PowerVoid -const CoreBlock = Packages.io.anuke.mindustry.world.blocks.storage.CoreBlock -const CoreEntity = Packages.io.anuke.mindustry.world.blocks.storage.CoreBlock.CoreEntity -const LaunchPad = Packages.io.anuke.mindustry.world.blocks.storage.LaunchPad -const StorageBlock = Packages.io.anuke.mindustry.world.blocks.storage.StorageBlock -const StorageBlockEntity = Packages.io.anuke.mindustry.world.blocks.storage.StorageBlock.StorageBlockEntity -const Unloader = Packages.io.anuke.mindustry.world.blocks.storage.Unloader -const UnloaderEntity = Packages.io.anuke.mindustry.world.blocks.storage.Unloader.UnloaderEntity -const Vault = Packages.io.anuke.mindustry.world.blocks.storage.Vault -const CommandCenter = Packages.io.anuke.mindustry.world.blocks.units.CommandCenter -const CommandCenterEntity = Packages.io.anuke.mindustry.world.blocks.units.CommandCenter.CommandCenterEntity -const MechPad = Packages.io.anuke.mindustry.world.blocks.units.MechPad -const MechFactoryEntity = Packages.io.anuke.mindustry.world.blocks.units.MechPad.MechFactoryEntity -const RallyPoint = Packages.io.anuke.mindustry.world.blocks.units.RallyPoint -const RepairPoint = Packages.io.anuke.mindustry.world.blocks.units.RepairPoint -const RepairPointEntity = Packages.io.anuke.mindustry.world.blocks.units.RepairPoint.RepairPointEntity -const UnitFactory = Packages.io.anuke.mindustry.world.blocks.units.UnitFactory -const UnitFactoryEntity = Packages.io.anuke.mindustry.world.blocks.units.UnitFactory.UnitFactoryEntity -const Consume = Packages.io.anuke.mindustry.world.consumers.Consume -const ConsumeItemFilter = Packages.io.anuke.mindustry.world.consumers.ConsumeItemFilter -const ConsumeItems = Packages.io.anuke.mindustry.world.consumers.ConsumeItems -const ConsumeLiquid = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquid -const ConsumeLiquidBase = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquidBase -const ConsumeLiquidFilter = Packages.io.anuke.mindustry.world.consumers.ConsumeLiquidFilter -const ConsumePower = Packages.io.anuke.mindustry.world.consumers.ConsumePower -const ConsumeType = Packages.io.anuke.mindustry.world.consumers.ConsumeType -const Consumers = Packages.io.anuke.mindustry.world.consumers.Consumers -const Attribute = Packages.io.anuke.mindustry.world.meta.Attribute -const BlockBars = Packages.io.anuke.mindustry.world.meta.BlockBars -const BlockFlag = Packages.io.anuke.mindustry.world.meta.BlockFlag -const BlockGroup = Packages.io.anuke.mindustry.world.meta.BlockGroup -const BlockStat = Packages.io.anuke.mindustry.world.meta.BlockStat -const BlockStats = Packages.io.anuke.mindustry.world.meta.BlockStats -const BuildVisibility = Packages.io.anuke.mindustry.world.meta.BuildVisibility -const PowerType = Packages.io.anuke.mindustry.world.meta.PowerType -const Producers = Packages.io.anuke.mindustry.world.meta.Producers -const StatCategory = Packages.io.anuke.mindustry.world.meta.StatCategory -const StatUnit = Packages.io.anuke.mindustry.world.meta.StatUnit -const StatValue = Packages.io.anuke.mindustry.world.meta.StatValue -const AmmoListValue = Packages.io.anuke.mindustry.world.meta.values.AmmoListValue -const BooleanValue = Packages.io.anuke.mindustry.world.meta.values.BooleanValue -const BoosterListValue = Packages.io.anuke.mindustry.world.meta.values.BoosterListValue -const ItemFilterValue = Packages.io.anuke.mindustry.world.meta.values.ItemFilterValue -const ItemListValue = Packages.io.anuke.mindustry.world.meta.values.ItemListValue -const LiquidFilterValue = Packages.io.anuke.mindustry.world.meta.values.LiquidFilterValue -const LiquidValue = Packages.io.anuke.mindustry.world.meta.values.LiquidValue -const NumberValue = Packages.io.anuke.mindustry.world.meta.values.NumberValue -const StringValue = Packages.io.anuke.mindustry.world.meta.values.StringValue -const BlockModule = Packages.io.anuke.mindustry.world.modules.BlockModule -const ConsumeModule = Packages.io.anuke.mindustry.world.modules.ConsumeModule -const ItemModule = Packages.io.anuke.mindustry.world.modules.ItemModule -const ItemCalculator = Packages.io.anuke.mindustry.world.modules.ItemModule.ItemCalculator -const ItemConsumer = Packages.io.anuke.mindustry.world.modules.ItemModule.ItemConsumer -const LiquidModule = Packages.io.anuke.mindustry.world.modules.LiquidModule -const LiquidCalculator = Packages.io.anuke.mindustry.world.modules.LiquidModule.LiquidCalculator -const LiquidConsumer = Packages.io.anuke.mindustry.world.modules.LiquidModule.LiquidConsumer -const PowerModule = Packages.io.anuke.mindustry.world.modules.PowerModule -const Produce = Packages.io.anuke.mindustry.world.producers.Produce -const ProduceItem = Packages.io.anuke.mindustry.world.producers.ProduceItem -const PrintStream = Packages.java.io.PrintStream diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 9c21d684f7..fec76294b0 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 9701743a64..8928863792 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -23,6 +23,7 @@ public class ScriptStubGenerator{ Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class); Array nopackage = Array.with("io.anuke.arc.func", "java.lang"); + Array imported = Array.with("io.anuke.mindustry.type", "io.anuke.mindustry.world"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + @@ -43,6 +44,7 @@ public class ScriptStubGenerator{ .filterInputsBy(new FilterBuilder() .include(FilterBuilder.prefix("io.anuke.mindustry")) .include(FilterBuilder.prefix("io.anuke.arc.func")) + .include(FilterBuilder.prefix("io.anuke.arc.collection")) .include(FilterBuilder.prefix("io.anuke.arc.scene")) )); @@ -60,7 +62,7 @@ public class ScriptStubGenerator{ result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); for(Class type : classes){ if(used.contains(type.getSimpleName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; - result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); + //result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); used.add(type.getSimpleName()); } From 8b80a42886eb5973077a2cdaa91d74c69f05d5f5 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sat, 7 Dec 2019 17:10:59 +0100 Subject: [PATCH 028/107] Respect insulated blocks when toggeling a powernode (#1163) --- core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 8c3002c417..3c9356076b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -183,7 +183,7 @@ public class PowerNode extends PowerBlock{ if(tile == other){ if(other.entity.power.links.size == 0){ getPotentialLinks(tile, link -> { - tile.configure(link.pos()); + if(!insulated(tile, link)) tile.configure(link.pos()); }); }else{ while(entity.power.links.size > 0){ From 06abc43aea7d0fcf8ba7f3aa7009deadc62b8dc7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 11:37:13 -0500 Subject: [PATCH 029/107] Fixed slow imports --- core/assets/scripts/global.js | 53 +++++++++++++++++++ .../io/anuke/mindustry/content/Blocks.java | 19 +++---- .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 2 +- core/src/io/anuke/mindustry/mod/Scripts.java | 10 +++- .../ui/fragments/ScriptConsoleFragment.java | 11 ++++ .../mindustry/tools/ScriptStubGenerator.java | 8 +-- 7 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 96a1775e91..8cc613f050 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -12,3 +12,56 @@ const extend = function(classType, params){ return new JavaAdapter(classType, params) } +importPackage(Packages.io.anuke.arc) +importPackage(Packages.io.anuke.arc.collection) +importPackage(Packages.io.anuke.arc.graphics.g2d) +importPackage(Packages.io.anuke.arc.scene) +importPackage(Packages.io.anuke.arc.scene.actions) +importPackage(Packages.io.anuke.arc.scene.event) +importPackage(Packages.io.anuke.arc.scene.style) +importPackage(Packages.io.anuke.arc.scene.ui) +importPackage(Packages.io.anuke.arc.scene.ui.layout) +importPackage(Packages.io.anuke.arc.scene.utils) +importPackage(Packages.io.anuke.arc.util) +importPackage(Packages.io.anuke.mindustry) +importPackage(Packages.io.anuke.mindustry.ai) +importPackage(Packages.io.anuke.mindustry.content) +importPackage(Packages.io.anuke.mindustry.core) +importPackage(Packages.io.anuke.mindustry.ctype) +importPackage(Packages.io.anuke.mindustry.editor) +importPackage(Packages.io.anuke.mindustry.entities) +importPackage(Packages.io.anuke.mindustry.entities.bullet) +importPackage(Packages.io.anuke.mindustry.entities.effect) +importPackage(Packages.io.anuke.mindustry.entities.traits) +importPackage(Packages.io.anuke.mindustry.entities.type) +importPackage(Packages.io.anuke.mindustry.entities.type.base) +importPackage(Packages.io.anuke.mindustry.entities.units) +importPackage(Packages.io.anuke.mindustry.game) +importPackage(Packages.io.anuke.mindustry.graphics) +importPackage(Packages.io.anuke.mindustry.input) +importPackage(Packages.io.anuke.mindustry.maps) +importPackage(Packages.io.anuke.mindustry.maps.filters) +importPackage(Packages.io.anuke.mindustry.maps.generators) +importPackage(Packages.io.anuke.mindustry.maps.zonegen) +importPackage(Packages.io.anuke.mindustry.type) +importPackage(Packages.io.anuke.mindustry.ui) +importPackage(Packages.io.anuke.mindustry.ui.dialogs) +importPackage(Packages.io.anuke.mindustry.ui.fragments) +importPackage(Packages.io.anuke.mindustry.ui.layout) +importPackage(Packages.io.anuke.mindustry.world) +importPackage(Packages.io.anuke.mindustry.world.blocks) +importPackage(Packages.io.anuke.mindustry.world.blocks.defense) +importPackage(Packages.io.anuke.mindustry.world.blocks.defense.turrets) +importPackage(Packages.io.anuke.mindustry.world.blocks.distribution) +importPackage(Packages.io.anuke.mindustry.world.blocks.liquid) +importPackage(Packages.io.anuke.mindustry.world.blocks.logic) +importPackage(Packages.io.anuke.mindustry.world.blocks.power) +importPackage(Packages.io.anuke.mindustry.world.blocks.production) +importPackage(Packages.io.anuke.mindustry.world.blocks.sandbox) +importPackage(Packages.io.anuke.mindustry.world.blocks.storage) +importPackage(Packages.io.anuke.mindustry.world.blocks.units) +importPackage(Packages.io.anuke.mindustry.world.consumers) +importPackage(Packages.io.anuke.mindustry.world.meta) +importPackage(Packages.io.anuke.mindustry.world.meta.values) +importPackage(Packages.io.anuke.mindustry.world.modules) +importPackage(Packages.io.anuke.mindustry.world.producers) diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 623fd0ef79..5a0ff5eecd 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -7,7 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.ctype.ContentList; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; @@ -19,8 +19,7 @@ import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.defense.*; import io.anuke.mindustry.world.blocks.defense.turrets.*; import io.anuke.mindustry.world.blocks.distribution.*; -import io.anuke.mindustry.world.blocks.liquid.Conduit; -import io.anuke.mindustry.world.blocks.liquid.LiquidTank; +import io.anuke.mindustry.world.blocks.liquid.*; import io.anuke.mindustry.world.blocks.logic.*; import io.anuke.mindustry.world.blocks.power.*; import io.anuke.mindustry.world.blocks.production.*; @@ -915,6 +914,7 @@ public class Blocks implements ContentList{ phaseConveyor = new ItemBridge("phase-conveyor"){{ requirements(Category.distribution, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.lead, 10, Items.graphite, 10)); range = 12; + canOverdrive = false; hasPower = true; consumes.power(0.30f); }}; @@ -977,7 +977,7 @@ public class Blocks implements ContentList{ size = 3; }}; - conduit = new io.anuke.mindustry.world.blocks.liquid.Conduit("conduit"){{ + conduit = new Conduit("conduit"){{ requirements(Category.liquid, ItemStack.with(Items.metaglass, 1)); health = 45; }}; @@ -989,14 +989,14 @@ public class Blocks implements ContentList{ health = 90; }}; - platedConduit = new io.anuke.mindustry.world.blocks.liquid.ArmoredConduit("plated-conduit"){{ + platedConduit = new ArmoredConduit("plated-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1)); liquidCapacity = 16f; liquidPressure = 1.025f; health = 220; }}; - liquidRouter = new io.anuke.mindustry.world.blocks.liquid.LiquidRouter("liquid-router"){{ + liquidRouter = new LiquidRouter("liquid-router"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 2)); liquidCapacity = 20f; }}; @@ -1008,20 +1008,21 @@ public class Blocks implements ContentList{ health = 500; }}; - liquidJunction = new io.anuke.mindustry.world.blocks.liquid.LiquidJunction("liquid-junction"){{ + liquidJunction = new LiquidJunction("liquid-junction"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 2, Items.metaglass, 2)); }}; - bridgeConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge("bridge-conduit"){{ + bridgeConduit = new LiquidExtendingBridge("bridge-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.graphite, 4, Items.metaglass, 8)); range = 4; hasPower = false; }}; - phaseConduit = new io.anuke.mindustry.world.blocks.liquid.LiquidBridge("phase-conduit"){{ + phaseConduit = new LiquidBridge("phase-conduit"){{ requirements(Category.liquid, ItemStack.with(Items.phasefabric, 5, Items.silicon, 7, Items.metaglass, 20, Items.titanium, 10)); range = 12; hasPower = true; + canOverdrive = false; consumes.power(0.30f); }}; diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index fec76294b0..4c70c6860b 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index d00962604c..23599e0732 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -352,9 +352,9 @@ public class Mods implements Loadable{ scripts.dispose(); scripts = null; } + content.clear(); content.createContent(false); loadScripts(); - content.clear(); content.createContent(); loadAsync(); loadSync(); diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 2ee6b1bbbf..6bde96c2a5 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -18,13 +18,21 @@ public class Scripts implements Disposable{ context = Vars.platform.getScriptContext(); context.setClassShutter(type -> ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream")); - scope = context.initStandardObjects(); + scope = new ImporterTopLevel(context);//context.initStandardObjects(); wrapper = Core.files.internal("scripts/wrapper.js").readString(); run(Core.files.internal("scripts/global.js").readString(), "global.js"); Log.info("Time to load script engine: {0}", Time.elapsed()); } + public String runConsole(String text){ + try{ + return String.valueOf(context.evaluateString(scope, text, "console.js", 1, null)); + }catch(Throwable t){ + return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); + } + } + public void run(LoadedMod mod, FileHandle file){ run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" + file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java new file mode 100644 index 0000000000..f0e28611db --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -0,0 +1,11 @@ +package io.anuke.mindustry.ui.fragments; + +import io.anuke.arc.scene.*; + +public class ScriptConsoleFragment extends Fragment{ + + @Override + public void build(Group parent){ + + } +} diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 8928863792..2bc9514436 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -22,7 +22,7 @@ public class ScriptStubGenerator{ Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class); - Array nopackage = Array.with("io.anuke.arc.func", "java.lang"); + Array nopackage = Array.with("io.anuke.arc.func", "java.lang", "java"); Array imported = Array.with("io.anuke.mindustry.type", "io.anuke.mindustry.world"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + @@ -61,9 +61,9 @@ public class ScriptStubGenerator{ StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); for(Class type : classes){ - if(used.contains(type.getSimpleName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; - //result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getCanonicalName()).append("\n"); - used.add(type.getSimpleName()); + if(used.contains(type.getPackage().getName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; + result.append("importPackage(Packages.").append(type.getPackage().getName()).append(")\n"); + used.add(type.getPackage().getName()); } //Log.info(result); From dd5e3b2aba0f7f7c614db452fdd8b4a020e5bda8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 14:10:39 -0500 Subject: [PATCH 030/107] JS console / Scripting tweaks --- core/assets/scripts/base.js | 4 +- core/assets/scripts/global.js | 4 +- core/assets/scripts/wrapper.js | 8 + .../io/anuke/mindustry/ClientLauncher.java | 10 +- .../anuke/mindustry/core/ContentLoader.java | 67 +++--- core/src/io/anuke/mindustry/core/Control.java | 6 +- .../io/anuke/mindustry/core/NetClient.java | 2 +- core/src/io/anuke/mindustry/core/UI.java | 3 + .../anuke/mindustry/entities/type/Player.java | 6 +- .../src/io/anuke/mindustry/input/Binding.java | 1 + .../anuke/mindustry/input/DesktopInput.java | 14 +- core/src/io/anuke/mindustry/mod/Mods.java | 15 +- core/src/io/anuke/mindustry/mod/Scripts.java | 49 +++- .../mindustry/ui/fragments/ChatFragment.java | 34 ++- .../mindustry/ui/fragments/HudFragment.java | 4 +- .../ui/fragments/PlacementFragment.java | 3 +- .../ui/fragments/ScriptConsoleFragment.java | 224 +++++++++++++++++- gradle.properties | 2 +- .../mindustry/server/MindustryServer.java | 4 +- tests/src/test/java/ApplicationTests.java | 2 +- .../src/test/java/power/PowerTestFixture.java | 2 +- .../io/anuke/mindustry/tools/ImagePacker.java | 2 +- 22 files changed, 365 insertions(+), 101 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index d689453537..124acce5b7 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -1,5 +1,5 @@ -const print = function(obj){ - java.lang.System.out.println(obj ? String(obj) : "null") +const log = function(context, obj){ + Vars.mods.getScripts().log(context, obj ? String(obj) : "null") } const extendContent = function(classType, name, params){ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 8cc613f050..d3c53473ee 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -1,7 +1,7 @@ //Generated class. Do not modify. -const print = function(obj){ - java.lang.System.out.println(obj ? String(obj) : "null") +const log = function(context, obj){ + Vars.mods.getScripts().log(context, obj ? String(obj) : "null") } const extendContent = function(classType, name, params){ diff --git a/core/assets/scripts/wrapper.js b/core/assets/scripts/wrapper.js index 121d306d71..0c7a8aba4d 100755 --- a/core/assets/scripts/wrapper.js +++ b/core/assets/scripts/wrapper.js @@ -1,2 +1,10 @@ modName = "$MOD_NAME$" + +!function(){ + +const scriptName = "$SCRIPT_NAME$" +const print = text => log(scriptName, text); $CODE$ + +}(); + diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 96190b6701..1c8fd4048f 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -69,14 +69,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Musics.load(); Sounds.load(); - assets.loadRun("scriptinit", Scripts.class, () -> {}, () -> { - content.createContent(false); - mods.loadScripts(); - }); - assets.loadRun("contentcreate", Content.class, () -> { - content.createContent(); + content.createBaseContent(); content.loadColors(); + }, () -> { + mods.loadScripts(); + content.createModContent(); }); add(logic = new Logic()); diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index cb5ef8d49c..b3672d5c00 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -20,7 +20,6 @@ import static io.anuke.mindustry.Vars.mods; */ @SuppressWarnings("unchecked") public class ContentLoader{ - private boolean loaded = false; private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; @@ -43,59 +42,47 @@ public class ContentLoader{ new LegacyColorMapper(), }; + public ContentLoader(){ + for(ContentType type : ContentType.values()){ + contentMap[type.ordinal()] = new Array<>(); + contentNameMap[type.ordinal()] = new ObjectMap<>(); + } + } + /** Clears all initialized content.*/ public void clear(){ contentNameMap = new ObjectMap[ContentType.values().length]; contentMap = new Array[ContentType.values().length]; initialization = new ObjectSet<>(); - loaded = false; } - /** Creates all content types. */ - public void createContent(){ - createContent(true); + + /** Creates all base types. */ + public void createBaseContent(){ + for(ContentList list : content){ + list.load(); + } } - /** Creates all content types. */ - public void createContent(boolean load){ - if(loaded){ - Log.info("Content already loaded, skipping."); - return; - } - - if(contentMap[0] == null){ - for(ContentType type : ContentType.values()){ - contentMap[type.ordinal()] = new Array<>(); - contentNameMap[type.ordinal()] = new ObjectMap<>(); - } - } - - if(load){ - - for(ContentList list : content){ - list.load(); - } - - if(mods != null){ - mods.loadContent(); - } - - //check up ID mapping, make sure it's linear - for(Array arr : contentMap){ - for(int i = 0; i < arr.size; i++){ - int id = arr.get(i).id; - if(id != i){ - throw new IllegalArgumentException("Out-of-order IDs for content '" + arr.get(i) + "' (expected " + i + " but got " + id + ")"); - } - } - } - - loaded = true; + /** Creates mod content, if applicable. */ + public void createModContent(){ + if(mods != null){ + mods.loadContent(); } } /** Logs content statistics.*/ public void logContent(){ + //check up ID mapping, make sure it's linear (debug only) + for(Array arr : contentMap){ + for(int i = 0; i < arr.size; i++){ + int id = arr.get(i).id; + if(id != i){ + throw new IllegalArgumentException("Out-of-order IDs for content '" + arr.get(i) + "' (expected " + i + " but got " + id + ")"); + } + } + } + Log.info("--- CONTENT INFO ---"); for(int k = 0; k < contentMap.length; k++){ Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index b38cc63297..c7a04955ca 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -451,12 +451,12 @@ public class Control implements ApplicationListener, Loadable{ platform.updateRPC(); } - if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(Core.input.keyTap(Binding.pause) && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.is(State.playing) ? State.paused : State.playing); } if(Core.input.keyTap(Binding.menu) && !ui.restart.isShown()){ - if(ui.chatfrag.chatOpen()){ + if(ui.chatfrag.shown()){ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ ui.paused.show(); @@ -464,7 +464,7 @@ public class Control implements ApplicationListener, Loadable{ } } - if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !ui.chatfrag.chatOpen()){ + if(!mobile && Core.input.keyTap(Binding.screenshot) && !(scene.getKeyboardFocus() instanceof TextField) && !scene.hasKeyboard()){ renderer.takeMapScreenshot(); } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index a3b85facb0..9b89a25e5c 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -471,7 +471,7 @@ public class NetClient implements ApplicationListener{ player.pointerX, player.pointerY, player.rotation, player.baseRotation, player.velocity().x, player.velocity().y, player.getMineTile(), - player.isBoosting, player.isShooting, ui.chatfrag.chatOpen(), player.isBuilding, + player.isBoosting, player.isShooting, ui.chatfrag.shown(), player.isBuilding, requests, Core.camera.position.x, Core.camera.position.y, Core.camera.width * viewScale, Core.camera.height * viewScale); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 142481b96d..3eb530ac7f 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -42,6 +42,7 @@ public class UI implements ApplicationListener, Loadable{ public MenuFragment menufrag; public HudFragment hudfrag; public ChatFragment chatfrag; + public ScriptConsoleFragment scriptfrag; public PlayerListFragment listfrag; public LoadingFragment loadfrag; @@ -211,6 +212,7 @@ public class UI implements ApplicationListener, Loadable{ chatfrag = new ChatFragment(); listfrag = new PlayerListFragment(); loadfrag = new LoadingFragment(); + scriptfrag = new ScriptConsoleFragment(); picker = new ColorPicker(); editor = new MapEditorDialog(); @@ -253,6 +255,7 @@ public class UI implements ApplicationListener, Loadable{ menufrag.build(menuGroup); chatfrag.container().build(hudGroup); listfrag.build(hudGroup); + scriptfrag.container().build(hudGroup); loadfrag.build(group); new FadeInFragment().build(group); } diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 4e83cd1091..73c0fc4dc0 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -556,7 +556,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ updateKeyboard(); } - isTyping = ui.chatfrag.chatOpen(); + isTyping = ui.chatfrag.shown(); updateMechanics(); @@ -604,7 +604,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ movement.limit(speed).scl(Time.delta()); - if(!ui.chatfrag.chatOpen()){ + if(!Core.scene.hasKeyboard()){ velocity.add(movement.x, movement.y); }else{ isShooting = false; @@ -613,7 +613,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ updateVelocityStatus(); moved = dst(prex, prey) > 0.001f; - if(!ui.chatfrag.chatOpen()){ + if(!Core.scene.hasKeyboard()){ float baseLerp = mech.getRotationAlpha(this); if(!isShooting() || !mech.turnCursor){ if(!movement.isZero()){ diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 45383cb6ef..25d41289e3 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -54,6 +54,7 @@ public enum Binding implements KeyBind{ chat_history_prev(KeyCode.UP), chat_history_next(KeyCode.DOWN), chat_scroll(new Axis(KeyCode.SCROLL)), + console(KeyCode.BACKTICK), ; private final KeybindValue defaultValue; diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 7b015600ce..e8cc6793d8 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -122,7 +122,7 @@ public class DesktopInput extends InputHandler{ drawSelected(sreq.x, sreq.y, sreq.block, getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null ? Pal.remove : Pal.accent); } - if(Core.input.keyDown(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyDown(Binding.schematic_select) && !Core.scene.hasKeyboard()){ drawSelection(schemX, schemY, cursorX, cursorY, Vars.maxSchematicSize); } @@ -139,7 +139,7 @@ public class DesktopInput extends InputHandler{ player.isShooting = false; } - if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !ui.chatfrag.chatOpen() && !(scene.getKeyboardFocus() instanceof TextField)){ + if(!state.is(State.menu) && Core.input.keyTap(Binding.minimap) && (scene.getKeyboardFocus() == ui.minimap || !scene.hasDialog()) && !Core.scene.hasKeyboard() && !(scene.getKeyboardFocus() instanceof TextField)){ if(!ui.minimap.isShown()){ ui.minimap.show(); }else{ @@ -293,12 +293,12 @@ public class DesktopInput extends InputHandler{ player.clearBuilding(); } - if(Core.input.keyTap(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard()){ schemX = rawCursorX; schemY = rawCursorY; } - if(Core.input.keyTap(Binding.schematic_menu) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyTap(Binding.schematic_menu) && !Core.scene.hasKeyboard()){ if(ui.schematics.isShown()){ ui.schematics.hide(); }else{ @@ -311,7 +311,7 @@ public class DesktopInput extends InputHandler{ selectRequests.clear(); } - if(Core.input.keyRelease(Binding.schematic_select) && !ui.chatfrag.chatOpen()){ + if(Core.input.keyRelease(Binding.schematic_select) && !Core.scene.hasKeyboard()){ lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY); useSchematic(lastSchematic); if(selectRequests.isEmpty()){ @@ -371,10 +371,10 @@ public class DesktopInput extends InputHandler{ }else if(selected != null){ //only begin shooting if there's no cursor event if(!tileTapped(selected) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.buildQueue().size == 0 || !player.isBuilding) && !droppingItem && - !tryBeginMine(selected) && player.getMineTile() == null && !ui.chatfrag.chatOpen()){ + !tryBeginMine(selected) && player.getMineTile() == null && !Core.scene.hasKeyboard()){ player.isShooting = true; } - }else if(!ui.chatfrag.chatOpen()){ //if it's out of bounds, shooting is just fine + }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine player.isShooting = true; } }else if(Core.input.keyTap(Binding.deselect) && block != null){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 23599e0732..1f7120ce06 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -198,6 +198,16 @@ public class Mods implements Loadable{ requiresReload = true; } + public Scripts getScripts(){ + if(scripts == null) scripts = platform.createScripts(); + return scripts; + } + + /** @return whether the scripting engine has been initialized. */ + public boolean hasScripts(){ + return scripts != null; + } + public boolean requiresReload(){ return requiresReload; } @@ -353,9 +363,10 @@ public class Mods implements Loadable{ scripts = null; } content.clear(); - content.createContent(false); + content.createBaseContent(); + content.loadColors(); loadScripts(); - content.createContent(); + content.createModContent(); loadAsync(); loadSync(); content.init(); diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 6bde96c2a5..e1edbfa078 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,24 +1,28 @@ package io.anuke.mindustry.mod; import io.anuke.arc.*; +import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.mod.Mods.*; import org.mozilla.javascript.*; +import static io.anuke.mindustry.Vars.*; + public class Scripts implements Disposable{ private final Context context; private final String wrapper; private Scriptable scope; + private Array logBuffer = new Array<>(); public Scripts(){ Time.mark(); context = Vars.platform.getScriptContext(); - context.setClassShutter(type -> ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream")); + context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream") || type.startsWith("io.anuke.mindustry")) && !type.equals("io.anuke.mindustry.mod.ClassAccess")); - scope = new ImporterTopLevel(context);//context.initStandardObjects(); + scope = new ImporterTopLevel(context); wrapper = Core.files.internal("scripts/wrapper.js").readString(); run(Core.files.internal("scripts/global.js").readString(), "global.js"); @@ -27,18 +31,51 @@ public class Scripts implements Disposable{ public String runConsole(String text){ try{ - return String.valueOf(context.evaluateString(scope, text, "console.js", 1, null)); + Object o = context.evaluateString(scope, text, "console.js", 1, null); + if(o instanceof NativeJavaObject){ + o = ((NativeJavaObject)o).unwrap(); + } + if(o instanceof Undefined){ + o = "undefined"; + } + return String.valueOf(o); }catch(Throwable t){ - return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); + return getError(t); } } + private String getError(Throwable t){ + if(t instanceof EcmaError && t.getCause() != null){ + t = t.getCause(); + } + return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); + } + + public void log(String source, String message){ + Log.info("[{0}]: {1}", source, message); + logBuffer.add("[accent][" + source + "]:[] " + message); + if(!headless & ui.scriptfrag != null){ + onLoad(); + } + } + + public void onLoad(){ + if(!headless){ + logBuffer.each(ui.scriptfrag::addMessage); + } + logBuffer.clear(); + } + public void run(LoadedMod mod, FileHandle file){ - run(wrapper.replace("$SCRIPT_NAME$", mod.name + "_" + file.nameWithoutExtension().replace("-", "_").replace(" ", "_")).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); + run(wrapper.replace("$SCRIPT_NAME$", mod.name + "/" + file.nameWithoutExtension()).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); } private void run(String script, String file){ - context.evaluateString(scope, script, file, 1, null); + try{ + context.evaluateString(scope, script, file, 1, null); + }catch(Throwable t){ + log(file, getError(t)); + } } @Override diff --git a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java index 2801d10149..c7c168bc84 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ChatFragment.java @@ -24,7 +24,7 @@ public class ChatFragment extends Table{ private final static int messagesShown = 10; private Array messages = new Array<>(); private float fadetime; - private boolean chatOpen = false; + private boolean shown = false; private TextField chatfield; private Label fieldlabel = new Label(">"); private BitmapFont font; @@ -52,7 +52,7 @@ public class ChatFragment extends Table{ if(!net.active() && messages.size > 0){ clearMessages(); - if(chatOpen){ + if(shown){ hide(); } } @@ -66,7 +66,7 @@ public class ChatFragment extends Table{ toggle(); } - if(chatOpen){ + if(shown){ if(input.keyTap(Binding.chat_history_prev) && historyPos < history.size - 1){ if(historyPos == 0) history.set(0, chatfield.getText()); historyPos++; @@ -123,7 +123,7 @@ public class ChatFragment extends Table{ Draw.color(shadowColor); - if(chatOpen){ + if(shown){ Fill.crect(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); } @@ -131,14 +131,14 @@ public class ChatFragment extends Table{ float spacing = chatspace; - chatfield.visible(chatOpen); - fieldlabel.visible(chatOpen); + chatfield.visible(shown); + fieldlabel.visible(shown); Draw.color(shadowColor); Draw.alpha(shadowColor.a * opacity); float theight = offsety + spacing + getMarginBottom(); - for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || chatOpen); i++){ + for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || shown); i++){ layout.setText(font, messages.get(i).formattedMessage, Color.white, textWidth, Align.bottomLeft, true); theight += layout.height + textspacing; @@ -147,7 +147,7 @@ public class ChatFragment extends Table{ font.getCache().clear(); font.getCache().addText(messages.get(i).formattedMessage, fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); - if(!chatOpen && fadetime - i < 1f && fadetime - i >= 0f){ + if(!shown && fadetime - i < 1f && fadetime - i >= 0f){ font.getCache().setAlphas((fadetime - i) * opacity); Draw.color(0, 0, 0, shadowColor.a * (fadetime - i) * opacity); }else{ @@ -163,7 +163,7 @@ public class ChatFragment extends Table{ Draw.color(); - if(fadetime > 0 && !chatOpen) + if(fadetime > 0 && !shown) fadetime -= Time.delta() / 180f; } @@ -180,9 +180,9 @@ public class ChatFragment extends Table{ public void toggle(){ - if(!chatOpen){ + if(!shown){ scene.setKeyboardFocus(chatfield); - chatOpen = !chatOpen; + shown = !shown; if(mobile){ TextInput input = new TextInput(); input.maxLength = maxTextLength; @@ -199,7 +199,7 @@ public class ChatFragment extends Table{ } }else{ scene.setKeyboardFocus(null); - chatOpen = !chatOpen; + shown = !shown; scrollPos = 0; sendMessage(); } @@ -207,7 +207,7 @@ public class ChatFragment extends Table{ public void hide(){ scene.setKeyboardFocus(null); - chatOpen = false; + shown = false; clearChatInput(); } @@ -222,12 +222,8 @@ public class ChatFragment extends Table{ chatfield.setText(""); } - public boolean chatOpen(){ - return chatOpen; - } - - public int getMessagesSize(){ - return messages.size; + public boolean shown(){ + return shown; } public void addMessage(String message, String sender){ diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 3bbce3b1ec..b2c60deca9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -83,7 +83,7 @@ public class HudFragment extends Fragment{ select.addImageButton(Icon.chatSmall, style,() -> { if(net.active() && mobile){ - if(ui.chatfrag.chatOpen()){ + if(ui.chatfrag.shown()){ ui.chatfrag.hide(); }else{ ui.chatfrag.toggle(); @@ -131,7 +131,7 @@ public class HudFragment extends Fragment{ } cont.update(() -> { - if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.chatOpen() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ + if(Core.input.keyTap(Binding.toggle_menus) && !ui.chatfrag.shown() && !Core.scene.hasDialog() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ toggleMenus(); } }); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 95bdd5affa..5d8e5ff0e5 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -103,7 +103,8 @@ public class PlacementFragment extends Fragment{ } } - if(ui.chatfrag.chatOpen()) return false; + if(ui.chatfrag.shown() || Core.scene.hasKeyboard()) return false; + for(int i = 0; i < blockSelect.length; i++){ if(Core.input.keyTap(blockSelect[i])){ if(i > 9) { //select block directionally diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java index f0e28611db..700c5beb7c 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -1,11 +1,231 @@ package io.anuke.mindustry.ui.fragments; +import io.anuke.arc.*; +import io.anuke.arc.Input.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; import io.anuke.arc.scene.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.Label.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.input.*; +import io.anuke.mindustry.ui.*; -public class ScriptConsoleFragment extends Fragment{ +import static io.anuke.arc.Core.*; +import static io.anuke.mindustry.Vars.*; + +public class ScriptConsoleFragment extends Table{ + private final static int messagesShown = 14; + private Array messages = new Array<>(); + private float fadetime; + private boolean open = false, shown; + private TextField chatfield; + private Label fieldlabel = new Label(">"); + private BitmapFont font; + private GlyphLayout layout = new GlyphLayout(); + private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); + private Color shadowColor = new Color(0, 0, 0, 0.4f); + private float textspacing = Scl.scl(10); + private Array history = new Array<>(); + private int historyPos = 0; + private int scrollPos = 0; + private Fragment container = new Fragment(){ + @Override + public void build(Group parent){ + scene.add(ScriptConsoleFragment.this); + } + }; + + public ScriptConsoleFragment(){ + + setFillParent(true); + font = Fonts.def; + + visible(() -> { + if(input.keyTap(Binding.console) && !Vars.net.client() && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + shown = !shown; + if(shown && !open){ + toggle(); + } + clearChatInput(); + } + + return shown && !Vars.net.client(); + }); + + update(() -> { + if(input.keyTap(Binding.chat) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + toggle(); + } + + if(open){ + if(input.keyTap(Binding.chat_history_prev) && historyPos < history.size - 1){ + if(historyPos == 0) history.set(0, chatfield.getText()); + historyPos++; + updateChat(); + } + if(input.keyTap(Binding.chat_history_next) && historyPos > 0){ + historyPos--; + updateChat(); + } + scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); + } + }); + + history.insert(0, ""); + setup(); + + if(mods.hasScripts()){ + app.post(() -> mods.getScripts().onLoad()); + } + } + + public Fragment container(){ + return container; + } + + public void clearMessages(){ + messages.clear(); + history.clear(); + history.insert(0, ""); + } + + private void setup(){ + fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle())); + fieldlabel.getStyle().font = font; + fieldlabel.setStyle(fieldlabel.getStyle()); + + chatfield = new TextField("", new TextField.TextFieldStyle(scene.getStyle(TextField.TextFieldStyle.class))); + chatfield.setMaxLength(Vars.maxTextLength); + chatfield.getStyle().background = null; + chatfield.getStyle().font = Fonts.chat; + chatfield.getStyle().fontColor = Color.white; + chatfield.setStyle(chatfield.getStyle()); + + bottom().left().marginBottom(offsety).marginLeft(offsetx * 2).add(fieldlabel).padBottom(6f); + + add(chatfield).padBottom(offsety).padLeft(offsetx).growX().padRight(offsetx).height(28); + } @Override - public void build(Group parent){ + public void draw(){ + float opacity = 1f; + float textWidth = graphics.getWidth() - offsetx*2f; + Draw.color(shadowColor); + + if(open){ + Fill.crect(offsetx, chatfield.getY(), chatfield.getWidth() + 15f, chatfield.getHeight() - 1); + } + + super.draw(); + + float spacing = chatspace; + + chatfield.visible(open); + fieldlabel.visible(open); + + Draw.color(shadowColor); + Draw.alpha(shadowColor.a * opacity); + + float theight = offsety + spacing + getMarginBottom(); + for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || open); i++){ + + layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true); + theight += layout.height + textspacing; + if(i - scrollPos == 0) theight -= textspacing + 1; + + font.getCache().clear(); + font.getCache().addText(messages.get(i), fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); + + if(!open && fadetime - i < 1f && fadetime - i >= 0f){ + font.getCache().setAlphas((fadetime - i) * opacity); + Draw.color(0, 0, 0, shadowColor.a * (fadetime - i) * opacity); + }else{ + font.getCache().setAlphas(opacity); + } + + Fill.crect(offsetx, theight - layout.height - 2, textWidth + Scl.scl(4f), layout.height + textspacing); + Draw.color(shadowColor); + Draw.alpha(opacity * shadowColor.a); + + font.getCache().draw(); + } + + Draw.color(); + + if(fadetime > 0 && !open) + fadetime -= Time.delta() / 180f; + } + + private void sendMessage(){ + String message = chatfield.getText(); + clearChatInput(); + + if(message.replaceAll(" ", "").isEmpty()) return; + + history.insert(1, message); + + addMessage("[lightgray]> " + message); + addMessage(mods.getScripts().runConsole(message)); + } + + public void toggle(){ + + if(!open){ + scene.setKeyboardFocus(chatfield); + open = !open; + if(mobile){ + TextInput input = new TextInput(); + input.maxLength = maxTextLength; + input.accepted = text -> { + chatfield.setText(text); + sendMessage(); + hide(); + Core.input.setOnscreenKeyboardVisible(false); + }; + input.canceled = this::hide; + Core.input.getTextInput(input); + }else{ + chatfield.fireClick(); + } + }else{ + scene.setKeyboardFocus(null); + open = !open; + scrollPos = 0; + sendMessage(); + } + } + + public void hide(){ + scene.setKeyboardFocus(null); + open = false; + clearChatInput(); + } + + public void updateChat(){ + chatfield.setText(history.get(historyPos)); + chatfield.setCursorPosition(chatfield.getText().length()); + } + + public void clearChatInput(){ + historyPos = 0; + history.set(0, ""); + chatfield.setText(""); + } + + public boolean open(){ + return open; + } + + public void addMessage(String message){ + messages.insert(0, message); + + fadetime += 1f; + fadetime = Math.min(fadetime, messagesShown) + 1f; } } diff --git a/gradle.properties b/gradle.properties index f61b492a7f..5157fccbe2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=ef6d1485c36346e008ac6818ec972e7781f9ba8d +archash=6d310772fec1f69efeae2e487cab3bd64728ae05 diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index ad83a69eb7..ca6077fd9e 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -33,7 +33,9 @@ public class MindustryServer implements ApplicationListener{ Vars.loadSettings(); Vars.init(); - content.createContent(); + content.createBaseContent(); + mods.loadScripts(); + content.createModContent(); content.init(); Core.app.addListener(logic = new Logic()); diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index a9ed831fbc..58f51ad473 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -47,7 +47,7 @@ public class ApplicationTests{ net = new Net(null); tree = new FileTree(); Vars.init(); - content.createContent(); + content.createBaseContent(); add(logic = new Logic()); add(netServer = new NetServer()); diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 75f4a56854..e3a2fea469 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -33,7 +33,7 @@ public class PowerTestFixture{ } }; - content.createContent(); + content.createBaseContent(); Log.setUseColors(false); Time.setDeltaProvider(() -> 0.5f); } diff --git a/tools/src/io/anuke/mindustry/tools/ImagePacker.java b/tools/src/io/anuke/mindustry/tools/ImagePacker.java index 7e4ff467a4..76346817ab 100644 --- a/tools/src/io/anuke/mindustry/tools/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/tools/ImagePacker.java @@ -24,7 +24,7 @@ public class ImagePacker{ Log.setLogger(new NoopLogHandler()); Vars.content = new ContentLoader(); - Vars.content.createContent(); + Vars.content.createBaseContent(); Log.setLogger(new LogHandler()); Files.walk(Paths.get("../../../assets-raw/sprites_out")).forEach(path -> { From 07598e3f2f6b485a11d21eb0c293b2054579f601 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 14:26:14 -0500 Subject: [PATCH 031/107] Minor tweaks --- core/src/io/anuke/mindustry/mod/Scripts.java | 6 ++---- .../ui/fragments/ScriptConsoleFragment.java | 15 ++++----------- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index e1edbfa078..84fdc4e5d3 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -45,9 +45,7 @@ public class Scripts implements Disposable{ } private String getError(Throwable t){ - if(t instanceof EcmaError && t.getCause() != null){ - t = t.getCause(); - } + t = Strings.getFinalCause(t); return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); } @@ -74,7 +72,7 @@ public class Scripts implements Disposable{ try{ context.evaluateString(scope, script, file, 1, null); }catch(Throwable t){ - log(file, getError(t)); + log(file, "[scarlet]" + getError(t)); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java index 700c5beb7c..458bae6c2c 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -21,7 +21,6 @@ import static io.anuke.mindustry.Vars.*; public class ScriptConsoleFragment extends Table{ private final static int messagesShown = 14; private Array messages = new Array<>(); - private float fadetime; private boolean open = false, shown; private TextField chatfield; private Label fieldlabel = new Label(">"); @@ -133,7 +132,7 @@ public class ScriptConsoleFragment extends Table{ Draw.alpha(shadowColor.a * opacity); float theight = offsety + spacing + getMarginBottom(); - for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos && (i < fadetime || open); i++){ + for(int i = scrollPos; i < messages.size && i < messagesShown + scrollPos; i++){ layout.setText(font, messages.get(i), Color.white, textWidth, Align.bottomLeft, true); theight += layout.height + textspacing; @@ -142,9 +141,9 @@ public class ScriptConsoleFragment extends Table{ font.getCache().clear(); font.getCache().addText(messages.get(i), fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); - if(!open && fadetime - i < 1f && fadetime - i >= 0f){ - font.getCache().setAlphas((fadetime - i) * opacity); - Draw.color(0, 0, 0, shadowColor.a * (fadetime - i) * opacity); + if(!open){ + font.getCache().setAlphas(opacity); + Draw.color(0, 0, 0, shadowColor.a * opacity); }else{ font.getCache().setAlphas(opacity); } @@ -157,9 +156,6 @@ public class ScriptConsoleFragment extends Table{ } Draw.color(); - - if(fadetime > 0 && !open) - fadetime -= Time.delta() / 180f; } private void sendMessage(){ @@ -224,8 +220,5 @@ public class ScriptConsoleFragment extends Table{ public void addMessage(String message){ messages.insert(0, message); - - fadetime += 1f; - fadetime = Math.min(fadetime, messagesShown) + 1f; } } From d81b36d897793f24215e4cbcd865329599ff7653 Mon Sep 17 00:00:00 2001 From: Patrick 'Quezler' Mounier Date: Sat, 7 Dec 2019 21:25:37 +0100 Subject: [PATCH 032/107] Add 1 plastanium to armored conduits recipe (#1181) --- core/src/io/anuke/mindustry/content/Blocks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 623fd0ef79..de1cae226f 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -990,7 +990,7 @@ public class Blocks implements ContentList{ }}; platedConduit = new io.anuke.mindustry.world.blocks.liquid.ArmoredConduit("plated-conduit"){{ - requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1)); + requirements(Category.liquid, ItemStack.with(Items.thorium, 2, Items.metaglass, 1, Items.plastanium, 1)); liquidCapacity = 16f; liquidPressure = 1.025f; health = 220; From d3747f0d4c5945b55c0885c6e5152c87e8983d1e Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 15:41:52 -0500 Subject: [PATCH 033/107] Content loading improvements --- core/assets/scripts/base.js | 2 +- core/assets/scripts/global.js | 2 +- .../anuke/mindustry/core/ContentLoader.java | 12 ++++++ .../mindustry/ctype/MappableContent.java | 2 +- .../mindustry/ctype/UnlockableContent.java | 4 +- core/src/io/anuke/mindustry/mod/Mods.java | 37 +++++++++++-------- core/src/io/anuke/mindustry/type/Item.java | 1 - core/src/io/anuke/mindustry/type/Liquid.java | 1 - core/src/io/anuke/mindustry/type/Mech.java | 1 - .../src/io/anuke/mindustry/type/UnitType.java | 1 - core/src/io/anuke/mindustry/world/Block.java | 1 - 11 files changed, 38 insertions(+), 26 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 124acce5b7..4d8cb451e6 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -3,7 +3,7 @@ const log = function(context, obj){ } const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, modName + "-" + name) + return new JavaAdapter(classType, params, name) } const extend = function(classType, params){ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index d3c53473ee..b92b9f22e2 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -5,7 +5,7 @@ const log = function(context, obj){ } const extendContent = function(classType, name, params){ - return new JavaAdapter(classType, params, modName + "-" + name) + return new JavaAdapter(classType, params, name) } const extend = function(classType, params){ diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index b3672d5c00..32a5ee1b56 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.core; import io.anuke.arc.collection.*; import io.anuke.arc.func.*; import io.anuke.arc.graphics.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; @@ -23,6 +24,7 @@ public class ContentLoader{ private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; + private @Nullable LoadedMod currentMod; private ObjectSet> initialization = new ObjectSet<>(); private ContentList[] content = { new Fx(), @@ -144,13 +146,23 @@ public class ContentLoader{ public void handleContent(Content content){ contentMap[content.getContentType().ordinal()].add(content); + } + public void setCurrentMod(LoadedMod mod){ + this.currentMod = mod; + } + + public String transformName(String name){ + return currentMod == null ? name : currentMod.name + "-" + name; } public void handleMappableContent(MappableContent content){ if(contentNameMap[content.getContentType().ordinal()].containsKey(content.name)){ throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + content.name + "')"); } + if(currentMod != null){ + content.mod = currentMod; + } contentNameMap[content.getContentType().ordinal()].put(content.name, content); } diff --git a/core/src/io/anuke/mindustry/ctype/MappableContent.java b/core/src/io/anuke/mindustry/ctype/MappableContent.java index 3063157c13..709e7652d4 100644 --- a/core/src/io/anuke/mindustry/ctype/MappableContent.java +++ b/core/src/io/anuke/mindustry/ctype/MappableContent.java @@ -6,7 +6,7 @@ public abstract class MappableContent extends Content{ public final String name; public MappableContent(String name){ - this.name = name; + this.name = Vars.content.transformName(name); Vars.content.handleMappableContent(this); } diff --git a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java index bb50e115cb..7082b4a431 100644 --- a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java @@ -20,8 +20,8 @@ public abstract class UnlockableContent extends MappableContent{ public UnlockableContent(String name){ super(name); - this.localizedName = Core.bundle.get(getContentType() + "." + name + ".name", name); - this.description = Core.bundle.getOrNull(getContentType() + "." + name + ".description"); + this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name); + this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description"); } /** Generate any special icons for this content. Called asynchronously.*/ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 1f7120ce06..33e567148c 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -382,27 +382,32 @@ public class Mods implements Loadable{ public void loadScripts(){ Time.mark(); - for(LoadedMod mod : loaded){ - if(mod.root.child("scripts").exists()){ - mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); - Log.info("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); + try{ + for(LoadedMod mod : loaded){ + if(mod.root.child("scripts").exists()){ + content.setCurrentMod(mod.name); + mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); + Log.info("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); - for(FileHandle file : mod.scripts){ - try{ - if(scripts == null){ - scripts = platform.createScripts(); + for(FileHandle file : mod.scripts){ + try{ + if(scripts == null){ + scripts = platform.createScripts(); + } + scripts.run(mod, file); + }catch(Throwable e){ + Core.app.post(() -> { + Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); + e.printStackTrace(); + //if(!headless) ui.showException(e); + }); + break; } - scripts.run(mod, file); - }catch(Throwable e){ - Core.app.post(() -> { - Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); - e.printStackTrace(); - //if(!headless) ui.showException(e); - }); - break; } } } + }finally{ + content.setCurrentMod(null); } Log.info("Time to initialize modded scripts: {0}", Time.elapsed()); diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 6ec12ae475..86951ab093 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -34,7 +34,6 @@ public class Item extends UnlockableContent{ public Item(String name, Color color){ super(name); this.color = color; - this.description = Core.bundle.getOrNull("item." + this.name + ".description"); } public Item(String name){ diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index bc97a18990..63839c479c 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -31,7 +31,6 @@ public class Liquid extends UnlockableContent{ public Liquid(String name, Color color){ super(name); this.color = new Color(color); - this.description = Core.bundle.getOrNull("liquid." + name + ".description"); } /** For modding only.*/ diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 8eb9681548..a9419a116b 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -39,7 +39,6 @@ public class Mech extends UnlockableContent{ public Mech(String name, boolean flying){ super(name); this.flying = flying; - this.description = Core.bundle.get("mech." + name + ".description"); } public Mech(String name){ diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index b2602a16ad..ddcaa4f36f 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -51,7 +51,6 @@ public class UnitType extends UnlockableContent{ public UnitType(String name){ super(name); - this.description = Core.bundle.getOrNull("unit." + name + ".description"); } public void create(Prov mainConstructor){ diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index e05f047b21..90abba2283 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -156,7 +156,6 @@ public class Block extends BlockStorage{ public Block(String name){ super(name); - this.description = Core.bundle.getOrNull("block." + name + ".description"); this.solid = false; } From 5ca01bf234054f9a6bc2dbd0588f50c0e9c0c4e3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 15:55:51 -0500 Subject: [PATCH 034/107] Effect parsing --- core/src/io/anuke/mindustry/mod/ContentParser.java | 5 +++++ core/src/io/anuke/mindustry/mod/Mods.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 9d1563b585..616a6ad7b6 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -51,6 +51,11 @@ public class ContentParser{ } } }); + put(StatusEffect.class, (type, data) -> { + StatusEffect effect = new StatusEffect(); + readFields(effect, data); + return effect; + }); put(Color.class, (type, data) -> Color.valueOf(data.asString())); put(BulletType.class, (type, data) -> { if(data.isString()){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 33e567148c..bf7753eea0 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -385,7 +385,7 @@ public class Mods implements Loadable{ try{ for(LoadedMod mod : loaded){ if(mod.root.child("scripts").exists()){ - content.setCurrentMod(mod.name); + content.setCurrentMod(mod); mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); Log.info("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); From ccca26d98f5fbcf84fe3ae4b0b68702597ebb2e2 Mon Sep 17 00:00:00 2001 From: Vanguard <55051135+XEN0PHIL@users.noreply.github.com> Date: Sun, 8 Dec 2019 01:39:35 +0300 Subject: [PATCH 035/107] RU updates (#1172) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_uk_UA.properties * Fixes * Капіталізація це зло. * Update bundle_ru.properties * Update bundle_uk_UA.properties * .-. * Gm Description * Oof * ЈҮУКЕНГШҺЗХҸЖДЛОРПАВЫӘЧСМИТҒБӨ * dada * Update upload-build.sh * Update upload-build.sh * test teeest * tesy tesssy * Translate new descriptions * й * Ukrainian finished. Fixed some errors. * Translated everything. Maybe. * / * 1 * Added tutorial. Thank to Slava0135 and ymomfe. * 1 * 1 * WATER WATER * [[]] * 1 * gmmm /-/-/-/ * idk what i changed * Обновление и корректировка строк с 1 по 90 * router * Обновление и корректировка строк с 87 по 252 Обновление и корректировка строк с 87 по 252, а так же правка предыдущих. - 35 строку лучше привести в соответствии с оригинальным текстом, без дополнений и пояснений. - 103 строка не переводится в соответствии с https://semver.org/lang/ru/ , хотя это не жёсткое правило, поскольку не влияет непосредственно на алгоритм работы с версиями. - 187 Предлагаю эту строку перевести как 'Настройки карты', не смотря на оригинальный текст (соответственно и 230, 231). * router * Обновление и корректировка строк с 253 по 321 - "WorldEditor Update" Обновление и корректировка строк с 253 по 321, а так же предыдущих. - Разобраться с 297 строкой ("filter.option.percentile"). - Разобраться с местами применения 322 строки. * озарение в переводе ;D * Fixed "В" * Unfinished Ukrainian language. * Small fixes. * Обновление и корректировка строк с 322 по 377 - "Campaign Update" Обновление и корректировка строк с 322 по 377, а так же предыдущих. - По прежнему нужно разобраться с 297 строкой ("filter.option.percentile"). Добавил метку для отличия функционала. Проверю и уберу к следующей сборке. * Мелкие правки * From additional improvements. * hmmm * hm * 123 * Небольшие правки "КАК СОЗДАТЬ СЕРВЕР С ДРУГОМ Update" * Рефакторинг и добавление новых строк с 1 по 136 - Приведение положения строк в бандле в соответствии с референсным файлом - Добавление и перевод новых (отсутствующих) строк из референсного файла * Рефакторинг и добавление новых строк с 137 по 380 - Приведение положения строк в бандле в соответствии с референсным файлом - Добавление и перевод новых (отсутствующих) строк из референсного файла - Мелкие правки * Second pack of changes by Vanguard. * ru_ri * Небольшие правки * 313131 * Рефакторинг, корректировка и добавление новых строк с 381 по 600 Рефакторинг, корректировка и добавление новых строк с 381 по 600 - Приведение положения строк в бандле в соответствии с референсным файлом - Добавление и перевод новых (отсутствующих) строк из референсного файла - Корректировка существующих строк * Перші сто рядків українського перекладу відредаговано. * 121 * 212122 * правки в редакторе * ещё правки в редакторе * мелкие правки * правка * Рефакторинг, корректировка и добавление новых строк с 601 по 800 Рефакторинг, корректировка и добавление новых строк с 601 по 800 - Приведение положения строк в бандле в соответствии с референсным файлом - Добавление и перевод новых (отсутствующих) строк из референсного файла - Корректировка существующих строк * Рефакторинг, корректировка и добавление новых строк с 801 по 912 Рефакторинг, корректировка и добавление новых строк с 801 по 912 - Приведение положения строк в бандле в соответствии с референсным файлом - Добавление и перевод новых (отсутствующих) строк из референсного файла - Корректировка существующих строк * мелкие правки * Виправив декілька помилок * 3123 * Мелкие правки и дополнения * Перевод новых строк * niiiice * oh no * oh no 😱 * 😱 oh no 😱 * just another yet translator * Some contributors The changes made by **Vanguard** were commited by @Prosta4okua and @Remint32 (Felix Corvus). Therefore he is not present in authors of commits on github. * Мелкие правки из TODO * Новые строки и новые правки DAFAK? -> https://github.com/Anuken/Mindustry/commit/3f293190cf2c02ec4475e17f2b2385abcf0521ae#diff-daade3141498d8856d75ec34b88bbb19 * Добавление строк блока с сообщением * Корректировка правок * Правки правок * Правки 🚚 * Крамниця * Правки и удаление "точки сбора" rally point ?!?! * Steam Russian localisation files * Tiny fix https://github.com/Anuken/Mindustry/issues/661 * Мелкие правки * Мелкие правки из TODO * Правки от Vanguard Правки от @XEN0PHIL * 🤔 ( ͡° ͜ʖ ͡°) * RU translation changes from Vanguard (#9) * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * ЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇЇ * Update bundle.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_uk_UA.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Fixed the mess between codes like {0} {1} etc. * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * Update bundle_ru.properties * 1 new line added mod.requiresversion * 1 new line, 1 changed line New: settings.resetKey Changed: mech.dart-ship.description * 1 new line added item.corestorable * byte-logic draft translations Зная скорость Анюка * 1 new line, 1 changed line New: mod.item.remove Changed: mode.attack.description --- core/assets/bundles/bundle_ru.properties | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index d3f2b919ce..8a7f6b3481 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -99,6 +99,7 @@ mod.enabled = [lightgray]Включён mod.disabled = [scarlet]Выключен mod.disable = Выкл. mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. +mod.requiresversion = [scarlet]Требуемая версия игры: [accent]{0} mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.nowdisabled = [scarlet]Модификации '{0}' требуются родительские модификации:[accent] {1}\n[lightgray]Сначала нужно загрузить их.\nЭта модификация будет автоматически отключена. mod.enable = Вкл. @@ -106,6 +107,7 @@ mod.requiresrestart = Теперь игра закроется, чтобы пр mod.reloadrequired = [scarlet]Необходим перезапуск mod.import = Импортировать модификацию mod.import.github = Импортировать модификацию с GitHub +mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Этот мод будет удалён. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Это сохранение содержит модификацию, которое Вы недавно обновили или оно больше не установлено. Может случиться повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} @@ -496,6 +498,7 @@ settings.language = Язык settings.data = Игровые данные settings.reset = Сбросить по умолчанию settings.rebind = Сменить +settings.resetKey = Сбросить settings.controls = Управление settings.game = Игра settings.sound = Звук @@ -642,7 +645,7 @@ setting.position.name = Отображать координаты игрока setting.musicvol.name = Громкость музыки setting.ambientvol.name = Громкость окружения setting.mutemusic.name = Заглушить музыку -setting.sfxvol.name = Громкость звуковых эффектов +setting.sfxvol.name = Громкость эффектов setting.mutesound.name = Заглушить звук setting.crashreport.name = Отправлять анонимные отчёты о вылетах setting.savecreate.name = Автоматическое создание сохранений @@ -668,7 +671,7 @@ keybind.clear_building.name = Очистить план строительств keybind.press = Нажмите клавишу… keybind.press.axis = Нажмите оси или клавишу… keybind.screenshot.name = Скриншот карты -keybind.toggle_power_lines.name = Отображение линий энергоснабжения +keybind.toggle_power_lines.name = Отображение лазеров энергоснабжения keybind.move_x.name = Движение по оси X keybind.move_y.name = Движение по оси Y keybind.category_prev.name = Предыдущая категория @@ -726,7 +729,7 @@ mode.editor.name = Редактор mode.pvp.name = PvP mode.pvp.description = Боритесь против других игроков.\n[gray]Для игры требуется как минимум 2 ядра разного цвета на карте. mode.attack.name = Атака -mode.attack.description = Уничтожьте вражескую базу. Никаких волн.\n[gray]Для игры требуется красное ядро на карте. +mode.attack.description = Уничтожьте вражескую базу.\n[gray]Для игры требуется красное ядро на карте. mode.custom = Пользовательские правила rules.infiniteresources = Бесконечные ресурсы (Игрок) @@ -806,6 +809,7 @@ mech.trident-ship.name = Трезубец mech.trident-ship.weapon = Бомбовый отсек mech.glaive-ship.name = Копьё mech.glaive-ship.weapon = Огненный бластер +item.corestorable = [lightgray]Можно хранить в ядре: {0} item.explosiveness = [lightgray]Взрывоопасность: {0}% item.flammability = [lightgray]Воспламеняемость: {0}% item.radioactivity = [lightgray]Радиоактивность: {0}% @@ -849,6 +853,8 @@ block.kiln.name = Печь block.graphite-press.name = Графитный пресс block.multi-press.name = Мульти-пресс block.constructing = {0} [lightgray](Строится) +block.signal = [lightgray]Сигнал: {0} +block.editsignal = Сигнал block.spawn.name = Точка появления врагов block.core-shard.name = Ядро: «Осколок» block.core-foundation.name = Ядро: «Штаб» @@ -1085,7 +1091,7 @@ mech.alpha-mech.description = Стандартный управляемый ме mech.delta-mech.description = Быстрый, легко бронированный мех, созданный для ударов «атакуй и беги». Наносит мало урона по строениям, но может очень быстро убить большие группы вражеских орудий с помощью дуговых молний. mech.tau-mech.description = Мех поддержки. Ремонтирует союзные блоки, просто стреляя в них. Может лечить союзников в радиусе его ремонтирующей способности. mech.omega-mech.description = Громоздкий и хорошо бронированный мех, созданный для передовых атак. Его броня может блокировать до 90% входящего урона. -mech.dart-ship.description = Стандартный управляемый корабль. Достаточно быстрый и легкий, но обладает слабым вооружением и низкой скоростью добычи. +mech.dart-ship.description = Стандартный управляемый корабль. Быстрая скорость добычи. Достаточно быстрый и легкий, но обладает слабым вооружением. mech.javelin-ship.description = Корабль для тактики «атакуй и беги». Сначала он медленный, но позже может разгоняться до огромных скоростей и летать над аванпостами противника, нанося большой урон молниями и ракетами. mech.trident-ship.description = Тяжёлый бомбардировщик, построенный для строительства и уничтожения вражеских укреплений. Достаточно хорошо бронированный. mech.glaive-ship.description = Большой хорошо бронированный боевой корабль. Оборудован зажигательным повторителем. Очень манёвренный. From fd6abaff628b0a0e83709b130cb4d38a847a4719 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 21:46:35 -0500 Subject: [PATCH 036/107] More class support --- core/assets/scripts/base.js | 2 ++ core/assets/scripts/global.js | 3 +++ core/src/io/anuke/mindustry/mod/ClassAccess.java | 2 +- tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java | 4 +++- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 4d8cb451e6..492e7392e5 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -9,3 +9,5 @@ const extendContent = function(classType, name, params){ const extend = function(classType, params){ return new JavaAdapter(classType, params) } + +const base = {} \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index b92b9f22e2..43d0b5826c 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -12,9 +12,12 @@ const extend = function(classType, params){ return new JavaAdapter(classType, params) } +const base = {} importPackage(Packages.io.anuke.arc) importPackage(Packages.io.anuke.arc.collection) +importPackage(Packages.io.anuke.arc.graphics) importPackage(Packages.io.anuke.arc.graphics.g2d) +importPackage(Packages.io.anuke.arc.math) importPackage(Packages.io.anuke.arc.scene) importPackage(Packages.io.anuke.arc.scene.actions) importPackage(Packages.io.anuke.arc.scene.event) diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 4c70c6860b..48c67d839f 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 2bc9514436..17cd3fb5df 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -4,8 +4,10 @@ import io.anuke.arc.*; import io.anuke.arc.collection.Array; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; import org.reflections.*; import org.reflections.scanners.*; @@ -21,7 +23,7 @@ public class ScriptStubGenerator{ String base = "io.anuke.mindustry"; Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); - Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class); + Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class); Array nopackage = Array.with("io.anuke.arc.func", "java.lang", "java"); Array imported = Array.with("io.anuke.mindustry.type", "io.anuke.mindustry.world"); From 477ebc91bf54cc2ddb0d828a1c39a159b1b071a7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 7 Dec 2019 21:53:50 -0500 Subject: [PATCH 037/107] Fixed reloading --- core/src/io/anuke/mindustry/core/ContentLoader.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 32a5ee1b56..ab6c44b5b4 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -45,10 +45,7 @@ public class ContentLoader{ }; public ContentLoader(){ - for(ContentType type : ContentType.values()){ - contentMap[type.ordinal()] = new Array<>(); - contentNameMap[type.ordinal()] = new ObjectMap<>(); - } + clear(); } /** Clears all initialized content.*/ @@ -56,6 +53,11 @@ public class ContentLoader{ contentNameMap = new ObjectMap[ContentType.values().length]; contentMap = new Array[ContentType.values().length]; initialization = new ObjectSet<>(); + + for(ContentType type : ContentType.values()){ + contentMap[type.ordinal()] = new Array<>(); + contentNameMap[type.ordinal()] = new ObjectMap<>(); + } } From fd202421b1a6563894e071639e0d84d4e8cd1136 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 00:25:13 -0500 Subject: [PATCH 038/107] Changed console keybind to prevent confusion --- core/src/io/anuke/mindustry/input/Binding.java | 2 +- core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 25d41289e3..3ac5f68271 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -54,7 +54,7 @@ public enum Binding implements KeyBind{ chat_history_prev(KeyCode.UP), chat_history_next(KeyCode.DOWN), chat_scroll(new Axis(KeyCode.SCROLL)), - console(KeyCode.BACKTICK), + console(KeyCode.F8), ; private final KeybindValue defaultValue; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java index 52f236fa81..7a98c9cfa7 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java @@ -158,6 +158,7 @@ public class SchematicsDialog extends FloatingDialog{ dialog.hide(); try{ Schematic s = Schematics.readBase64(Core.app.getClipboardText()); + s.removeSteamID(); schematics.add(s); setup(); ui.showInfoFade("$schematic.saved"); @@ -172,6 +173,7 @@ public class SchematicsDialog extends FloatingDialog{ try{ Schematic s = Schematics.read(file); + s.removeSteamID(); schematics.add(s); setup(); showInfo(s); From 98a083abddc74fa0ca0f45a27d5068fcaac48c21 Mon Sep 17 00:00:00 2001 From: GioIacca9 <39232448+GioIacca9@users.noreply.github.com> Date: Sun, 8 Dec 2019 15:49:03 +0100 Subject: [PATCH 039/107] Update bundle_it.properties --- core/assets/bundles/bundle_it.properties | 747 ++++++++++++----------- 1 file changed, 403 insertions(+), 344 deletions(-) diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index d1f19ae8b1..7fb632244c 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -1,45 +1,50 @@ credits.text = Creato da [ROYAL]Anuken[] - [SKY]anukendev@gmail.com[] credits = Crediti contributors = Traduttori e Contributori -discord = Entra nel server discord di mindustry! -link.discord.description = la chatroom ufficiale del server discord di Mindustry +discord = Entra nel server Discord di mindustry! +link.discord.description = La chatroom ufficiale del server Discord di Mindustry link.reddit.description = The Mindustry subreddit link.github.description = Codice sorgente del gioco link.changelog.description = Elenco delle modifiche del gioco link.dev-builds.description = Build di sviluppo versioni instabili link.trello.description = Scheda ufficiale trello per funzionalità pianificate -link.itch.io.description = pagina di itch.io con download per PC e versione web +link.itch.io.description = Pagina di itch.io con download per PC e versione web link.google-play.description = Elenco di Google Play Store -link.wiki.description = wiki ufficiale di Mindustry +link.f-droid.description = Catalogo F-Droid +link.wiki.description = Wiki ufficiale di Mindustry linkfail = Impossibile aprire il link! L'URL è stato copiato. screenshot = Screenshot salvato a {0} screenshot.invalid = Mappa troppo grossa, probabilmente non c'è abbastanza memoria libera. -gameover = Il nucleo è stato distrutto. +gameover = Il Nucleo è stato distrutto. gameover.pvp = La squadra [accent] {0}[] ha vinto! highscore = [YELLOW]Nuovo record! + copied = Copiato. load.sound = Suoni load.map = Mappe load.image = Immagini -load.content = Content +load.content = Contenuti load.system = Sistema load.mod = Mods -schematic = Schematiche -schematic.add = Salva Schema... -schematics = Schemi -schematic.replace = A schematic by that name already exists. Replace it? -schematic.import = Importa schema... +load.scripts = Testi + +schematic = Schematica +schematic.add = Salva Schematica... +schematics = Schematiche +schematic.replace = Una schematica con questo nome esiste già. Sostituirla? +schematic.import = Importa schematica... schematic.exportfile = Esporta file schematic.importfile = Importa File schematic.browseworkshop = Naviga sul Workshop -schematic.copy = copia negli appunti +schematic.copy = Copia negli appunti schematic.copy.import = Importa dagli appunti schematic.shareworkshop = Condividi sul Workshop -schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Flip Schematic -schematic.saved = Schema salvato. -schematic.delete.confirm = Questo schema sarà cancellato definitivamente. -schematic.rename = Rinomina schema -schematic.info = {0}x{1}, {2} blocks +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Ruota Schematica +schematic.saved = Schematica salvata. +schematic.delete.confirm = Questa schematica sarà cancellata definitivamente. +schematic.rename = Rinomina schematica +schematic.info = {0}x{1}, {2} blocchi + stat.wave = Ondate sconfitte:[accent] {0} stat.enemiesDestroyed = Nemici distrutti:[accent] {0} stat.built = Costruzioni erette:[accent] {0} @@ -47,30 +52,31 @@ stat.destroyed = Costruzioni distrutte:[accent] {0} stat.deconstructed = Costruzioni smantellate:[accent] {0} stat.delivered = Riorse lanciate: stat.rank = Livello finale: [accent]{0} -launcheditems = [accent]Oggetti lanciati -launchinfo = [unlaunched][[LAUNCH] il tuo core per ottenere gli oggetti indicati in blu. -map.delete = Sei sicuro di voler eliminare questa mappa"[accent]{0}[]"? -level.highscore = Miglior punteggio: [accent]{0} -level.select = Selezione del livello -level.mode = Modalità di gioco: -showagain = non mostrare più -coreattack = < Il nucleo è sotto attacco! > + +launcheditems = [accent]Oggetti Lanciati +launchinfo = [unlaunched][[LAUNCH] il tuo Nucleo per ottenere gli oggetti indicati in blu. +map.delete = Sei sicuro di voler eliminare la mappa"[accent]{0}[]"? +level.highscore = Miglior Punteggio: [accent]{0} +level.select = Selezione del Livello +level.mode = Modalità di Gioco: +showagain = Non mostrare più +coreattack = < Il Nucleo è sotto attacco! > nearpoint = [[ [scarlet]LASCIA LA ZONA NEMICA IMMEDIATAMENTE[] ]\nautodistruzione imminente -database = Database nucleo +database = Database Nucleo savegame = Salva loadgame = Carica -joingame = Unisciti al gioco -customgame = Gioco personalizzato +joingame = Unisciti al Gioco +customgame = Gioco Personalizzato newgame = Nuova partita -none = +none = minimap = Minimappa -position = Position +position = Posizione close = Chiuso website = Sito web quit = Esci save.quit = Salva ed esci maps = Mappe -maps.browse = Consulta Mappe +maps.browse = Esplora Mappe continue = Continua maps.none = [LIGHT_GRAY]Nessuna mappa trovata! invalid = Non valido @@ -80,66 +86,69 @@ uploadingcontent = Carico il contenuto uploadingpreviewfile = Carico file di anteprima committingchanges = Applico le modifiche done = Fatto -feature.unsupported = Your device does not support this feature. -mods.alphainfo = Tieni a mente che queste mod sono in alpha, e[scarlet] possono avere molti bug[].\nRiporta tutti i problemi che trovi in Mindustry su GitHub o Discord. +feature.unsupported = Il tuo dispositivo non supporta questa funzione. + +mods.alphainfo = Tieni a mente che queste Mod sono in alpha, e[scarlet] possono contenere molti bug[].\Segnala tutti i problemi che trovi su GitHub o Discord di Mindustry. mods.alpha = [accent](Alpha) mods = Mods -mods.none = [LIGHT_GRAY]Nessuna mod trovata! -mods.guide = guida per il modding! -mods.report = Riporta un bug -mods.openfolder = Open Mod Folder +mods.none = [LIGHT_GRAY]Nessuna Mod trovata! +mods.guide = Guida per il modding! +mods.report = Segnala un Bug +mods.openfolder = Apri Cartella Mod mod.enabled = [lightgray]Abilitato mod.disabled = [scarlet]Disabilitato mod.disable = Disabilita -mod.delete.error = Unable to delete mod. File may be in use. -mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. +mod.delete.error = Impossibile eliminare questa Mod. Il file potrebbe essere in uso. +mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} +mod.nowdisabled = [scarlet]Alla Mod '{0}' mancano delle dipendenze:[accent] {1}\n[lightgray]Queste Mod devono essere scaricate prima.\nQuesta Mod verrà disabilitata automaticamente. mod.enable = Abilita -mod.requiresrestart = . +mod.requiresrestart = Il gioco verrà chiuso per applicare i cambiamenti. mod.reloadrequired = [scarlet]Riavvio necessario -mod.import = Importa una mod -mod.import.github = Import GitHub Mod -mod.remove.confirm = Questa mod verrà cancellata. -mod.author = [LIGHT_GRAY]Author:[] {0} -mod.missing = Questo salvataggio contiene mod che hai recentemente aggiornato o non le hai piu installate. Il salvataggio può essere corrotto. sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} -mod.preview.missing = Prima di pubblicare questa mod nel workshop, devi aggiungere un immagine di copertina.\nmetti un immagine[accent] preview.png[] nella cartella della mod e riprova . -mod.folder.missing = Solo mod in una cartella possono essere pubblicate nel workshop.\nPer pubblicare una mod, bisogna decompressare il file in una cartella e eliminare il file zip, dopo riavvia il gioco e ricarica la mod +mod.import = Importa una Mod +mod.import.github = Importa una Mod da GitHub +mod.item.remove = Questo item fa parte della Mod[accent] '{0}'[]. Per rimuoverlo, disinstalla questa Mod. +mod.remove.confirm = Questa Mod verrà eliminata. +mod.author = [LIGHT_GRAY]Autore:[] {0} +mod.missing = Questo salvataggio contiene Mod che hai recentemente aggiornato o non hai più installate. Il salvataggio potrebbe corrompersi. Sei sicuro di volerlo caricare?\n[lightgray]Mods:\n{0} +mod.preview.missing = Prima di pubblicare questa Mod nel Workshop, devi aggiungere un immagine di copertina.\nMetti un immagine[accent] con nome preview.png[] nella cartella della Mod e riprova. +mod.folder.missing = Solo le Mod in una cartella possono essere pubblicate nel Workshop.\nPer convertire una Mod in una cartella, decomprimi i suoi file in una cartella ed elimina il vecchio zip, quindi riavvia il gioco o ricarica le tue mods. + about.button = Info name = Nome: -noname = Scegli un [accent] nome[] prima di unirti. +noname = Scegli un[accent] nome[] prima di unirti. filename = Nome file: unlocked = Nuovo blocco scoperto! -completed = [accent]Completo +completed = [accent]Completato techtree = Albero scoperta research.list = [LIGHT_GRAY]Ricerca: research = Ricerca researched = [LIGHT_GRAY]{0} cercati. players = {0} giocatori online players.single = {0} giocatori online -server.closing = [accent]Chiusura server ... +server.closing = [accent]Chiusura server... server.kicked.kick = Sei stato cacciato dal server! -server.kicked.whitelist = Non sei presente in questa whitelist. +server.kicked.whitelist = Non sei presente nella whitelist. server.kicked.serverClose = Server chiuso. -server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Buona giornata. +server.kicked.vote = Sei stato cacciato su richiesta dei giocatori. Addio. server.kicked.clientOutdated = Versione del client obsoleta! Aggiorna il tuo gioco! server.kicked.serverOutdated = Server obsoleto! Chiedi all'host di aggiornare la versione del server! -server.kicked.banned = Sei bandito da questo server. -server.kicked.typeMismatch = Questo server non è compatibile con la tua build. +server.kicked.banned = Sei stato bandito da questo server. +server.kicked.typeMismatch = Questo server non è compatibile con il tuo client. server.kicked.playerLimit = Questo server è pieno. Attendi che si liberi un posto. server.kicked.recentKick = Sei stato cacciato di recente.\nAspetta prima di riconnetterti. server.kicked.nameInUse = C'è già qualcuno con il tuo nome su questo server. server.kicked.nameEmpty = Il tuo nome deve contenere almeno un carattere. server.kicked.idInUse = Sei già su questo server! Non è permesso connettersi con due account. -server.kicked.customClient = Questo server non supporta le build personalizzate. Scarica la versione ufficiale dal sito. +server.kicked.customClient = Questo server non supporta i client personalizzati. Scarica la versione ufficiale dal sito. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]connessione wifi o rete locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. -join.info = Qui è possibile inserire un [accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\n Sono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco di server globali automatici; se si desidera connettersi a qualcuno tramite IP, è necessario chiedere all'host il proprio IP. +server.versions = Your version:[accent] {0}[]\nVersione server:[accent] {1}[] +host.info = Il pulsante [accent]host [] ospita un server sulla porta [scarlet]6567[].[] Chiunque sulla stessa [LIGHT_GRAY]rete wifi o locale[] dovrebbe essere in grado di vedere il server nell'elenco server.\n\n Se vuoi che le persone siano in grado di connettersi ovunque tramite il tuo IP, è richiesto il [accent]port forwarding[]. \n\n[LIGHT_GRAY]Nota: se qualcuno sta riscontrando problemi durante la connessione al gioco LAN, assicurati di aver consentito a Mindustry di accedere alla rete locale nelle impostazioni del firewall. +join.info = Qui è possibile inserire l'[accent]IP del server[] a cui connettersi, o scoprire [accent]un server sulla rete locale[] disponibile.\nSono supportati sia il multiplayer LAN che WAN. \n\n[LIGHT_GRAY]Nota: non esiste un elenco automatico dei server globali; se desideri connetterti a qualcuno tramite il suo IP, è necessario chiedere all'host il proprio IP. hostserver = Ospita Server invitefriends = Invita amici hostserver.mobile = Ospita\nServer host = Host -hosting = [accent] Apertura del server ... +hosting = [accent] Apertura del server... hosts.refresh = Aggiorna hosts.discovering = Ricerca partite LAN hosts.discovering.any = Ricerca partite @@ -152,7 +161,7 @@ trace.ip = IP: [accent]{0} trace.id = ID univoco: [accent]{0} trace.mobile = Mobile Client: [accent]{0} trace.modclient = Client personalizzato: [accent]{0} -invalidid = ID client non valido! Invia una segnalazione di bug. +invalidid = ID client non valido! Segnala un bug. server.bans = Lista Ban server.bans.none = Nessun giocatore bandito trovato! Finora tutto liscio. server.admins = Amministratori @@ -173,51 +182,51 @@ confirmunadmin = Sei sicuro di voler rimuovere lo stato di amministratore da que joingame.title = Unisciti alla Partita joingame.ip = IP: disconnect = Disconnesso. -disconnect.error = Connection error. -disconnect.closed = Connection closed. +disconnect.error = Errore di connessione. +disconnect.closed = Connessione chiusa. disconnect.timeout = Timed out. -disconnect.data = errore nel caricamento del mondo, mi dispiace! +disconnect.data = Errore durante il caricamento del mondo! cantconnect = Impossibile unirsi al server ([accent]{0}[]). -connecting = [accent]Connessione in corso ... -connecting.data = [accent]Caricamento dei dati del mondo ... +connecting = [accent]Connessione in corso... +connecting.data = [accent]Caricamento del mondo... server.port = Porta: server.addressinuse = Indirizzo già in uso! -server.invalidport = Numero di porta non valido! +server.invalidport = Numero porta non valido! server.error = [crimson]Errore nell'hosting del server: [accent] {0} save.new = Nuovo Salvataggio save.overwrite = Sei sicuro di voler sovrascrivere questo salvataggio? overwrite = Sovrascrivi save.none = Nessun salvataggio trovato! -saveload = [accent]Salvataggio ... -savefail = [crimson]Salvataggio del gioco NON riuscito! +saveload = [accent]Salvataggio in corso... +savefail = [crimson]Salvataggio del gioco non riuscito! save.delete.confirm = Sei sicuro di voler eliminare questo salvataggio? save.delete = Elimina save.export = Esporta Salvataggio save.import.invalid = [accent]Questo salvataggio non è valido! -save.import.fail = [crimson]Impossibile importare salvataggio: [accent]{0} +save.import.fail = [crimson]Impossibile importare il salvataggio: [accent]{0} save.export.fail = [crimson]Impossibile esportare il salvataggio: [accent]{0} save.import = Importa Salvataggio -save.newslot = Salva nome: +save.newslot = Nome: save.rename = Rinomina save.rename.text = Nuovo nome: selectslot = Seleziona un salvataggio. slot = [accent]Slot {0} -editmessage = Modifica messaggio +editmessage = Modifica Messaggio save.corrupted = [orang]Salvataggio corrotto o non valido! -empty = +empty = on = On off = Off -save.autosave = Salvataggio automatico: {0} +save.autosave = Salvataggio Automatico: {0} save.map = Mappa: {0} save.wave = Ondata: {0} save.mode = Gamemode: {0} -save.date = Ultimo salvataggio: {0} -save.playtime = Tempo di gioco: {0} +save.date = Ultimo Salvataggio: {0} +save.playtime = Tempo di Gioco: {0} warning = Attenzione confirm = Conferma delete = Elimina view.workshop = Vedi nel Workshop -workshop.listing = Edit Workshop Listing +workshop.listing = Modifica l'elenco del Workshop ok = OK open = Apri customize = Personalizza @@ -229,14 +238,14 @@ data.export = Esporta Salvataggio data.import = Importa Salvataggio data.exported = Dati esportati. data.invalid = Questi non sono dati di gioco validi. -data.import.confirm = Importare dati di gioco esterni eliminerà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente. -classic.export = Esporta dati classici -classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vorresti esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app? +data.import.confirm = Importare dati di gioco esterni sovrascriverà[scarlet] tutti[] i tuoi progressi attuali.\n[accent]L'operazione è irreversibile![]\n\nUna volta importati i dati, il gioco si chiuderà immediatamente. +classic.export = Esporta Dati Classici +classic.export.text = [accent]Mindustry[] ha appena rilasciato un aggiornamento importante.\nSalvataggio Classic (v3.5 build 40) o dati delle mappe è stato ritrovato. Vuoi esportare questi salvatagggi sul tuo telefono per usarli nella Mindustry Classic app? quit.confirm = Sei sicuro di voler uscire? -quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent] Gioca > Tutorial.[] -loading = [accent]Caricamento in corso ... -reloading = [accent]Reloading Mods... -saving = [accent]Salvando ... +quit.confirm.tutorial = Sei sicuro di sapere cosa stai facendo? Il tutorial può essere ripetuto in[accent]\nImpostazioni -> Gioco -> Ripeti il Tutorial.[] +loading = [accent]Caricamento in Corso... +reloading = [accent]Ricaricamento delle mods... +saving = [accent]Salvataggio in corso... cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy pausebuilding = [accent][[{0}][] to pause building @@ -245,7 +254,7 @@ wave = [accent]Ondata {0} wave.waiting = [LIGHT_GRAY]Ondata tra {0} wave.waveInProgress = [LIGHT_GRAY]Ondata in corso... waiting = In attesa... -waiting.players = Aspettando giocatori... +waiting.players = Attendendo giocatori... wave.enemies = [LIGHT_GRAY]{0} Nemici Rimasti wave.enemy = [LIGHT_GRAY]{0} Nemico Rimasto loadimage = Carica immagine @@ -255,19 +264,19 @@ custom = Personalizzato builtin = Incluso map.delete.confirm = Sei sicuro di voler eliminare questa mappa? L'operazione è irreversibile! map.random = [accent]Mappa casuale -map.nospawn = Questa mappa non possiede un nucleo in cui spawnare! Aggiungine uno nell'editor. -map.nospawn.pvp = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. -map.nospawn.attack = Questa mappa non ha un nucleo nemico! Aggiungi un [SCARLET]nucleo rosso[] nell'editor per poter giocare. +map.nospawn = Questa mappa non possiede un Nucleo in cui spawnare! Aggiungine uno nell'editor. +map.nospawn.pvp = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. +map.nospawn.attack = Questa mappa non ha un Nucleo nemico! Aggiungi un [SCARLET]Nucleo rosso[] nell'editor per poter giocare. map.invalid = Errore nel caricamento della mappa: file mappa corrotto o non valido. -workshop.update = Update Item -workshop.error = Error fetching workshop details: {0} +workshop.update = Aggiorna elemento +workshop.error = Errore nel recupero dei dettagli del Workshop: {0} map.publish.confirm = Vuoi pubblicare questa mappa?\n\n[lightgray]Assicurati di aver accettato il Workshop EULA, o le tue mappe non saranno visibili! -workshop.menu = Select what you would like to do with this item. -workshop.info = Item Info -changelog = Changelog (optional): +workshop.menu = Seleziona cosa vorresti fare con questo elemento. +workshop.info = Info elemento +changelog = Changelog (opzionale): eula = Steam EULA -missing = This item has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked. -publishing = [accent]Publishing... +missing = This item has been deleted or moved.\n[lightgray]The Workshop listing has now been automatically un-linked. +publishing = [accent]Pubblicazione... publish.confirm = Are you sure you want to publish this?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your items will not show up! publish.error = Error publishing item: {0} steam.error = Failed to initialize Steam services.\nError: {0} @@ -288,7 +297,7 @@ editor.newmap = Nuova mappa workshop = Workshop waves.title = Ondate waves.remove = Rimuovi -waves.never = mai +waves.never = waves.every = sempre waves.waves = ondata/e waves.perspawn = per spawn @@ -297,7 +306,7 @@ waves.boss = Boss waves.preview = Anteprima waves.edit = Modifica... waves.copy = Copia negli appunti -waves.load = Caica dagli appunti +waves.load = Carica dagli appunti waves.invalid = Onde dagli appunti non valide. waves.copied = Onde copiate. waves.none = Nessun nemico definiti.\n Nota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. @@ -310,7 +319,7 @@ editor.removeunit = Rimuovi un'unità editor.teams = Squadre editor.errorload = Errore nel caricamento di:\n[accent]{0} editor.errorsave = Errore nel salvataggio di:\n[accent]{0} -editor.errorimage = Quella è un'immagine, non una mappa. Non cambiare estensioni sperando che funzioni.\n\n Se vuoi importare una mappa vecchia clicca su "importa una mappa vecchia" nell'editor. +editor.errorimage = Quella è un'immagine, non una mappa.\n\nSe vuoi importare una mappa vecchia clicca su "Importa una mappa vecchia" nell'editor. editor.errorlegacy = La mappa è troppo vecchia ed usa un formato che non è più supportato. editor.errornot = Questo file non è una mappa. editor.errorheader = Questo file della mappa è invalido o corrotto. @@ -339,7 +348,7 @@ editor.exportfile.description = Esporta file mappa editor.exportimage = Esporta immagine editor.exportimage.description = Esporta file immagine mappa editor.loadimage = Carica\nimmagine -editor.saveimage = Salva\nImmagine +editor.saveimage = Salva\nimmagine editor.unsaved = [scarlet]Alcune modifiche non sono state salvate![]\nSei sicuro di voler uscire? editor.resizemap = Ridimensiona la mappa editor.mapname = Nome Mappa: @@ -347,9 +356,10 @@ editor.overwrite = [accent]Attenzione!\nQuesto sovrascrive una mappa esistente. editor.overwrite.confirm = [scarlet]Attenzione![] Una mappa con questo nome esiste già. Sei sicuro di volerla sovrascrivere? editor.exists = Esiste già una mappa con questo nome. editor.selectmap = Seleziona una mappa da caricare: -toolmode.replace = Rimpiazzare + +toolmode.replace = Sostituire toolmode.replace.description = Disegna solo su blocchi solidi. -toolmode.replaceall = Rimpiazzare tutto +toolmode.replaceall = Sostituisci tutto toolmode.replaceall.description = Rimpiazza tutti i blocchi nella mappa toolmode.orthogonal = Ortogonale toolmode.orthogonal.description = Disegna solo linee ortogonali @@ -357,10 +367,11 @@ toolmode.square = Quadrato toolmode.square.description = Pennello quadrato toolmode.eraseores = Rimuovi Minerali toolmode.eraseores.description = Rimuove solo minerali -toolmode.fillteams = Riempi squadre +toolmode.fillteams = Riempi Squadre toolmode.fillteams.description = Riempe squadre al posto di blocchi -toolmode.drawteams = Disegna squadre +toolmode.drawteams = Disegna Squadre toolmode.drawteams.description = Disegna squadre al posto di blocchi + filters.empty = [LIGHT_GRAY]Nessun filtro! Aggiungine uno cliccando il tasto sotto. filter.distort = Modifica filter.noise = Interferenza @@ -391,7 +402,8 @@ filter.option.ore = Minerale filter.option.floor2 = Pavimento secondario filter.option.threshold2 = Soglia secondaria filter.option.radius = Raggio -filter.option.percentile = percentuale +filter.option.percentile = Percentuale + width = Larghezza: height = Altezza: menu = Menu @@ -404,41 +416,43 @@ ping = Ping: {0}ms language.restart = Riavvia il gioco affinché il cambiamento della lingua abbia effetto. settings = Impostazioni tutorial = Tutorial -tutorial.retake = Ripeti il tutorial +tutorial.retake = Ripeti il Tutorial editor = Editor mapeditor = Editor Mappe + abandon = Abbandona abandon.text = Questa zona e tutte le tue risorse saranno perdute e passeranno al nemico. locked = Bloccato complete = [LIGHT_GRAY]Completato: -requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} -resume = Riprendi zona:\n[LIGHT_GRAY]{0} -bestwave = [LIGHT_GRAY]Migliore: {0} -launch = Decollare +requirement.wave = Raggiungi onda {0} in {1} +requirement.core = Distruggi il Nucleo nemico in {0} +requirement.unlock = Sblocca {0} +resume = Riprendi Zona:\n[LIGHT_GRAY]{0} +bestwave = [LIGHT_GRAY]Ondata migliore: {0} +launch = < DECOLLARE > launch.title = Decollo riuscito! -launch.next = [LIGHT_GRAY]Nuova opportunità all'ondata {0} +launch.next = [LIGHT_GRAY]nuova opportunità all'ondata {0} launch.unable2 = [scarlet]IMPOSSIBILE DECOLLARE![] -launch.confirm = Questo trasporterà tutte le risorse nel tuo nucleo.\nNon riuscirai a ritornare in questa base. +launch.confirm = Questo trasporterà tutte le risorse nel tuo Nucleo.\nNon riuscirai a ritornare in questa base. launch.skip.confirm = Se salti adesso non riuscirai a decollare fino alle ondate successive -uncover = Svelare +uncover = Scopri configure = Configura l'equipaggiamento -bannedblocks = Banned Blocks -addall = Add All +bannedblocks = Blocchi banditi +addall = Aggiungi tutti configure.locked = [LIGHT_GRAY]Arriva all'ondata {0}\nper configurare l'equipaggiamento. configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} sbloccata. zone.requirement.complete = Ondata {0} raggiunta:\n{1} requisiti di zona soddisfatti. -zone.config.unlocked = Loadout unlocked:[lightgray]\n{0} -zone.resources = Risorse trovate: +zone.config.unlocked = Equipaggiamento sbloccato:[lightgray]\n{0} +zone.resources = Risorse Trovate: zone.objective = [lightgray]Obiettivo: [accent]{0} zone.objective.survival = Sopravvivere -zone.objective.attack = Distruggere il nucleo nemico +zone.objective.attack = Distruggere il Nucleo Nemico add = Aggiungi... boss.health = Vita del Boss + connectfail = [crimson] Impossibile connettersi al server: [accent] {0} -error.unreachable = Server irraggiungibile +error.unreachable = Server irraggiungibile. L'indirizzo è scritto correttamente? error.invalidaddress = Indirizzo invalido. error.timedout = Timeout!\n Assicurati che l'host abbia il port forwarding impostato e che l'indirizzo sia corretto! error.mismatch = Errore pacchetti:\nPossibile discordanza della versione client / server.\n Assicurati che tu e l'host possiediate l'ultima versione di Mindustry! @@ -447,6 +461,7 @@ error.mapnotfound = Mappa non trovata error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio del bloom.\nIl tuo dispositivo potrebbe non supportarlo. + zone.groundZero.name = Terreno Zero zone.desertWastes.name = Rifiuti Desertici zone.craters.name = Crateri @@ -461,10 +476,11 @@ zone.saltFlats.name = Saline zone.impact0078.name = Impatto 0078 zone.crags.name = Dirupi zone.fungalPass.name = Passaggio Fungoso + zone.groundZero.description = La posizione ottimale per cominciare. Bassa minaccia nemica. Poche risorse.\nRaccogli quanto più piombo e rame possibile.\nProcedi. zone.frozenForest.description = Anche qui, più vicino alle montagne, le spore si sono diffuse. Le temperature rigide non possono contenerle per sempre.\n Inizia la scoperta dell'energia. Costruisci generatori a combustione. Impara a usare i riparatori. zone.desertWastes.description = Questi rifiuti sono vasti, imprevedibili ed attraversati da strutture settoriali abbandonate.\n\nIl carbone è presente nella regione. Bruciatelo per ottenere energia o sintetizzate la grafite.\n\n[lightgray]Questa posizione di atterraggio non può essere garantita. -zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro nucleo. Non lasciare nulla in piedi. +zone.saltFlats.description = Alle periferie del deserto si trovano le saline. Poche risorse possono essere trovate in questa posizione.\n\nIl nemico ha eretto un complesso di archiviazione delle risorse qui. Sradicare il loro Nucleo. Non lasciare nulla in piedi. zone.craters.description = L'acqua si è accumulata in questo cratere, reliquia delle vecchie guerre. Recupera l'area. Raccogli la sabbia. Fondi il vetro metallico. Pompa l'acqua per raffreddare torrette e trivelle. zone.ruinousShores.description = Oltre i rifiuti, c'è il litorale. Una volta, questa posizione ospitava una schiera di difesa costiera. Non rimane molto. Solo le strutture di difesa più elementari sono rimaste incolume, tutto il resto ridotto a rottami.\nContinua l'espansione verso l'esterno. Riscopri la tecnologia. zone.stainedMountains.description = Più nell'entroterra si trovano le montagne, non ancora contaminate da spore.\nEstrai l'abbondante titanio in questa zona. Scopri come usarlo.\n\nLa presenza del nemico è maggiore qui. Non dare loro il tempo di inviare le loro unità più forti. @@ -475,23 +491,24 @@ zone.nuclearComplex.description = Un ex impianto per la produzione e la lavorazi zone.fungalPass.description = Un'area di transizione tra alte montagne e terre più basse, piene di spore. Qui si trova una piccola base di ricognizione nemica.\nDistruggila.\nUsa le unità Pugnale e Strisciatore. Elimina i due nuclei. zone.impact0078.description = zone.crags.description = + settings.language = Lingua settings.data = Importa/Esporta salvataggio -settings.reset = Resetta Alle Impostazioni Predefinite +settings.reset = Ripristina Impostazioni settings.rebind = Modifica settings.controls = Controlli settings.game = Gioco settings.sound = Suoni settings.graphics = Grafica -settings.cleardata = Cancella dati di gioco... -settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nNon può essere annullato! -settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, includendo salvataggi, mappe, oggetti sbloccati, impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà. -paused = In pausa -clear = Clear -banned = [scarlet]Banned +settings.cleardata = Elimina Dati di Gioco... +settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata! +settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente. +paused = [accent]< In Pausa > +clear = Pulisci +banned = [scarlet]Bandito yes = Si no = No -info.title = [accent] Info +info.title = Info error.title = [crimson]Si è verificato un errore error.crashtitle = Si è verificato un errore blocks.input = Ingresso @@ -501,49 +518,53 @@ block.unknown = [LIGHT_GRAY]??? blocks.powercapacity = Capacità Energetica blocks.powershot = Danno/Colpo blocks.damage = Danno -blocks.targetsair = Attacca nemici aerei -blocks.targetsground = Attacca nemici terreni -blocks.itemsmoved = Velocità movimento -blocks.launchtime = Tempo fra decolli +blocks.targetsair = Attacca Nemici Aerei +blocks.targetsground = Attacca Nemici Terreni +blocks.itemsmoved = Velocità di Movimento +blocks.launchtime = Tempo fra Decolli blocks.shootrange = Raggio blocks.size = Grandezza -blocks.liquidcapacity = Capacità del liquido +blocks.liquidcapacity = Capacità del Liquido blocks.powerrange = Raggio Energia -blocks.powerconnections = Max Connections -blocks.poweruse = Utilizzo energia +blocks.powerconnections = Connessioni Massime +blocks.poweruse = Utilizzo Energia blocks.powerdamage = Energia/Danno blocks.itemcapacity = Capacità -blocks.basepowergeneration = Generazione energia di base -blocks.productiontime = Tempo di produzione -blocks.repairtime = Tempo di riparazione completa +blocks.basepowergeneration = Generazione Energia di Base +blocks.productiontime = Tempo di Produzione +blocks.repairtime = Tempo di Riparazione Completa blocks.speedincrease = Aumento Velocità blocks.range = Raggio blocks.drilltier = Scavabili -blocks.drillspeed = Velocità di scavo stabile -blocks.boosteffect = Effetto boost -blocks.maxunits = Unità attive max +blocks.drillspeed = Velocità di Scavo Stabile +blocks.boosteffect = Effetto Boost +blocks.maxunits = Unità Attive Max blocks.health = Salute -blocks.buildtime = Tempo di costruzione +blocks.buildtime = Tempo di Costruzione blocks.buildcost = Costo di Costruzione blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi blocks.reload = Ricarica blocks.ammo = Munizioni -bar.drilltierreq = Miglior trivella richiesta -bar.drillspeed = Velocità scavo: {0}/s -bar.pumpspeed = Pump Speed: {0}/s + +bar.drilltierreq = Miglior Trivella Richiesta +bar.drillspeed = Velocità Scavo: {0}/s +bar.pumpspeed = Velocità di Pompaggio: {0}/s bar.efficiency = Efficienza: {0}% bar.powerbalance = Energia: {0} -bar.powerstored = Stored: {0}/{1} +bar.powerstored = Immagazzinata: {0}/{1} bar.poweramount = Energia: {0} -bar.poweroutput = Energia in uscita: {0} +bar.poweroutput = Energia in Uscita: {0} bar.items = Oggetti: {0} -bar.capacity = Capacity: {0} +bar.capacity = Capacità: {0} bar.liquid = Liquido bar.heat = Calore bar.power = Energia -bar.progress = Progresso della costruzione +bar.progress = Progresso della Costruzione bar.spawned = Unità: {0}/{1} +bar.input = Entrata +bar.output = Uscita + bullet.damage = [stat]{0}[lightgray] danno bullet.splashdamage = [stat]{0}[lightgray] danno ad area ~[stat] {1}[lightgray] blocchi bullet.incendiary = [stat]incendiario @@ -555,6 +576,7 @@ bullet.freezing = [stat]congelante bullet.tarred = [stat]viscoso bullet.multiplier = [stat]{0}[lightgray]x moltiplicatore munizioni bullet.reload = [stat]{0}[lightgray]x ricarica + unit.blocks = blocchi unit.powersecond = unità energia/secondo unit.liquidsecond = unità liquide/secondo @@ -567,6 +589,8 @@ unit.persecond = /sec unit.timesspeed = x velocità unit.percent = % unit.items = oggetti +unit.thousands = k +unit.millions = mln category.general = Generali category.power = Energia category.liquids = Liquidi @@ -574,58 +598,62 @@ category.items = Oggetti category.crafting = Produzione category.shooting = Potenza di fuoco category.optional = Miglioramenti Opzionali -setting.landscape.name = Blocca paesaggio +setting.landscape.name = Blocca Paesaggio setting.shadows.name = Ombre -setting.blockreplace.name = Automatic Block Suggestions -setting.linear.name = Filtro lineare -setting.hints.name = Hints -setting.animatedwater.name = Acqua animata -setting.animatedshields.name = Scudi animati -setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riapertura gioco)[] -setting.indicators.name = Indicatori Alleati -setting.autotarget.name = Mira automatica +setting.blockreplace.name = Suggerimento Blocchi Automatico +setting.linear.name = Filtro Lineare +setting.hints.name = Suggerimenti +setting.buildautopause.name = Auto-Pause Building +setting.animatedwater.name = Acqua Animata +setting.animatedshields.name = Scudi Animati +setting.antialias.name = Antialias[LIGHT_GRAY] (richiede riavvio)[] +setting.indicators.name = Indicatori Alleati/Nemici +setting.autotarget.name = Mira Automatica setting.keyboard.name = Tastiera -setting.touchscreen.name = Controlli Touchscreen +setting.touchscreen.name = Controlli Touchscreen setting.fpscap.name = Limite FPS setting.fpscap.none = Niente setting.fpscap.text = {0} FPS -setting.uiscale.name = Ridimensionamento dell'interfaccia utente[lightgray] (richiede riapertura gioco)[] -setting.swapdiagonal.name = Posizionamento sempre diagonale +setting.uiscale.name = Ridimensionamento Interfaccia[lightgray] (richiede riavvio)[] +setting.swapdiagonal.name = Posizionamento Sempre Diagonale setting.difficulty.training = Allenamento setting.difficulty.easy = Facile -setting.difficulty.normal = Medio +setting.difficulty.normal = Normale setting.difficulty.hard = Difficile setting.difficulty.insane = Impossibile setting.difficulty.name = Difficoltà: -setting.screenshake.name = Movimento dello schermo -setting.effects.name = Visualizza effetti -setting.destroyedblocks.name = Display Destroyed Blocks +setting.screenshake.name = Movimento dello Schermo +setting.effects.name = Visualizza Effetti +setting.destroyedblocks.name = Mostra Blocchi Distrutti setting.conveyorpathfinding.name = Conveyor Placement Pathfinding -setting.sensitivity.name = Sensibilità del controller -setting.saveinterval.name = Intervallo di salvataggio automatico -setting.seconds = {0} Secondi +setting.sensitivity.name = Sensibilità del Controller +setting.saveinterval.name = Intervallo di Salvataggio Automatico +setting.blockselecttimeout.name = Tempo di Selezione del Blocco +setting.milliseconds = {0} millisecondi +setting.seconds = {0} secondi setting.fullscreen.name = Schermo Intero -setting.borderlesswindow.name = Schermo senza bordi[LIGHT_GRAY] (potrebbe richiedere riapertura gioco) -setting.fps.name = Mostra FPS +setting.borderlesswindow.name = Finestra Senza Bordi[LIGHT_GRAY] (potrebbe richiedere riavvio) +setting.fps.name = Mostra FPS e Ping +setting.blockselectkeys.name = Mostra Tasto di Selezione del Blocco setting.vsync.name = VSync -setting.pixelate.name = Sfocare [LIGHT_GRAY](potrebbe ridure il rendimento) -setting.minimap.name = Mostra minimappa -setting.position.name = Show Player Position +setting.pixelate.name = Effetto Pixel [LIGHT_GRAY](potrebbe ridure le prestazioni) +setting.minimap.name = Mostra Minimappa +setting.position.name = Mostra Posizione Giocatori setting.musicvol.name = Volume Musica setting.ambientvol.name = Volume Ambiente -setting.mutemusic.name = Silenzia musica +setting.mutemusic.name = Silenzia Musica setting.sfxvol.name = Volume Effetti -setting.mutesound.name = Togli suoni -setting.crashreport.name = Invia rapporti sugli arresti anomali anonimamente +setting.mutesound.name = Togli Suoni +setting.crashreport.name = Invia rapporti anonimi sugli arresti anomali setting.savecreate.name = Autosalvataggio -setting.publichost.name = Gioco visibile pubblicamente -setting.chatopacity.name = Opacità chat -setting.lasersopacity.name = Power Laser Opacity +setting.publichost.name = Gioco Visibile Pubblicamente +setting.chatopacity.name = Opacità Chat +setting.lasersopacity.name = Opacità Laser d'Energia setting.playerchat.name = Mostra Chat in-game public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. -uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci dalle impostazioni [accent] {0}[] impostazioni... -uiscale.cancel = Annulla ed esci +uiscale.reset = La scala dell'interfaccia utente è stata modificata.\nPremere "OK" per confermare questa scala.\n[scarlet] Ripristina ed esci in [accent] {0}[] secondi... +uiscale.cancel = Annulla ed Esci setting.bloom.name = Shaders keybind.title = Configurazione Tasti keybinds.mobile = [scarlet]La maggior parte dei keybind qui non sono funzionali sui dispositivi mobili. È supportato solo il movimento di base. @@ -635,71 +663,92 @@ category.multiplayer.name = Multigiocatore command.attack = Attacca command.rally = Guardia command.retreat = Ritirata -keybind.clear_building.name = Clear Building +placement.blockselectkeys = \n[lightgray]Tasto: [{0}, +keybind.clear_building.name = Pulisci Costruzione keybind.press = Premi un tasto... keybind.press.axis = Premi un'asse o un tasto... -keybind.screenshot.name = Screenshot della mappa -keybind.move_x.name = Muovi orizzontale -keybind.move_y.name = Muovi verticale -keybind.schematic_select.name = Select Region -keybind.schematic_menu.name = Schematic Menu -keybind.schematic_flip_x.name = Flip Schematic X -keybind.schematic_flip_y.name = Flip Schematic Y +keybind.screenshot.name = Screenshot della Mappa +keybind.move_x.name = Muovi Orizzontalmente +keybind.move_y.name = Muovi Verticalmente +keybind.mouse_move.name = Segui il Mouse +keybind.dash.name = Scatto +keybind.schematic_select.name = Seleziona Regione +keybind.schematic_menu.name = Menu Schematica +keybind.schematic_flip_x.name = Ruota Schematica Orizzontalmente +keybind.schematic_flip_y.name = Flip Schematic Verticalmente +keybind.category_prev.name = Categoria Precedente +keybind.category_next.name = Categoria Successiva +keybind.block_select_left.name = Seleziona Blocco Sinistra +keybind.block_select_right.name = Seleziona Blocco Destra +keybind.block_select_up.name = Seleziona Blocco Su +keybind.block_select_down.name = Seleziona Blocco Giù +keybind.block_select_01.name = Categoria/Seleziona Blocco 1 +keybind.block_select_02.name = Categoria/Seleziona Blocco 2 +keybind.block_select_03.name = Categoria/Seleziona Blocco 3 +keybind.block_select_04.name = Categoria/Seleziona Blocco 4 +keybind.block_select_05.name = Categoria/Seleziona Blocco 5 +keybind.block_select_06.name = Categoria/Seleziona Blocco 6 +keybind.block_select_07.name = Categoria/Seleziona Blocco 7 +keybind.block_select_08.name = Categoria/Seleziona Blocco 8 +keybind.block_select_09.name = Categoria/Seleziona Blocco 9 +keybind.block_select_10.name = Categoria/Seleziona Blocco 10 keybind.fullscreen.name = Schermo Intero -keybind.select.name = Seleziona -keybind.diagonal_placement.name = Posizionamento diagonale +keybind.select.name = Seleziona/Spara +keybind.diagonal_placement.name = Posizionamento Diagonale keybind.pick.name = Scegli Blocco -keybind.break_block.name = Rompi blocco +keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona keybind.shoot.name = Spara -keybind.zoom_hold.name = Attiva zoom -keybind.zoom.name = Esegui zoom -keybind.menu.name = Apri Menu +keybind.zoom_hold.name = Attiva Zoom +keybind.zoom.name = Esegui Zoom +keybind.menu.name = Menu keybind.pause.name = Pausa -keybind.pause_building.name = Pause/Resume Building +keybind.pause_building.name = Pausa/Riprendi Costruzione keybind.minimap.name = Minimappa -keybind.dash.name = Scatto keybind.chat.name = Chat keybind.player_list.name = Lista dei Giocatori keybind.console.name = Console -keybind.rotate.name = Ruotare -keybind.rotateplaced.name = Rotate Existing (Hold) +keybind.rotate.name = Ruota +keybind.rotateplaced.name = Ruota Blocco Esistente (Premuto) keybind.toggle_menus.name = Mostra/Nascondi HUD -keybind.chat_history_prev.name = Scorri chat vero l'alto -keybind.chat_history_next.name = Scorri chatt verso il basso -keybind.chat_scroll.name = Scorri chat -keybind.drop_unit.name = Lascia materiali -keybind.zoom_minimap.name = Esegui Zoom minimappa -mode.help.title = Descrizione delle modalità +keybind.chat_history_prev.name = Scorri Chat vero l'alto +keybind.chat_history_next.name = Scorri Chat verso il basso +keybind.chat_scroll.name = Scorri Chat +keybind.drop_unit.name = Lascia Materiali +keybind.zoom_minimap.name = Esegui Zoom Minimappa +keybind.toggle_power_lines.name = Attiva/Disattiva Laser d'Energia +mode.help.title = Descrizione delle Modalità mode.survival.name = Sopravvivenza -mode.survival.description = La modalità normale. Risorse limitate ed ondate in entrata automatiche. +mode.survival.description = Modalità normale. Risorse limitate ed ondate in entrata automatiche. mode.sandbox.name = Creativa mode.sandbox.description = Risorse infinite e nessun timer per le ondate. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Lotta contro altri giocatori. mode.attack.name = Schermaglia -mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate -mode.custom = Regole personalizzate +mode.attack.description = Obiettivo: Distruggere la base nemica, non ci sono ondate. +mode.custom = Regole Personalizzate + rules.infiniteresources = Risorse infinite -rules.wavetimer = Timer ondate +rules.reactorexplosions = Esplosioni Reattore +rules.wavetimer = Timer Ondate rules.waves = Ondate -rules.attack = Modalità attacco -rules.enemyCheat = Infinite Risorse AI +rules.attack = Modalità Attacco +rules.enemyCheat = Risorse AI Infinite rules.unitdrops = Generazione Unità -rules.unitbuildspeedmultiplier = Moltiplicatore velocità costruzione unità -rules.unithealthmultiplier = Moltiplicatore vita unità -rules.playerhealthmultiplier = Moltiplicatore vita giocatore -rules.playerdamagemultiplier = Moltiplicatore danno giocatore -rules.unitdamagemultiplier = Moltiplicatore danno unità -rules.enemycorebuildradius = Raggio dove non si può costruire attorno al nucleo nemico:[LIGHT_GRAY] (tiles) +rules.unitbuildspeedmultiplier = Moltiplicatore Velocità Costruzione Unità +rules.unithealthmultiplier = Moltiplicatore Vita Unità +rules.playerhealthmultiplier = Moltiplicatore Vita Giocatore +rules.playerdamagemultiplier = Moltiplicatore Danno Giocatore +rules.unitdamagemultiplier = Moltiplicatore Danno Unità +rules.enemycorebuildradius = Raggio di Protezione del Nucleo Nemico dalle Costruzioni:[LIGHT_GRAY] (tiles) rules.respawntime = Tempo di rigeneratione:[LIGHT_GRAY] (sec) -rules.wavespacing = Tempo fra ondate:[LIGHT_GRAY] (secondi) -rules.buildcostmultiplier = Moltiplicatore costo costruzione -rules.buildspeedmultiplier = Moltiplicatore velocità costruzione +rules.wavespacing = Tempo fra Ondate:[LIGHT_GRAY] (secondi) +rules.buildcostmultiplier = Moltiplicatore Costo Costruzione +rules.buildspeedmultiplier = Moltiplicatore Velocità Costruzione rules.waitForWaveToEnd = Ondate aspettano fino a quando l'ondata precedente finisce -rules.dropzoneradius = Raggio di generazione:[LIGHT_GRAY] (blocchi) -rules.respawns = Massimo di rigenerazioni per ondata +rules.dropzoneradius = Raggio di Generazione:[LIGHT_GRAY] (blocchi) +rules.respawns = Rigenerazioni per ondata max rules.limitedRespawns = Limite rigenerazioni rules.title.waves = Ondate rules.title.respawns = Rigenerazioni @@ -707,6 +756,10 @@ rules.title.resourcesbuilding = Risorse e costruzioni rules.title.player = Giocatori rules.title.enemy = Nemici rules.title.unit = Unità +rules.title.experimental = Sperimentale +rules.lighting = Illuminazione +rules.ambientlight = Illuminazione Ambientale + content.item.name = Oggetti content.liquid.name = Liquidi content.unit.name = Unità @@ -733,26 +786,27 @@ liquid.slag.name = Scoria liquid.oil.name = Petrolio liquid.cryofluid.name = Criofluido mech.alpha-mech.name = Alpha -mech.alpha-mech.weapon = Ripetitore pesante +mech.alpha-mech.weapon = Ripetitore Pesante mech.alpha-mech.ability = Orda di droni mech.delta-mech.name = Delta -mech.delta-mech.weapon = Generatore di fulmini +mech.delta-mech.weapon = Generatore di Fulmini mech.delta-mech.ability = Scarica mech.tau-mech.name = Tau -mech.tau-mech.weapon = Laser ricostruttore -mech.tau-mech.ability = Impulso riparatore +mech.tau-mech.weapon = Laser Ricostruttore +mech.tau-mech.ability = Impulso Riparatore mech.omega-mech.name = Omega -mech.omega-mech.weapon = Sciame di missili -mech.omega-mech.ability = Configurazione armata +mech.omega-mech.weapon = Sciame di Missili +mech.omega-mech.ability = Configurazione Armata mech.dart-ship.name = Dardo mech.dart-ship.weapon = Ripetitore mech.javelin-ship.name = Giavellotto -mech.javelin-ship.weapon = Missili esplosivi -mech.javelin-ship.ability = Booster di scarico +mech.javelin-ship.weapon = Missili Esplosivi +mech.javelin-ship.ability = Booster di Scarico mech.trident-ship.name = Tridente -mech.trident-ship.weapon = Valle delle bombe +mech.trident-ship.weapon = Valle delle Bombe mech.glaive-ship.name = Glaive -mech.glaive-ship.weapon = Ripetitore di fiamma +mech.glaive-ship.weapon = Ripetitore di Fiamma +item.corestorable = [lightgray]Immagazzinabili nel Nucleo: {0} item.explosiveness = [LIGHT_GRAY]Esplosività: {0} item.flammability = [LIGHT_GRAY]Infiammabilità: {0} item.radioactivity = [LIGHT_GRAY]Radioattività: {0} @@ -760,42 +814,43 @@ unit.health = [LIGHT_GRAY]Salute: {0} unit.speed = [LIGHT_GRAY]Velocità: {0} mech.weapon = [LIGHT_GRAY]Armi: {0} mech.health = [LIGHT_GRAY]Salute: {0} -mech.itemcapacity = [LIGHT_GRAY]Capacità oggetti: {0} -mech.minespeed = [LIGHT_GRAY]Velocità di scavo: {0} -mech.minepower = [LIGHT_GRAY]Potenza di scavo: {0} +mech.itemcapacity = [LIGHT_GRAY]Capacità Oggetti: {0} +mech.minespeed = [LIGHT_GRAY]Velocità di Scavo: {0} +mech.minepower = [LIGHT_GRAY]Potenza di Scavo: {0} mech.ability = [LIGHT_GRAY]Abilità: {0} -mech.buildspeed = [LIGHT_GRAY]Velocità costruzione: {0}% -liquid.heatcapacity = [LIGHT_GRAY]Capacità calorifica: {0} +mech.buildspeed = [LIGHT_GRAY]Velocità di Costruzione: {0}% +liquid.heatcapacity = [LIGHT_GRAY]Capacità Termica: {0} liquid.viscosity = [LIGHT_GRAY]Viscosità: {0} liquid.temperature = [LIGHT_GRAY]Temperatura: {0} + block.sand-boulder.name = Masso di Sabbia block.grass.name = Erba block.salt.name = Sale block.saltrocks.name = Rocce salate block.pebbles.name = Ciottoli block.tendrils.name = Viticci -block.sandrocks.name = Rocce sabbiose +block.sandrocks.name = Rocce Sabbiose block.spore-pine.name = Pino di Spore block.sporerocks.name = Roccia di Spore block.rock.name = Roccia -block.snowrock.name = Roccia innevata -block.snow-pine.name = Pino innevato +block.snowrock.name = Roccia Innevata +block.snow-pine.name = Pino Innevato block.shale.name = Scisto -block.shale-boulder.name = Masso di scisto +block.shale-boulder.name = Masso di Scisto block.moss.name = Muschio block.shrubs.name = Arbusti -block.spore-moss.name = Muschio di spore -block.shalerocks.name = Rocce di scisto +block.spore-moss.name = Muschio di Spore +block.shalerocks.name = Rocce di Scisto block.scrap-wall.name = Muro di Rottami -block.scrap-wall-large.name = Muro di Rottami grande -block.scrap-wall-huge.name = Muro di Rottami enorme -block.scrap-wall-gigantic.name = Muro di Rottami gigante +block.scrap-wall-large.name = Muro di Rottami Grande +block.scrap-wall-huge.name = Muro di Rottami Enorme +block.scrap-wall-gigantic.name = Muro di Rottami Gigante block.thruster.name = Propulsore block.kiln.name = Forno -block.graphite-press.name = Pressa per grafite +block.graphite-press.name = Pressa per Grafite block.multi-press.name = Multi Pressa -block.constructing = {0}\n[LIGHT_GRAY](In costruzione) -block.spawn.name = Spawn nemico +block.constructing = {0}\n[LIGHT_GRAY](In Costruzione) +block.spawn.name = Spawn Nemico block.core-shard.name = Nucleo: Frammento block.core-foundation.name = Nucleo: Fondamento block.core-nucleus.name = Nucleo: Kernel @@ -810,24 +865,24 @@ block.darksand.name = Sabbia Scura block.ice.name = Ghiaccio block.snow.name = Neve block.craters.name = Crateri -block.sand-water.name = Acqua sabbiosa -block.darksand-water.name = Acqua sabbiosa scura +block.sand-water.name = Acqua Sabbiosa +block.darksand-water.name = Acqua Sabbiosa scura block.char.name = Carbone block.holostone.name = Pietra Holo -block.ice-snow.name = Neve ghiacciata +block.ice-snow.name = Neve Ghiacciata block.rocks.name = Rocce -block.icerocks.name = Rocce ghiacciate -block.snowrocks.name = Rocce innevate -block.dunerocks.name = Rocce delle dune +block.icerocks.name = Rocce Ghiacciate +block.snowrocks.name = Rocce Innevate +block.dunerocks.name = Rocce delle Dune block.pine.name = Pino -block.white-tree-dead.name = Albero bianco morto -block.white-tree.name = Albero morto -block.spore-cluster.name = Agglomerato di spore -block.metal-floor.name = Pavimento metallico -block.metal-floor-2.name = Pavimento metallico 2 -block.metal-floor-3.name = Pavimento metallico 3 -block.metal-floor-5.name = Pavimento metallico 5 -block.metal-floor-damaged.name = Pavimento metallico danneggiato +block.white-tree-dead.name = Albero Bianco Morto +block.white-tree.name = Albero Morto +block.spore-cluster.name = Agglomerato di Spore +block.metal-floor.name = Pavimento Metallico +block.metal-floor-2.name = Pavimento Metallico 2 +block.metal-floor-3.name = Pavimento Metallico 3 +block.metal-floor-5.name = Pavimento Metallico 4 +block.metal-floor-damaged.name = Pavimento Metallico Danneggiato block.dark-panel-1.name = Pannello scuro 1 block.dark-panel-2.name = Pannello scuro 2 block.dark-panel-3.name = Pannello scuro 3 @@ -839,55 +894,58 @@ block.ignarock.name = Roccia Ignea block.hotrock.name = Roccia Bollente block.magmarock.name = Roccia Magmatica block.cliffs.name = Scogliere -block.copper-wall.name = Muro di rame -block.copper-wall-large.name = Muro grande di rame -block.titanium-wall.name = Muro di titanio -block.titanium-wall-large.name = Muro grande di titanio -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall -block.phase-wall.name = Muro di fase -block.phase-wall-large.name = Muro grande di fase -block.thorium-wall.name = Muro di torio -block.thorium-wall-large.name = Muro grande di torio +block.copper-wall.name = Muro di Rame +block.copper-wall-large.name = Muro Grande di Rame +block.titanium-wall.name = Muro di Titanio +block.titanium-wall-large.name = Muro Grande di Titanio +block.plastanium-wall.name = Muro di Plastanio +block.plastanium-wall-large.name = Muro Grande di Plastanio +block.phase-wall.name = Muro di Fase +block.phase-wall-large.name = Muro Grande di Fase +block.thorium-wall.name = Muro di Torio +block.thorium-wall-large.name = Muro Grande di Torio block.door.name = Porta -block.door-large.name = Porta grande +block.door-large.name = Porta Grande block.duo.name = Torretta Duo block.scorch.name = Bruciatore -block.scatter.name = Cannone a dispersione +block.scatter.name = Cannone a Dispersione block.hail.name = Bombardiere block.lancer.name = Lanciere -block.conveyor.name = Nastro trasportatore -block.titanium-conveyor.name = Nastro avanzato -block.armored-conveyor.name = Nastro corazzato +block.conveyor.name = Nastro Trasportatore +block.titanium-conveyor.name = Nastro Avanzato +block.armored-conveyor.name = Nastro Corazzato block.armored-conveyor.description = Trasporta gli oggetti alla stessa velocità del nastro avanzato, ma è più resistente. Accetta input dai lati solo da altri nastri. block.junction.name = Incrocio block.router.name = Distributore block.distributor.name = Distributore Grande block.sorter.name = Filtro -block.inverted-sorter.name = Inverted Sorter -block.message.name = Message -block.overflow-gate.name = Separatore per eccesso +block.inverted-sorter.name = Filtro Inverso +block.message.name = Messaggio +block.illuminator.name = Lanterna +block.illuminator.description = Una piccola, compatta sorgente di luce. Richiede energia per funzionare. +block.overflow-gate.name = Separatore per Eccesso block.silicon-smelter.name = Fonderia -block.phase-weaver.name = Tessitore di fase +block.phase-weaver.name = Tessitore di Fase block.pulverizer.name = Polverizzatore -block.cryofluidmixer.name = Miscelatore di liquidi +block.cryofluidmixer.name = Miscelatore di Liquidi block.melter.name = Fonditore block.incinerator.name = Inceneritore block.spore-press.name = Pressa di Spore block.separator.name = Separatore block.coal-centrifuge.name = Centrifuga di Carbone -block.power-node.name = Nodo energetico -block.power-node-large.name = Nodo energetico grande +block.power-node.name = Nodo Energetico +block.power-node-large.name = Nodo Energetico Grande block.surge-tower.name = Torre di Sovratensione +block.diode.name = Diodo block.battery.name = Batteria -block.battery-large.name = Batteria grande -block.combustion-generator.name = Generatore a combustibile -block.turbine-generator.name = Turbina a vapore -block.differential-generator.name = Generatore differenziale +block.battery-large.name = Batteria Grande +block.combustion-generator.name = Generatore a Combustibile +block.turbine-generator.name = Turbina a Vapore +block.differential-generator.name = Generatore Differenziale block.impact-reactor.name = Reattore ad Impatto -block.mechanical-drill.name = Trivella meccanica -block.pneumatic-drill.name = Trivella pneumatica -block.laser-drill.name = Trivella laser +block.mechanical-drill.name = Trivella Meccanica +block.pneumatic-drill.name = Trivella Pneumatica +block.laser-drill.name = Trivella Laser block.water-extractor.name = Estrattore d'acqua block.cultivator.name = Coltivatore block.dart-mech-pad.name = Piattaforma del Mech Dardo @@ -897,27 +955,27 @@ block.trident-ship-pad.name = Piattaforma della Nave Tridente block.glaive-ship-pad.name = Piattaforma della Nave Glaive block.omega-mech-pad.name = Piattaforma del Mech Omega block.tau-mech-pad.name = Piattaforma del Mech Tau -block.conduit.name = Condotta -block.mechanical-pump.name = Pompa meccanica -block.item-source.name = Fonte infinita (oggetti) +block.conduit.name = Condotto +block.mechanical-pump.name = Pompa Meccanica +block.item-source.name = Fonte Infinita (oggetti) block.item-void.name = Cestino (oggetti) -block.liquid-source.name = Fonte infinita (liquidi) +block.liquid-source.name = Fonte Infinita (liquidi) block.power-void.name = Cestino (energia) -block.power-source.name = Fonte infinita (energia) +block.power-source.name = Fonte Infinita (energia) block.unloader.name = Scaricatore block.vault.name = Deposito block.wave.name = Idrogetto block.swarmer.name = Sciamatore block.salvo.name = Cannone Leggero block.ripple.name = Cannone Pesante -block.phase-conveyor.name = Nastro di fase -block.bridge-conveyor.name = Nastro trasportatore sopraelevato -block.plastanium-compressor.name = Compressore al plastanio -block.pyratite-mixer.name = Miscelatore di pirite -block.blast-mixer.name = Miscelatore di esplosivi -block.solar-panel.name = Pannello solare -block.solar-panel-large.name = Pannello solare 3x3 -block.oil-extractor.name = Estrattore di petrolio +block.phase-conveyor.name = Nastro di Fase +block.bridge-conveyor.name = Nastro Trasportatore Sopraelevato +block.plastanium-compressor.name = Compressore al Plastanio +block.pyratite-mixer.name = Miscelatore di Pirite +block.blast-mixer.name = Miscelatore d'Esplosivi +block.solar-panel.name = Pannello Solare +block.solar-panel-large.name = Pannello Solare Grande +block.oil-extractor.name = Estrattore di Petrolio block.command-center.name = Centro di Comando block.draug-factory.name = Fabbrica Droni Minatori block.spirit-factory.name = Fabbrica Droni Riparatori @@ -929,19 +987,19 @@ block.crawler-factory.name = Fabbrica Mech Strisciatore block.titan-factory.name = Fabbrica Mech Titano block.fortress-factory.name = Fabbrica Mech Fortezza block.revenant-factory.name = Fabbrica Combattenti Superstiti -block.repair-point.name = Punto di riparazione -block.pulse-conduit.name = Condotta attiva -block.phase-conduit.name = Condotta di fase -block.liquid-router.name = Distributore di liquidi +block.repair-point.name = Punto di Riparazione +block.pulse-conduit.name = Condotto Attiva +block.phase-conduit.name = Condotta di Fase +block.liquid-router.name = Distributore di Liquidi block.liquid-tank.name = Serbatoio -block.liquid-junction.name = Giunzione liquida -block.bridge-conduit.name = Condotta sopraelevata -block.rotary-pump.name = Pompa a turbina -block.thorium-reactor.name = Reattore al torio +block.liquid-junction.name = Giunzione Liquida +block.bridge-conduit.name = Condotta Sopraelevata +block.rotary-pump.name = Pompa a Turbina +block.thorium-reactor.name = Reattore al Torio block.mass-driver.name = Lancia Materiali -block.blast-drill.name = Trivella ad impulsi -block.thermal-pump.name = Pompa termica -block.thermal-generator.name = Generatore termico +block.blast-drill.name = Trivella ad Impulsi +block.thermal-pump.name = Pompa Termica +block.thermal-generator.name = Generatore Termico block.alloy-smelter.name = Altoforno block.mender.name = Riparatore block.mend-projector.name = Riparatore Grande @@ -982,12 +1040,12 @@ unit.eradicator.name = Estirpatore unit.lich.name = Lich unit.reaper.name = Mietitore tutorial.next = [lightgray] -tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo nucleo per farlo.\n\n[accent]{0}/{1} rame +tutorial.intro = Sei entrato nel[scarlet] Tutorial di Mindustry.[]\nInizia[accent] scavando rame[]. Clicca un minerale di rame vicino al tuo Nucleo per farlo.\n\n[accent]{0}/{1} rame tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers [] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Ora crea una trivella.\n[accent]Le trivelle []scavano da sole e sono più efficienti. Piazzane una su un minerale di rame. tutorial.drill.mobile = Ora crea una trivella. \n[accent] Le trivelle []scavano da sole e sono più efficienti. \n Toccare la scheda della trivella in basso a destra. \n Selezionare la trivella meccanica [accent] []. \n Posizionarlo su una vena di rame toccando, quindi premere il segno di spunta [accent] [] in basso per confermare la selezione. \n Premere il tasto X [accent] [] per annullare il posizionamento. tutorial.blockinfo = Ogni blocco ha statistiche diverse. Alcuni minerali richiedono trivelle specifiche.\nPer controllare le informazioni e le statistiche di un blocco, [accent] tocca "?" mentre lo selezioni nel database. []\n\n[accent]Accedi ora alle statistiche della trivella meccanica. [] -tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al nucleo. \nCrea una linea di nastri dalla trivella al nucleo. +tutorial.conveyor = [accent]I nastri trasportatori []sono usati per trasportare oggetti al Nucleo. \nCrea una linea di nastri dalla trivella al Nucleo. tutorial.conveyor.mobile = [accent] I nastri trasportatori [] sono usati per trasportare oggetti nel nocciolo. \nCrea una linea di nastri trasportatori dalla trivella al nocciolo. \n[accent] Posizionati in una linea tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione. \n\n [accent] {0} / {1} nastri trasportatori disposti in linea \n [accent] 0/1 oggetti consegnati tutorial.turret = Costruisci delle torrette per respingere il nemico [LIGHT_GRAY] []. \nCostruisci una torretta Duo vicino alla tua base. tutorial.drillturret = La Torretta Duo richiede[accent] munizioni di rame[] per sparare.\nPosiziona una trivella e collega un nastro alla torretta per rifornirla di munizioni con il rame estratto. @@ -995,13 +1053,14 @@ tutorial.pause = Durante la battaglia, puoi mettere in pausa il gioco [accent]. tutorial.pause.mobile = Durante la battaglia, puoi mettere in pausa il gioco [accent]. []\nPuoi disporre gli edifici mentre sei in pausa. \n\n[accent] Premi questo pulsante in alto a sinistra per mettere in pausa. tutorial.unpause = Ora premi di nuovo spazio per annullare la pausa. tutorial.unpause.mobile = Ora premilo di nuovo per annullare la pausa. -tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo core usando la selezione dell'area . -tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo nucleo usando la selezione dell'area. -tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal nucleo. [] -tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel nucleo. [] -tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. -tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. -tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial. +tutorial.breaking = I blocchi spesso devono essere distrutti. \n [accent]Tieni premuto il tasto destro del mouse [] per distruggere tutti i blocchi in una selezione. []\n[accent]Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area . +tutorial.breaking.mobile = I blocchi spesso devono essere distrutti. \n [accent] Seleziona la modalità di decostruzione [], quindi tocca un blocco per iniziare a smantellarlo. \n Distruggi un'area tenendo premuto il dito per alcuni secondi [] e trascinando in una direzione.\nPremi il pulsante con il segno di spunta per confermare la rimozione. \n\n [accent] Distruggi tutti i blocchi di scarto a sinistra del tuo Nucleo usando la selezione dell'area. +tutorial.withdraw = In alcune situazioni, è necessario prendere gli oggetti direttamente dai blocchi.\nPer fare ciò, [accent] tocca un blocco []con oggetti al suo interno, quindi [accent] tocca l'oggetto [] nell'inventario. \nPuoi prelevare più oggetti insieme[accent]tenendo premuto il tasto sinistro del mouse[].\n[accent]Preleva un po' di rame dal Nucleo. [] +tutorial.deposit = Deposita tutti gli oggetti che trasporti trascinandoli dalla tua nave al blocco di destinazione. \n[accent]Rimetti il rame nel Nucleo. [] +tutorial.waves = Il nemico [LIGHT_GRAY] si avvicina.\nDifendi il tuo Nucleo per 2 ondate. Costruisci più torrette. Puoi sparare tenendo premuto il tasto sinistro del mouse. +tutorial.waves.mobile = Il [lightgray] nemico si avvicina.\n\n Difendi il Nucleo per 2 ondate. La tua nave sparerà automaticamente contro i nemici.\nCostruisci più torrette. +tutorial.launch = Una volta raggiunta un'ondata specifica, sarai in grado di [accent] decollare con il Nucleo [], lasciando la zona e abbandonando le tue difese e le tue strutture\nOtterrai [accent]tutte le risorse nel tuo Nucleo[] e potrai quindi usarle per ricercare nuove tecnologie.\n\n [accent]Decolla e conferma per terminare il tutorial. + item.copper.description = Un utile materiale, usato dappertutto item.lead.description = Un materiale di base, molto usato nei blocchi di trasporto. item.metaglass.description = Un durissimo composto di vetro. Estensivamente usato per trasporto di liquidi ed immagazzinamento. @@ -1030,8 +1089,8 @@ mech.dart-ship.description = Una navicella standard. Molto veloce e leggera, ma mech.javelin-ship.description = Una navetta da tocca e fuga. Anche se inizialmente lenta, può accelerare ad alte velocità e volare sopra gli avamposti dei nemici, e provocare molti danni ai nemici tramite l'utilizzo di fulmini o missili. mech.trident-ship.description = Un bombardiere pesante. Molto ben protetto. mech.glaive-ship.description = Una grande e ben armata macchina da guerra. Equipaggiata con lanciafamme e con accelerazione veloce. -unit.draug.description = Un drone minerario primitivo. Economico da produrre. Sacrificabile. Scava automaticamente rame e piombo nelle vicinanze. Fornisce risorse estratte al nucleo più vicino. -unit.spirit.description = L'unità drone di partenza. Si genera nel nucleo per impostazione predefinita. Scava automaticamente, raccoglie oggetti e ripara blocchi. +unit.draug.description = Un drone minerario primitivo. Economico da produrre. Sacrificabile. Scava automaticamente rame e piombo nelle vicinanze. Fornisce risorse estratte al Nucleo più vicino. +unit.spirit.description = L'unità drone di partenza. Si genera nel Nucleo per impostazione predefinita. Scava automaticamente, raccoglie oggetti e ripara blocchi. unit.phantom.description = Un'unità drone avanzata. Scava automaticamente, raccoglie oggetti e ripara blocchi. Significativamente più efficace del drone di partenza. unit.dagger.description = Un unità terrena base, molto più efficiente se in branco. unit.crawler.description = Un'unità di terra costituita da un telaio essenziale con potenti esplosivi legati sulla parte superiore. Non particolarmente resistente. Esplode a contatto con i nemici. @@ -1063,12 +1122,12 @@ block.power-source.description = Produce energia infinita, esiste solo nella mod block.item-source.description = Produce oggetti infiniti, esiste solo nella modalità creativa. block.item-void.description = Elimina gli oggetti che vi entrano senza bisogno di energia, esiste solo nella modalità creativa. block.liquid-source.description = Emette continuamente liquidi. Esiste solo nella modalità creativa. -block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il nucleo e le torrette nelle prime ondate. -block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il nucleo e le torrette nelle prime ondate. \nOccupa più blocchi +block.copper-wall.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. +block.copper-wall-large.description = Un blocco difensivo economico.\nUtile per proteggere il Nucleo e le torrette nelle prime ondate. \nOccupa più tessere. block.titanium-wall.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. block.titanium-wall-large.description = Un blocco difensivo moderatamente forte.\nFornisce una protezione moderata dai nemici. \nOccupa più blocchi -block.plastanium-wall.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections. -block.plastanium-wall-large.description = A special type of wall that absorbs electric arcs and blocks automatic power node connections.\nSpans multiple tiles. +block.plastanium-wall.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche del nodo d'energia. +block.plastanium-wall-large.description = Un tipo speciale di muro che assorbe gli archi elettrici e blocca le connessioni automatiche dei nodi d'energia.\nSi estende su più blocchi. block.thorium-wall.description = Un forte blocco difensivo.\nBuona protezione dai nemici. block.thorium-wall-large.description = Un forte blocco difensivo.\nBuona protezione dai nemici.\nOccupa più blocchi block.phase-wall.description = Non è forte come un muro di torio, ma devia i proiettili a meno che non siano troppo potenti. @@ -1088,7 +1147,7 @@ block.junction.description = Permette di incrociare nastri che trasportano mater block.bridge-conveyor.description = Consente il trasporto di oggetti fino a 3 tessere ad un altro nastro sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. block.phase-conveyor.description = Nastro avanzato. Consuma energia per teletrasportare gli oggetti su un altro nastro di fase collegato. block.sorter.description = Divide gli oggetti. Se l'oggetto corrisponde a quello selezionato, Può passare. Altrimenti viene espulso sui lati. -block.inverted-sorter.description = Processes items like a standard sorter, but outputs selected items to the sides instead. +block.inverted-sorter.description = Elabora gli oggetti come uno smistatore standard, ma in uscita dà gli elementi selezionati ai lati. block.router.description = Accetta gli elementi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Utile per suddividere i materiali da una fonte a più destinazioni. block.distributor.description = Un distributore avanzato che divide gli oggetti in altre 7 direzioni allo stesso modo. block.overflow-gate.description = Una combinazione di un incrocio e di un distributore , che distribuisce sui suoi lati se in nastro difronte si satura. @@ -1096,13 +1155,13 @@ block.mass-driver.description = Ultimo blocco di trasporto di oggetti. Raccoglie block.mechanical-pump.description = Una pompa economica con potenza lenta, ma nessun consumo di energia. block.rotary-pump.description = Una pompa avanzata che raddoppia la velocità consumando energia. block.thermal-pump.description = La pompa migliore. Tre volte più veloce di una pompa meccanica e l'unica pompa in grado di recuperare la lava. -block.conduit.description = Condotta di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altre condotte. -block.pulse-conduit.description = Condotta avanzata. Trasporta più liquido e più velocemente delle condotte standard. +block.conduit.description = Condotto di base. Funziona come un nastro trasportatore, ma per i liquidi. Ideale per estrattori, pompe o altri condotti. +block.pulse-conduit.description = Condotto avanzato. Trasporta più liquido e più velocemente dei condotti standard. block.liquid-router.description = Accetta i liquidi da una direzione e li emette fino a 3 altre direzioni allo stesso modo. Può anche immagazzinare una certa quantità di liquido. Utile per suddividere i liquidi da una fonte verso più destinazioni. block.liquid-tank.description = Conserva una grande quantità di liquidi. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali o come protezione per il raffreddamento di blocchi vitali. -block.liquid-junction.description = Permette di incrociare condotte che trasportano liquidi diversi in posizioni diverse. -block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altra condotta sopraelevata.\nPuò passare sopra ad altri blocchi od edifici. -block.phase-conduit.description = Condotta avanzata. Consuma energia per teletrasportare i liquidi in un altra condotta di fase collegata. +block.liquid-junction.description = Permette di incrociare condotti che trasportano liquidi diversi in posizioni diverse. +block.bridge-conduit.description = Consente il trasporto di liquidi fino a 3 tessere da un altro condotto sopraelevato.\nPuò passare sopra ad altri blocchi od edifici. +block.phase-conduit.description = Condotto avanzato. Consuma energia per teletrasportare i liquidi in un altro condotto di fase collegato. block.power-node.description = Trasmette energia tra i nodi collegati. È possibile creare fino a quattro collegamenti.\nClicca sul nodo per configurare i collegamenti. block.power-node-large.description = Ha un raggio maggiore rispetto al nodo energetico e si possono creare un massimo di sei collegamenti.\nClicca sul nodo per configurare i collegamenti. block.surge-tower.description = Un nodo di alimentazione a lungo raggio solo due connessioni disponibili.\nClicca sul nodo per configurare i collegamenti. @@ -1124,13 +1183,13 @@ block.blast-drill.description = La trivella migliore. Richiede grandi quantità block.water-extractor.description = Estrae l'acqua dal terreno. Usalo quando non c'è nessun lago nelle vicinanze. block.cultivator.description = Coltiva il terreno con acqua per ottenere materia organica. block.oil-extractor.description = Utilizza grandi quantità di energia per estrarre petrolio dalla sabbia. Usalo quando non c'è una fonte diretta di petrolio nelle vicinanze. -block.core-shard.description = La prima iterazione del nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. -block.core-foundation.description = La seconda versione del nucleo. Meglio corazzato. Immagazzina più risorse. -block.core-nucleus.description = La terza ed ultima versione del nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. +block.core-shard.description = La prima iterazione del Nucleo. Una volta distrutto, tutti i contatti con la regione vengono persi. Non lasciare che questo accada. +block.core-foundation.description = La seconda versione del Nucleo. Meglio corazzato. Immagazzina più risorse. +block.core-nucleus.description = La terza ed ultima versione del Nucleo. Estremamente ben corazzato. Immagazzina enormi quantità di risorse. block.vault.description = Immagazzina una grande quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal deposito. block.container.description = Immagazzina una piccola quantità di oggetti. Usalo per creare zone cuscinetto quando c'è una domanda non costante di materiali. Uno [LIGHT_GRAY]scaricatore[] può essere utilizzato per recuperare elementi dal contenitore. -block.unloader.description = Scarica gli oggetti da un contenitore, caveau o nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. -block.launch-pad.description = Lancia oggetti nel tuo nucleo senza necessità di un lasciare la zona. +block.unloader.description = Scarica gli oggetti da un contenitore, caveau o Nucleo su un trasportatore o direttamente in un blocco adiacente. L'oggetto da scaricare può essere scelto toccando lo scaricatore. +block.launch-pad.description = Lancia oggetti nel tuo Nucleo senza necessità di un lasciare la zona. block.launch-pad-large.description = Una versione migliore dell'Ascensore Spaziale, immagazzina più oggetti. Lancia oggetti più frequentemente. block.duo.description = Una torretta piccola ed economica. block.scatter.description = Una torretta antiaerea di medie dimensioni. Spara schegge di piombo o frammenti di rottami sulle unità nemiche. @@ -1146,7 +1205,7 @@ block.ripple.description = Una grande torretta di artiglieria che spara più col block.cyclone.description = Una grande torretta a fuoco rapido. block.spectre.description = Una grande torretta che spara due potenti proiettili contemporaneamente. block.meltdown.description = Una grande torretta che spara un potente laser a lungo raggio. -block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del nucleo nemico o la ritirata verso il proprio nucleo o fabbrica.\nQuando non è presente un nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco. +block.command-center.description = Da istruzioni alle unità alleate nella mappa. Comanda la ricongizione, l'attacco del Nucleo nemico o la ritirata verso il proprio Nucleo o fabbrica.\nQuando non è presente un Nucleo nemico, le unità pattuglieranno anche se viene ordinato un attacco. block.draug-factory.description = Produce droni per la raccolta mineraria. block.spirit-factory.description = Produce droni che riparano blocchi. block.phantom-factory.description = Produce droni avanzati che seguono il giocatore e lo assistono nella costruzione. From b3e14360743fafbb099b5095bf01feb33a7a53a8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 10:09:29 -0500 Subject: [PATCH 040/107] Fixed #1176 --- .../io/anuke/mindustry/world/blocks/power/PowerNode.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index b2d914ce3f..4cb97d6bba 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -108,7 +108,7 @@ public class PowerNode extends PowerBlock{ && !other.entity.proximity().contains(tile) && other.entity.power.graph != tile.entity.power.graph; tempTiles.clear(); - Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { + Geometry.circle(tile.x, tile.y, (int)(laserRange + 2), (x, y) -> { Tile other = world.ltile(x, y); if(valid.get(other)){ if(!insulated(tile, other)){ @@ -139,7 +139,7 @@ public class PowerNode extends PowerBlock{ tempTiles.clear(); graphs.clear(); - Geometry.circle(tile.x, tile.y, (int)(laserRange + 1), (x, y) -> { + Geometry.circle(tile.x, tile.y, (int)(laserRange + 2), (x, y) -> { Tile other = world.ltile(x, y); if(valid.get(other) && !tempTiles.contains(other)){ tempTiles.add(other); @@ -220,8 +220,8 @@ public class PowerNode extends PowerBlock{ Lines.stroke(1.5f); - for(int x = (int)(tile.x - laserRange - 1); x <= tile.x + laserRange + 1; x++){ - for(int y = (int)(tile.y - laserRange - 1); y <= tile.y + laserRange + 1; y++){ + for(int x = (int)(tile.x - laserRange - 2); x <= tile.x + laserRange + 2; x++){ + for(int y = (int)(tile.y - laserRange - 2); y <= tile.y + laserRange + 2; y++){ Tile link = world.ltile(x, y); if(link != tile && linkValid(tile, link, false)){ From 07fb5aa88ef5a25154109839d76f12ea492cc4b1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 10:27:06 -0500 Subject: [PATCH 041/107] Bugfixes --- core/src/io/anuke/mindustry/maps/Maps.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index a966edf9e2..d54555ddd0 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -84,7 +84,16 @@ public class Maps{ maps.sort(); }); - Events.on(ContentReloadEvent.class, event -> reload()); + Events.on(ContentReloadEvent.class, event -> { + reload(); + for(Map map : maps){ + try{ + map.texture = map.previewFile().exists() ? new Texture(map.previewFile()) : new Texture(MapIO.generatePreview(map)); + }catch(Exception e){ + e.printStackTrace(); + } + } + }); if(Core.assets != null){ ((CustomLoader)Core.assets.getLoader(Content.class)).loaded = this::createAllPreviews; From 9f4d44f0f337db0f6a222fdcc00226037847bac7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 11:00:59 -0500 Subject: [PATCH 042/107] Cleanup / Added server support for scripting --- .../io/anuke/mindustry/ctype/UnlockableContent.java | 5 ----- core/src/io/anuke/mindustry/mod/Mods.java | 4 ++-- core/src/io/anuke/mindustry/mod/Scripts.java | 4 ++-- core/src/io/anuke/mindustry/type/Item.java | 10 ++-------- core/src/io/anuke/mindustry/type/Liquid.java | 10 ++-------- core/src/io/anuke/mindustry/type/Mech.java | 6 +----- core/src/io/anuke/mindustry/type/UnitType.java | 5 ----- core/src/io/anuke/mindustry/type/Zone.java | 5 ----- core/src/io/anuke/mindustry/ui/ContentDisplay.java | 8 ++++---- core/src/io/anuke/mindustry/ui/ItemDisplay.java | 2 +- core/src/io/anuke/mindustry/ui/ItemsDisplay.java | 2 +- core/src/io/anuke/mindustry/ui/LiquidDisplay.java | 2 +- .../io/anuke/mindustry/ui/dialogs/DatabaseDialog.java | 2 +- .../io/anuke/mindustry/ui/dialogs/DeployDialog.java | 4 ++-- .../io/anuke/mindustry/ui/dialogs/TechTreeDialog.java | 2 +- .../io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java | 2 +- core/src/io/anuke/mindustry/world/Block.java | 7 +------ core/src/io/anuke/mindustry/world/blocks/OreBlock.java | 6 +++--- .../anuke/mindustry/world/blocks/production/Drill.java | 2 +- .../mindustry/world/meta/values/AmmoListValue.java | 2 +- .../mindustry/world/meta/values/BoosterListValue.java | 2 +- .../src/io/anuke/mindustry/server/ServerControl.java | 4 ++++ 22 files changed, 32 insertions(+), 64 deletions(-) diff --git a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java index 7082b4a431..ab1e4d9e4b 100644 --- a/core/src/io/anuke/mindustry/ctype/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/ctype/UnlockableContent.java @@ -42,11 +42,6 @@ public abstract class UnlockableContent extends MappableContent{ return cicons[icon.ordinal()]; } - /** Returns the localized name of this content. */ - public abstract String localizedName(); - - //public abstract TextureRegion getContentIcon(); - /** This should show all necessary info about this content in the specified table. */ public abstract void displayInfo(Table table); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 974be2f634..bdcd7ca800 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -392,7 +392,7 @@ public class Mods implements Loadable{ if(mod.root.child("scripts").exists()){ content.setCurrentMod(mod); mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); - Log.info("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); + Log.debug("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); for(FileHandle file : mod.scripts){ try{ @@ -415,7 +415,7 @@ public class Mods implements Loadable{ content.setCurrentMod(null); } - Log.info("Time to initialize modded scripts: {0}", Time.elapsed()); + Log.debug("Time to initialize modded scripts: {0}", Time.elapsed()); } /** Creates all the content found in mod files. */ diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 84fdc4e5d3..664c1e54ff 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -26,7 +26,7 @@ public class Scripts implements Disposable{ wrapper = Core.files.internal("scripts/wrapper.js").readString(); run(Core.files.internal("scripts/global.js").readString(), "global.js"); - Log.info("Time to load script engine: {0}", Time.elapsed()); + Log.debug("Time to load script engine: {0}", Time.elapsed()); } public String runConsole(String text){ @@ -52,7 +52,7 @@ public class Scripts implements Disposable{ public void log(String source, String message){ Log.info("[{0}]: {1}", source, message); logBuffer.add("[accent][" + source + "]:[] " + message); - if(!headless & ui.scriptfrag != null){ + if(!headless && ui.scriptfrag != null){ onLoad(); } } diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 86951ab093..597eb468b5 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -1,10 +1,9 @@ package io.anuke.mindustry.type; -import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; @@ -50,14 +49,9 @@ public class Item extends UnlockableContent{ ContentDisplay.displayItem(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("item." + this.name + ".name"); - } - @Override public String toString(){ - return localizedName(); + return localizedName; } @Override diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index 63839c479c..8ed87e7941 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -1,11 +1,10 @@ package io.anuke.mindustry.type; -import io.anuke.arc.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.ui.*; public class Liquid extends UnlockableContent{ @@ -51,14 +50,9 @@ public class Liquid extends UnlockableContent{ ContentDisplay.displayLiquid(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("liquid." + this.name + ".name"); - } - @Override public String toString(){ - return localizedName(); + return localizedName; } @Override diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index a9419a116b..7a5de5ae2d 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -45,10 +45,6 @@ public class Mech extends UnlockableContent{ this(name, false); } - public String localizedName(){ - return Core.bundle.get("mech." + name + ".name"); - } - public void updateAlt(Player player){ } @@ -112,6 +108,6 @@ public class Mech extends UnlockableContent{ @Override public String toString(){ - return localizedName(); + return localizedName; } } diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index ddcaa4f36f..c559177139 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -64,11 +64,6 @@ public class UnitType extends UnlockableContent{ ContentDisplay.displayUnit(table, this); } - @Override - public String localizedName(){ - return Core.bundle.get("unit." + name + ".name"); - } - @Override public void load(){ weapon.load(); diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index e0084f0b73..c60249b223 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -205,11 +205,6 @@ public class Zone extends UnlockableContent{ public void displayInfo(Table table){ } - @Override - public String localizedName(){ - return Core.bundle.get("zone." + name + ".name"); - } - @Override public ContentType getContentType(){ return ContentType.zone; diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index e086e4e616..36f100d6a3 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -66,7 +66,7 @@ public class ContentDisplay{ table.table(title -> { title.addImage(item.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + item.localizedName()).padLeft(5); + title.add("[accent]" + item.localizedName).padLeft(5); }); table.row(); @@ -100,7 +100,7 @@ public class ContentDisplay{ table.table(title -> { title.addImage(liquid.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + liquid.localizedName()).padLeft(5); + title.add("[accent]" + liquid.localizedName).padLeft(5); }); table.row(); @@ -134,7 +134,7 @@ public class ContentDisplay{ public static void displayMech(Table table, Mech mech){ table.table(title -> { title.addImage(mech.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + mech.localizedName()).padLeft(5); + title.add("[accent]" + mech.localizedName).padLeft(5); }); table.left().defaults().left(); @@ -182,7 +182,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { title.addImage(unit.icon(Cicon.xlarge)).size(8 * 6); - title.add("[accent]" + unit.localizedName()).padLeft(5); + title.add("[accent]" + unit.localizedName).padLeft(5); }); table.row(); diff --git a/core/src/io/anuke/mindustry/ui/ItemDisplay.java b/core/src/io/anuke/mindustry/ui/ItemDisplay.java index 1efcd10919..a55a5034c5 100644 --- a/core/src/io/anuke/mindustry/ui/ItemDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemDisplay.java @@ -15,7 +15,7 @@ public class ItemDisplay extends Table{ public ItemDisplay(Item item, int amount, boolean showName){ add(new ItemImage(new ItemStack(item, amount))).size(8 * 4).padRight(amount > 99 ? 12 : 0); - if(showName) add(item.localizedName()).padLeft(4 + amount > 99 ? 4 : 0); + if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); this.item = item; this.amount = amount; diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java index f10b17e3eb..e198673c08 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java @@ -29,7 +29,7 @@ public class ItemsDisplay extends Table{ if(item.type == ItemType.material && data.isUnlocked(item)){ t.label(() -> format(item)).left(); t.addImage(item.icon(Cicon.small)).size(8 * 3).padLeft(4).padRight(4); - t.add(item.localizedName()).color(Color.lightGray).left(); + t.add(item.localizedName).color(Color.lightGray).left(); t.row(); } } diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java index be4d22b124..741491d9b9 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -33,6 +33,6 @@ public class LiquidDisplay extends Table{ add(StatUnit.perSecond.localized()).padLeft(2).padRight(5).color(Color.lightGray); } - add(liquid.localizedName()); + add(liquid.localizedName); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index faa3f6f39a..65adb85efa 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -66,7 +66,7 @@ public class DatabaseDialog extends FloatingDialog{ if(unlocked(unlock)){ image.clicked(() -> Vars.ui.content.show(unlock)); - image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName()))); + image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName))); } if((++count) % maxWidth == 0){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 056d0cfc24..a84ff1a73c 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -155,7 +155,7 @@ public class DeployDialog extends FloatingDialog{ }).color(Color.darkGray).grow())); } - TextButton button = Elements.newButton(Core.bundle.format("resume", slot.getZone().localizedName()), Styles.squaret, () -> { + TextButton button = Elements.newButton(Core.bundle.format("resume", slot.getZone().localizedName), Styles.squaret, () -> { control.saves.getZoneSlot().cautiousLoad(() -> { hide(); ui.loadAnd(() -> { @@ -232,7 +232,7 @@ public class DeployDialog extends FloatingDialog{ }); if(zone.unlocked() && !hidden(zone)){ - button.labelWrap(zone.localizedName()).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center); + button.labelWrap(zone.localizedName).style(Styles.outlineLabel).width(140).growX().get().setAlignment(Align.center); }else{ Cons flasher = zone.canUnlock() && !hidden(zone) ? e -> e.update(() -> e.getColor().set(Color.white).lerp(Pal.accent, Mathf.absin(3f, 1f))) : e -> {}; flasher.get(button.addImage(Icon.locked).get()); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index a9b8282a36..7a60ad2724 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -337,7 +337,7 @@ public class TechTreeDialog extends FloatingDialog{ t.table(list -> { list.left(); list.addImage(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); - list.add(req.item.localizedName()).color(Color.lightGray); + list.add(req.item.localizedName).color(Color.lightGray); list.label(() -> " " + Math.min(data.getItem(req.item), req.amount) + " / " + req.amount) .update(l -> l.setColor(data.has(req.item, req.amount) ? Color.lightGray : Color.scarlet)); }).fillX().left(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 32d2e264f1..1bf34b0855 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -96,7 +96,7 @@ public class ZoneInfoDialog extends FloatingDialog{ }).growX(); }else{ - cont.add(zone.localizedName()).color(Pal.accent).growX().center(); + cont.add(zone.localizedName).color(Pal.accent).growX().center(); cont.row(); cont.addImage().color(Pal.accent).height(3).pad(6).growX(); cont.row(); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index f9dcd9c779..6e001d38b5 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -395,11 +395,6 @@ public class Block extends BlockStorage{ return sum / size / size; } - @Override - public String localizedName(){ - return localizedName; - } - @Override public void displayInfo(Table table){ ContentDisplay.displayBlock(table, this); @@ -552,7 +547,7 @@ public class Block extends BlockStorage{ }else{ current = entity -> entity.liquids.current(); } - bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName(), + bars.add("liquid", entity -> new Bar(() -> entity.liquids.get(current.get(entity)) <= 0.001f ? Core.bundle.get("bar.liquid") : current.get(entity).localizedName, () -> current.get(entity).barColor(), () -> entity.liquids.get(current.get(entity)) / liquidCapacity)); } diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index ba74f2db0f..7270ec7aa0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -16,7 +16,7 @@ public class OreBlock extends OverlayFloor{ public OreBlock(Item ore){ super("ore-" + ore.name); - this.localizedName = ore.localizedName(); + this.localizedName = ore.localizedName; this.itemDrop = ore; this.variants = 3; this.color.set(ore.color); @@ -29,7 +29,7 @@ public class OreBlock extends OverlayFloor{ } public void setup(Item ore){ - this.localizedName = ore.localizedName(); + this.localizedName = ore.localizedName; this.itemDrop = ore; this.color.set(ore.color); } @@ -80,6 +80,6 @@ public class OreBlock extends OverlayFloor{ @Override public String getDisplayName(Tile tile){ - return itemDrop.localizedName(); + return itemDrop.localizedName; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index c4ee18715a..14788104d9 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -191,7 +191,7 @@ public class Drill extends Block{ Item item = list.get(i); table.addImage(Core.atlas.find(item.name + "1")).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); - table.add(item.localizedName()); + table.add(item.localizedName); if(i != list.size - 1){ table.add("/").padLeft(5).padRight(5); } diff --git a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java index c531fabe45..c19503c5d1 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -29,7 +29,7 @@ public class AmmoListValue implements StatValue{ for(T t : map.keys()){ BulletType type = map.get(t); table.addImage(icon(t)).size(3 * 8).padRight(4).right().top(); - table.add(t.localizedName()).padRight(10).left().top(); + table.add(t.localizedName).padRight(10).left().top(); table.table(Tex.underline, bt -> { bt.left().defaults().padRight(3).left(); diff --git a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java index 4d1a867904..30c1ff0765 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/BoosterListValue.java @@ -33,7 +33,7 @@ public class BoosterListValue implements StatValue{ if(!filter.get(liquid)) continue; c.addImage(liquid.icon(Cicon.medium)).size(3 * 8).padRight(4).right().top(); - c.add(liquid.localizedName()).padRight(10).left().top(); + c.add(liquid.localizedName).padRight(10).left().top(); c.table(Tex.underline, bt -> { bt.left().defaults().padRight(3).left(); diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index f8f03f526e..ba5722e843 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -357,6 +357,10 @@ public class ServerControl implements ApplicationListener{ } }); + handler.register("js", "", "Run arbitrary Javascript.", arg -> { + info("&lc" + mods.getScripts().runConsole(arg[0])); + }); + handler.register("say", "", "Send a message to all players.", arg -> { if(!state.is(State.playing)){ err("Not hosting. Host a game first."); From 6588fc6581c4830ce6ddc0e862f06a222db66fc8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 13:14:47 -0500 Subject: [PATCH 043/107] Removed pointless base object --- core/assets/scripts/base.js | 4 +--- core/assets/scripts/global.js | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index 492e7392e5..fd92b48f74 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -8,6 +8,4 @@ const extendContent = function(classType, name, params){ const extend = function(classType, params){ return new JavaAdapter(classType, params) -} - -const base = {} \ No newline at end of file +} \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 43d0b5826c..c23b01a8aa 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -11,8 +11,6 @@ const extendContent = function(classType, name, params){ const extend = function(classType, params){ return new JavaAdapter(classType, params) } - -const base = {} importPackage(Packages.io.anuke.arc) importPackage(Packages.io.anuke.arc.collection) importPackage(Packages.io.anuke.arc.graphics) From 803719b216ebc9b30f1350dcfd9cb8481d3abb5a Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 13:44:27 -0500 Subject: [PATCH 044/107] Added mod displayName property [for color tags, etc] --- core/src/io/anuke/mindustry/Vars.java | 2 + core/src/io/anuke/mindustry/mod/Mods.java | 6 ++- .../mindustry/ui/dialogs/MapsDialog.java | 2 +- .../mindustry/ui/dialogs/ModsDialog.java | 2 +- .../ui/dialogs/SchematicsDialog.java | 2 +- .../ui/fragments/ScriptConsoleFragment.java | 4 +- .../mindustry/server/MindustryServer.java | 49 ------------------- .../anuke/mindustry/server/ServerControl.java | 5 +- .../mindustry/server/ServerLauncher.java | 42 ++++++++++++++-- .../mindustry/tools/ScriptStubGenerator.java | 1 - 10 files changed, 54 insertions(+), 61 deletions(-) delete mode 100644 server/src/io/anuke/mindustry/server/MindustryServer.java diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 089fd0dc49..20c73ad3dd 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -118,6 +118,8 @@ public class Vars implements Loadable{ public static boolean headless; /** whether steam is enabled for this game */ public static boolean steam; + /** whether typing into the console is enabled - developers only */ + public static boolean enableConsole = false; /** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */ public static FileHandle dataDirectory; /** data subdirectory used for screenshots */ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index bdcd7ca800..55419079d2 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -738,10 +738,14 @@ public class Mods implements Loadable{ /** Plugin metadata information.*/ public static class ModMeta{ - public String name, author, description, version, main, minGameVersion; + public String name, displayName, author, description, version, main, minGameVersion; public Array dependencies = Array.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; + + public String displayName(){ + return displayName == null ? name : displayName; + } } /** Thrown when an error occurs while loading a mod.*/ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index 0ae118d5d2..4fd821d051 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -143,7 +143,7 @@ public class MapsDialog extends FloatingDialog{ button.row(); button.stack(new Image(map.safeTexture()).setScaling(Scaling.fit), new BorderImage(map.safeTexture()).setScaling(Scaling.fit)).size(mapsize - 20f); button.row(); - button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.name : "$builtin").color(Color.gray).padTop(3); + button.add(map.custom ? "$custom" : map.workshop ? "$workshop" : map.mod != null ? "[lightgray]" + map.mod.meta.displayName() : "$builtin").color(Color.gray).padTop(3); i++; } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index ed8b3c5670..efbb02693a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -126,7 +126,7 @@ public class ModsDialog extends FloatingDialog{ t.margin(14f).left(); t.table(title -> { title.left(); - title.add("[accent]" + mod.meta.name + "[lightgray] v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")).width(200f).wrap(); + title.add("[accent]" + mod.meta.displayName() + "[lightgray] v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")).width(200f).wrap(); title.add().growX(); title.addImageTextButton(mod.enabled() ? "$mod.disable" : "$mod.enable", mod.enabled() ? Icon.arrowDownSmall : Icon.arrowUpSmall, Styles.cleart, () -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java index 7a98c9cfa7..4e10a46160 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SchematicsDialog.java @@ -100,7 +100,7 @@ public class SchematicsDialog extends FloatingDialog{ }else{ buttons.addImageButton(Icon.trash16Small, style, () -> { if(s.mod != null){ - ui.showInfo(Core.bundle.format("mod.item.remove", s.mod.meta.name)); + ui.showInfo(Core.bundle.format("mod.item.remove", s.mod.meta.displayName())); }else{ ui.showConfirm("$confirm", "$schematic.delete.confirm", () -> { schematics.remove(s); diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java index 458bae6c2c..61b7cb4780 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -47,7 +47,7 @@ public class ScriptConsoleFragment extends Table{ visible(() -> { if(input.keyTap(Binding.console) && !Vars.net.client() && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ shown = !shown; - if(shown && !open){ + if(shown && !open && enableConsole){ toggle(); } clearChatInput(); @@ -57,7 +57,7 @@ public class ScriptConsoleFragment extends Table{ }); update(() -> { - if(input.keyTap(Binding.chat) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + if(input.keyTap(Binding.chat) && enableConsole && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ toggle(); } diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java deleted file mode 100644 index ca6077fd9e..0000000000 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ /dev/null @@ -1,49 +0,0 @@ -package io.anuke.mindustry.server; - -import io.anuke.arc.*; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; -import io.anuke.mindustry.core.*; -import io.anuke.mindustry.mod.*; - -import static io.anuke.mindustry.Vars.*; - -public class MindustryServer implements ApplicationListener{ - private String[] args; - - public MindustryServer(String[] args){ - this.args = args; - } - - @Override - public void init(){ - Core.settings.setDataDirectory(Core.files.local("config")); - loadLocales = false; - headless = true; - - FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); - if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ - Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); - plugins.sibling("mods").mkdirs(); - for(FileHandle file : plugins.list()){ - file.copyTo(plugins.sibling("mods")); - } - } - - Vars.loadSettings(); - Vars.init(); - content.createBaseContent(); - mods.loadScripts(); - content.createModContent(); - content.init(); - - Core.app.addListener(logic = new Logic()); - Core.app.addListener(netServer = new NetServer()); - Core.app.addListener(new ServerControl(args)); - - mods.each(Mod::init); - } - - -} diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index ba5722e843..0f3df8f1ef 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -336,7 +336,7 @@ public class ServerControl implements ApplicationListener{ if(!mods.all().isEmpty()){ info("Mods:"); for(LoadedMod mod : mods.all()){ - info(" &ly{0} &lcv{1}", mod.meta.name, mod.meta.version); + info(" &ly{0} &lcv{1}", mod.meta.displayName(), mod.meta.version); } }else{ info("No mods found."); @@ -347,7 +347,8 @@ public class ServerControl implements ApplicationListener{ handler.register("mod", "", "Display information about a loaded plugin.", arg -> { LoadedMod mod = mods.all().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); if(mod != null){ - info("Name: &ly{0}", mod.meta.name); + info("Name: &ly{0}", mod.meta.displayName()); + info("Internal Name: &ly{0}", mod.name); info("Version: &ly{0}", mod.meta.version); info("Author: &ly{0}", mod.meta.author); info("Path: &ly{0}", mod.file.path()); diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index fcf6a52077..16b2dc6e2e 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -1,22 +1,58 @@ package io.anuke.mindustry.server; +import io.anuke.arc.*; import io.anuke.arc.backends.headless.*; +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; -import static io.anuke.mindustry.Vars.platform; +import static io.anuke.mindustry.Vars.*; -public class ServerLauncher{ +public class ServerLauncher implements ApplicationListener{ + static String[] args; public static void main(String[] args){ try{ + ServerLauncher.args = args; Vars.platform = new Platform(){}; Vars.net = new Net(platform.getNet()); - new HeadlessApplication(new MindustryServer(args), null, throwable -> CrashSender.send(throwable, f -> {})); + new HeadlessApplication(new ServerLauncher(), null, throwable -> CrashSender.send(throwable, f -> {})); }catch(Throwable t){ CrashSender.send(t, f -> {}); } } + + @Override + public void init(){ + Core.settings.setDataDirectory(Core.files.local("config")); + loadLocales = false; + headless = true; + + FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); + if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ + Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); + plugins.sibling("mods").mkdirs(); + for(FileHandle file : plugins.list()){ + file.copyTo(plugins.sibling("mods")); + } + } + + Vars.loadSettings(); + Vars.init(); + content.createBaseContent(); + mods.loadScripts(); + content.createModContent(); + content.init(); + + Core.app.addListener(logic = new Logic()); + Core.app.addListener(netServer = new NetServer()); + Core.app.addListener(new ServerControl(args)); + + mods.each(Mod::init); + } } \ No newline at end of file diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 17cd3fb5df..6914d09636 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -25,7 +25,6 @@ public class ScriptStubGenerator{ Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class); Array nopackage = Array.with("io.anuke.arc.func", "java.lang", "java"); - Array imported = Array.with("io.anuke.mindustry.type", "io.anuke.mindustry.world"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + From 9f29898713b3f29d97a7048c1c536eaa40fb2b31 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 15:17:14 -0500 Subject: [PATCH 045/107] Better console / Better logging --- .../io/anuke/mindustry/ClientLauncher.java | 2 +- core/src/io/anuke/mindustry/Vars.java | 30 ++++++++- .../anuke/mindustry/core/ContentLoader.java | 8 +-- .../io/anuke/mindustry/mod/ContentParser.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 8 +-- core/src/io/anuke/mindustry/mod/Scripts.java | 20 ++---- .../ui/fragments/ScriptConsoleFragment.java | 9 +-- .../mindustry/desktop/DesktopLauncher.java | 64 +------------------ gradle.properties | 2 +- .../anuke/mindustry/server/ServerControl.java | 48 ++++---------- .../mindustry/server/ServerLauncher.java | 9 +++ 11 files changed, 71 insertions(+), 131 deletions(-) diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 1c8fd4048f..08363a67be 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -32,8 +32,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform @Override public void setup(){ + Vars.loadLogger(); Vars.platform = this; - Log.setUseColors(false); beginTime = Time.millis(); Time.setDeltaProvider(() -> { diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 20c73ad3dd..8d9f04d045 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -15,6 +15,7 @@ import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.maps.*; @@ -25,12 +26,14 @@ import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import java.nio.charset.*; import java.util.*; -import static io.anuke.arc.Core.*; +import static io.anuke.arc.Core.settings; @SuppressWarnings("unchecked") public class Vars implements Loadable{ /** Whether to load locales.*/ public static boolean loadLocales = true; + /** Whether the logger is loaded. */ + public static boolean loadedLogger = false; /** Maximum schematic size.*/ public static final int maxSchematicSize = 32; /** All schematic base64 starts with this string.*/ @@ -270,6 +273,31 @@ public class Vars implements Loadable{ maps.load(); } + public static void loadLogger(){ + if(loadedLogger) return; + + String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""}; + String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + + Array logBuffer = new Array<>(); + Log.setLogger((level, text, args) -> { + String result = Log.format(text, args); + System.out.println(Log.format(stags[level.ordinal()] + "&fr " + text, args)); + + result = tags[level.ordinal()] + " " + result; + + if(!headless && (ui == null || ui.scriptfrag == null)){ + logBuffer.add(result); + }else if(!headless){ + ui.scriptfrag.addMessage(result); + } + }); + + Events.on(ClientLoadEvent.class, e -> logBuffer.each(ui.scriptfrag::addMessage)); + + loadedLogger = true; + } + public static void loadSettings(){ Core.settings.setAppName(appName); diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index ab6c44b5b4..a744b032e1 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -87,12 +87,12 @@ public class ContentLoader{ } } - Log.info("--- CONTENT INFO ---"); + Log.debug("--- CONTENT INFO ---"); for(int k = 0; k < contentMap.length; k++){ - Log.info("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); + Log.debug("[{0}]: loaded {1}", ContentType.values()[k].name(), contentMap[k].size); } - Log.info("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); - Log.info("-------------------"); + Log.debug("Total content loaded: {0}", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); + Log.debug("-------------------"); } /** Calls Content#init() on everything. Use only after all modules have been created.*/ diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 3ca887279d..e2b1970b46 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -483,7 +483,7 @@ public class ContentParser{ FieldMetadata metadata = fields.get(child.name().replace(" ", "_")); if(metadata == null){ if(ignoreUnknownFields){ - Log.err("{0}: Ignoring unknown field: " + child.name + " (" + type.getName() + ")", object); + Log.warn("{0}: Ignoring unknown field: " + child.name + " (" + type.getName() + ")", object); continue; }else{ SerializationException ex = new SerializationException("Field not found: " + child.name + " (" + type.getName() + ")"); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 55419079d2..bdc9d79027 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -101,7 +101,7 @@ public class Mods implements Loadable{ Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); packSprites(sprites, mod, true); packSprites(overrides, mod, false); - Log.info("Packed {0} images for mod '{1}'.", sprites.size + overrides.size, mod.meta.name); + Log.debug("Packed {0} images for mod '{1}'.", sprites.size + overrides.size, mod.meta.name); totalSprites += sprites.size + overrides.size; } @@ -112,7 +112,7 @@ public class Mods implements Loadable{ } } - Log.info("Time to pack textures: {0}", Time.elapsed()); + Log.debug("Time to pack textures: {0}", Time.elapsed()); } private void packSprites(Array sprites, LoadedMod mod, boolean prefix){ @@ -158,12 +158,12 @@ public class Mods implements Loadable{ Core.atlas = packer.flush(filter, new TextureAtlas()); Core.atlas.setErrorRegion("error"); - Log.info("Total pages: {0}", Core.atlas.getTextures().size); + Log.debug("Total pages: {0}", Core.atlas.getTextures().size); } packer.dispose(); packer = null; - Log.info("Time to update textures: {0}", Time.elapsed()); + Log.debug("Time to update textures: {0}", Time.elapsed()); } private PageType getPage(AtlasRegion region){ diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 664c1e54ff..9048200bc9 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -1,20 +1,17 @@ package io.anuke.mindustry.mod; import io.anuke.arc.*; -import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.Log.*; import io.anuke.mindustry.*; import io.anuke.mindustry.mod.Mods.*; import org.mozilla.javascript.*; -import static io.anuke.mindustry.Vars.*; - public class Scripts implements Disposable{ private final Context context; private final String wrapper; private Scriptable scope; - private Array logBuffer = new Array<>(); public Scripts(){ Time.mark(); @@ -50,18 +47,11 @@ public class Scripts implements Disposable{ } public void log(String source, String message){ - Log.info("[{0}]: {1}", source, message); - logBuffer.add("[accent][" + source + "]:[] " + message); - if(!headless && ui.scriptfrag != null){ - onLoad(); - } + log(LogLevel.info, source, message); } - public void onLoad(){ - if(!headless){ - logBuffer.each(ui.scriptfrag::addMessage); - } - logBuffer.clear(); + public void log(LogLevel level, String source, String message){ + Log.log(level, "[{0}]: {1}", source, message); } public void run(LoadedMod mod, FileHandle file){ @@ -72,7 +62,7 @@ public class Scripts implements Disposable{ try{ context.evaluateString(scope, script, file, 1, null); }catch(Throwable t){ - log(file, "[scarlet]" + getError(t)); + log(LogLevel.err, file, "" + getError(t)); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java index 61b7cb4780..32fdbb9394 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -19,7 +19,7 @@ import static io.anuke.arc.Core.*; import static io.anuke.mindustry.Vars.*; public class ScriptConsoleFragment extends Table{ - private final static int messagesShown = 14; + private final static int messagesShown = 30; private Array messages = new Array<>(); private boolean open = false, shown; private TextField chatfield; @@ -71,16 +71,13 @@ public class ScriptConsoleFragment extends Table{ historyPos--; updateChat(); } - scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); } + + scrollPos = (int)Mathf.clamp(scrollPos + input.axis(Binding.chat_scroll), 0, Math.max(0, messages.size - messagesShown)); }); history.insert(0, ""); setup(); - - if(mods.hasScripts()){ - app.post(() -> mods.getScripts().onLoad()); - } } public Fragment container(){ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index eb216b724e..40cb76fad8 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -9,13 +9,8 @@ import io.anuke.arc.backends.sdl.jni.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.func.*; -import io.anuke.arc.input.*; import io.anuke.arc.math.*; -import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.*; -import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; @@ -26,7 +21,6 @@ import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.*; import java.io.*; import java.net.*; @@ -49,6 +43,7 @@ public class DesktopLauncher extends ClientLauncher{ public static void main(String[] arg){ try{ + Vars.loadLogger(); new SdlApplication(new DesktopLauncher(arg), new SdlConfig(){{ title = "Mindustry"; maximized = true; @@ -64,7 +59,6 @@ public class DesktopLauncher extends ClientLauncher{ } public DesktopLauncher(String[] args){ - Log.setUseColors(false); Version.init(); boolean useSteam = Version.modifier.contains("steam"); testMobile = Array.with(args).contains("-testMobile"); @@ -91,50 +85,7 @@ public class DesktopLauncher extends ClientLauncher{ } } - StringBuilder base = new StringBuilder(); - Log.setLogger(new LogHandler(){ - @Override - public void print(String text, Object... args){ - String out = Log.format(text, false, args); - - base.append(out).append("\n"); - } - }); - Events.on(ClientLoadEvent.class, event -> { - Label[] label = {null}; - boolean[] visible = {false}; - Core.scene.table(t -> { - t.touchable(Touchable.disabled); - t.top().left(); - t.update(() -> { - if(Core.input.keyTap(KeyCode.BACKTICK) && (loadError || System.getProperty("user.name").equals("anuke") || Version.modifier.contains("beta"))){ - visible[0] = !visible[0]; - } - - t.toFront(); - }); - t.table(Styles.black3, f -> label[0] = f.add("").get()).visible(() -> visible[0]); - label[0].getText().append(base); - }); - - Log.setLogger(new LogHandler(){ - @Override - public void print(String text, Object... args){ - super.print(text, args); - String out = Log.format(text, false, args); - - int maxlen = 2048; - - if(label[0].getText().length() > maxlen){ - label[0].setText(label[0].getText().substring(label[0].getText().length() - maxlen)); - } - - label[0].getText().append(out).append("\n"); - label[0].invalidateHierarchy(); - } - }); - if(steamError != null){ Core.app.post(() -> Core.app.post(() -> Core.app.post(() -> { ui.showErrorMessage(Core.bundle.format("steam.error", (steamError.getMessage() == null) ? steamError.getClass().getSimpleName() : steamError.getClass().getSimpleName() + ": " + steamError.getMessage())); @@ -176,19 +127,6 @@ public class DesktopLauncher extends ClientLauncher{ } } - void fallbackSteam(){ - try{ - String name = "steam_api"; - if(OS.isMac || OS.isLinux) name = "lib" + name; - if(OS.isWindows && OS.is64Bit) name += "64"; - name += (OS.isLinux ? ".so" : OS.isMac ? ".dylib" : ".dll"); - Streams.copyStream(getClass().getResourceAsStream(name), new FileOutputStream(name)); - System.loadLibrary(new File(name).getAbsolutePath()); - }catch(Throwable e){ - logSteamError(e); - } - } - void initSteam(String[] args){ SVars.net = new SNet(new ArcNetImpl()); SVars.stats = new SStats(); diff --git a/gradle.properties b/gradle.properties index 5157fccbe2..98ed84057f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=6d310772fec1f69efeae2e487cab3bd64728ae05 +archash=338ffafbb964ba9d41d89adc4ca4f1c589b46248 diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index 0f3df8f1ef..a904af25a8 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -43,6 +43,9 @@ public class ServerControl implements ApplicationListener{ private static final int maxLogLength = 1024 * 512; private static final int commandSocketPort = 6859; + protected static String[] tags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; + protected static DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); + private final CommandHandler handler = new CommandHandler(""); private final FileHandle logFolder = Core.settings.getDataDirectory().child("logs/"); @@ -68,44 +71,19 @@ public class ServerControl implements ApplicationListener{ "globalrules", "{reactorExplosions: false}" ); - Log.setLogger(new LogHandler(){ - DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); + Log.setLogger((level, text, args1) -> { + String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1); + System.out.println(result); - @Override - public void debug(String text, Object... args){ - print("&lc&fb" + "[DEBG] " + text, args); + if(Core.settings.getBool("logging")){ + logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", false, args1)); } - @Override - public void info(String text, Object... args){ - print("&lg&fb" + "[INFO] " + text, args); - } - - @Override - public void err(String text, Object... args){ - print("&lr&fb" + "[ERR!] " + text, args); - } - - @Override - public void warn(String text, Object... args){ - print("&ly&fb" + "[WARN] " + text, args); - } - - @Override - public void print(String text, Object... args){ - String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(text + "&fr", args); - System.out.println(result); - - if(Core.settings.getBool("logging")){ - logToFile("[" + dateTime.format(LocalDateTime.now()) + "] " + format(text + "&fr", false, args)); - } - - if(socketOutput != null){ - try{ - socketOutput.println(format(text + "&fr", false, args).replace("[DEBG] ", "").replace("[WARN] ", "").replace("[INFO] ", "").replace("[ERR!] ", "")); - }catch(Throwable e){ - err("Error occurred logging to socket: {0}", e.getClass().getSimpleName()); - } + if(socketOutput != null){ + try{ + socketOutput.println(format(text + "&fr", false, args1)); + }catch(Throwable e){ + err("Error occurred logging to socket: {0}", e.getClass().getSimpleName()); } } }); diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index 16b2dc6e2e..549746fc83 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -11,7 +11,11 @@ import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; +import java.time.*; + +import static io.anuke.arc.util.Log.*; import static io.anuke.mindustry.Vars.*; +import static io.anuke.mindustry.server.ServerControl.*; public class ServerLauncher implements ApplicationListener{ static String[] args; @@ -21,6 +25,11 @@ public class ServerLauncher implements ApplicationListener{ ServerLauncher.args = args; Vars.platform = new Platform(){}; Vars.net = new Net(platform.getNet()); + + Log.setLogger((level, text, args1) -> { + String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr", args1); + System.out.println(result); + }); new HeadlessApplication(new ServerLauncher(), null, throwable -> CrashSender.send(throwable, f -> {})); }catch(Throwable t){ CrashSender.send(t, f -> {}); From a7d37b7e6c115ef74e5ef71c68c4eecaa95588b3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 15:59:48 -0500 Subject: [PATCH 046/107] Fixed tests --- gradle.properties | 2 +- tools/src/io/anuke/mindustry/tools/ImagePacker.java | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/gradle.properties b/gradle.properties index 98ed84057f..7f9aee7e15 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=338ffafbb964ba9d41d89adc4ca4f1c589b46248 +archash=b38d5e9c24d921f87f33bc48fcb65e245c1b1d0c diff --git a/tools/src/io/anuke/mindustry/tools/ImagePacker.java b/tools/src/io/anuke/mindustry/tools/ImagePacker.java index 76346817ab..b5a3787382 100644 --- a/tools/src/io/anuke/mindustry/tools/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/tools/ImagePacker.java @@ -5,8 +5,7 @@ import io.anuke.arc.collection.ObjectMap; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; import io.anuke.arc.util.*; -import io.anuke.arc.util.Log.LogHandler; -import io.anuke.arc.util.Log.NoopLogHandler; +import io.anuke.arc.util.Log.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.ContentLoader; @@ -25,7 +24,7 @@ public class ImagePacker{ Log.setLogger(new NoopLogHandler()); Vars.content = new ContentLoader(); Vars.content.createBaseContent(); - Log.setLogger(new LogHandler()); + Log.setLogger(new DefaultLogHandler()); Files.walk(Paths.get("../../../assets-raw/sprites_out")).forEach(path -> { try{ From 1aca3025184044b566a98954ad3063e56ba7884b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 18:34:23 -0500 Subject: [PATCH 047/107] Many changes to improve scripting --- core/assets/scripts/base.js | 6 +++- core/assets/scripts/global.js | 6 ++++ .../io/anuke/mindustry/content/Blocks.java | 8 ++--- core/src/io/anuke/mindustry/core/Logic.java | 2 +- .../io/anuke/mindustry/entities/Damage.java | 2 +- .../anuke/mindustry/entities/effect/Fire.java | 6 ++-- .../mindustry/entities/effect/Puddle.java | 31 +++++++++---------- .../entities/traits/BuilderTrait.java | 5 ++- .../mindustry/entities/type/BaseUnit.java | 2 +- .../anuke/mindustry/entities/type/Bullet.java | 11 ++----- .../mindustry/entities/type/TileEntity.java | 2 +- .../entities/type/base/BuilderDrone.java | 2 +- .../anuke/mindustry/input/InputHandler.java | 2 +- .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- .../io/anuke/mindustry/mod/ContentParser.java | 15 ++++++--- core/src/io/anuke/mindustry/mod/Scripts.java | 2 +- .../io/anuke/mindustry/type/ItemStack.java | 4 +-- .../ui/fragments/BlockConfigFragment.java | 2 +- .../ui/fragments/ScriptConsoleFragment.java | 6 ++-- core/src/io/anuke/mindustry/world/Block.java | 4 +-- core/src/io/anuke/mindustry/world/Build.java | 4 +-- core/src/io/anuke/mindustry/world/Tile.java | 2 +- .../mindustry/world/blocks/BuildBlock.java | 12 +++---- .../world/blocks/defense/DeflectorWall.java | 2 +- .../mindustry/world/blocks/defense/Door.java | 8 ++--- .../world/blocks/defense/ForceProjector.java | 6 ++-- .../world/blocks/defense/MendProjector.java | 6 ++-- .../blocks/defense/OverdriveProjector.java | 6 ++-- .../defense/turrets/ArtilleryTurret.java | 2 +- .../blocks/defense/turrets/BurstTurret.java | 2 +- .../blocks/defense/turrets/ChargeTurret.java | 4 +-- .../blocks/defense/turrets/CooledTurret.java | 2 +- .../blocks/defense/turrets/DoubleTurret.java | 2 +- .../blocks/defense/turrets/ItemTurret.java | 10 +++--- .../blocks/defense/turrets/LaserTurret.java | 10 +++--- .../blocks/defense/turrets/LiquidTurret.java | 12 +++---- .../world/blocks/defense/turrets/Turret.java | 24 +++++++------- .../distribution/BufferedItemBridge.java | 2 +- .../world/blocks/distribution/Conveyor.java | 26 ++++++++-------- .../distribution/ExtendingItemBridge.java | 2 +- .../world/blocks/distribution/ItemBridge.java | 28 ++++++++--------- .../world/blocks/distribution/Junction.java | 6 ++-- .../world/blocks/distribution/MassDriver.java | 20 ++++++------ .../blocks/distribution/OverflowGate.java | 8 ++--- .../world/blocks/distribution/Router.java | 8 ++--- .../world/blocks/distribution/Sorter.java | 12 +++---- .../world/blocks/liquid/Conduit.java | 6 ++-- .../world/blocks/liquid/LiquidBridge.java | 2 +- .../blocks/liquid/LiquidExtendingBridge.java | 2 +- .../world/blocks/logic/MessageBlock.java | 8 ++--- .../world/blocks/power/ImpactReactor.java | 8 ++--- .../blocks/power/ItemLiquidGenerator.java | 8 ++--- .../world/blocks/power/LightBlock.java | 10 +++--- .../world/blocks/power/NuclearReactor.java | 8 ++--- .../world/blocks/power/PowerGenerator.java | 2 +- .../world/blocks/power/PowerGraph.java | 2 +- .../world/blocks/power/PowerNode.java | 4 +-- .../world/blocks/power/SolarGenerator.java | 2 +- .../world/blocks/power/ThermalGenerator.java | 8 ++--- .../world/blocks/production/Cultivator.java | 6 ++-- .../world/blocks/production/Drill.java | 6 ++-- .../world/blocks/production/Fracker.java | 4 +-- .../blocks/production/GenericCrafter.java | 2 +- .../blocks/production/GenericSmelter.java | 4 +-- .../world/blocks/production/Incinerator.java | 8 ++--- .../blocks/production/LiquidConverter.java | 2 +- .../world/blocks/production/Separator.java | 4 +-- .../world/blocks/production/SolidPump.java | 6 ++-- .../world/blocks/sandbox/ItemSource.java | 10 +++--- .../world/blocks/sandbox/LiquidSource.java | 10 +++--- .../world/blocks/storage/CoreBlock.java | 16 +++++----- .../world/blocks/storage/StorageBlock.java | 4 +-- .../world/blocks/storage/Unloader.java | 10 +++--- .../world/blocks/units/CommandCenter.java | 12 +++---- .../mindustry/world/blocks/units/MechPad.java | 12 +++---- .../world/blocks/units/RepairPoint.java | 8 ++--- .../world/blocks/units/UnitFactory.java | 10 +++--- .../test/java/power/DirectConsumerTests.java | 2 +- .../java/power/ItemLiquidGeneratorTests.java | 2 +- tests/src/test/java/power/PowerTests.java | 8 ++--- .../mindustry/tools/ScriptStubGenerator.java | 8 +++-- 81 files changed, 288 insertions(+), 282 deletions(-) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index fd92b48f74..ab3d740c91 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -8,4 +8,8 @@ const extendContent = function(classType, name, params){ const extend = function(classType, params){ return new JavaAdapter(classType, params) -} \ No newline at end of file +} + +const run = method => new java.lang.Runnable(){run: method} +const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const Calls = Packages.io.anuke.mindustry.gen.Call \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index c23b01a8aa..60a315c74b 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -11,8 +11,13 @@ const extendContent = function(classType, name, params){ const extend = function(classType, params){ return new JavaAdapter(classType, params) } + +const run = method => new java.lang.Runnable(){run: method} +const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) +const Calls = Packages.io.anuke.mindustry.gen.Call importPackage(Packages.io.anuke.arc) importPackage(Packages.io.anuke.arc.collection) +importPackage(Packages.io.anuke.arc.func) importPackage(Packages.io.anuke.arc.graphics) importPackage(Packages.io.anuke.arc.graphics.g2d) importPackage(Packages.io.anuke.arc.math) @@ -38,6 +43,7 @@ importPackage(Packages.io.anuke.mindustry.entities.type) importPackage(Packages.io.anuke.mindustry.entities.type.base) importPackage(Packages.io.anuke.mindustry.entities.units) importPackage(Packages.io.anuke.mindustry.game) +importPackage(Packages.io.anuke.mindustry.gen) importPackage(Packages.io.anuke.mindustry.graphics) importPackage(Packages.io.anuke.mindustry.input) importPackage(Packages.io.anuke.mindustry.maps) diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index b68c24587a..167e1289ae 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -484,7 +484,7 @@ public class Blocks implements ContentList{ drawer = tile -> { Draw.rect(region, tile.drawx(), tile.drawy()); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.alpha(Mathf.absin(entity.totalProgress, 3f, 0.9f) * entity.warmup); Draw.rect(reg(topRegion), tile.drawx(), tile.drawy()); @@ -509,7 +509,7 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name), Core.atlas.find(name + "-weave")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); Draw.rect(reg(weaveRegion), tile.drawx(), tile.drawy(), entity.totalProgress); @@ -659,7 +659,7 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.rect(reg(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), tile.drawx(), tile.drawy()); @@ -686,7 +686,7 @@ public class Blocks implements ContentList{ drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator")}; drawer = tile -> { - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.rect(reg(rotatorRegion), tile.drawx(), tile.drawy(), entity.totalProgress * 2f); diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 91b7e9ba3a..69c667e625 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -52,7 +52,7 @@ public class Logic implements ApplicationListener{ if(block instanceof BuildBlock){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //update block to reflect the fact that something was being constructed if(entity.cblock != null && entity.cblock.synthetic()){ diff --git a/core/src/io/anuke/mindustry/entities/Damage.java b/core/src/io/anuke/mindustry/entities/Damage.java index 149bb9b4d8..e637c6081e 100644 --- a/core/src/io/anuke/mindustry/entities/Damage.java +++ b/core/src/io/anuke/mindustry/entities/Damage.java @@ -38,7 +38,7 @@ public class Damage{ } for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ - Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f))); + Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1)); } int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30); diff --git a/core/src/io/anuke/mindustry/entities/effect/Fire.java b/core/src/io/anuke/mindustry/entities/effect/Fire.java index 2c47550426..8546ec45e8 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Fire.java +++ b/core/src/io/anuke/mindustry/entities/effect/Fire.java @@ -10,10 +10,10 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.TimedEntity; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.TypeID; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import java.io.*; @@ -144,7 +144,7 @@ public class Fire extends TimedEntity implements SaveTrait, SyncTrait{ create(other); if(Mathf.chance(fireballChance * Time.delta() * Mathf.clamp(flammability / 10f))){ - Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)); + Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1, 1); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Puddle.java b/core/src/io/anuke/mindustry/entities/effect/Puddle.java index e7f1330a10..e53e40e8dc 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Puddle.java +++ b/core/src/io/anuke/mindustry/entities/effect/Puddle.java @@ -1,25 +1,22 @@ package io.anuke.mindustry.entities.effect; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.collection.IntMap; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Fill; -import io.anuke.arc.math.Angles; -import io.anuke.arc.math.Mathf; +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.pooling.Pool.Poolable; -import io.anuke.arc.util.pooling.Pools; +import io.anuke.arc.util.*; +import io.anuke.arc.util.pooling.Pool.*; +import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.SolidEntity; import io.anuke.mindustry.entities.traits.*; -import io.anuke.mindustry.type.TypeID; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Liquid; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; import java.io.*; @@ -118,7 +115,7 @@ public class Puddle extends SolidEntity implements SaveTrait, Poolable, DrawTrai (liquid.flammability > 0.3f && dest.temperature > 0.7f)){ //flammable liquid + hot liquid Fire.create(tile); if(Mathf.chance(0.006 * amount)){ - Call.createBullet(Bullets.fireball, x, y, Mathf.random(360f)); + Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), 1f, 1f); } }else if(dest.temperature > 0.7f && liquid.temperature < 0.55f){ //cold liquid poured onto hot puddle if(Mathf.chance(0.5f * amount)){ diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index 3459e3b18e..c7ced76ec8 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.traits; import io.anuke.arc.*; import io.anuke.arc.collection.Queue; -import io.anuke.arc.collection.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; @@ -88,7 +87,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ } //otherwise, update it. - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); if(entity == null){ return; @@ -210,7 +209,7 @@ public interface BuilderTrait extends Entity, TeamTrait{ } Tile tile = world.tile(place.x, place.y); if(tile != null && tile.entity instanceof BuildEntity){ - place.progress = tile.entity().progress; + place.progress = tile.ent().progress; } if(tail){ buildQueue().addLast(place); diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index ab22a7933b..b0b741bacb 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -107,7 +107,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ public @Nullable UnitCommand getCommand(){ if(isCommanded()){ - return indexer.getAllied(team, BlockFlag.comandCenter).first().entity().command; + return indexer.getAllied(team, BlockFlag.comandCenter).first().ent().command; } return null; } diff --git a/core/src/io/anuke/mindustry/entities/type/Bullet.java b/core/src/io/anuke/mindustry/entities/type/Bullet.java index a5c3d21697..abf7952aeb 100644 --- a/core/src/io/anuke/mindustry/entities/type/Bullet.java +++ b/core/src/io/anuke/mindustry/entities/type/Bullet.java @@ -77,16 +77,9 @@ public class Bullet extends SolidEntity implements DamageTrait, ScaleTrait, Pool return create(type, parent.owner, parent.team, x, y, angle, velocityScl); } - /** Internal use only. */ @Remote(called = Loc.server, unreliable = true) - public static void createBullet(BulletType type, float x, float y, float angle){ - create(type, null, Team.derelict, x, y, angle); - } - - /** ok */ - @Remote(called = Loc.server, unreliable = true) - public static void createBullet(BulletType type, Team team, float x, float y, float angle){ - create(type, null, team, x, y, angle); + public static void createBullet(BulletType type, Team team, float x, float y, float angle, float velocityScl, float lifetimeScl){ + create(type, null, team, x, y, angle, velocityScl, lifetimeScl, null); } public Entity getOwner(){ diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 947748ffeb..8c9617b28b 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -37,7 +37,7 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ public PowerModule power; public ItemModule items; public LiquidModule liquids; - public ConsumeModule cons; + public @Nullable ConsumeModule cons; /** List of (cached) tiles with entities in proximity, used for outputting to */ private Array proximity = new Array<>(8); diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java index 06a3ceb60d..ca31f4c401 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -171,7 +171,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ BuildRequest req = player.buildRequest(); Tile tile = world.tile(req.x, req.y); if(tile != null && tile.entity instanceof BuildEntity){ - BuildEntity b = tile.entity(); + BuildEntity b = tile.ent(); float dist = Math.min(b.dst(x, y) - placeDistance, 0); if(dist / type.maxVelocity < b.buildCost * 0.9f){ target = b; diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index f95f7a2b04..c2ff9db807 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -221,7 +221,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public boolean requestMatches(BuildRequest request){ Tile tile = world.tile(request.x, request.y); - return tile != null && tile.block() instanceof BuildBlock && tile.entity().cblock == request.block; + return tile != null && tile.block() instanceof BuildBlock && tile.ent().cblock == request.block; } public void drawBreaking(int x, int y){ diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 48c67d839f..d126af792c 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index e2b1970b46..ded39c15f0 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -165,11 +165,11 @@ public class ContentParser{ Block block; - if(Vars.content.getByName(ContentType.block, name) != null){ - block = Vars.content.getByName(ContentType.block, name); + if(locate(ContentType.block, name) != null){ + block = locate(ContentType.block, name); if(value.has("type")){ - throw new IllegalArgumentException("When overwriting an existing block, you must not re-declare its type. The original type will be used. Block: " + name); + throw new IllegalArgumentException("When defining properties for an existing block, you must not re-declare its type. The original type will be used. Block: " + name); } }else{ //TODO generate dynamically instead of doing.. this @@ -386,16 +386,21 @@ public class ContentParser{ } currentMod = mod; - boolean exists = Vars.content.getByName(type, name) != null; + boolean located = locate(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); toBeParsed.add(c); - if(!exists){ + if(!located){ c.sourceFile = file; c.mod = mod; } return c; } + private T locate(ContentType type, String name){ + T first = Vars.content.getByName(type, name); //try vanilla replacement + return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); + } + private T make(Class type){ try{ Constructor cons = type.getDeclaredConstructor(); diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 9048200bc9..6ab13c4208 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -42,7 +42,7 @@ public class Scripts implements Disposable{ } private String getError(Throwable t){ - t = Strings.getFinalCause(t); + t.printStackTrace(); return t.getClass().getSimpleName() + (t.getMessage() == null ? "" : ": " + t.getMessage()); } diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 4ea87f5605..723a6e4c24 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -38,7 +38,7 @@ public class ItemStack implements Comparable{ public static ItemStack[] with(Object... items){ ItemStack[] stacks = new ItemStack[items.length / 2]; for(int i = 0; i < items.length; i += 2){ - stacks[i / 2] = new ItemStack((Item)items[i], (Integer)items[i + 1]); + stacks[i / 2] = new ItemStack((Item)items[i], ((Number)items[i + 1]).intValue()); } return stacks; } @@ -46,7 +46,7 @@ public class ItemStack implements Comparable{ public static Array list(Object... items){ Array stacks = new Array<>(items.length / 2); for(int i = 0; i < items.length; i += 2){ - stacks.add(new ItemStack((Item)items[i], (Integer)items[i + 1])); + stacks.add(new ItemStack((Item)items[i], ((Number)items[i + 1]).intValue())); } return stacks; } diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java index 7644ec9559..663c275e11 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockConfigFragment.java @@ -50,7 +50,7 @@ public class BlockConfigFragment extends Fragment{ table.visible(true); table.clear(); - tile.block().buildTable(tile, table); + tile.block().buildConfiguration(tile, table); table.pack(); table.setTransform(true); table.actions(Actions.scaleTo(0f, 1f), Actions.visible(true), diff --git a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java index 32fdbb9394..87b7f76d6e 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -53,7 +53,7 @@ public class ScriptConsoleFragment extends Table{ clearChatInput(); } - return shown && !Vars.net.client(); + return shown && !Vars.net.active(); }); update(() -> { @@ -163,8 +163,8 @@ public class ScriptConsoleFragment extends Table{ history.insert(1, message); - addMessage("[lightgray]> " + message); - addMessage(mods.getScripts().runConsole(message)); + addMessage("[lightgray]> " + message.replace("[", "[[")); + addMessage(mods.getScripts().runConsole(message).replace("[", "[[")); } public void toggle(){ diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 6e001d38b5..e1f7e4763d 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -184,7 +184,7 @@ public class Block extends BlockStorage{ } protected void updatePowerGraph(Tile tile){ - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); for(Tile other : getPowerConnections(tile, tempTiles)){ if(other.entity.power != null){ @@ -483,7 +483,7 @@ public class Block extends BlockStorage{ * Called when this block is tapped to build a UI on the table. * {@link #configurable} must return true for this to be called. */ - public void buildTable(Tile tile, Table table){ + public void buildConfiguration(Tile tile, Table table){ } /** Update table alignment after configuring.*/ diff --git a/core/src/io/anuke/mindustry/world/Build.java b/core/src/io/anuke/mindustry/world/Build.java index 5f7834ed25..276caefba7 100644 --- a/core/src/io/anuke/mindustry/world/Build.java +++ b/core/src/io/anuke/mindustry/world/Build.java @@ -39,7 +39,7 @@ public class Build{ Block sub = BuildBlock.get(previous.size); world.setBlock(tile, sub, team, rotation); - tile.entity().setDeconstruct(previous); + tile.ent().setDeconstruct(previous); tile.entity.health = tile.entity.maxHealth() * prevPercent; Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); @@ -61,7 +61,7 @@ public class Build{ Block sub = BuildBlock.get(result.size); world.setBlock(tile, sub, team, rotation); - tile.entity().setConstruct(previous, result); + tile.ent().setConstruct(previous, result); Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, false))); } diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 06e6cdca81..b3b82a3c45 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -99,7 +99,7 @@ public class Tile implements Position, TargetTrait{ } @SuppressWarnings("unchecked") - public T entity(){ + public T ent(){ return (T)entity; } diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 9a31172660..60d99e730c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -118,19 +118,19 @@ public class BuildBlock extends Block{ @Override public String getDisplayName(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return Core.bundle.format("block.constructing", entity.cblock == null ? entity.previous.localizedName : entity.cblock.localizedName); } @Override public TextureRegion getDisplayIcon(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return (entity.cblock == null ? entity.previous : entity.cblock).icon(io.anuke.mindustry.ui.Cicon.full); } @Override public boolean isSolidFor(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); return entity == null || (entity.cblock != null && entity.cblock.solid) || entity.previous == null || entity.previous.solid; } @@ -141,7 +141,7 @@ public class BuildBlock extends Block{ @Override public void tapped(Tile tile, Player player){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //if the target is constructible, begin constructing if(entity.cblock != null){ @@ -164,7 +164,7 @@ public class BuildBlock extends Block{ @Override public void draw(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); //When breaking, don't draw the previous block... since it's the thing you were breaking if(entity.cblock != null && entity.previous == entity.cblock){ @@ -181,7 +181,7 @@ public class BuildBlock extends Block{ @Override public void drawLayer(Tile tile){ - BuildEntity entity = tile.entity(); + BuildEntity entity = tile.ent(); Shaders.blockbuild.color = Pal.accent; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java index 1dff9f636c..3cc6d177f0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/DeflectorWall.java @@ -27,7 +27,7 @@ public class DeflectorWall extends Wall{ public void draw(Tile tile){ super.draw(tile); - DeflectorEntity entity = tile.entity(); + DeflectorEntity entity = tile.ent(); if(entity.hit < 0.0001f) return; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java index dc05d1ee58..e8bfd2c4b4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/Door.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/Door.java @@ -36,7 +36,7 @@ public class Door extends Wall{ @Remote(called = Loc.server) public static void onDoorToggle(Player player, Tile tile, boolean open){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if(entity != null){ entity.open = open; Door door = (Door)tile.block(); @@ -59,7 +59,7 @@ public class Door extends Wall{ @Override public void draw(Tile tile){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if(!entity.open){ Draw.rect(region, tile.drawx(), tile.drawy()); @@ -75,13 +75,13 @@ public class Door extends Wall{ @Override public boolean isSolidFor(Tile tile){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); return !entity.open; } @Override public void tapped(Tile tile, Player player){ - DoorEntity entity = tile.entity(); + DoorEntity entity = tile.ent(); if((Units.anyEntities(tile) && entity.open) || !tile.entity.timer.get(timerToggle, 30f)){ return; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java index 5b385578d1..466d677b6c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/ForceProjector.java @@ -88,7 +88,7 @@ public class ForceProjector extends Block{ @Override public void update(Tile tile){ - ForceEntity entity = tile.entity(); + ForceEntity entity = tile.ent(); if(entity.shield == null){ entity.shield = new ShieldEntity(tile); @@ -170,7 +170,7 @@ public class ForceProjector extends Block{ public void draw(Tile tile){ super.draw(tile); - ForceEntity entity = tile.entity(); + ForceEntity entity = tile.ent(); if(entity.buildup <= 0f) return; Draw.alpha(entity.buildup / breakage * 0.75f); @@ -214,7 +214,7 @@ public class ForceProjector extends Block{ final ForceEntity entity; public ShieldEntity(Tile tile){ - this.entity = tile.entity(); + this.entity = tile.ent(); set(tile.drawx(), tile.drawy()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java index 1d737a4900..a19d536018 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/MendProjector.java @@ -64,7 +64,7 @@ public class MendProjector extends Block{ @Override public void update(Tile tile){ - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() || tile.isEnemyCheat() ? 1f : 0f, 0.08f); entity.charge += entity.heat * entity.delta(); @@ -106,7 +106,7 @@ public class MendProjector extends Block{ @Override public void drawSelect(Tile tile){ - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); float realRange = range + entity.phaseHeat * phaseRangeBoost; Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); @@ -116,7 +116,7 @@ public class MendProjector extends Block{ public void draw(Tile tile){ super.draw(tile); - MendEntity entity = tile.entity(); + MendEntity entity = tile.ent(); float f = 1f - (Time.time() / 100f) % 1f; Draw.color(baseColor, phaseColor, entity.phaseHeat); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java index f1708354b5..84e88b2f22 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/OverdriveProjector.java @@ -74,7 +74,7 @@ public class OverdriveProjector extends Block{ @Override public void update(Tile tile){ - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); entity.heat = Mathf.lerpDelta(entity.heat, entity.cons.valid() ? 1f : 0f, 0.08f); entity.charge += entity.heat * Time.delta(); @@ -115,7 +115,7 @@ public class OverdriveProjector extends Block{ @Override public void drawSelect(Tile tile){ - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); float realRange = range + entity.phaseHeat * phaseRangeBoost; Drawf.dashCircle(tile.drawx(), tile.drawy(), realRange, baseColor); @@ -125,7 +125,7 @@ public class OverdriveProjector extends Block{ public void draw(Tile tile){ super.draw(tile); - OverdriveEntity entity = tile.entity(); + OverdriveEntity entity = tile.ent(); float f = 1f - (Time.time() / 100f) % 1f; Draw.color(baseColor, phaseColor, entity.phaseHeat); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java index f7095474c8..433987d2c6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ArtilleryTurret.java @@ -22,7 +22,7 @@ public class ArtilleryTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.recoil = recoil; entity.heat = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java index 66775fb14e..3661ec175c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/BurstTurret.java @@ -16,7 +16,7 @@ public class BurstTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.heat = 1f; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java index e6aac80ea9..dc12e2425f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ChargeTurret.java @@ -25,7 +25,7 @@ public class ChargeTurret extends PowerTurret{ @Override public void shoot(Tile tile, BulletType ammo){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); useAmmo(tile); @@ -55,7 +55,7 @@ public class ChargeTurret extends PowerTurret{ @Override public boolean shouldTurn(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); return !entity.shooting; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java index 03c35de0d0..9e48e3fc3a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/CooledTurret.java @@ -50,7 +50,7 @@ public class CooledTurret extends Turret{ float maxUsed = consumes.get(ConsumeType.liquid).amount; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Liquid liquid = entity.liquids.current(); float used = Math.min(Math.min(entity.liquids.get(liquid), maxUsed * Time.delta()), Math.max(0, ((reload - entity.reload) / coolantMultiplier) / liquid.heatCapacity)) * baseReloadSpeed(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java index 813280bb2f..70be09ad4a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/DoubleTurret.java @@ -26,7 +26,7 @@ public class DoubleTurret extends ItemTurret{ @Override protected void shoot(Tile tile, BulletType ammo){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.shots++; int i = Mathf.signs[entity.shots % 2]; diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index ea670a37e5..393e102d7a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -47,7 +47,7 @@ public class ItemTurret extends CooledTurret{ public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); content.items().each(i -> filter.get(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), - () -> tile.entity != null && !((ItemTurretEntity)tile.entity).ammo.isEmpty() && ((ItemEntry)tile.entity().ammo.peek()).item == item))); + () -> tile.entity != null && !((ItemTurretEntity)tile.entity).ammo.isEmpty() && ((ItemEntry)tile.ent().ammo.peek()).item == item))); table.add(image).size(8 * 4); } @@ -79,7 +79,7 @@ public class ItemTurret extends CooledTurret{ public void displayBars(Tile tile, Table bars){ super.displayBars(tile, bars); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); bars.add(new Bar("blocks.ammo", Pal.ammo, () -> (float)entity.totalAmmo / maxAmmo)).growX(); bars.row(); @@ -87,7 +87,7 @@ public class ItemTurret extends CooledTurret{ @Override public int acceptStack(Item item, int amount, Tile tile, Unit source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); BulletType type = ammo.get(item); @@ -111,7 +111,7 @@ public class ItemTurret extends CooledTurret{ @Override public void handleItem(Item item, Tile tile, Tile source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity == null) return; if(item == Items.pyratite){ @@ -144,7 +144,7 @@ public class ItemTurret extends CooledTurret{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return ammo != null && ammo.get(item) != null && entity.totalAmmo + ammo.get(item).ammoMultiplier <= maxAmmo; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java index 74e8490928..422b5b57b8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -41,7 +41,7 @@ public class LaserTurret extends PowerTurret{ public void update(Tile tile){ super.update(tile); - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); if(entity.bulletLife > 0 && entity.bullet != null){ tr.trns(entity.rotation, size * tilesize / 2f, 0f); @@ -59,7 +59,7 @@ public class LaserTurret extends PowerTurret{ @Override protected void updateShooting(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); if(entity.bulletLife > 0 && entity.bullet != null){ return; @@ -87,14 +87,14 @@ public class LaserTurret extends PowerTurret{ @Override protected void turnToTarget(Tile tile, float targetRot){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta() * (entity.bulletLife > 0f ? firingMoveFract : 1f)); } @Override protected void bullet(Tile tile, BulletType type, float angle){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); entity.bullet = Bullet.create(type, tile.entity, tile.getTeam(), tile.drawx() + tr.x, tile.drawy() + tr.y, angle); entity.bulletLife = shootDuration; @@ -102,7 +102,7 @@ public class LaserTurret extends PowerTurret{ @Override public boolean shouldActiveSound(Tile tile){ - LaserTurretEntity entity = tile.entity(); + LaserTurretEntity entity = tile.ent(); return entity.bulletLife > 0 && entity.bullet != null; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 83b9a75d8b..7192ba09fe 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -48,13 +48,13 @@ public class LiquidTurret extends Turret{ @Override public boolean shouldActiveSound(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.target != null && hasAmmo(tile); } @Override protected boolean validateTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.liquids.current().canExtinguish() && entity.target instanceof Tile){ return Fire.has(((Tile)entity.target).x, ((Tile)entity.target).y); } @@ -63,7 +63,7 @@ public class LiquidTurret extends Turret{ @Override protected void findTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.liquids.current().canExtinguish()){ int tr = (int)(range / tilesize); for(int x = -tr; x <= tr; x++){ @@ -83,7 +83,7 @@ public class LiquidTurret extends Turret{ protected void effects(Tile tile){ BulletType type = peekAmmo(tile); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(type.shootEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(type.smokeEffect, entity.liquids.current().color, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); @@ -98,7 +98,7 @@ public class LiquidTurret extends Turret{ @Override public BulletType useAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(tile.isEnemyCheat()) return ammo.get(entity.liquids.current()); BulletType type = ammo.get(entity.liquids.current()); entity.liquids.remove(entity.liquids.current(), type.ammoMultiplier); @@ -112,7 +112,7 @@ public class LiquidTurret extends Turret{ @Override public boolean hasAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return ammo.get(entity.liquids.current()) != null && entity.liquids.total() >= ammo.get(entity.liquids.current()).ammoMultiplier; } diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java index 9f2cfa9ed6..e6c3b129d4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/Turret.java @@ -115,7 +115,7 @@ public abstract class Turret extends Block{ @Override public void drawLayer(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); tr2.trns(entity.rotation, -entity.recoil); @@ -143,7 +143,7 @@ public abstract class Turret extends Block{ @Override public void update(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(!validateTarget(tile)) entity.target = null; @@ -185,12 +185,12 @@ public abstract class Turret extends Block{ } protected boolean validateTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return !Units.invalidateTarget(entity.target, tile.getTeam(), tile.drawx(), tile.drawy()); } protected void findTarget(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(targetAir && !targetGround){ entity.target = Units.closestEnemy(tile.getTeam(), tile.drawx(), tile.drawy(), range, e -> !e.isDead() && e.isFlying()); @@ -200,7 +200,7 @@ public abstract class Turret extends Block{ } protected void turnToTarget(Tile tile, float targetRot){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.rotation = Angles.moveToward(entity.rotation, targetRot, rotatespeed * entity.delta() * baseReloadSpeed(tile)); } @@ -213,7 +213,7 @@ public abstract class Turret extends Block{ public BulletType useAmmo(Tile tile){ if(tile.isEnemyCheat()) return peekAmmo(tile); - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); AmmoEntry entry = entity.ammo.peek(); entry.amount -= ammoPerShot; if(entry.amount == 0) entity.ammo.pop(); @@ -226,7 +226,7 @@ public abstract class Turret extends Block{ * Get the ammo type that will be returned if useAmmo is called. */ public BulletType peekAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.ammo.peek().type(); } @@ -234,12 +234,12 @@ public abstract class Turret extends Block{ * Returns whether the turret has ammo. */ public boolean hasAmmo(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); return entity.ammo.size > 0 && entity.ammo.peek().amount >= ammoPerShot; } protected void updateShooting(Tile tile){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); if(entity.reload >= reload){ BulletType type = peekAmmo(tile); @@ -253,7 +253,7 @@ public abstract class Turret extends Block{ } protected void shoot(Tile tile, BulletType type){ - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); entity.recoil = recoil; entity.heat = 1f; @@ -276,7 +276,7 @@ public abstract class Turret extends Block{ Effect shootEffect = this.shootEffect == Fx.none ? peekAmmo(tile).shootEffect : this.shootEffect; Effect smokeEffect = this.smokeEffect == Fx.none ? peekAmmo(tile).smokeEffect : this.smokeEffect; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(shootEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); Effects.effect(smokeEffect, tile.drawx() + tr.x, tile.drawy() + tr.y, entity.rotation); @@ -291,7 +291,7 @@ public abstract class Turret extends Block{ protected void ejectEffects(Tile tile){ if(!isTurret(tile)) return; - TurretEntity entity = tile.entity(); + TurretEntity entity = tile.ent(); Effects.effect(ammoUseEffect, tile.drawx() - Angles.trnsx(entity.rotation, ammoEjectBack), tile.drawy() - Angles.trnsy(entity.rotation, ammoEjectBack), entity.rotation); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java index cb684c90f3..89b91cb50c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -21,7 +21,7 @@ public class BufferedItemBridge extends ExtendingItemBridge{ @Override public void updateTransport(Tile tile, Tile other){ - BufferedItemBridgeEntity entity = tile.entity(); + BufferedItemBridgeEntity entity = tile.ent(); if(entity.buffer.accepts() && entity.items.total() > 0){ entity.buffer.accept(entity.items.take()); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index f046a63850..a3799def15 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -75,7 +75,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void draw(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); byte rotation = tile.rotation(); int frame = entity.clogHeat <= 0.5f ? (int)(((Time.time() * speed * 8f * entity.timeScale)) % 4) : 0; @@ -85,7 +85,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean shouldIdleSound(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); return entity.clogHeat <= 0.5f ; } @@ -93,7 +93,7 @@ public class Conveyor extends Block implements Autotiler{ public void onProximityUpdate(Tile tile){ super.onProximityUpdate(tile); - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; entity.blendsclx = bits[1]; @@ -122,7 +122,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void drawLayer(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); byte rotation = tile.rotation(); @@ -148,7 +148,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public void unitOn(Tile tile, Unit unit){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); if(entity.clogHeat > 0.5f){ return; @@ -178,12 +178,12 @@ public class Conveyor extends Block implements Autotiler{ @Override public void update(Tile tile){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.minitem = 1f; Tile next = tile.getNearby(tile.rotation()); if(next != null) next = next.link(); - float nextMax = next != null && next.block() instanceof Conveyor && next.block().acceptItem(null, next, tile) ? 1f - Math.max(itemSpace - next.entity().minitem, 0) : 1f; + float nextMax = next != null && next.block() instanceof Conveyor && next.block().acceptItem(null, next, tile) ? 1f - Math.max(itemSpace - next.ent().minitem, 0) : 1f; int minremove = Integer.MAX_VALUE; for(int i = entity.convey.size - 1; i >= 0; i--){ @@ -211,7 +211,7 @@ public class Conveyor extends Block implements Autotiler{ if(pos.y >= 0.9999f && offloadDir(tile, pos.item)){ if(next != null && next.block() instanceof Conveyor){ - ConveyorEntity othere = next.entity(); + ConveyorEntity othere = next.ent(); ItemPos ni = pos2.set(othere.convey.get(othere.lastInserted), ItemPos.updateShorts); @@ -263,7 +263,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public int removeStack(Tile tile, Item item, int amount){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.noSleep(); int removed = 0; @@ -289,13 +289,13 @@ public class Conveyor extends Block implements Autotiler{ @Override public int acceptStack(Item item, int amount, Tile tile, Unit source){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); return Math.min((int)(entity.minitem / itemSpace), amount); } @Override public void handleStack(Item item, int amount, Tile tile, Unit source){ - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); for(int i = amount - 1; i >= 0; i--){ long result = ItemPos.packItem(item, 0f, i * itemSpace); @@ -309,7 +309,7 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ int direction = source == null ? 0 : Math.abs(source.relativeTo(tile.x, tile.y) - tile.rotation()); - float minitem = tile.entity().minitem; + float minitem = tile.ent().minitem; return (((direction == 0) && minitem > itemSpace) || ((direction % 2 == 1) && minitem > 0.52f)) && (source == null || !(source.block().rotate && (source.rotation() + 2) % 4 == tile.rotation())); } @@ -324,7 +324,7 @@ public class Conveyor extends Block implements Autotiler{ float pos = ch == 0 ? 0 : ch % 2 == 1 ? 0.5f : 1f; float y = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; - ConveyorEntity entity = tile.entity(); + ConveyorEntity entity = tile.ent(); entity.noSleep(); long result = ItemPos.packItem(item, y * 0.9f, pos); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java index 3889a8078a..7a0a2b1d06 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -16,7 +16,7 @@ public class ExtendingItemBridge extends ItemBridge{ @Override public void drawLayer(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)) return; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 8965a1be97..3624a1079b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -46,7 +46,7 @@ public class ItemBridge extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().link = value; + tile.ent().link = value; } @Override @@ -126,7 +126,7 @@ public class ItemBridge extends Block{ @Override public void drawConfigure(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Draw.color(Pal.accent); Lines.stroke(1f); @@ -151,7 +151,7 @@ public class ItemBridge extends Block{ @Override public boolean onConfigureTileTapped(Tile tile, Tile other){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); if(linkValid(tile, other)){ if(entity.link == other.pos()){ @@ -166,7 +166,7 @@ public class ItemBridge extends Block{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * entity.delta(); entity.time2 += (entity.cycleSpeed - 1f) * entity.delta(); @@ -175,7 +175,7 @@ public class ItemBridge extends Block{ while(it.hasNext){ int i = it.next(); Tile other = world.tile(i); - if(!linkValid(tile, other, false) || other.entity().link != tile.pos()){ + if(!linkValid(tile, other, false) || other.ent().link != tile.pos()){ it.remove(); } } @@ -198,7 +198,7 @@ public class ItemBridge extends Block{ } public void updateTransport(Tile tile, Tile other){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); if(entity.uptime >= 0.5f && entity.timer.get(timerTransport, transportTime)){ Item item = entity.items.take(); @@ -214,7 +214,7 @@ public class ItemBridge extends Block{ @Override public void drawLayer(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)) return; @@ -254,7 +254,7 @@ public class ItemBridge extends Block{ public boolean acceptItem(Item item, Tile tile, Tile source){ if(tile.getTeam() != source.getTeam()) return false; - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(linkValid(tile, other)){ @@ -263,7 +263,7 @@ public class ItemBridge extends Block{ if(rel == rel2) return false; }else{ - return source.block() instanceof ItemBridge && source.entity().link == tile.pos() && tile.entity.items.total() < itemCapacity; + return source.block() instanceof ItemBridge && source.ent().link == tile.pos() && tile.entity.items.total() < itemCapacity; } return tile.entity.items.total() < itemCapacity; @@ -272,7 +272,7 @@ public class ItemBridge extends Block{ @Override public boolean canDumpLiquid(Tile tile, Tile to, Liquid liquid){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ @@ -300,7 +300,7 @@ public class ItemBridge extends Block{ public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ if(tile.getTeam() != source.getTeam() || !hasLiquids) return false; - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(linkValid(tile, other)){ @@ -308,7 +308,7 @@ public class ItemBridge extends Block{ int rel2 = tile.relativeTo(source.x, source.y); if(rel == rel2) return false; - }else if(!(source.block() instanceof ItemBridge && source.entity().link == tile.pos())){ + }else if(!(source.block() instanceof ItemBridge && source.ent().link == tile.pos())){ return false; } @@ -317,7 +317,7 @@ public class ItemBridge extends Block{ @Override public boolean canDump(Tile tile, Tile to, Item item){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ @@ -355,7 +355,7 @@ public class ItemBridge extends Block{ return false; } - return other.block() == this && (!checkDouble || other.entity().link != tile.pos()); + return other.block() == this && (!checkDouble || other.ent().link != tile.pos()); } public static class ItemBridgeEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java index 8fe62c1a05..45fea7b8a4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Junction.java @@ -42,7 +42,7 @@ public class Junction extends Block{ @Override public void update(Tile tile){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); DirectionalItemBuffer buffer = entity.buffer; for(int i = 0; i < 4; i++){ @@ -72,14 +72,14 @@ public class Junction extends Block{ @Override public void handleItem(Item item, Tile tile, Tile source){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); int relative = source.relativeTo(tile.x, tile.y); entity.buffer.accept(relative, item); } @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - JunctionEntity entity = tile.entity(); + JunctionEntity entity = tile.ent(); int relative = source.relativeTo(tile.x, tile.y); if(entity == null || relative == -1 || !entity.buffer.accepts(relative)) diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index f6799d7dc7..1f75a716c8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -47,7 +47,7 @@ public class MassDriver extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().link = value; + tile.ent().link = value; } @Override @@ -64,7 +64,7 @@ public class MassDriver extends Block{ @Override public void update(Tile tile){ - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); Tile link = world.tile(entity.link); boolean hasLink = linkValid(tile); @@ -120,7 +120,7 @@ public class MassDriver extends Block{ tile.entity.items.total() >= minDistribute && //must shoot minimum amount of items link.block().itemCapacity - link.entity.items.total() >= minDistribute //must have minimum amount of space ){ - MassDriverEntity other = link.entity(); + MassDriverEntity other = link.ent(); other.waitingShooters.add(tile); if(entity.reload <= 0.0001f){ @@ -152,7 +152,7 @@ public class MassDriver extends Block{ @Override public void drawLayer(Tile tile){ - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); Draw.rect(region, tile.drawx() + Angles.trnsx(entity.rotation + 180f, entity.reload * knockback), @@ -172,7 +172,7 @@ public class MassDriver extends Block{ Lines.stroke(1f); Drawf.circles(tile.drawx(), tile.drawy(), (tile.block().size / 2f + 1) * tilesize + sin - 2f, Pal.accent); - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(linkValid(tile)){ Tile target = world.tile(entity.link); @@ -187,7 +187,7 @@ public class MassDriver extends Block{ public boolean onConfigureTileTapped(Tile tile, Tile other){ if(tile == other) return false; - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(entity.link == other.pos()){ tile.configure(-1); @@ -207,8 +207,8 @@ public class MassDriver extends Block{ } protected void fire(Tile tile, Tile target){ - MassDriverEntity entity = tile.entity(); - MassDriverEntity other = target.entity(); + MassDriverEntity entity = tile.ent(); + MassDriverEntity other = target.ent(); //reset reload, use power. entity.reload = 1f; @@ -264,13 +264,13 @@ public class MassDriver extends Block{ protected boolean shooterValid(Tile tile, Tile other){ if(other == null) return true; if(!(other.block() instanceof MassDriver)) return false; - MassDriverEntity entity = other.entity(); + MassDriverEntity entity = other.ent(); return entity.link == tile.pos() && tile.dst(other) <= range; } protected boolean linkValid(Tile tile){ if(tile == null) return false; - MassDriverEntity entity = tile.entity(); + MassDriverEntity entity = tile.ent(); if(entity == null || entity.link == -1) return false; Tile link = world.tile(entity.link); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java index a510bae97c..a6c8f779ac 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/OverflowGate.java @@ -29,7 +29,7 @@ public class OverflowGate extends Block{ @Override public int removeStack(Tile tile, Item item, int amount){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); int result = super.removeStack(tile, item, amount); if(result != 0 && item == entity.lastItem){ entity.lastItem = null; @@ -39,7 +39,7 @@ public class OverflowGate extends Block{ @Override public void update(Tile tile){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); if(entity.lastItem == null && entity.items.total() > 0){ entity.items.clear(); @@ -60,14 +60,14 @@ public class OverflowGate extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0; } @Override public void handleItem(Item item, Tile tile, Tile source){ - OverflowGateEntity entity = tile.entity(); + OverflowGateEntity entity = tile.ent(); entity.items.add(item, 1); entity.lastItem = item; entity.time = 0f; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java index c8e9fb441d..1893af98e2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Router.java @@ -24,7 +24,7 @@ public class Router extends Block{ @Override public void update(Tile tile){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); if(entity.lastItem == null && entity.items.total() > 0){ entity.items.clear(); @@ -45,14 +45,14 @@ public class Router extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); return tile.getTeam() == source.getTeam() && entity.lastItem == null && entity.items.total() == 0; } @Override public void handleItem(Item item, Tile tile, Tile source){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); entity.items.add(item, 1); entity.lastItem = item; entity.time = 0f; @@ -75,7 +75,7 @@ public class Router extends Block{ @Override public int removeStack(Tile tile, Item item, int amount){ - RouterEntity entity = tile.entity(); + RouterEntity entity = tile.ent(); int result = super.removeStack(tile, item, amount); if(result != 0 && item == entity.lastItem){ entity.lastItem = null; diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 60c88e77b1..1794161654 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -45,7 +45,7 @@ public class Sorter extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().sortItem = content.item(value); + tile.ent().sortItem = content.item(value); } @Override @@ -57,7 +57,7 @@ public class Sorter extends Block{ public void draw(Tile tile){ super.draw(tile); - SorterEntity entity = tile.entity(); + SorterEntity entity = tile.ent(); if(entity.sortItem == null) return; Draw.color(entity.sortItem.color); @@ -67,7 +67,7 @@ public class Sorter extends Block{ @Override public int minimapColor(Tile tile){ - return tile.entity().sortItem == null ? 0 : tile.entity().sortItem.color.rgba(); + return tile.ent().sortItem == null ? 0 : tile.ent().sortItem.color.rgba(); } @Override @@ -89,7 +89,7 @@ public class Sorter extends Block{ } Tile getTileTarget(Item item, Tile dest, Tile source, boolean flip){ - SorterEntity entity = dest.entity(); + SorterEntity entity = dest.ent(); int dir = source.relativeTo(dest.x, dest.y); if(dir == -1) return null; @@ -130,8 +130,8 @@ public class Sorter extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - SorterEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + SorterEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java index e68b58e48d..0b6518b956 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/Conduit.java @@ -47,7 +47,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ public void onProximityUpdate(Tile tile){ super.onProximityUpdate(tile); - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); int[] bits = buildBlending(tile, tile.rotation(), null, true); entity.blendbits = bits[0]; } @@ -91,7 +91,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public void draw(Tile tile){ - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); LiquidModule mod = tile.entity.liquids; int rotation = tile.rotation() * 90; @@ -108,7 +108,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public void update(Tile tile){ - ConduitEntity entity = tile.entity(); + ConduitEntity entity = tile.ent(); entity.smoothLiquid = Mathf.lerpDelta(entity.smoothLiquid, entity.liquids.total() / liquidCapacity, 0.05f); if(tile.entity.liquids.total() > 0.001f && tile.entity.timer.get(timerFlow, 1)){ diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java index f64a16ba80..5575d6d779 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidBridge.java @@ -21,7 +21,7 @@ public class LiquidBridge extends ItemBridge{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); entity.time2 += (entity.cycleSpeed - 1f) * Time.delta(); diff --git a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 8c82053b7f..1753e17d55 100644 --- a/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -21,7 +21,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ @Override public void update(Tile tile){ - ItemBridgeEntity entity = tile.entity(); + ItemBridgeEntity entity = tile.ent(); entity.time += entity.cycleSpeed * Time.delta(); entity.time2 += (entity.cycleSpeed - 1f) * Time.delta(); diff --git a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java index 9b773c6356..0cb2611815 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java @@ -61,7 +61,7 @@ public class MessageBlock extends Block{ } } - MessageBlockEntity entity = tile.entity(); + MessageBlockEntity entity = tile.ent(); if(entity != null){ entity.message = result.toString(); entity.lines = entity.message.split("\n"); @@ -70,7 +70,7 @@ public class MessageBlock extends Block{ @Override public void drawSelect(Tile tile){ - MessageBlockEntity entity = tile.entity(); + MessageBlockEntity entity = tile.ent(); BitmapFont font = Fonts.outline; GlyphLayout l = Pools.obtain(GlyphLayout.class, GlyphLayout::new); boolean ints = font.usesIntegerPositions(); @@ -95,8 +95,8 @@ public class MessageBlock extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - MessageBlockEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + MessageBlockEntity entity = tile.ent(); table.addImageButton(Icon.pencilSmall, () -> { if(mobile){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java index 77e2cf2ad2..e74eab58ef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ImpactReactor.java @@ -69,7 +69,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void update(Tile tile){ - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); if(entity.cons.valid() && entity.power.status >= 0.99f){ boolean prevOut = getPowerProduction(tile) <= consumes.getPower().requestedPower(entity); @@ -95,7 +95,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void draw(Tile tile){ - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); Draw.rect(reg(bottomRegion), tile.drawx(), tile.drawy()); @@ -118,7 +118,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void drawLight(Tile tile){ - float fract = tile.entity().warmup; + float fract = tile.ent().warmup; renderer.lights.add(tile.drawx(), tile.drawy(), (110f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(plasma2).lerp(plasma1, Mathf.absin(7f, 0.2f)), 0.8f * fract); } @@ -131,7 +131,7 @@ public class ImpactReactor extends PowerGenerator{ public void onDestroyed(Tile tile){ super.onDestroyed(tile); - FusionReactorEntity entity = tile.entity(); + FusionReactorEntity entity = tile.ent(); if(entity.warmup < 0.4f || !state.rules.reactorExplosions) return; diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 7d4b378b2a..75bd3bd578 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -87,13 +87,13 @@ public class ItemLiquidGenerator extends PowerGenerator{ @Override public boolean productionValid(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); return entity.generateTime > 0; } @Override public void update(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); //Note: Do not use this delta when calculating the amount of power or the power efficiency, but use it for resource consumption if necessary. //Power amount is delta'd by PowerGraph class already. @@ -156,7 +156,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ public void draw(Tile tile){ super.draw(tile); - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); if(hasItems){ Draw.color(heatColor); @@ -175,7 +175,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ @Override public void drawLight(Tile tile){ - ItemLiquidGeneratorEntity entity = tile.entity(); + ItemLiquidGeneratorEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (60f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.orange, 0.5f); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java index 06e1b257cb..989775dc40 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/LightBlock.java @@ -39,7 +39,7 @@ public class LightBlock extends Block{ @Override public void draw(Tile tile){ super.draw(tile); - LightEntity entity = tile.entity(); + LightEntity entity = tile.ent(); Draw.blend(Blending.additive); Draw.color(Tmp.c1.set(entity.color), entity.efficiency() * 0.3f); @@ -49,8 +49,8 @@ public class LightBlock extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - LightEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + LightEntity entity = tile.ent(); table.addImageButton(Icon.pencilSmall, () -> { ui.picker.show(Tmp.c1.set(entity.color).a(0.5f), false, res -> { @@ -63,12 +63,12 @@ public class LightBlock extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().color = value; + tile.ent().color = value; } @Override public void drawLight(Tile tile){ - LightEntity entity = tile.entity(); + LightEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), radius, Tmp.c1.set(entity.color), brightness * tile.entity.efficiency()); } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java index 7ae1e4ca70..5957a92ac6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/NuclearReactor.java @@ -73,7 +73,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void update(Tile tile){ - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); ConsumeLiquid cliquid = consumes.get(ConsumeType.liquid); Item item = consumes.get(ConsumeType.item).items[0].item; @@ -120,7 +120,7 @@ public class NuclearReactor extends PowerGenerator{ Sounds.explosionbig.at(tile); - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); int fuel = entity.items.get(consumes.get(ConsumeType.item).items[0].item); @@ -151,7 +151,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void drawLight(Tile tile){ - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); float fract = entity.productionEfficiency; renderer.lights.add(tile.drawx(), tile.drawy(), (90f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(lightColor).lerp(Color.scarlet, entity.heat), 0.6f * fract); } @@ -160,7 +160,7 @@ public class NuclearReactor extends PowerGenerator{ public void draw(Tile tile){ super.draw(tile); - NuclearReactorEntity entity = tile.entity(); + NuclearReactorEntity entity = tile.ent(); Draw.color(coolColor, hotColor, entity.heat); Fill.rect(tile.drawx(), tile.drawy(), size * tilesize, size * tilesize); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java index d5e4c2ccfd..7612e9ff16 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGenerator.java @@ -45,7 +45,7 @@ public class PowerGenerator extends PowerDistributor{ @Override public float getPowerProduction(Tile tile){ - return powerProduction * tile.entity().productionEfficiency; + return powerProduction * tile.ent().productionEfficiency; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index b5d29266ac..d0d1a80425 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -296,7 +296,7 @@ public class PowerGraph{ private boolean otherConsumersAreValid(Tile tile, Consume consumePower){ for(Consume cons : tile.block().consumes.all()){ - if(cons != consumePower && !cons.isOptional() && !cons.valid(tile.entity())){ + if(cons != consumePower && !cons.isOptional() && !cons.valid(tile.ent())){ return false; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 4cb97d6bba..bfd60a2cdb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -172,7 +172,7 @@ public class PowerNode extends PowerBlock{ @Override public boolean onConfigureTileTapped(Tile tile, Tile other){ - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); other = other.link(); if(linkValid(tile, other)){ @@ -262,7 +262,7 @@ public class PowerNode extends PowerBlock{ public void drawLayer(Tile tile){ if(Core.settings.getInt("lasersopacity") == 0) return; - TileEntity entity = tile.entity(); + TileEntity entity = tile.ent(); for(int i = 0; i < entity.power.links.size; i++){ Tile link = world.tile(entity.power.links.get(i)); diff --git a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java index 4844fc2297..81712ba4bc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/SolarGenerator.java @@ -17,7 +17,7 @@ public class SolarGenerator extends PowerGenerator{ @Override public void update(Tile tile){ - tile.entity().productionEfficiency = state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f; + tile.ent().productionEfficiency = state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java index 5bb3cce8d7..61570c66df 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ThermalGenerator.java @@ -20,7 +20,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void update(Tile tile){ - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); if(entity.productionEfficiency > 0.1f && Mathf.chance(0.05 * entity.delta())){ Effects.effect(generateEffect, tile.drawx() + Mathf.range(3f), tile.drawy() + Mathf.range(3f)); @@ -34,7 +34,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void drawLight(Tile tile){ - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (40f + Mathf.absin(10f, 5f)) * entity.productionEfficiency * size, Color.scarlet, 0.4f); } @@ -42,7 +42,7 @@ public class ThermalGenerator extends PowerGenerator{ public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); - GeneratorEntity entity = tile.entity(); + GeneratorEntity entity = tile.ent(); entity.productionEfficiency = sumAttribute(Attribute.heat, tile.x, tile.y); } @@ -50,7 +50,7 @@ public class ThermalGenerator extends PowerGenerator{ public float getPowerProduction(Tile tile){ //in this case, productionEfficiency means 'total heat' //thus, it may be greater than 1.0 - return powerProduction * tile.entity().productionEfficiency; + return powerProduction * tile.ent().productionEfficiency; } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java index 4cf0a6b2f1..640f438b40 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Cultivator.java @@ -43,7 +43,7 @@ public class Cultivator extends GenericCrafter{ public void update(Tile tile){ super.update(tile); - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); entity.warmup = Mathf.lerpDelta(entity.warmup, entity.cons.valid() ? 1f : 0f, 0.015f); } @@ -64,7 +64,7 @@ public class Cultivator extends GenericCrafter{ @Override public void draw(Tile tile){ - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); @@ -99,7 +99,7 @@ public class Cultivator extends GenericCrafter{ public void onProximityAdded(Tile tile){ super.onProximityAdded(tile); - CultivatorEntity entity = tile.entity(); + CultivatorEntity entity = tile.ent(); entity.boost = sumAttribute(attribute, tile.x, tile.y); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 14788104d9..865fb8aea7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -98,7 +98,7 @@ public class Drill extends Block{ float s = 0.3f; float ts = 0.6f; - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); super.drawCracks(tile); @@ -163,7 +163,7 @@ public class Drill extends Block{ @Override public void drawSelect(Tile tile){ - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); if(entity.dominantItem != null){ float dx = tile.drawx() - size * tilesize/2f, dy = tile.drawy() + size * tilesize/2f; @@ -239,7 +239,7 @@ public class Drill extends Block{ @Override public void update(Tile tile){ - DrillEntity entity = tile.entity(); + DrillEntity entity = tile.ent(); if(entity.dominantItem == null){ countOre(tile); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java index 4f79a420b5..d70d8e878c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Fracker.java @@ -49,7 +49,7 @@ public class Fracker extends SolidPump{ @Override public void draw(Tile tile){ - FrackerEntity entity = tile.entity(); + FrackerEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); super.drawCracks(tile); @@ -70,7 +70,7 @@ public class Fracker extends SolidPump{ @Override public void update(Tile tile){ - FrackerEntity entity = tile.entity(); + FrackerEntity entity = tile.ent(); if(entity.cons.valid()){ if(entity.accumulator >= itemUseTime){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java index 512be4ddd6..00075370e4 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericCrafter.java @@ -86,7 +86,7 @@ public class GenericCrafter extends Block{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); if(entity.cons.valid()){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java index ba0c20bb75..3fe9e1eb7a 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/GenericSmelter.java @@ -28,7 +28,7 @@ public class GenericSmelter extends GenericCrafter{ public void draw(Tile tile){ super.draw(tile); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); //draw glowing center if(entity.warmup > 0f && flameColor.a > 0.001f){ @@ -50,7 +50,7 @@ public class GenericSmelter extends GenericCrafter{ @Override public void drawLight(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); renderer.lights.add(tile.drawx(), tile.drawy(), (60f + Mathf.absin(10f, 5f)) * entity.warmup * size, flameColor, 0.65f); } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java index 57c00e5a2c..656476c4d8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Incinerator.java @@ -29,7 +29,7 @@ public class Incinerator extends Block{ @Override public void update(Tile tile){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); if(entity.cons.valid()){ entity.heat = Mathf.lerpDelta(entity.heat, 1f, 0.04f); @@ -42,7 +42,7 @@ public class Incinerator extends Block{ public void draw(Tile tile){ super.draw(tile); - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); if(entity.heat > 0f){ float g = 0.3f; @@ -68,7 +68,7 @@ public class Incinerator extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); return entity.heat > 0.5f; } @@ -81,7 +81,7 @@ public class Incinerator extends Block{ @Override public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - IncineratorEntity entity = tile.entity(); + IncineratorEntity entity = tile.ent(); return entity.heat > 0.5f; } diff --git a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java index 6908ad4176..95fdc2184f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/LiquidConverter.java @@ -41,7 +41,7 @@ public class LiquidConverter extends GenericCrafter{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); if(tile.entity.cons.valid()){ diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java index bd3f98966b..c297851e67 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Separator.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Separator.java @@ -64,7 +64,7 @@ public class Separator extends Block{ public void draw(Tile tile){ super.draw(tile); - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); Draw.color(tile.entity.liquids.current().color); Draw.alpha(tile.entity.liquids.total() / liquidCapacity); @@ -78,7 +78,7 @@ public class Separator extends Block{ @Override public void update(Tile tile){ - GenericCrafterEntity entity = tile.entity(); + GenericCrafterEntity entity = tile.ent(); entity.totalProgress += entity.warmup * entity.delta(); diff --git a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java index 6a3e5d806c..e7ac5b0c14 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/SolidPump.java @@ -67,7 +67,7 @@ public class SolidPump extends Pump{ @Override public void draw(Tile tile){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy()); Draw.color(tile.entity.liquids.current().color); @@ -85,7 +85,7 @@ public class SolidPump extends Pump{ @Override public void update(Tile tile){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); float fraction = 0f; @@ -140,7 +140,7 @@ public class SolidPump extends Pump{ super.onProximityAdded(tile); if(attribute != null){ - SolidPumpEntity entity = tile.entity(); + SolidPumpEntity entity = tile.ent(); entity.boost = sumAttribute(attribute, tile.x, tile.y); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java index d38c9dc432..46e1e86ee2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java @@ -30,7 +30,7 @@ public class ItemSource extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().outputItem = content.item(value); + tile.ent().outputItem = content.item(value); } @Override @@ -60,7 +60,7 @@ public class ItemSource extends Block{ public void draw(Tile tile){ super.draw(tile); - ItemSourceEntity entity = tile.entity(); + ItemSourceEntity entity = tile.ent(); if(entity.outputItem == null) return; Draw.color(entity.outputItem.color); @@ -70,7 +70,7 @@ public class ItemSource extends Block{ @Override public void update(Tile tile){ - ItemSourceEntity entity = tile.entity(); + ItemSourceEntity entity = tile.ent(); if(entity.outputItem == null) return; entity.items.set(entity.outputItem, 1); @@ -79,8 +79,8 @@ public class ItemSource extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - ItemSourceEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + ItemSourceEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.outputItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java index ec3f325db2..ac260679a7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -50,7 +50,7 @@ public class LiquidSource extends Block{ @Override public void update(Tile tile){ - LiquidSourceEntity entity = tile.entity(); + LiquidSourceEntity entity = tile.ent(); if(entity.source == null){ tile.entity.liquids.clear(); @@ -69,7 +69,7 @@ public class LiquidSource extends Block{ public void draw(Tile tile){ super.draw(tile); - LiquidSourceEntity entity = tile.entity(); + LiquidSourceEntity entity = tile.ent(); if(entity.source != null){ Draw.color(entity.source.color); @@ -79,8 +79,8 @@ public class LiquidSource extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - LiquidSourceEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + LiquidSourceEntity entity = tile.ent(); Array items = content.liquids(); @@ -109,7 +109,7 @@ public class LiquidSource extends Block{ @Override public void configured(Tile tile, Player player, int value){ - tile.entity().source = value == -1 ? null : content.liquid(value); + tile.ent().source = value == -1 ? null : content.liquid(value); } class LiquidSourceEntity extends TileEntity{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java index 3ee36c332b..557dddce45 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/CoreBlock.java @@ -43,7 +43,7 @@ public class CoreBlock extends StorageBlock{ public static void onUnitRespawn(Tile tile, Player player){ if(player == null || tile.entity == null) return; - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); Effects.effect(Fx.spawn, entity); entity.progress = 0; entity.spawnPlayer = player; @@ -76,13 +76,13 @@ public class CoreBlock extends StorageBlock{ @Override public int getMaximumAccepted(Tile tile, Item item){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); return item.type == ItemType.material ? entity.storageCapacity : 0; } @Override public void onProximityUpdate(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); for(Tile other : state.teams.get(tile.getTeam()).cores){ if(other != tile){ @@ -94,7 +94,7 @@ public class CoreBlock extends StorageBlock{ entity.storageCapacity = itemCapacity + entity.proximity().sum(e -> isContainer(e) ? e.block().itemCapacity : 0); entity.proximity().each(this::isContainer, t -> { t.entity.items = entity.items; - t.entity().linkedCore = tile; + t.ent().linkedCore = tile; }); for(Tile other : state.teams.get(tile.getTeam()).cores){ @@ -109,7 +109,7 @@ public class CoreBlock extends StorageBlock{ } for(Tile other : state.teams.get(tile.getTeam()).cores){ - CoreEntity oe = other.entity(); + CoreEntity oe = other.ent(); oe.storageCapacity = entity.storageCapacity; } } @@ -183,7 +183,7 @@ public class CoreBlock extends StorageBlock{ @Override public void drawLayer(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); if(entity.heat > 0.001f){ RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.spawnPlayer, mech); @@ -202,7 +202,7 @@ public class CoreBlock extends StorageBlock{ @Override public void update(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); if(entity.spawnPlayer != null){ if(!entity.spawnPlayer.isDead() || !entity.spawnPlayer.isAdded()){ @@ -225,7 +225,7 @@ public class CoreBlock extends StorageBlock{ @Override public boolean shouldActiveSound(Tile tile){ - CoreEntity entity = tile.entity(); + CoreEntity entity = tile.ent(); return entity.spawnPlayer != null; } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index 7746932916..710f97fbe3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -16,7 +16,7 @@ public abstract class StorageBlock extends Block{ @Override public boolean acceptItem(Item item, Tile tile, Tile source){ - StorageBlockEntity entity = tile.entity(); + StorageBlockEntity entity = tile.ent(); return entity.linkedCore != null ? entity.linkedCore.block().acceptItem(item, entity.linkedCore, source) : tile.entity.items.get(item) < getMaximumAccepted(tile, item); } @@ -27,7 +27,7 @@ public abstract class StorageBlock extends Block{ @Override public void drawSelect(Tile tile){ - StorageBlockEntity entity = tile.entity(); + StorageBlockEntity entity = tile.ent(); if(entity.linkedCore != null){ entity.linkedCore.block().drawSelect(entity.linkedCore); } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index b809fc351c..8186ade094 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -56,12 +56,12 @@ public class Unloader extends Block{ @Override public void configured(Tile tile, Player player, int value){ tile.entity.items.clear(); - tile.entity().sortItem = content.item(value); + tile.ent().sortItem = content.item(value); } @Override public void update(Tile tile){ - UnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.ent(); if(tile.entity.timer.get(timerUnload, speed / entity.timeScale) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ @@ -113,7 +113,7 @@ public class Unloader extends Block{ public void draw(Tile tile){ super.draw(tile); - UnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.ent(); Draw.color(entity.sortItem == null ? Color.clear : entity.sortItem.color); Draw.rect("unloader-center", tile.worldx(), tile.worldy()); @@ -121,8 +121,8 @@ public class Unloader extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - UnloaderEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + UnloaderEntity entity = tile.ent(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; tile.configure(item == null ? -1 : item.id); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index d44b966493..9423ac6cae 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -45,8 +45,8 @@ public class CommandCenter extends Block{ ObjectSet set = indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter); if(set.size > 0){ - CommandCenterEntity entity = tile.entity(); - CommandCenterEntity oe = set.first().entity(); + CommandCenterEntity entity = tile.ent(); + CommandCenterEntity oe = set.first().ent(); entity.command = oe.command; } } @@ -75,7 +75,7 @@ public class CommandCenter extends Block{ @Override public void draw(Tile tile){ - CommandCenterEntity entity = tile.entity(); + CommandCenterEntity entity = tile.ent(); super.draw(tile); float size = IconSize.small.size/4f; @@ -88,8 +88,8 @@ public class CommandCenter extends Block{ } @Override - public void buildTable(Tile tile, Table table){ - CommandCenterEntity entity = tile.entity(); + public void buildConfiguration(Tile tile, Table table){ + CommandCenterEntity entity = tile.ent(); ButtonGroup group = new ButtonGroup<>(); Table buttons = new Table(); @@ -109,7 +109,7 @@ public class CommandCenter extends Block{ for(Tile center : indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){ if(center.block() instanceof CommandCenter){ - CommandCenterEntity entity = center.entity(); + CommandCenterEntity entity = center.ent(); entity.command = command; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index c5a07cdead..594ec7b154 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -49,7 +49,7 @@ public class MechPad extends Block{ public static void onMechFactoryTap(Player player, Tile tile){ if(player == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(!entity.cons.valid()) return; player.beginRespawning(entity); @@ -60,7 +60,7 @@ public class MechPad extends Block{ public static void onMechFactoryDone(Tile tile){ if(!(tile.entity instanceof MechFactoryEntity)) return; - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); Effects.effect(Fx.spawn, entity); @@ -80,7 +80,7 @@ public class MechPad extends Block{ } protected static boolean checkValidTap(Tile tile, Player player){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); return !player.isDead() && tile.interactable(player.getTeam()) && Math.abs(player.x - tile.drawx()) <= tile.block().size * tilesize && Math.abs(player.y - tile.drawy()) <= tile.block().size * tilesize && entity.cons.valid() && entity.player == null; } @@ -97,7 +97,7 @@ public class MechPad extends Block{ @Override public void tapped(Tile tile, Player player){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(checkValidTap(tile, player)){ Call.onMechFactoryTap(player, tile); @@ -109,7 +109,7 @@ public class MechPad extends Block{ @Override public void drawLayer(Tile tile){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(entity.player != null){ RespawnBlock.drawRespawn(tile, entity.heat, entity.progress, entity.time, entity.player, (!entity.sameMech && entity.player.mech == mech ? mech : Mechs.starter)); @@ -118,7 +118,7 @@ public class MechPad extends Block{ @Override public void update(Tile tile){ - MechFactoryEntity entity = tile.entity(); + MechFactoryEntity entity = tile.ent(); if(entity.player != null){ entity.player.set(tile.drawx(), tile.drawy()); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index e02381d73d..a6bfb1ffeb 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -66,14 +66,14 @@ public class RepairPoint extends Block{ @Override public void drawLayer(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); Draw.rect(region, tile.drawx(), tile.drawy(), entity.rotation - 90); } @Override public void drawLayer2(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); if(entity.target != null && Angles.angleDist(entity.angleTo(entity.target), entity.rotation) < 30f){ @@ -95,7 +95,7 @@ public class RepairPoint extends Block{ @Override public void update(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); boolean targetIsBeingRepaired = false; if(entity.target != null && (entity.target.isDead() || entity.target.dst(tile) > repairRadius || entity.target.health >= entity.target.maxHealth())){ @@ -122,7 +122,7 @@ public class RepairPoint extends Block{ @Override public boolean shouldConsume(Tile tile){ - RepairPointEntity entity = tile.entity(); + RepairPointEntity entity = tile.ent(); return entity.target != null; } diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 93e19b7266..8879f991b5 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -48,7 +48,7 @@ public class UnitFactory extends Block{ public static void onUnitFactorySpawn(Tile tile, int spawns){ if(!(tile.entity instanceof UnitFactoryEntity) || !(tile.block() instanceof UnitFactory)) return; - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); UnitFactory factory = (UnitFactory)tile.block(); entity.buildTime = 0f; @@ -110,7 +110,7 @@ public class UnitFactory extends Block{ @Override public void unitRemoved(Tile tile, Unit unit){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); entity.spawned--; entity.spawned = Math.max(entity.spawned, 0); } @@ -122,7 +122,7 @@ public class UnitFactory extends Block{ @Override public void draw(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); TextureRegion region = unitType.icon(Cicon.full); Draw.rect(name, tile.drawx(), tile.drawy()); @@ -153,7 +153,7 @@ public class UnitFactory extends Block{ @Override public void update(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); if(entity.spawned >= maxSpawn){ return; @@ -184,7 +184,7 @@ public class UnitFactory extends Block{ @Override public boolean shouldConsume(Tile tile){ - UnitFactoryEntity entity = tile.entity(); + UnitFactoryEntity entity = tile.ent(); return entity.spawned < maxSpawn; } diff --git a/tests/src/test/java/power/DirectConsumerTests.java b/tests/src/test/java/power/DirectConsumerTests.java index 89ed331c8b..0892b13d88 100644 --- a/tests/src/test/java/power/DirectConsumerTests.java +++ b/tests/src/test/java/power/DirectConsumerTests.java @@ -41,7 +41,7 @@ public class DirectConsumerTests extends PowerTestFixture{ consumerTile.entity.items.add(Items.lead, leadAmount); Tile producerTile = createFakeTile(2, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; PowerGraph graph = new PowerGraph(); graph.add(producerTile); diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index e6bc2a20de..5e5a2ed034 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -52,7 +52,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ }; tile = createFakeTile(0, 0, generator); - entity = tile.entity(); + entity = tile.ent(); } /** Tests the consumption and efficiency when being supplied with liquids. */ diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index 6b253e4f29..b3353cfc2c 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -51,7 +51,7 @@ public class PowerTests extends PowerTestFixture{ void simulateDirectConsumption(float producedPower, float requiredPower, float expectedSatisfaction, String parameterDescription){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; Tile directConsumerTile = createFakeTile(0, 1, createFakeDirectConsumer(requiredPower)); PowerGraph powerGraph = new PowerGraph(); @@ -91,7 +91,7 @@ public class PowerTests extends PowerTestFixture{ if(producedPower > 0.0f){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(producedPower)); - producerTile.entity().productionEfficiency = 1f; + producerTile.ent().productionEfficiency = 1f; powerGraph.add(producerTile); } Tile directConsumerTile = null; @@ -116,7 +116,7 @@ public class PowerTests extends PowerTestFixture{ @Test void directConsumptionStopsWithNoPower(){ Tile producerTile = createFakeTile(0, 0, createFakeProducerBlock(10.0f)); - producerTile.entity().productionEfficiency = 1.0f; + producerTile.ent().productionEfficiency = 1.0f; Tile consumerTile = createFakeTile(0, 1, createFakeDirectConsumer(5.0f)); PowerGraph powerGraph = new PowerGraph(); @@ -133,7 +133,7 @@ public class PowerTests extends PowerTestFixture{ assertEquals(0.0f, consumerTile.entity.power.status, Mathf.FLOAT_ROUNDING_ERROR); if(consumerTile.block().consumes.hasPower()){ ConsumePower consumePower = consumerTile.block().consumes.getPower(); - assertFalse(consumePower.valid(consumerTile.entity())); + assertFalse(consumePower.valid(consumerTile.ent())); } } } diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 6914d09636..ac29c6adb4 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -9,6 +9,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.gen.*; import org.reflections.*; import org.reflections.scanners.*; import org.reflections.util.*; @@ -21,10 +22,11 @@ public class ScriptStubGenerator{ public static void main(String[] args){ String base = "io.anuke.mindustry"; - Array blacklist = Array.with("plugin", "mod", "net", "io", "tools", "gen"); + Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); - Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class); - Array nopackage = Array.with("io.anuke.arc.func", "java.lang", "java"); + Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class); + Array nopackage = Array.with("java.lang", "java"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + "\n" + From e06d61dcc93119d6a61643376e8218e038321f1d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 18:38:56 -0500 Subject: [PATCH 048/107] FX cleanup --- core/src/io/anuke/mindustry/content/Fx.java | 117 ------------------ .../io/anuke/mindustry/entities/Effects.java | 2 + 2 files changed, 2 insertions(+), 117 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index d7aeed4c65..4c31f0bd1a 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -48,28 +48,24 @@ public class Fx implements ContentList{ Draw.rect(unit.getIconRegion(), e.x, e.y, unit.getIconRegion().getWidth() * Draw.scl * scl, unit.getIconRegion().getWidth() * Draw.scl * scl, 180f); - Draw.reset(); }); commandSend = new Effect(28, e -> { Draw.color(Pal.command); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); - Draw.color(); }); placeBlock = new Effect(16, e -> { Draw.color(Pal.accent); Lines.stroke(3f - e.fin() * 2f); Lines.square(e.x, e.y, tilesize / 2f * e.rotation + e.fin() * 3f); - Draw.reset(); }); tapBlock = new Effect(12, e -> { Draw.color(Pal.accent); Lines.stroke(3f - e.fin() * 2f); Lines.circle(e.x, e.y, 4f + (tilesize / 1.5f * e.rotation) * e.fin()); - Draw.reset(); }); breakBlock = new Effect(12, e -> { @@ -80,41 +76,35 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 3 + (int)(e.rotation * 3), e.rotation * 2f + (tilesize * e.rotation) * e.finpow(), (x, y) -> { Fill.square(e.x + x, e.y + y, 1f + e.fout() * (3f + e.rotation)); }); - Draw.reset(); }); select = new Effect(23, e -> { Draw.color(Pal.accent); Lines.stroke(e.fout() * 3f); Lines.circle(e.x, e.y, 3f + e.fin() * 14f); - Draw.reset(); }); smoke = new Effect(100, e -> { Draw.color(Color.gray, Pal.darkishGray, e.fin()); float size = 7f - e.fin() * 7f; Draw.rect("circle", e.x, e.y, size, size); - Draw.reset(); }); magmasmoke = new Effect(110, e -> { Draw.color(Color.gray); Fill.circle(e.x, e.y, e.fslope() * 6f); - Draw.reset(); }); spawn = new Effect(30, e -> { Lines.stroke(2f * e.fout()); Draw.color(Pal.accent); Lines.poly(e.x, e.y, 4, 5f + e.fin() * 12f); - Draw.reset(); }); padlaunch = new Effect(10, e -> { Lines.stroke(4f * e.fout()); Draw.color(Pal.accent); Lines.poly(e.x, e.y, 4, 5f + e.fin() * 60f); - Draw.reset(); }); vtolHover = new Effect(40f, e -> { @@ -122,7 +112,6 @@ public class Fx implements ContentList{ float ang = e.rotation + Mathf.randomSeedRange(e.id, 30f); Draw.color(Pal.lightFlame, Pal.lightOrange, e.fin()); Fill.circle(e.x + Angles.trnsx(ang, len), e.y + Angles.trnsy(ang, len), 2f * e.fout()); - Draw.reset(); }); unitDrop = new GroundEffect(30, e -> { @@ -130,7 +119,6 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 9, 3 + 20f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.4f); }); - Draw.reset(); }); unitLand = new GroundEffect(30, e -> { @@ -138,42 +126,36 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 6, 17f * e.finpow(), (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.3f); }); - Draw.reset(); }); unitPickup = new GroundEffect(18, e -> { Draw.color(Pal.lightishGray); Lines.stroke(e.fin() * 2f); Lines.poly(e.x, e.y, 4, 13f * e.fout()); - Draw.reset(); }); landShock = new GroundEffect(12, e -> { Draw.color(Pal.lancerLaser); Lines.stroke(e.fout() * 3f); Lines.poly(e.x, e.y, 12, 20f * e.fout()); - Draw.reset(); }); pickup = new Effect(18, e -> { Draw.color(Pal.lightishGray); Lines.stroke(e.fout() * 2f); Lines.spikes(e.x, e.y, 1f + e.fin() * 6f, e.fout() * 4f, 6); - Draw.reset(); }); healWave = new Effect(22, e -> { Draw.color(Pal.heal); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 60f); - Draw.color(); }); heal = new Effect(11, e -> { Draw.color(Pal.heal); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 2f + e.finpow() * 7f); - Draw.color(); }); @@ -193,7 +175,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitFuse = new Effect(14, e -> { @@ -212,7 +193,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitBulletBig = new Effect(13, e -> { @@ -224,7 +204,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1.5f); }); - Draw.reset(); }); hitFlameSmall = new Effect(14, e -> { @@ -236,7 +215,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 3 + 1f); }); - Draw.reset(); }); hitLiquid = new Effect(16, e -> { @@ -246,7 +224,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2f); }); - Draw.reset(); }); hitLancer = new Effect(12, e -> { @@ -258,7 +235,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - Draw.reset(); }); hitMeltdown = new Effect(12, e -> { @@ -270,14 +246,12 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); }); - Draw.reset(); }); hitLaser = new Effect(8, e -> { Draw.color(Color.white, Pal.heal, e.fin()); Lines.stroke(0.5f + e.fout()); Lines.circle(e.x, e.y, e.fin() * 5f); - Draw.reset(); }); despawn = new Effect(12, e -> { @@ -289,7 +263,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, ang, e.fout() * 2 + 1f); }); - Draw.reset(); }); flakExplosion = new Effect(20, e -> { @@ -313,7 +286,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); plasticExplosion = new Effect(24, e -> { @@ -337,7 +309,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); plasticExplosionFlak = new Effect(28, e -> { @@ -361,7 +332,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); blastExplosion = new Effect(22, e -> { @@ -385,32 +355,27 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); artilleryTrail = new Effect(50, e -> { Draw.color(e.color); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); incendTrail = new Effect(50, e -> { Draw.color(Pal.lightOrange); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); missileTrail = new Effect(50, e -> { Draw.color(e.color); Fill.circle(e.x, e.y, e.rotation * e.fout()); - Draw.reset(); }); absorb = new Effect(12, e -> { Draw.color(Pal.accent); Lines.stroke(2f * e.fout()); Lines.circle(e.x, e.y, 5f * e.fout()); - Draw.reset(); }); flakExplosionBig = new Effect(30, e -> { @@ -434,7 +399,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); @@ -445,7 +409,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.1f + e.fout() * 1.4f); }); - Draw.color(); }); fire = new Effect(50f, e -> { @@ -467,7 +430,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - Draw.color(); }); steam = new Effect(35f, e -> { @@ -477,7 +439,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fslope() * 1.5f); }); - Draw.color(); }); fireballsmoke = new Effect(25f, e -> { @@ -487,7 +448,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - Draw.color(); }); ballfire = new Effect(25f, e -> { @@ -497,7 +457,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.2f + e.fout() * 1.5f); }); - Draw.color(); }); freezing = new Effect(40f, e -> { @@ -507,7 +466,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1.2f); }); - Draw.color(); }); melting = new Effect(40f, e -> { @@ -517,7 +475,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, .2f + e.fout() * 1.2f); }); - Draw.color(); }); wet = new Effect(40f, e -> { @@ -527,7 +484,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1f); }); - Draw.color(); }); oily = new Effect(42f, e -> { @@ -537,7 +493,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1f); }); - Draw.color(); }); overdriven = new Effect(20f, e -> { @@ -547,7 +502,6 @@ public class Fx implements ContentList{ Fill.square(e.x + x, e.y + y, e.fout() * 2.3f + 0.5f); }); - Draw.color(); }); dropItem = new Effect(20f, e -> { @@ -562,35 +516,30 @@ public class Fx implements ContentList{ Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 2f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 28f); - Draw.reset(); }); bigShockwave = new Effect(10f, 80f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f); Lines.circle(e.x, e.y, e.fin() * 50f); - Draw.reset(); }); nuclearShockwave = new Effect(10f, 200f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 140f); - Draw.reset(); }); impactShockwave = new Effect(13f, 300f, e -> { Draw.color(Pal.lighterOrange, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 4f + 0.2f); Lines.circle(e.x, e.y, e.fin() * 200f); - Draw.reset(); }); spawnShockwave = new Effect(20f, 400f, e -> { Draw.color(Color.white, Color.lightGray, e.fin()); Lines.stroke(e.fout() * 3f + 0.5f); Lines.circle(e.x, e.y, e.fin() * (e.rotation + 50f)); - Draw.reset(); }); explosion = new Effect(30, e -> { @@ -613,7 +562,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); dynamicExplosion = new Effect(30, e -> { @@ -638,7 +586,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + out * 4 * (3f + intensity)); }); - Draw.reset(); }); blockExplosion = new Effect(30, e -> { @@ -661,7 +608,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); }); - Draw.reset(); }); blockExplosionSmoke = new Effect(30, e -> { @@ -672,7 +618,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x / 2f, e.y + y / 2f, e.fout() * 1f); }); - Draw.reset(); }); @@ -681,7 +626,6 @@ public class Fx implements ContentList{ float w = 1f + 5 * e.fout(); Drawf.tri(e.x, e.y, w, 15f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 3f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootHeal = new Effect(8, e -> { @@ -689,7 +633,6 @@ public class Fx implements ContentList{ float w = 1f + 5 * e.fout(); Drawf.tri(e.x, e.y, w, 17f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootSmallSmoke = new Effect(20f, e -> { @@ -699,7 +642,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 1.5f); }); - Draw.reset(); }); shootBig = new Effect(9, e -> { @@ -707,7 +649,6 @@ public class Fx implements ContentList{ float w = 1.2f + 7 * e.fout(); Drawf.tri(e.x, e.y, w, 25f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 4f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootBig2 = new Effect(10, e -> { @@ -715,7 +656,6 @@ public class Fx implements ContentList{ float w = 1.2f + 8 * e.fout(); Drawf.tri(e.x, e.y, w, 29f * e.fout(), e.rotation); Drawf.tri(e.x, e.y, w, 5f * e.fout(), e.rotation + 180f); - Draw.reset(); }); shootBigSmoke = new Effect(17f, e -> { @@ -725,7 +665,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2f + 0.2f); }); - Draw.reset(); }); shootBigSmoke2 = new Effect(18f, e -> { @@ -735,7 +674,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, e.fout() * 2.4f + 0.2f); }); - Draw.reset(); }); shootSmallFlame = new Effect(32f, e -> { @@ -745,7 +683,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.5f); }); - Draw.reset(); }); shootPyraFlame = new Effect(33f, e -> { @@ -755,7 +692,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.65f + e.fout() * 1.6f); }); - Draw.reset(); }); shootLiquid = new Effect(40f, e -> { @@ -765,7 +701,6 @@ public class Fx implements ContentList{ Fill.circle(e.x + x, e.y + y, 0.5f + e.fout() * 2.5f); }); - Draw.reset(); }); shellEjectSmall = new GroundEffect(30f, 400f, e -> { @@ -780,7 +715,6 @@ public class Fx implements ContentList{ e.y + Angles.trnsy(lr, len) + Mathf.randomSeedRange(e.id + i + 8, 3f * e.fin()), 1f, 2f, rot + e.fin() * 50f * i); - Draw.color(); }); shellEjectMedium = new GroundEffect(34f, 400f, e -> { @@ -804,7 +738,6 @@ public class Fx implements ContentList{ }); } - Draw.color(); }); shellEjectBig = new GroundEffect(22f, 400f, e -> { @@ -829,7 +762,6 @@ public class Fx implements ContentList{ }); } - Draw.color(); }); lancerLaserShoot = new Effect(21f, e -> { @@ -839,7 +771,6 @@ public class Fx implements ContentList{ Drawf.tri(e.x, e.y, 4f * e.fout(), 29f, e.rotation + 90f * i); } - Draw.reset(); }); lancerLaserShootSmoke = new Effect(26f, e -> { @@ -849,7 +780,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f); }); - Draw.reset(); }); lancerLaserCharge = new Effect(38f, e -> { @@ -859,7 +789,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 3f + 1f); }); - Draw.reset(); }); lancerLaserChargeBegin = new Effect(71f, e -> { @@ -877,7 +806,6 @@ public class Fx implements ContentList{ Drawf.tri(e.x + x, e.y + y, e.fslope() * 3f + 1, e.fslope() * 3f + 1, Mathf.angle(x, y)); }); - Draw.reset(); }); lightningShoot = new Effect(12f, e -> { @@ -888,7 +816,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 5f + 2f); }); - Draw.reset(); }); @@ -897,7 +824,6 @@ public class Fx implements ContentList{ float size = 1f + e.fout() * 5f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); nuclearsmoke = new Effect(40, e -> { @@ -905,7 +831,6 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); nuclearcloud = new Effect(90, 200f, e -> { @@ -913,7 +838,6 @@ public class Fx implements ContentList{ float size = e.fout() * 14f; Draw.color(Color.lime, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); impactsmoke = new Effect(60, e -> { @@ -921,7 +845,6 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); impactcloud = new Effect(140, 400f, e -> { @@ -929,7 +852,6 @@ public class Fx implements ContentList{ float size = e.fout() * 15f; Draw.color(Pal.lighterOrange, Color.lightGray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); redgeneratespark = new Effect(18, e -> { @@ -937,7 +859,6 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Pal.redSpark, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); generatespark = new Effect(18, e -> { @@ -945,7 +866,6 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Pal.orangeSpark, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); fuelburn = new Effect(23, e -> { @@ -953,70 +873,60 @@ public class Fx implements ContentList{ float len = e.fout() * 4f; Draw.color(Color.lightGray, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, len, len); - Draw.reset(); }); }); plasticburn = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 5f, (x, y) -> { Draw.color(Color.valueOf("e9ead3"), Color.gray, e.fin()); Fill.circle(e.x + x, e.y + y, e.fout() * 1f); - Draw.reset(); }); }); pulverize = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); pulverizeRed = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.redDust, Pal.stoneGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); pulverizeRedder = new Effect(40, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 9f, (x, y) -> { Draw.color(Pal.redderDust, Pal.stoneGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2.5f + 0.5f, 45); - Draw.reset(); }); }); pulverizeSmall = new Effect(30, e -> { Angles.randLenVectors(e.id, 3, e.fin() * 5f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); - Draw.reset(); }); }); pulverizeMedium = new Effect(30, e -> { Angles.randLenVectors(e.id, 5, 3f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.stoneGray); Fill.square(e.x + x, e.y + y, e.fout() * 1f + 0.5f, 45); - Draw.reset(); }); }); producesmoke = new Effect(12, e -> { Angles.randLenVectors(e.id, 8, 4f + e.fin() * 18f, (x, y) -> { Draw.color(Color.white, Pal.accent, e.fin()); Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45); - Draw.reset(); }); }); smeltsmoke = new Effect(15, e -> { Angles.randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> { Draw.color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); - Draw.reset(); }); }); formsmoke = new Effect(40, e -> { Angles.randLenVectors(e.id, 6, 5f + e.fin() * 8f, (x, y) -> { Draw.color(Pal.plasticSmoke, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, 0.2f + e.fout() * 2f, 45); - Draw.reset(); }); }); blastsmoke = new Effect(26, e -> { @@ -1024,7 +934,6 @@ public class Fx implements ContentList{ float size = 2f + e.fout() * 6f; Draw.color(Color.lightGray, Color.darkGray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); lava = new Effect(18, e -> { @@ -1032,79 +941,66 @@ public class Fx implements ContentList{ float size = e.fslope() * 4f; Draw.color(Color.orange, Color.gray, e.fin()); Draw.rect("circle", e.x + x, e.y + y, size, size); - Draw.reset(); }); }); dooropen = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fin() * 2f); - Draw.reset(); }); doorclose = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize / 2f + e.fout() * 2f); - Draw.reset(); }); dooropenlarge = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fin() * 2f); - Draw.reset(); }); doorcloselarge = new Effect(10, e -> { Lines.stroke(e.fout() * 1.6f); Lines.square(e.x, e.y, tilesize + e.fout() * 2f); - Draw.reset(); }); purify = new Effect(10, e -> { Draw.color(Color.royal, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); purifyoil = new Effect(10, e -> { Draw.color(Color.black, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); purifystone = new Effect(10, e -> { Draw.color(Color.orange, Color.gray, e.fin()); Lines.stroke(2f); Lines.spikes(e.x, e.y, e.fin() * 4f, 2, 6); - Draw.reset(); }); generate = new Effect(11, e -> { Draw.color(Color.orange, Color.yellow, e.fin()); Lines.stroke(1f); Lines.spikes(e.x, e.y, e.fin() * 5f, 2, 8); - Draw.reset(); }); mine = new Effect(20, e -> { Angles.randLenVectors(e.id, 6, 3f + e.fin() * 6f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f, 45); - Draw.reset(); }); }); mineBig = new Effect(30, e -> { Angles.randLenVectors(e.id, 6, 4f + e.fin() * 8f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.2f, 45); - Draw.reset(); }); }); mineHuge = new Effect(40, e -> { Angles.randLenVectors(e.id, 8, 5f + e.fin() * 10f, (x, y) -> { Draw.color(e.color, Color.lightGray, e.fin()); Fill.square(e.x + x, e.y + y, e.fout() * 2f + 0.5f, 45); - Draw.reset(); }); }); smelt = new Effect(20, e -> { Angles.randLenVectors(e.id, 6, 2f + e.fin() * 5f, (x, y) -> { Draw.color(Color.white, e.color, e.fin()); Fill.square(e.x + x, e.y + y, 0.5f + e.fout() * 2f, 45); - Draw.reset(); }); }); teleportActivate = new Effect(50, e -> { @@ -1121,7 +1017,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - Draw.reset(); }); teleport = new Effect(60, e -> { Draw.color(e.color); @@ -1132,7 +1027,6 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fin() * 4f + 1f); }); - Draw.reset(); }); teleportOut = new Effect(20, e -> { Draw.color(e.color); @@ -1143,13 +1037,11 @@ public class Fx implements ContentList{ Lines.lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fslope() * 4f + 1f); }); - Draw.reset(); }); ripple = new GroundEffect(false, 30, e -> { Draw.color(Tmp.c1.set(e.color).mul(1.2f)); Lines.stroke(e.fout() + 0.4f); Lines.circle(e.x, e.y, 2f + e.fin() * 4f); - Draw.reset(); }); bubble = new Effect(20, e -> { @@ -1158,56 +1050,47 @@ public class Fx implements ContentList{ Angles.randLenVectors(e.id, 2, 8f, (x, y) -> { Lines.circle(e.x + x, e.y + y, 1f + e.fin() * 3f); }); - Draw.reset(); }); launch = new Effect(28, e -> { Draw.color(Pal.command); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, 4f + e.finpow() * 120f); - Draw.color(); }); healWaveMend = new Effect(40, e -> { Draw.color(e.color); Lines.stroke(e.fout() * 2f); Lines.circle(e.x, e.y, e.finpow() * e.rotation); - Draw.color(); }); overdriveWave = new Effect(50, e -> { Draw.color(e.color); Lines.stroke(e.fout() * 1f); Lines.circle(e.x, e.y, e.finpow() * e.rotation); - Draw.color(); }); healBlock = new Effect(20, e -> { Draw.color(Pal.heal); Lines.stroke(2f * e.fout() + 0.5f); Lines.square(e.x, e.y, 1f + (e.fin() * e.rotation * tilesize / 2f - 1f)); - Draw.color(); }); healBlockFull = new Effect(20, e -> { Draw.color(e.color); Draw.alpha(e.fout()); - Fill.square(e.x, e.y, e.rotation * tilesize / 2f); - Draw.color(); }); overdriveBlockFull = new Effect(60, e -> { Draw.color(e.color); Draw.alpha(e.fslope() * 0.4f); Fill.square(e.x, e.y, e.rotation * tilesize); - Draw.color(); }); shieldBreak = new Effect(40, e -> { Draw.color(Pal.accent); Lines.stroke(3f * e.fout()); Lines.poly(e.x, e.y, 6, e.rotation + e.fin(), 90); - Draw.reset(); }); coreLand = new Effect(120f, e -> { diff --git a/core/src/io/anuke/mindustry/entities/Effects.java b/core/src/io/anuke/mindustry/entities/Effects.java index 2647fc2427..ca1492bdbf 100644 --- a/core/src/io/anuke/mindustry/entities/Effects.java +++ b/core/src/io/anuke/mindustry/entities/Effects.java @@ -4,6 +4,7 @@ import io.anuke.arc.Core; import io.anuke.arc.collection.Array; import io.anuke.arc.func.Cons; import io.anuke.arc.graphics.Color; +import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Position; import io.anuke.arc.util.pooling.Pools; @@ -36,6 +37,7 @@ public class Effects{ public static void renderEffect(int id, Effect render, Color color, float life, float rotation, float x, float y, Object data){ container.set(id, color, life, render.lifetime, rotation, x, y, data); render.draw.render(container); + Draw.reset(); } public static Effect getEffect(int id){ From 2554433f8db17427d70503593ff9afe6a83a7435 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 21:29:03 -0500 Subject: [PATCH 049/107] Fixed #1184 --- .../io/anuke/mindustry/mod/ContentParser.java | 34 +++++++++++-------- .../mindustry/desktop/DesktopLauncher.java | 3 ++ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index ded39c15f0..78a4628473 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -173,20 +173,26 @@ public class ContentParser{ } }else{ //TODO generate dynamically instead of doing.. this - Class type = resolve(getType(value), - "io.anuke.mindustry.world", - "io.anuke.mindustry.world.blocks", - "io.anuke.mindustry.world.blocks.defense", - "io.anuke.mindustry.world.blocks.defense.turrets", - "io.anuke.mindustry.world.blocks.distribution", - "io.anuke.mindustry.world.blocks.liquid", - "io.anuke.mindustry.world.blocks.logic", - "io.anuke.mindustry.world.blocks.power", - "io.anuke.mindustry.world.blocks.production", - "io.anuke.mindustry.world.blocks.sandbox", - "io.anuke.mindustry.world.blocks.storage", - "io.anuke.mindustry.world.blocks.units" - ); + Class type; + + try{ + type = resolve(getType(value), + "io.anuke.mindustry.world", + "io.anuke.mindustry.world.blocks", + "io.anuke.mindustry.world.blocks.defense", + "io.anuke.mindustry.world.blocks.defense.turrets", + "io.anuke.mindustry.world.blocks.distribution", + "io.anuke.mindustry.world.blocks.liquid", + "io.anuke.mindustry.world.blocks.logic", + "io.anuke.mindustry.world.blocks.power", + "io.anuke.mindustry.world.blocks.production", + "io.anuke.mindustry.world.blocks.sandbox", + "io.anuke.mindustry.world.blocks.storage", + "io.anuke.mindustry.world.blocks.units" + ); + }catch(IllegalArgumentException e){ + type = Block.class; + } block = make(type, mod + "-" + name); } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 40cb76fad8..6b5236da58 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -107,6 +107,9 @@ public class DesktopLauncher extends ClientLauncher{ if(SteamAPI.restartAppIfNecessary(SVars.steamID)){ System.exit(0); } + }catch(NullPointerException ignored){ + steam = false; + Log.info("Running in offline mode."); }catch(Throwable e){ steam = false; Log.err("Failed to load Steam native libraries."); From 9e07b95223341a5d21d37cee0641b415190aec89 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 8 Dec 2019 22:50:54 -0500 Subject: [PATCH 050/107] Functional tweaks --- core/assets/scripts/base.js | 4 ++++ core/assets/scripts/global.js | 3 +++ core/src/io/anuke/mindustry/ui/Styles.java | 3 +++ 3 files changed, 10 insertions(+) diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index ab3d740c91..9b3fb5dcb4 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -11,5 +11,9 @@ const extend = function(classType, params){ } const run = method => new java.lang.Runnable(){run: method} +const boolf = method => new Boolf(){get: method} +const boolp = method => new Boolp(){get: method} +const cons = method => new Cons(){get: method} +const prov = method => new Prov(){get: method} const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) const Calls = Packages.io.anuke.mindustry.gen.Call \ No newline at end of file diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 60a315c74b..72a5440403 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -13,6 +13,9 @@ const extend = function(classType, params){ } const run = method => new java.lang.Runnable(){run: method} +const boolf = method => new Boolf(){get: method} +const boolp = method => new Boolp(){get: method} +const cons = method => new Cons(){get: method} const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) const Calls = Packages.io.anuke.mindustry.gen.Call importPackage(Packages.io.anuke.arc) diff --git a/core/src/io/anuke/mindustry/ui/Styles.java b/core/src/io/anuke/mindustry/ui/Styles.java index 29c1321009..af519a4b14 100644 --- a/core/src/io/anuke/mindustry/ui/Styles.java +++ b/core/src/io/anuke/mindustry/ui/Styles.java @@ -201,6 +201,9 @@ public class Styles{ down = flatDown; up = black6; over = flatOver; + disabled = black8; + imageDisabledColor = Color.lightGray; + imageUpColor = Color.white; }}; clearToggleTransi = new ImageButtonStyle(){{ down = flatDown; From 74dc31b10a82763d4f1ff29d32ae430ee87b9def Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 11:27:09 -0500 Subject: [PATCH 051/107] Removed unnecessary unit types --- .../io/anuke/mindustry/content/UnitTypes.java | 30 ++-- .../mindustry/entities/type/base/Crawler.java | 4 - .../mindustry/entities/type/base/Dagger.java | 5 - .../mindustry/entities/type/base/Draug.java | 4 - .../mindustry/entities/type/base/Eruptor.java | 4 - .../entities/type/base/Fortress.java | 4 - .../mindustry/entities/type/base/Ghoul.java | 5 - .../base/{Revenant.java => HoverUnit.java} | 2 +- .../mindustry/entities/type/base/Phantom.java | 5 - .../mindustry/entities/type/base/Spirit.java | 4 - .../mindustry/entities/type/base/Titan.java | 5 - .../mindustry/entities/type/base/Wraith.java | 5 - .../io/versions/LegacyTypeTable.java | 162 ++++++++++-------- .../io/anuke/mindustry/mod/ContentParser.java | 23 ++- .../src/io/anuke/mindustry/type/UnitType.java | 5 +- tests/src/test/java/ApplicationTests.java | 8 +- 16 files changed, 132 insertions(+), 143 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Crawler.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Dagger.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Draug.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Eruptor.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Fortress.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Ghoul.java rename core/src/io/anuke/mindustry/entities/type/base/{Revenant.java => HoverUnit.java} (96%) delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Phantom.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Spirit.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Titan.java delete mode 100644 core/src/io/anuke/mindustry/entities/type/base/Wraith.java diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 35eb9890bd..d6e1dd232a 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -17,7 +17,7 @@ public class UnitTypes implements ContentList{ @Override public void load(){ - draug = new UnitType("draug", Draug::new){{ + draug = new UnitType("draug", MinerDrone::new){{ flying = true; drag = 0.01f; speed = 0.3f; @@ -32,7 +32,7 @@ public class UnitTypes implements ContentList{ }}; }}; - spirit = new UnitType("spirit", Spirit::new){{ + spirit = new UnitType("spirit", RepairDrone::new){{ flying = true; drag = 0.01f; speed = 0.42f; @@ -53,7 +53,7 @@ public class UnitTypes implements ContentList{ }}; }}; - phantom = new UnitType("phantom", Phantom::new){{ + phantom = new UnitType("phantom", BuilderDrone::new){{ flying = true; drag = 0.01f; mass = 2f; @@ -76,7 +76,7 @@ public class UnitTypes implements ContentList{ }}; }}; - dagger = new UnitType("dagger", Dagger::new){{ + dagger = new UnitType("dagger", GroundUnit::new){{ maxVelocity = 1.1f; speed = 0.2f; drag = 0.4f; @@ -92,7 +92,7 @@ public class UnitTypes implements ContentList{ }}; }}; - crawler = new UnitType("crawler", Crawler::new){{ + crawler = new UnitType("crawler", GroundUnit::new){{ maxVelocity = 1.27f; speed = 0.285f; drag = 0.4f; @@ -123,7 +123,7 @@ public class UnitTypes implements ContentList{ }}; }}; - titan = new UnitType("titan", Titan::new){{ + titan = new UnitType("titan", GroundUnit::new){{ maxVelocity = 0.8f; speed = 0.22f; drag = 0.4f; @@ -145,7 +145,7 @@ public class UnitTypes implements ContentList{ }}; }}; - fortress = new UnitType("fortress", Fortress::new){{ + fortress = new UnitType("fortress", GroundUnit::new){{ maxVelocity = 0.78f; speed = 0.15f; drag = 0.4f; @@ -167,7 +167,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eruptor = new UnitType("eruptor", Eruptor::new){{ + eruptor = new UnitType("eruptor", GroundUnit::new){{ maxVelocity = 0.81f; speed = 0.16f; drag = 0.4f; @@ -189,7 +189,7 @@ public class UnitTypes implements ContentList{ }}; }}; - chaosArray = new UnitType("chaos-array", Dagger::new){{ + chaosArray = new UnitType("chaos-array", GroundUnit::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -213,7 +213,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eradicator = new UnitType("eradicator", Dagger::new){{ + eradicator = new UnitType("eradicator", GroundUnit::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -238,7 +238,7 @@ public class UnitTypes implements ContentList{ }}; }}; - wraith = new UnitType("wraith", Wraith::new){{ + wraith = new UnitType("wraith", FlyingUnit::new){{ speed = 0.3f; maxVelocity = 1.9f; drag = 0.01f; @@ -257,7 +257,7 @@ public class UnitTypes implements ContentList{ }}; }}; - ghoul = new UnitType("ghoul", Ghoul::new){{ + ghoul = new UnitType("ghoul", FlyingUnit::new){{ health = 220; speed = 0.2f; maxVelocity = 1.4f; @@ -281,7 +281,7 @@ public class UnitTypes implements ContentList{ }}; }}; - revenant = new UnitType("revenant", Revenant::new){{ + revenant = new UnitType("revenant", HoverUnit::new){{ health = 1000; mass = 5f; hitsize = 20f; @@ -312,7 +312,7 @@ public class UnitTypes implements ContentList{ }}; }}; - lich = new UnitType("lich", Revenant::new){{ + lich = new UnitType("lich", HoverUnit::new){{ health = 6000; mass = 20f; hitsize = 40f; @@ -345,7 +345,7 @@ public class UnitTypes implements ContentList{ }}; }}; - reaper = new UnitType("reaper", Revenant::new){{ + reaper = new UnitType("reaper", HoverUnit::new){{ health = 11000; mass = 30f; hitsize = 56f; diff --git a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java b/core/src/io/anuke/mindustry/entities/type/base/Crawler.java deleted file mode 100644 index 44da8bea5f..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Crawler extends GroundUnit{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java b/core/src/io/anuke/mindustry/entities/type/base/Dagger.java deleted file mode 100644 index 09a39daaa7..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Dagger extends GroundUnit{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Draug.java b/core/src/io/anuke/mindustry/entities/type/base/Draug.java deleted file mode 100644 index 47b7caed25..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Draug.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Draug extends MinerDrone{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java deleted file mode 100644 index 4c86371811..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Eruptor extends GroundUnit{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java deleted file mode 100644 index c4f36dba69..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Fortress extends GroundUnit{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java b/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java deleted file mode 100644 index 0c4294645a..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Ghoul extends FlyingUnit{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java b/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java similarity index 96% rename from core/src/io/anuke/mindustry/entities/type/base/Revenant.java rename to core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java index 393c134891..6aae538484 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java +++ b/core/src/io/anuke/mindustry/entities/type/base/HoverUnit.java @@ -5,7 +5,7 @@ import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.Units; -public class Revenant extends FlyingUnit{ +public class HoverUnit extends FlyingUnit{ @Override public void drawWeapons(){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/Phantom.java b/core/src/io/anuke/mindustry/entities/type/base/Phantom.java deleted file mode 100644 index 1a50115647..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Phantom.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Phantom extends BuilderDrone{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Spirit.java b/core/src/io/anuke/mindustry/entities/type/base/Spirit.java deleted file mode 100644 index d43fc658b0..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Spirit.java +++ /dev/null @@ -1,4 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Spirit extends RepairDrone{ -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Titan.java b/core/src/io/anuke/mindustry/entities/type/base/Titan.java deleted file mode 100644 index 9324d4d215..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Titan.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Titan extends GroundUnit{ - -} diff --git a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java b/core/src/io/anuke/mindustry/entities/type/base/Wraith.java deleted file mode 100644 index c8923e309f..0000000000 --- a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java +++ /dev/null @@ -1,5 +0,0 @@ -package io.anuke.mindustry.entities.type.base; - -public class Wraith extends FlyingUnit{ - -} diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java index 419d91e7ed..6e04863262 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java @@ -12,6 +12,60 @@ Latest data: [build 81] 0 = Player 1 = Fire 2 = Puddle +3 = MinerDrone +4 = RepairDrone +5 = BuilderDrone +6 = GroundUnit +7 = GroundUnit +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = FlyingUnit +12 = FlyingUnit +13 = Revenant + +Before removal of lightining/bullet: [build 80] + +0 = Player +1 = Fire +2 = Puddle +3 = Bullet +4 = Lightning +5 = MinerDrone +6 = RepairDrone +7 = BuilderDrone +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = GroundUnit +12 = GroundUnit +13 = FlyingUnit +14 = FlyingUnit +15 = Revenant + +Before addition of new units: [build 79 and below] + +0 = Player +1 = Fire +2 = Puddle +3 = Bullet +4 = Lightning +5 = RepairDrone +6 = GroundUnit +7 = GroundUnit +8 = GroundUnit +9 = GroundUnit +10 = GroundUnit +11 = FlyingUnit +12 = FlyingUnit +13 = BuilderDrone +14 = Revenant + */ +public class LegacyTypeTable{ + /* + 0 = Player +1 = Fire +2 = Puddle 3 = Draug 4 = Spirit 5 = Phantom @@ -23,97 +77,59 @@ Latest data: [build 81] 11 = Wraith 12 = Ghoul 13 = Revenant - -Before removal of lightining/bullet: [build 80] - -0 = Player -1 = Fire -2 = Puddle -3 = Bullet -4 = Lightning -5 = Draug -6 = Spirit -7 = Phantom -8 = Dagger -9 = Crawler -10 = Titan -11 = Fortress -12 = Eruptor -13 = Wraith -14 = Ghoul -15 = Revenant - -Before addition of new units: [build 79 and below] - -0 = Player -1 = Fire -2 = Puddle -3 = Bullet -4 = Lightning -5 = Spirit -6 = Dagger -7 = Crawler -8 = Titan -9 = Fortress -10 = Eruptor -11 = Wraith -12 = Ghoul -13 = Phantom -14 = Revenant - */ -public class LegacyTypeTable{ + */ private static final Prov[] build81Table = { Player::new, Fire::new, Puddle::new, - Draug::new, - Spirit::new, - Phantom::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Revenant::new + MinerDrone::new, + RepairDrone::new, + BuilderDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + HoverUnit::new }; private static final Prov[] build80Table = { Player::new, Fire::new, Puddle::new, - Bullet::new, //TODO reading these may crash + Bullet::new, Lightning::new, - Draug::new, - Spirit::new, - Phantom::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Revenant::new + MinerDrone::new, + RepairDrone::new, + BuilderDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + HoverUnit::new }; private static final Prov[] build79Table = { Player::new, Fire::new, Puddle::new, - Bullet::new, //TODO reading these may crash + Bullet::new, Lightning::new, - Spirit::new, - Dagger::new, - Crawler::new, - Titan::new, - Fortress::new, - Eruptor::new, - Wraith::new, - Ghoul::new, - Phantom::new, - Revenant::new + RepairDrone::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + GroundUnit::new, + FlyingUnit::new, + FlyingUnit::new, + BuilderDrone::new, + HoverUnit::new }; public static Prov[] getTable(int build){ diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 78a4628473..909c80d232 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -36,6 +36,19 @@ import java.lang.reflect.*; public class ContentParser{ private static final boolean ignoreUnknownFields = true; private ObjectMap, ContentType> contentTypes = new ObjectMap<>(); + private StringMap legacyUnitMap = StringMap.of( + "Dagger", "GroundUnit", + "Eruptor", "GroundUnit", + "Titan", "GroundUnit", + "Fortress", "GroundUnit", + "Crawler", "GroundUnit", + "Revenant", "HoverUnit", + "Draug", "MinerDrone", + "Phantom", "BuilderDrone", + "Spirit", "RepairDrone", + "Wraith", "FlyingUnit", + "Ghoul", "FlyingUnit" + ); private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ put(Effect.class, (type, data) -> field(Fx.class, data)); put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); @@ -260,8 +273,14 @@ public class ContentParser{ ContentType.unit, (TypeParser)(mod, name, value) -> { readBundle(ContentType.unit, name, value); - Class type = resolve(getType(value), "io.anuke.mindustry.entities.type.base"); - UnitType unit = new UnitType(mod + "-" + name, supply(type)); + UnitType unit; + if(locate(ContentType.unit, name) == null){ + Class type = resolve(legacyUnitMap.get(Strings.capitalize(getType(value)), getType(value)), "io.anuke.mindustry.entities.type.base"); + unit = new UnitType(mod + "-" + name, supply(type)); + }else{ + unit = locate(ContentType.unit, name); + } + currentContent = unit; read(() -> readFields(unit, value, true)); diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index c559177139..1a7335b032 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -16,8 +16,7 @@ import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ public @NonNull TypeID typeID; - public @NonNull - Prov constructor; + public @NonNull Prov constructor; public float health = 60; public float hitsize = 7f; @@ -49,7 +48,7 @@ public class UnitType extends UnlockableContent{ create(mainConstructor); } - public UnitType(String name){ + public UnitType(String name){ super(name); } diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 58f51ad473..12409c364f 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -289,8 +289,8 @@ public class ApplicationTests{ void buildingOverlap(){ initBuilding(); - Phantom d1 = (Phantom)UnitTypes.phantom.create(Team.sharded); - Phantom d2 = (Phantom)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d1 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d2 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); d1.set(10f, 20f); d2.set(10f, 20f); @@ -311,8 +311,8 @@ public class ApplicationTests{ void buildingDestruction(){ initBuilding(); - Phantom d1 = (Phantom)UnitTypes.phantom.create(Team.sharded); - Phantom d2 = (Phantom)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d1 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); + BuilderDrone d2 = (BuilderDrone)UnitTypes.phantom.create(Team.sharded); d1.set(10f, 20f); d2.set(10f, 20f); From 177cea5c5dda59d5328addfb263e50ec48a3efa2 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 11:48:59 -0500 Subject: [PATCH 052/107] Added block size error --- core/src/io/anuke/mindustry/mod/ContentParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 909c80d232..c5c10519f2 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -246,6 +246,10 @@ public class ContentParser{ readFields(block, value, true); + if(block.size > 8){ + throw new IllegalArgumentException("Blocks cannot be larger than 8x8."); + } + //add research tech node if(research[0] != null){ Block parent = find(ContentType.block, research[0]); From 0078a8cb8e76e62ed0fdf9beeca762b25cedf92c Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 12:48:15 -0500 Subject: [PATCH 053/107] Fixed scripts not working on older Android phones --- android/build.gradle | 2 +- .../io/anuke/mindustry/AndroidLauncher.java | 4 +- .../rhino/AndroidContextFactory.java | 44 +++++++++ .../rhino/BaseAndroidClassLoader.java | 99 +++++++++++++++++++ .../rhino/FileAndroidClassLoader.java | 59 +++++++++++ .../rhino/InMemoryAndroidClassLoader.java | 42 ++++++++ .../anuke/mindustry/rhino/RhinoBuilder.java | 83 ++++++++++++++++ core/assets/bundles/bundle.properties | 1 + core/src/io/anuke/mindustry/mod/Mods.java | 4 + core/src/io/anuke/mindustry/mod/Scripts.java | 17 +++- 10 files changed, 349 insertions(+), 6 deletions(-) create mode 100644 android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java create mode 100644 android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java create mode 100644 android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java create mode 100644 android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java create mode 100644 android/src/io/anuke/mindustry/rhino/RhinoBuilder.java diff --git a/android/build.gradle b/android/build.gradle index 5d438dc30c..5795f34340 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -28,7 +28,7 @@ dependencies{ implementation project(":core") implementation arcModule("backends:backend-android") - implementation 'com.faendir.rhino:rhino-android:1.5.2' + implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3' natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-armeabi-v7a" natives "com.badlogicgames.gdx:gdx-platform:$gdxVersion:natives-arm64-v8a" diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index e8e3223a19..0faeba5a05 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -9,7 +9,6 @@ import android.os.Build.*; import android.os.*; import android.provider.Settings.*; import android.telephony.*; -import com.faendir.rhino_android.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; import io.anuke.arc.files.*; @@ -20,6 +19,7 @@ import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.rhino.*; import io.anuke.mindustry.ui.dialogs.*; import java.io.*; @@ -68,7 +68,7 @@ public class AndroidLauncher extends AndroidApplication{ @Override public org.mozilla.javascript.Context getScriptContext(){ - return new RhinoAndroidHelper(Core.files.local("script-output").file()).enterContext(); + return new RhinoBuilder(getContext()).enterContext(); } @Override diff --git a/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java b/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java new file mode 100644 index 0000000000..318af0c2d4 --- /dev/null +++ b/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java @@ -0,0 +1,44 @@ +package io.anuke.mindustry.rhino; + +import android.os.*; +import org.mozilla.javascript.*; + +import java.io.*; + +/** + * Ensures that the classLoader used is correct + * @author F43nd1r + * @since 11.01.2016 + */ +public class AndroidContextFactory extends ContextFactory{ + + private final File cacheDirectory; + + /** + * Create a new factory. It will cache generated code in the given directory + * @param cacheDirectory the cache directory + */ + public AndroidContextFactory(File cacheDirectory){ + this.cacheDirectory = cacheDirectory; + initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader())); + } + + /** + * Create a ClassLoader which is able to deal with bytecode + * @param parent the parent of the create classloader + * @return a new ClassLoader + */ + @Override + public BaseAndroidClassLoader createClassLoader(ClassLoader parent){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ + return new InMemoryAndroidClassLoader(parent); + } + return new FileAndroidClassLoader(parent, cacheDirectory); + } + + @Override + protected void onContextReleased(final Context cx){ + super.onContextReleased(cx); + ((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset(); + } +} diff --git a/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java new file mode 100644 index 0000000000..83491956e8 --- /dev/null +++ b/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java @@ -0,0 +1,99 @@ +package io.anuke.mindustry.rhino; + +import com.android.dex.*; +import com.android.dx.cf.direct.*; +import com.android.dx.command.dexer.*; +import com.android.dx.dex.*; +import com.android.dx.dex.cf.*; +import com.android.dx.dex.file.*; +import com.android.dx.merge.*; +import org.mozilla.javascript.*; + +import java.io.*; + +/** + * Compiles java bytecode to dex bytecode and loads it + * @author F43nd1r + * @since 11.01.2016 + */ +abstract class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{ + + /** + * Create a new instance with the given parent classloader + * @param parent the parent + */ + public BaseAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + /** + * {@inheritDoc} + */ + @Override + public Class defineClass(String name, byte[] data){ + try{ + DexOptions dexOptions = new DexOptions(); + DexFile dexFile = new DexFile(dexOptions); + DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true); + classFile.setAttributeFactory(StdAttributeFactory.THE_ONE); + classFile.getMagic(); + DxContext context = new DxContext(); + dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile)); + Dex dex = new Dex(dexFile.toDex(null, false)); + Dex oldDex = getLastDex(); + if(oldDex != null){ + dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge(); + } + return loadClass(dex, name); + }catch(IOException | ClassNotFoundException e){ + throw new FatalLoadingException(e); + } + } + + protected abstract Class loadClass(Dex dex, String name) throws ClassNotFoundException; + + protected abstract Dex getLastDex(); + + protected abstract void reset(); + + /** + * Does nothing + * @param aClass ignored + */ + @Override + public void linkClass(Class aClass){ + //doesn't make sense on android + } + + /** + * Try to load a class. This will search all defined classes, all loaded jars and the parent class loader. + * @param name the name of the class to load + * @param resolve ignored + * @return the class + * @throws ClassNotFoundException if the class could not be found in any of the locations + */ + @Override + public Class loadClass(String name, boolean resolve) + throws ClassNotFoundException{ + Class loadedClass = findLoadedClass(name); + if(loadedClass == null){ + Dex dex = getLastDex(); + if(dex != null){ + loadedClass = loadClass(dex, name); + } + if(loadedClass == null){ + loadedClass = getParent().loadClass(name); + } + } + return loadedClass; + } + + /** + * Might be thrown in any Rhino method that loads bytecode if the loading failed + */ + public static class FatalLoadingException extends RuntimeException{ + FatalLoadingException(Throwable t){ + super("Failed to define class", t); + } + } +} diff --git a/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java new file mode 100644 index 0000000000..4f16618e84 --- /dev/null +++ b/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java @@ -0,0 +1,59 @@ +package io.anuke.mindustry.rhino; + +import com.android.dex.*; +import dalvik.system.*; +import io.anuke.arc.*; +import io.anuke.arc.backends.android.surfaceview.*; +import io.anuke.arc.util.ArcAnnotate.*; + +import java.io.*; + +/** + * @author F43nd1r + * @since 24.10.2017 + */ +@SuppressWarnings("ResultOfMethodCallIgnored") +class FileAndroidClassLoader extends BaseAndroidClassLoader{ + private static int instanceCounter = 0; + private final File dexFile; + + /** + * Create a new instance with the given parent classloader + * @param parent the parent + */ + public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ + super(parent); + int id = instanceCounter++; + dexFile = new File(cacheDir, id + ".dex"); + cacheDir.mkdirs(); + reset(); + } + + @Override + protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + try{ + dex.writeTo(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); + } + + @Nullable + @Override + protected Dex getLastDex(){ + if(dexFile.exists()){ + try{ + return new Dex(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + } + return null; + } + + @Override + protected void reset(){ + dexFile.delete(); + } +} diff --git a/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java new file mode 100644 index 0000000000..dd358d247f --- /dev/null +++ b/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java @@ -0,0 +1,42 @@ +package io.anuke.mindustry.rhino; + +import android.annotation.*; +import android.os.*; +import com.android.dex.*; +import dalvik.system.*; +import io.anuke.arc.util.ArcAnnotate.NonNull; +import io.anuke.arc.util.ArcAnnotate.Nullable; + +import java.nio.*; + +/** + * @author F43nd1r + * @since 24.10.2017 + */ + +@TargetApi(Build.VERSION_CODES.O) +class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ + @Nullable + private Dex last; + + public InMemoryAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + @Override + protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + last = dex; + return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); + } + + @Nullable + @Override + protected Dex getLastDex(){ + return last; + } + + @Override + protected void reset(){ + last = null; + } +} diff --git a/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java b/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java new file mode 100644 index 0000000000..b6df496945 --- /dev/null +++ b/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java @@ -0,0 +1,83 @@ +package io.anuke.mindustry.rhino; + +import org.mozilla.javascript.*; + +import java.io.*; + +/** + * Helps to prepare a Rhino Context for usage on android. + * @author F43nd1r + * @since 11.01.2016 + */ +public class RhinoBuilder{ + private final File cacheDirectory; + + /** + * Constructs a new helper using the default temporary directory. + * Note: It is recommended to use a custom directory, so no permission problems occur. + */ + public RhinoBuilder(){ + this(new File(System.getProperty("java.io.tmpdir", "."), "classes")); + } + + /** + * Constructs a new helper using a directory in the applications cache. + * @param context any context + */ + public RhinoBuilder(android.content.Context context){ + this(new File(context.getCacheDir(), "classes")); + } + + /** + * Constructs a helper using the specified directory as cache. + * @param cacheDirectory the cache directory to use + */ + public RhinoBuilder(File cacheDirectory){ + this.cacheDirectory = cacheDirectory; + } + + /** + * call this instead of {@link Context#enter()} + * @return a context prepared for android + */ + public Context enterContext(){ + if(!SecurityController.hasGlobal()) + SecurityController.initGlobal(new SecurityController(){ + @Override + public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){ + return Context.getCurrentContext().createClassLoader(classLoader); + } + + @Override + public Object getDynamicSecurityDomain(Object o){ + return null; + } + }); + return getContextFactory().enterContext(); + } + + /** + * @return The Context factory which has to be used on android. + */ + public AndroidContextFactory getContextFactory(){ + AndroidContextFactory factory; + if(!ContextFactory.hasExplicitGlobal()){ + factory = new AndroidContextFactory(cacheDirectory); + ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory); + }else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){ + throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory"); + }else{ + factory = (AndroidContextFactory)ContextFactory.getGlobal(); + } + return factory; + } + + /** + * @return a context prepared for android + * @deprecated use {@link #enterContext()} instead + */ + @Deprecated + public static Context prepareContext(){ + return new RhinoBuilder().enterContext(); + } +} diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 2a32d86f22..a42c94141a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -114,6 +114,7 @@ mod.author = [LIGHT_GRAY]Author:[] {0} mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. +mod.scripts.unsupported = Your device does not support mod scripts. Some mods will not function correctly. about.button = About name = Name: diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index bdc9d79027..0030d65721 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -381,6 +381,10 @@ public class Mods implements Loadable{ requiresReload = false; Events.fire(new ContentReloadEvent()); + + if(scripts != null && scripts.hasErrored()){ + Core.app.post(() -> Core.settings.getBoolOnce("scripts-errored", () -> ui.showErrorMessage("$mod.scripts.unsupported"))); + } } /** This must be run on the main thread! */ diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 6ab13c4208..921e4b783e 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -12,20 +12,29 @@ public class Scripts implements Disposable{ private final Context context; private final String wrapper; private Scriptable scope; + private boolean errored; public Scripts(){ Time.mark(); context = Vars.platform.getScriptContext(); - context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("adapter") || type.contains("PrintStream") || type.startsWith("io.anuke.mindustry")) && !type.equals("io.anuke.mindustry.mod.ClassAccess")); + context.setClassShutter(type -> (ClassAccess.allowedClassNames.contains(type) || type.startsWith("$Proxy") || + type.startsWith("adapter") || type.contains("PrintStream") || + type.startsWith("io.anuke.mindustry")) && !type.equals("io.anuke.mindustry.mod.ClassAccess")); scope = new ImporterTopLevel(context); wrapper = Core.files.internal("scripts/wrapper.js").readString(); - run(Core.files.internal("scripts/global.js").readString(), "global.js"); + if(!run(Core.files.internal("scripts/global.js").readString(), "global.js")){ + errored = true; + } Log.debug("Time to load script engine: {0}", Time.elapsed()); } + public boolean hasErrored(){ + return errored; + } + public String runConsole(String text){ try{ Object o = context.evaluateString(scope, text, "console.js", 1, null); @@ -58,11 +67,13 @@ public class Scripts implements Disposable{ run(wrapper.replace("$SCRIPT_NAME$", mod.name + "/" + file.nameWithoutExtension()).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); } - private void run(String script, String file){ + private boolean run(String script, String file){ try{ context.evaluateString(scope, script, file, 1, null); + return true; }catch(Throwable t){ log(LogLevel.err, file, "" + getError(t)); + return false; } } From 2a03ef0c43697a2c9d3ef64825bb6f1f6fe1dab4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 16:59:43 -0500 Subject: [PATCH 054/107] More cleanup --- .../io/anuke/mindustry/AndroidLauncher.java | 3 +- .../anuke/mindustry/AndroidRhinoContext.java | 229 ++++++++++++++++++ .../rhino/AndroidContextFactory.java | 44 ---- .../rhino/BaseAndroidClassLoader.java | 99 -------- .../rhino/FileAndroidClassLoader.java | 59 ----- .../rhino/InMemoryAndroidClassLoader.java | 42 ---- .../anuke/mindustry/rhino/RhinoBuilder.java | 83 ------- gradle.properties | 2 +- 8 files changed, 231 insertions(+), 330 deletions(-) create mode 100644 android/src/io/anuke/mindustry/AndroidRhinoContext.java delete mode 100644 android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java delete mode 100644 android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java delete mode 100644 android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java delete mode 100644 android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java delete mode 100644 android/src/io/anuke/mindustry/rhino/RhinoBuilder.java diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 0faeba5a05..56861eeead 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -19,7 +19,6 @@ import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.mod.*; -import io.anuke.mindustry.rhino.*; import io.anuke.mindustry.ui.dialogs.*; import java.io.*; @@ -68,7 +67,7 @@ public class AndroidLauncher extends AndroidApplication{ @Override public org.mozilla.javascript.Context getScriptContext(){ - return new RhinoBuilder(getContext()).enterContext(); + return AndroidRhinoContext.enterContext(getContext().getCacheDir()); } @Override diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java new file mode 100644 index 0000000000..eadc1c12fd --- /dev/null +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -0,0 +1,229 @@ +package io.anuke.mindustry; + +import android.annotation.*; +import android.os.*; +import com.android.dex.*; +import com.android.dx.cf.direct.*; +import com.android.dx.command.dexer.*; +import com.android.dx.dex.*; +import com.android.dx.dex.cf.*; +import com.android.dx.dex.file.DexFile; +import com.android.dx.merge.*; +import dalvik.system.*; +import io.anuke.arc.*; +import io.anuke.arc.backends.android.surfaceview.*; +import io.anuke.arc.util.ArcAnnotate.NonNull; +import io.anuke.arc.util.ArcAnnotate.Nullable; +import io.anuke.mindustry.AndroidRhinoContext.BaseAndroidClassLoader.*; +import org.mozilla.javascript.*; + +import java.io.*; +import java.nio.*; + +/** + * Helps to prepare a Rhino Context for usage on android. + * @author F43nd1r + * @since 11.01.2016 + */ +public class AndroidRhinoContext{ + + /** + * call this instead of {@link Context#enter()} + * @return a context prepared for android + */ + public static Context enterContext(File cacheDirectory){ + if(!SecurityController.hasGlobal()) + SecurityController.initGlobal(new SecurityController(){ + @Override + public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){ + return Context.getCurrentContext().createClassLoader(classLoader); + } + + @Override + public Object getDynamicSecurityDomain(Object o){ + return null; + } + }); + + AndroidContextFactory factory; + if(!ContextFactory.hasExplicitGlobal()){ + factory = new AndroidContextFactory(cacheDirectory); + ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory); + }else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){ + throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory"); + }else{ + factory = (AndroidContextFactory)ContextFactory.getGlobal(); + } + + return factory.enterContext(); + } + + /** + * Ensures that the classLoader used is correct + * @author F43nd1r + * @since 11.01.2016 + */ + public static class AndroidContextFactory extends ContextFactory{ + private final File cacheDirectory; + + /** + * Create a new factory. It will cache generated code in the given directory + * @param cacheDirectory the cache directory + */ + public AndroidContextFactory(File cacheDirectory){ + this.cacheDirectory = cacheDirectory; + initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader())); + } + + /** + * Create a ClassLoader which is able to deal with bytecode + * @param parent the parent of the create classloader + * @return a new ClassLoader + */ + @Override + public BaseAndroidClassLoader createClassLoader(ClassLoader parent){ + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ + return new InMemoryAndroidClassLoader(parent); + } + return new FileAndroidClassLoader(parent, cacheDirectory); + } + + @Override + protected void onContextReleased(final Context cx){ + super.onContextReleased(cx); + ((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset(); + } + } + + /** + * Compiles java bytecode to dex bytecode and loads it + * @author F43nd1r + * @since 11.01.2016 + */ + abstract static class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{ + + public BaseAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + @Override + public Class defineClass(String name, byte[] data){ + try{ + DexOptions dexOptions = new DexOptions(); + DexFile dexFile = new DexFile(dexOptions); + DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true); + classFile.setAttributeFactory(StdAttributeFactory.THE_ONE); + classFile.getMagic(); + DxContext context = new DxContext(); + dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile)); + Dex dex = new Dex(dexFile.toDex(null, false)); + Dex oldDex = getLastDex(); + if(oldDex != null){ + dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge(); + } + return loadClass(dex, name); + }catch(IOException | ClassNotFoundException e){ + throw new FatalLoadingException(e); + } + } + + protected abstract Class loadClass(Dex dex, String name) throws ClassNotFoundException; + + protected abstract Dex getLastDex(); + + protected abstract void reset(); + + @Override + public void linkClass(Class aClass){} + + @Override + public Class loadClass(String name, boolean resolve) + throws ClassNotFoundException{ + Class loadedClass = findLoadedClass(name); + if(loadedClass == null){ + Dex dex = getLastDex(); + if(dex != null){ + loadedClass = loadClass(dex, name); + } + if(loadedClass == null){ + loadedClass = getParent().loadClass(name); + } + } + return loadedClass; + } + + /** Might be thrown in any Rhino method that loads bytecode if the loading failed. */ + public static class FatalLoadingException extends RuntimeException{ + FatalLoadingException(Throwable t){ + super("Failed to define class", t); + } + } + + static class FileAndroidClassLoader extends BaseAndroidClassLoader{ + private static int instanceCounter = 0; + private final File dexFile; + + public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ + super(parent); + int id = instanceCounter++; + dexFile = new File(cacheDir, id + ".dex"); + cacheDir.mkdirs(); + reset(); + } + + @Override + protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + try{ + dex.writeTo(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); + } + + @Nullable + @Override + protected Dex getLastDex(){ + if(dexFile.exists()){ + try{ + return new Dex(dexFile); + }catch(IOException e){ + e.printStackTrace(); + } + } + return null; + } + + @Override + protected void reset(){ + dexFile.delete(); + } + } + + @TargetApi(Build.VERSION_CODES.O) + static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ + @Nullable private Dex last; + + public InMemoryAndroidClassLoader(ClassLoader parent){ + super(parent); + } + + @Override + protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + last = dex; + return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); + } + + @Nullable + @Override + protected Dex getLastDex(){ + return last; + } + + @Override + protected void reset(){ + last = null; + } + } + } +} diff --git a/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java b/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java deleted file mode 100644 index 318af0c2d4..0000000000 --- a/android/src/io/anuke/mindustry/rhino/AndroidContextFactory.java +++ /dev/null @@ -1,44 +0,0 @@ -package io.anuke.mindustry.rhino; - -import android.os.*; -import org.mozilla.javascript.*; - -import java.io.*; - -/** - * Ensures that the classLoader used is correct - * @author F43nd1r - * @since 11.01.2016 - */ -public class AndroidContextFactory extends ContextFactory{ - - private final File cacheDirectory; - - /** - * Create a new factory. It will cache generated code in the given directory - * @param cacheDirectory the cache directory - */ - public AndroidContextFactory(File cacheDirectory){ - this.cacheDirectory = cacheDirectory; - initApplicationClassLoader(createClassLoader(AndroidContextFactory.class.getClassLoader())); - } - - /** - * Create a ClassLoader which is able to deal with bytecode - * @param parent the parent of the create classloader - * @return a new ClassLoader - */ - @Override - public BaseAndroidClassLoader createClassLoader(ClassLoader parent){ - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ - return new InMemoryAndroidClassLoader(parent); - } - return new FileAndroidClassLoader(parent, cacheDirectory); - } - - @Override - protected void onContextReleased(final Context cx){ - super.onContextReleased(cx); - ((BaseAndroidClassLoader)cx.getApplicationClassLoader()).reset(); - } -} diff --git a/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java deleted file mode 100644 index 83491956e8..0000000000 --- a/android/src/io/anuke/mindustry/rhino/BaseAndroidClassLoader.java +++ /dev/null @@ -1,99 +0,0 @@ -package io.anuke.mindustry.rhino; - -import com.android.dex.*; -import com.android.dx.cf.direct.*; -import com.android.dx.command.dexer.*; -import com.android.dx.dex.*; -import com.android.dx.dex.cf.*; -import com.android.dx.dex.file.*; -import com.android.dx.merge.*; -import org.mozilla.javascript.*; - -import java.io.*; - -/** - * Compiles java bytecode to dex bytecode and loads it - * @author F43nd1r - * @since 11.01.2016 - */ -abstract class BaseAndroidClassLoader extends ClassLoader implements GeneratedClassLoader{ - - /** - * Create a new instance with the given parent classloader - * @param parent the parent - */ - public BaseAndroidClassLoader(ClassLoader parent){ - super(parent); - } - - /** - * {@inheritDoc} - */ - @Override - public Class defineClass(String name, byte[] data){ - try{ - DexOptions dexOptions = new DexOptions(); - DexFile dexFile = new DexFile(dexOptions); - DirectClassFile classFile = new DirectClassFile(data, name.replace('.', '/') + ".class", true); - classFile.setAttributeFactory(StdAttributeFactory.THE_ONE); - classFile.getMagic(); - DxContext context = new DxContext(); - dexFile.add(CfTranslator.translate(context, classFile, null, new CfOptions(), dexOptions, dexFile)); - Dex dex = new Dex(dexFile.toDex(null, false)); - Dex oldDex = getLastDex(); - if(oldDex != null){ - dex = new DexMerger(new Dex[]{dex, oldDex}, CollisionPolicy.KEEP_FIRST, context).merge(); - } - return loadClass(dex, name); - }catch(IOException | ClassNotFoundException e){ - throw new FatalLoadingException(e); - } - } - - protected abstract Class loadClass(Dex dex, String name) throws ClassNotFoundException; - - protected abstract Dex getLastDex(); - - protected abstract void reset(); - - /** - * Does nothing - * @param aClass ignored - */ - @Override - public void linkClass(Class aClass){ - //doesn't make sense on android - } - - /** - * Try to load a class. This will search all defined classes, all loaded jars and the parent class loader. - * @param name the name of the class to load - * @param resolve ignored - * @return the class - * @throws ClassNotFoundException if the class could not be found in any of the locations - */ - @Override - public Class loadClass(String name, boolean resolve) - throws ClassNotFoundException{ - Class loadedClass = findLoadedClass(name); - if(loadedClass == null){ - Dex dex = getLastDex(); - if(dex != null){ - loadedClass = loadClass(dex, name); - } - if(loadedClass == null){ - loadedClass = getParent().loadClass(name); - } - } - return loadedClass; - } - - /** - * Might be thrown in any Rhino method that loads bytecode if the loading failed - */ - public static class FatalLoadingException extends RuntimeException{ - FatalLoadingException(Throwable t){ - super("Failed to define class", t); - } - } -} diff --git a/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java deleted file mode 100644 index 4f16618e84..0000000000 --- a/android/src/io/anuke/mindustry/rhino/FileAndroidClassLoader.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.anuke.mindustry.rhino; - -import com.android.dex.*; -import dalvik.system.*; -import io.anuke.arc.*; -import io.anuke.arc.backends.android.surfaceview.*; -import io.anuke.arc.util.ArcAnnotate.*; - -import java.io.*; - -/** - * @author F43nd1r - * @since 24.10.2017 - */ -@SuppressWarnings("ResultOfMethodCallIgnored") -class FileAndroidClassLoader extends BaseAndroidClassLoader{ - private static int instanceCounter = 0; - private final File dexFile; - - /** - * Create a new instance with the given parent classloader - * @param parent the parent - */ - public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ - super(parent); - int id = instanceCounter++; - dexFile = new File(cacheDir, id + ".dex"); - cacheDir.mkdirs(); - reset(); - } - - @Override - protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ - try{ - dex.writeTo(dexFile); - }catch(IOException e){ - e.printStackTrace(); - } - return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); - } - - @Nullable - @Override - protected Dex getLastDex(){ - if(dexFile.exists()){ - try{ - return new Dex(dexFile); - }catch(IOException e){ - e.printStackTrace(); - } - } - return null; - } - - @Override - protected void reset(){ - dexFile.delete(); - } -} diff --git a/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java b/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java deleted file mode 100644 index dd358d247f..0000000000 --- a/android/src/io/anuke/mindustry/rhino/InMemoryAndroidClassLoader.java +++ /dev/null @@ -1,42 +0,0 @@ -package io.anuke.mindustry.rhino; - -import android.annotation.*; -import android.os.*; -import com.android.dex.*; -import dalvik.system.*; -import io.anuke.arc.util.ArcAnnotate.NonNull; -import io.anuke.arc.util.ArcAnnotate.Nullable; - -import java.nio.*; - -/** - * @author F43nd1r - * @since 24.10.2017 - */ - -@TargetApi(Build.VERSION_CODES.O) -class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ - @Nullable - private Dex last; - - public InMemoryAndroidClassLoader(ClassLoader parent){ - super(parent); - } - - @Override - protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ - last = dex; - return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); - } - - @Nullable - @Override - protected Dex getLastDex(){ - return last; - } - - @Override - protected void reset(){ - last = null; - } -} diff --git a/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java b/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java deleted file mode 100644 index b6df496945..0000000000 --- a/android/src/io/anuke/mindustry/rhino/RhinoBuilder.java +++ /dev/null @@ -1,83 +0,0 @@ -package io.anuke.mindustry.rhino; - -import org.mozilla.javascript.*; - -import java.io.*; - -/** - * Helps to prepare a Rhino Context for usage on android. - * @author F43nd1r - * @since 11.01.2016 - */ -public class RhinoBuilder{ - private final File cacheDirectory; - - /** - * Constructs a new helper using the default temporary directory. - * Note: It is recommended to use a custom directory, so no permission problems occur. - */ - public RhinoBuilder(){ - this(new File(System.getProperty("java.io.tmpdir", "."), "classes")); - } - - /** - * Constructs a new helper using a directory in the applications cache. - * @param context any context - */ - public RhinoBuilder(android.content.Context context){ - this(new File(context.getCacheDir(), "classes")); - } - - /** - * Constructs a helper using the specified directory as cache. - * @param cacheDirectory the cache directory to use - */ - public RhinoBuilder(File cacheDirectory){ - this.cacheDirectory = cacheDirectory; - } - - /** - * call this instead of {@link Context#enter()} - * @return a context prepared for android - */ - public Context enterContext(){ - if(!SecurityController.hasGlobal()) - SecurityController.initGlobal(new SecurityController(){ - @Override - public GeneratedClassLoader createClassLoader(ClassLoader classLoader, Object o){ - return Context.getCurrentContext().createClassLoader(classLoader); - } - - @Override - public Object getDynamicSecurityDomain(Object o){ - return null; - } - }); - return getContextFactory().enterContext(); - } - - /** - * @return The Context factory which has to be used on android. - */ - public AndroidContextFactory getContextFactory(){ - AndroidContextFactory factory; - if(!ContextFactory.hasExplicitGlobal()){ - factory = new AndroidContextFactory(cacheDirectory); - ContextFactory.getGlobalSetter().setContextFactoryGlobal(factory); - }else if(!(ContextFactory.getGlobal() instanceof AndroidContextFactory)){ - throw new IllegalStateException("Cannot initialize factory for Android Rhino: There is already another factory"); - }else{ - factory = (AndroidContextFactory)ContextFactory.getGlobal(); - } - return factory; - } - - /** - * @return a context prepared for android - * @deprecated use {@link #enterContext()} instead - */ - @Deprecated - public static Context prepareContext(){ - return new RhinoBuilder().enterContext(); - } -} diff --git a/gradle.properties b/gradle.properties index 7f9aee7e15..212385a749 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=b38d5e9c24d921f87f33bc48fcb65e245c1b1d0c +archash=190918590e8401b1686ecb9167e3c2a9e77eafaa From 8148f2a0f7b4693eaf6748079a711370388a6626 Mon Sep 17 00:00:00 2001 From: AmateurPotion <47741752+AmateurPotion@users.noreply.github.com> Date: Tue, 10 Dec 2019 10:25:42 +0900 Subject: [PATCH 055/107] Update bundle_ko.properties --- core/assets/bundles/bundle_ko.properties | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index dfe930fee9..8e2f2c3b61 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -26,6 +26,7 @@ load.image = 사진 load.content = 컨텐츠 load.system = 시스템 load.mod = 모드 +load.scripts = 스크립트 schematic = 설계도 schematic.add = 설계도 저장하기 @@ -95,10 +96,11 @@ mods.none = [LIGHT_GRAY]추가한 모드가 없습니다! mods.guide = 모드 가이드 mods.report = 버그 신고 mods.openfolder = 모드 폴더 열기 -mod.enabled = [firebrick]활성화 -mod.disabled = [lightgray]비활성화 +mod.enabled = [lightgray]활성화 +mod.disabled = [scarlet]비활성화 mod.disable = 비활성화 mod.delete.error = 모드를 삭제할 수 없습니다. 아마도 해당 모드가 사용중인 것 같습니다. +mod.requiresversion = [scarlet]게임의 버전이 낮아 모드를 활성화할 수 없습니다!\n[scarlet]요구되는 게임 버전 : [accent]{0} mod.missingdependencies = [scarlet]의존되는 모드: {0} mod.nowdisabled = [scarlet]모드 '{0}'는 다음의 모드에 의존합니다 :[accent] {1}\n[lightgray]이 모드를 먼저 다운로드해야합니다.\n이 모드는 자동으로 비활성화됩니다. mod.enable = 활성화 @@ -106,11 +108,13 @@ mod.requiresrestart = 모드 변경사항을 적용하기 위해 게임을 종 mod.reloadrequired = [scarlet]새로고침 예정됨 mod.import = 모드 추가 mod.import.github = 깃허브 모드 추가 +mod.item.remove = 이것은 모드[accent] '{0}'[]의 자원입니다. 이 자원을 삭제하려면, 이 모드를 제거해야합니다. mod.remove.confirm = 이 모드를 삭제하시겠습니까? mod.author = [LIGHT_GRAY]제작자 : [] {0} mod.missing = 이 세이브파일에는 설치하지 않은 모드 혹은 이 버전에 속해있지 않은 데이터가 포함되어 있습니다. 이 파일을 불러올 경우 세이브파일의 데이터가 손상될 수 있습니다. 정말로 이 파일을 불러오시겠습니까?\n[lightgray]모드 :\n{0} mod.preview.missing = 워크샵에 당신의 모드를 업로드하기 전에 미리보기 이미지를 먼저 추가해야합니다.\n[accent] preview.png[]라는 이름으로 미리보기 이미지를 당신의 모드 폴더안에 준비한 후 다시 시도해주세요. mod.folder.missing = 워크샵에는 폴더 형태의 모드만 게시할 수 있습니다.\n모드를 폴더 형태로 바꾸려면 파일을 폴더에 압축 해제하고 이전 압축파일을 제거한 후, 게임을 재시작하거나 모드를 다시 로드하십시오. +mod.scripts.unsupported = 당신의 기기는 모드스크립트를 지원하지 않습니다. 모드의 일부 기능이 작동하지 않을 수 있습니다. about.button = 정보 name = 이름 : @@ -496,6 +500,7 @@ settings.language = 언어 settings.data = 게임 데이터 settings.reset = 설정 초기화 settings.rebind = 키 재설정 +settings.resetKey = 키 설정 settings.controls = 조작 settings.game = 게임 settings.sound = 소리 @@ -589,6 +594,8 @@ unit.persecond = /초 unit.timesspeed = x 배 unit.percent = % unit.items = 자원 +unit.thousands = 천 +unit.millions = 백만 category.general = 일반 category.power = 전력 category.liquids = 액체 @@ -623,7 +630,7 @@ setting.difficulty.name = 난이도 : setting.screenshake.name = 화면 흔들기 setting.effects.name = 화면 효과 setting.destroyedblocks.name = 부서진 블럭 표시 -setting.conveyorpathfinding.name = 컨베이어 설치 보조 기능 +setting.conveyorpathfinding.name = 교차기 자동 설치 setting.sensitivity.name = 컨트롤러 감도 setting.saveinterval.name = 저장 간격 setting.seconds = {0} 초 @@ -644,7 +651,7 @@ setting.sfxvol.name = 효과음 크기 setting.mutesound.name = 소리 끄기 setting.crashreport.name = 익명으로 오류 보고서 자동 전송 setting.savecreate.name = 자동 저장 활성화 -setting.publichost.name = 공개 서버 보이기 +setting.publichost.name = 스팀 공개 서버 보이기 setting.chatopacity.name = 채팅 투명도 setting.lasersopacity.name = 전력 레이저 밝기 setting.playerchat.name = 채팅 말풍선 표시 @@ -676,10 +683,10 @@ keybind.schematic_flip_x.name = 설계도 X축 뒤집기 keybind.schematic_flip_y.name = 설계도 Y축 뒤집기 keybind.category_prev.name = 이전 목록 keybind.category_next.name = 다음 목록 -keybind.block_select_left.name = 블럭 Select Left -keybind.block_select_right.name = 블럭 Select Right -keybind.block_select_up.name = 블럭 Select Up -keybind.block_select_down.name = 블럭 Select Down +keybind.block_select_left.name = 블럭 왼쪽 선택 +keybind.block_select_right.name = 블럭 오른쪽 선택 +keybind.block_select_up.name = 블블럭 위쪽 선택 +keybind.block_select_down.name = 블럭 아래쪽 선택 keybind.block_select_01.name = 카테고리/블럭 선택 1 keybind.block_select_02.name = 카테고리/블럭 선택 2 keybind.block_select_03.name = 카테고리/블럭 선택 3 @@ -804,6 +811,7 @@ mech.trident-ship.name = 트라이던트 mech.trident-ship.weapon = 폭탄 저장고 mech.glaive-ship.name = 글레이브 mech.glaive-ship.weapon = 중무장 인화성 소총 +item.corestorable = [lightgray]코어 잔여 저장공간: {0} item.explosiveness = [LIGHT_GRAY]폭발성 : {0} item.flammability = [LIGHT_GRAY]인화성 : {0} item.radioactivity = [LIGHT_GRAY]방사능 : {0} From 83a3195e348ffe140f5a0e7fb437b848d74bfe24 Mon Sep 17 00:00:00 2001 From: AmateurPotion <47741752+AmateurPotion@users.noreply.github.com> Date: Tue, 10 Dec 2019 10:26:40 +0900 Subject: [PATCH 056/107] Update bundle_ko.properties --- core/assets/bundles/bundle_ko.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 8e2f2c3b61..43fd7d841b 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -685,7 +685,7 @@ keybind.category_prev.name = 이전 목록 keybind.category_next.name = 다음 목록 keybind.block_select_left.name = 블럭 왼쪽 선택 keybind.block_select_right.name = 블럭 오른쪽 선택 -keybind.block_select_up.name = 블블럭 위쪽 선택 +keybind.block_select_up.name = 블럭 위쪽 선택 keybind.block_select_down.name = 블럭 아래쪽 선택 keybind.block_select_01.name = 카테고리/블럭 선택 1 keybind.block_select_02.name = 카테고리/블럭 선택 2 From da849085ec202be8255bc2207405245d0289afe8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 22:08:22 -0500 Subject: [PATCH 057/107] Status effect cleanup --- .../io/anuke/mindustry/AndroidLauncher.java | 2 +- .../anuke/mindustry/AndroidRhinoContext.java | 12 +-- .../mindustry/content/StatusEffects.java | 70 ++++++++++------- .../io/anuke/mindustry/mod/ContentParser.java | 2 +- .../io/anuke/mindustry/type/StatusEffect.java | 78 +++++++++---------- 5 files changed, 84 insertions(+), 80 deletions(-) diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 56861eeead..24c223d2d6 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -67,7 +67,7 @@ public class AndroidLauncher extends AndroidApplication{ @Override public org.mozilla.javascript.Context getScriptContext(){ - return AndroidRhinoContext.enterContext(getContext().getCacheDir()); + return AndroidRhinoContext.enter(getContext().getCacheDir()); } @Override diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java index eadc1c12fd..78ee040b50 100644 --- a/android/src/io/anuke/mindustry/AndroidRhinoContext.java +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -12,8 +12,6 @@ import com.android.dx.merge.*; import dalvik.system.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; -import io.anuke.arc.util.ArcAnnotate.NonNull; -import io.anuke.arc.util.ArcAnnotate.Nullable; import io.anuke.mindustry.AndroidRhinoContext.BaseAndroidClassLoader.*; import org.mozilla.javascript.*; @@ -31,7 +29,7 @@ public class AndroidRhinoContext{ * call this instead of {@link Context#enter()} * @return a context prepared for android */ - public static Context enterContext(File cacheDirectory){ + public static Context enter(File cacheDirectory){ if(!SecurityController.hasGlobal()) SecurityController.initGlobal(new SecurityController(){ @Override @@ -172,7 +170,7 @@ public class AndroidRhinoContext{ } @Override - protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ try{ dex.writeTo(dexFile); }catch(IOException e){ @@ -181,7 +179,6 @@ public class AndroidRhinoContext{ return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); } - @Nullable @Override protected Dex getLastDex(){ if(dexFile.exists()){ @@ -202,19 +199,18 @@ public class AndroidRhinoContext{ @TargetApi(Build.VERSION_CODES.O) static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ - @Nullable private Dex last; + private Dex last; public InMemoryAndroidClassLoader(ClassLoader parent){ super(parent); } @Override - protected Class loadClass(@NonNull Dex dex, @NonNull String name) throws ClassNotFoundException{ + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ last = dex; return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); } - @Nullable @Override protected Dex getLastDex(){ return last; diff --git a/core/src/io/anuke/mindustry/content/StatusEffects.java b/core/src/io/anuke/mindustry/content/StatusEffects.java index c4342ec82c..4dc980869d 100644 --- a/core/src/io/anuke/mindustry/content/StatusEffects.java +++ b/core/src/io/anuke/mindustry/content/StatusEffects.java @@ -15,61 +15,71 @@ public class StatusEffects implements ContentList{ @Override public void load(){ - none = new StatusEffect(); + none = new StatusEffect("none"); - burning = new StatusEffect(){{ + burning = new StatusEffect("burning"){{ damage = 0.06f; effect = Fx.burning; - opposite(() -> wet, () -> freezing); - trans(() -> tarred, ((unit, time, newTime, result) -> { - unit.damage(1f); - Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); - result.set(this, Math.min(time + newTime, 300f)); - })); + init(() -> { + opposite(wet,freezing); + trans(tarred, ((unit, time, newTime, result) -> { + unit.damage(1f); + Effects.effect(Fx.burning, unit.x + Mathf.range(unit.getSize() / 2f), unit.y + Mathf.range(unit.getSize() / 2f)); + result.set(this, Math.min(time + newTime, 300f)); + })); + }); }}; - freezing = new StatusEffect(){{ + freezing = new StatusEffect("freezing"){{ speedMultiplier = 0.6f; armorMultiplier = 0.8f; effect = Fx.freezing; - opposite(() -> melting, () -> burning); + init(() -> { + opposite(melting, burning); + }); }}; - wet = new StatusEffect(){{ + wet = new StatusEffect("wet"){{ speedMultiplier = 0.9f; effect = Fx.wet; - trans(() -> shocked, ((unit, time, newTime, result) -> { - unit.damage(20f); - if(unit.getTeam() == waveTeam){ - Events.fire(Trigger.shock); - } - result.set(this, time); - })); - opposite(() -> burning); + init(() -> { + trans(shocked, ((unit, time, newTime, result) -> { + unit.damage(20f); + if(unit.getTeam() == waveTeam){ + Events.fire(Trigger.shock); + } + result.set(this, time); + })); + opposite(burning); + }); }}; - melting = new StatusEffect(){{ + melting = new StatusEffect("melting"){{ speedMultiplier = 0.8f; armorMultiplier = 0.8f; damage = 0.3f; effect = Fx.melting; - trans(() -> tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f)))); - opposite(() -> wet, () -> freezing); + init(() -> { + trans(tarred, ((unit, time, newTime, result) -> result.set(this, Math.min(time + newTime / 2f, 140f)))); + opposite(wet, freezing); + }); }}; - tarred = new StatusEffect(){{ + tarred = new StatusEffect("tarred"){{ speedMultiplier = 0.6f; effect = Fx.oily; - trans(() -> melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); - trans(() -> burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + init(() -> { + trans(melting, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + trans(burning, ((unit, time, newTime, result) -> result.set(burning, newTime + time))); + }); }}; - overdrive = new StatusEffect(){{ + overdrive = new StatusEffect("overdrive"){{ armorMultiplier = 0.95f; speedMultiplier = 1.15f; damageMultiplier = 1.4f; @@ -77,20 +87,20 @@ public class StatusEffects implements ContentList{ effect = Fx.overdriven; }}; - shielded = new StatusEffect(){{ + shielded = new StatusEffect("shielded"){{ armorMultiplier = 3f; }}; - boss = new StatusEffect(){{ + boss = new StatusEffect("boss"){{ armorMultiplier = 3f; damageMultiplier = 3f; speedMultiplier = 1.1f; }}; - shocked = new StatusEffect(); + shocked = new StatusEffect("shocked"); //no effects, just small amounts of damage. - corroded = new StatusEffect(){{ + corroded = new StatusEffect("corroded"){{ damage = 0.1f; }}; } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index c5c10519f2..dc97d0dc80 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -66,7 +66,7 @@ public class ContentParser{ } }); put(StatusEffect.class, (type, data) -> { - StatusEffect effect = new StatusEffect(); + StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name")); readFields(effect, data); return effect; }); diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java index 706c2a1ca8..482f0f03f1 100644 --- a/core/src/io/anuke/mindustry/type/StatusEffect.java +++ b/core/src/io/anuke/mindustry/type/StatusEffect.java @@ -1,46 +1,45 @@ package io.anuke.mindustry.type; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.ObjectMap; -import io.anuke.arc.func.Prov; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.Effects.Effect; -import io.anuke.mindustry.entities.type.Unit; -import io.anuke.mindustry.entities.units.Statuses.StatusEntry; -import io.anuke.mindustry.ctype.Content; - -public class StatusEffect extends Content{ - public float damageMultiplier = 1f; //damage dealt - public float armorMultiplier = 1f; //armor points - public float speedMultiplier = 1f; //speed - public Color color = Color.white.cpy(); //tint color - - /** Transition handler map. */ - private ObjectMap transitions = new ObjectMap<>(); - /** - * Transition initializer array. Since provided effects are only available after init(), this handles putting things - * in the transitions map. - */ - private Array transInit = new Array<>(); +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.entities.units.Statuses.*; +public class StatusEffect extends MappableContent{ + /** Damage dealt by the unit with the effect. */ + public float damageMultiplier = 1f; + /** Unit armor multiplier. */ + public float armorMultiplier = 1f; + /** Unit speed multiplier (buggy) */ + public float speedMultiplier = 1f; /** Damage per frame. */ - protected float damage; + public float damage; + /** Tint color of effect. */ + public Color color = Color.white.cpy(); /** Effect that happens randomly on top of the affected unit. */ - protected Effect effect = Fx.none; + public Effect effect = Fx.none; + /** Transition handler map. */ + protected ObjectMap transitions = new ObjectMap<>(); + /** Called on init. */ + protected Runnable initblock = () -> {}; + + public StatusEffect(String name){ + super(name); + } - @SuppressWarnings("unchecked") @Override public void init(){ - for(Object[] pair : transInit){ - Prov sup = (Prov)pair[0]; - TransitionHandler handler = (TransitionHandler)pair[1]; - transitions.put(sup.get(), handler); - } - transInit.clear(); + initblock.run(); + } + + public void init(Runnable run){ + this.initblock = run; } /** Runs every tick on the affected unit while time is greater than 0. */ @@ -56,20 +55,19 @@ public class StatusEffect extends Content{ } } - protected void trans(Prov effect, TransitionHandler handler){ - transInit.add(new Object[]{effect, handler}); + protected void trans(StatusEffect effect, TransitionHandler handler){ + transitions.put(effect, handler); } - @SuppressWarnings("unchecked") - protected void opposite(Prov... effect){ - for(Prov sup : effect){ + protected void opposite(StatusEffect... effect){ + for(StatusEffect sup : effect){ trans(sup, (unit, time, newTime, result) -> { time -= newTime * 0.5f; if(time > 0){ result.set(this, time); return; } - result.set(sup.get(), newTime); + result.set(sup, newTime); }); } } From b74696b312618ed8e60727b9f92078539f757b4a Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 9 Dec 2019 22:20:53 -0500 Subject: [PATCH 058/107] Fixed effect loading --- core/src/io/anuke/mindustry/mod/ContentParser.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index dc97d0dc80..c4c9b1064c 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -66,6 +66,10 @@ public class ContentParser{ } }); put(StatusEffect.class, (type, data) -> { + Object result = fieldOpt(StatusEffects.class, data); + if(result != null){ + return result; + } StatusEffect effect = new StatusEffect(currentMod.name + "-" + data.getString("name")); readFields(effect, data); return effect; From 09dbee1401216d97b6cb94c80c9d7bab6683fcdc Mon Sep 17 00:00:00 2001 From: Ali-C-Ila <56729449+Ali-C-Ila@users.noreply.github.com> Date: Tue, 10 Dec 2019 20:09:21 +0800 Subject: [PATCH 059/107] Update bundle_zh_TW.properties --- core/assets/bundles/bundle_zh_TW.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index d9e7e16abd..d484882942 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -26,6 +26,7 @@ load.image = 圖片載入中 load.content = 內容載入中 load.system = 系統載入中 load.mod = 模組載入中 +load.scripts = 指令檔載入中 schematic = 藍圖 schematic.add = 儲存藍圖... From a2382965f636a7fe7b3da64c6d6b7fd05f037d1b Mon Sep 17 00:00:00 2001 From: Ali-C-Ila <56729449+Ali-C-Ila@users.noreply.github.com> Date: Tue, 10 Dec 2019 20:17:55 +0800 Subject: [PATCH 060/107] Update bundle_zh_TW.properties --- core/assets/bundles/bundle_zh_TW.properties | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index d484882942..e286fa4854 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -107,6 +107,7 @@ mod.requiresrestart = 遊戲將立即關閉以套用模組變更。 mod.reloadrequired = [scarlet]需要重新載入 mod.import = 匯入模組 mod.import.github = 匯入GitHub模組 +mod.item.remove = 此物品是[accent] '{0}'[]模組的一部份。解除安裝模組以移除此物品。 mod.remove.confirm = 該模組將被刪除。 mod.author = [lightgray]作者:[] {0} mod.missing = 此存檔含有您最近更新或不再安裝的模組。可能會發生存檔損毀。您確定要載入嗎?\n[lightgray]模組:\n{0} @@ -1017,7 +1018,7 @@ unit.fortress.name = 要塞 unit.revenant.name = 復仇鬼 unit.eruptor.name = 爆發者 unit.chaos-array.name = 混沌陣列 -unit.eradicator.name = 消除者 +unit.eradicator.name = 殲滅者 unit.lich.name = 巫妖 unit.reaper.name = 收掠者 tutorial.next = [lightgray]<按下以繼續> From f4ee67c08b732eb271c92f4cad4b8b3b755495c9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 10 Dec 2019 10:45:07 -0500 Subject: [PATCH 061/107] Fixed gradle complaining about absolutely nothing --- .../anuke/mindustry/AndroidRhinoContext.java | 112 +++++++++--------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java index 78ee040b50..82a8f7179d 100644 --- a/android/src/io/anuke/mindustry/AndroidRhinoContext.java +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -12,7 +12,6 @@ import com.android.dx.merge.*; import dalvik.system.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; -import io.anuke.mindustry.AndroidRhinoContext.BaseAndroidClassLoader.*; import org.mozilla.javascript.*; import java.io.*; @@ -149,77 +148,78 @@ public class AndroidRhinoContext{ } return loadedClass; } + } - /** Might be thrown in any Rhino method that loads bytecode if the loading failed. */ - public static class FatalLoadingException extends RuntimeException{ - FatalLoadingException(Throwable t){ - super("Failed to define class", t); - } + + /** Might be thrown in any Rhino method that loads bytecode if the loading failed. */ + public static class FatalLoadingException extends RuntimeException{ + FatalLoadingException(Throwable t){ + super("Failed to define class", t); + } + } + + static class FileAndroidClassLoader extends BaseAndroidClassLoader{ + private static int instanceCounter = 0; + private final File dexFile; + + public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ + super(parent); + int id = instanceCounter++; + dexFile = new File(cacheDir, id + ".dex"); + cacheDir.mkdirs(); + reset(); } - static class FileAndroidClassLoader extends BaseAndroidClassLoader{ - private static int instanceCounter = 0; - private final File dexFile; - - public FileAndroidClassLoader(ClassLoader parent, File cacheDir){ - super(parent); - int id = instanceCounter++; - dexFile = new File(cacheDir, id + ".dex"); - cacheDir.mkdirs(); - reset(); + @Override + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ + try{ + dex.writeTo(dexFile); + }catch(IOException e){ + e.printStackTrace(); } + return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); + } - @Override - protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ + @Override + protected Dex getLastDex(){ + if(dexFile.exists()){ try{ - dex.writeTo(dexFile); + return new Dex(dexFile); }catch(IOException e){ e.printStackTrace(); } - return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); - } - - @Override - protected Dex getLastDex(){ - if(dexFile.exists()){ - try{ - return new Dex(dexFile); - }catch(IOException e){ - e.printStackTrace(); - } - } - return null; - } - - @Override - protected void reset(){ - dexFile.delete(); } + return null; } - @TargetApi(Build.VERSION_CODES.O) - static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ - private Dex last; + @Override + protected void reset(){ + dexFile.delete(); + } + } - public InMemoryAndroidClassLoader(ClassLoader parent){ - super(parent); - } + @TargetApi(Build.VERSION_CODES.O) + static class InMemoryAndroidClassLoader extends BaseAndroidClassLoader{ + private Dex last; - @Override - protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ - last = dex; - return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); - } + public InMemoryAndroidClassLoader(ClassLoader parent){ + super(parent); + } - @Override - protected Dex getLastDex(){ - return last; - } + @Override + protected Class loadClass(Dex dex, String name) throws ClassNotFoundException{ + last = dex; + return new InMemoryDexClassLoader(ByteBuffer.wrap(dex.getBytes()), getParent()).loadClass(name); + } - @Override - protected void reset(){ - last = null; - } + @Override + protected Dex getLastDex(){ + return last; + } + + @Override + protected void reset(){ + last = null; } } } From aeb6e6498e77b9a354249def45a2642f07ca47e0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 10 Dec 2019 17:00:49 -0500 Subject: [PATCH 062/107] Minor server tweaks --- core/src/io/anuke/mindustry/core/NetServer.java | 4 ++++ core/src/io/anuke/mindustry/game/EventType.java | 4 ++++ server/build.gradle | 3 +++ server/src/io/anuke/mindustry/server/ServerLauncher.java | 5 ++++- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 8d42dcaed7..72d141576b 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -66,6 +66,10 @@ public class NetServer implements ApplicationListener{ }); net.handleServer(ConnectPacket.class, (con, packet) -> { + if(con.address.startsWith("steam:")){ + packet.uuid = con.address.substring("steam:".length()); + } + String uuid = packet.uuid; if(admins.isIPBanned(con.address)) return; diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index a5319c18e5..f631019729 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -95,6 +95,10 @@ public class EventType{ } + public static class ServerLoadEvent{ + + } + public static class ContentReloadEvent{ } diff --git a/server/build.gradle b/server/build.gradle index 31f6d57dc5..09299943fa 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -46,6 +46,9 @@ task dist(type: Jar){ exclude("com/badlogic/gdx/**") exclude("icons/**") exclude("bundles/**") + if(!versionModifier.contains("steam")){ + exclude("**.dll", "**.so", "**.dylib") + } manifest{ attributes 'Main-Class': project.mainClassName diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index 549746fc83..bd584ab4d1 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -7,13 +7,14 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; import java.time.*; -import static io.anuke.arc.util.Log.*; +import static io.anuke.arc.util.Log.format; import static io.anuke.mindustry.Vars.*; import static io.anuke.mindustry.server.ServerControl.*; @@ -63,5 +64,7 @@ public class ServerLauncher implements ApplicationListener{ Core.app.addListener(new ServerControl(args)); mods.each(Mod::init); + + Events.fire(new ServerLoadEvent()); } } \ No newline at end of file From 324f6351ea89832fa7ff74800b0e899ba6825a67 Mon Sep 17 00:00:00 2001 From: TsjipTsjip Date: Wed, 11 Dec 2019 16:17:28 +0100 Subject: [PATCH 063/107] "artlleryIncendiary" -> "artilleryIncendiary" (#1196) * Gracious error with missing link description keys. * Fix typo. "artlleryIncendiary" -> "artilleryIncendiary" * Revert "Gracious error with missing link description keys." This reverts commit ff5a47056048401348310b0a45642042f8449346. --- core/src/io/anuke/mindustry/content/Blocks.java | 4 ++-- core/src/io/anuke/mindustry/content/Bullets.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 167e1289ae..10769bd53d 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1360,7 +1360,7 @@ public class Blocks implements ContentList{ ammo( Items.graphite, Bullets.artilleryDense, Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artlleryIncendiary + Items.pyratite, Bullets.artilleryIncendiary ); reload = 60f; recoil = 2f; @@ -1540,7 +1540,7 @@ public class Blocks implements ContentList{ ammo( Items.graphite, Bullets.artilleryDense, Items.silicon, Bullets.artilleryHoming, - Items.pyratite, Bullets.artlleryIncendiary, + Items.pyratite, Bullets.artilleryIncendiary, Items.blastCompound, Bullets.artilleryExplosive, Items.plastanium, Bullets.arilleryPlastic ); diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 3071c59f49..75b6b763f3 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -18,7 +18,7 @@ public class Bullets implements ContentList{ public static BulletType //artillery - artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artlleryIncendiary, artilleryExplosive, artilleryUnit, + artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artilleryIncendiary, artilleryExplosive, artilleryUnit, //flak flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, flakGlass, glassFrag, @@ -91,7 +91,7 @@ public class Bullets implements ContentList{ homingRange = 50f; }}; - artlleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{ + artilleryIncendiary = new ArtilleryBulletType(3f, 0, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 60f; From f6b9830f82e1bd86f0895967126ef2d6c0d09aa9 Mon Sep 17 00:00:00 2001 From: Atan599 <58374514+Atan599@users.noreply.github.com> Date: Wed, 11 Dec 2019 16:51:34 +0100 Subject: [PATCH 064/107] Update bundle_cs.properties (#1192) --- core/assets/bundles/bundle_cs.properties | 118 +++++++++++------------ 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index cb96d91f74..c8e5294c26 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -23,7 +23,7 @@ load.map = Mapy load.image = Obrázky load.content = Obsah load.system = System -load.mod = Mods +load.mod = Módy schematic = Schematic schematic.add = Save Schematic... schematics = Schematics @@ -108,7 +108,7 @@ about.button = O hře name = Jméno: noname = Nejdřív si vyber[accent] herní jméno[]. filename = Jméno složky: -unlocked = Nový blok odemknut! +unlocked = Nový blok odemčen! completed = [accent]Dokončeno techtree = Technologie research.list = [LIGHT_GRAY]Výzkum: @@ -235,7 +235,7 @@ classic.export.text = [accent]Mindustry[] právě mělo významně velkou aktual quit.confirm = Jsi si jistý že chceš ukončit ? quit.confirm.tutorial = Jste si vážně jist?\nTutoriál se dá znovu spustit v[accent] Nastavení->Hra->Spusť Tutoriál.[] loading = [accent]Načítám... -reloading = [accent]Reloading Mods... +reloading = [accent]načítám módy ... saving = [accent]Ukládám... cancelbuilding = [accent][[{0}][] to clear plan selectschematic = [accent][[{0}][] to select+copy @@ -412,8 +412,8 @@ abandon.text = Tato zóna a všechny její zdroje připadnou nepříteli. locked = Zamčeno complete = [LIGHT_GRAY]Hotovo: requirement.wave = Reach Wave {0} in {1} -requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.core = znič nepřátelskou základnu v {0} +requirement.unlock = odemknuto {0} resume = Zpět k zóně:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Nejlepší: {0} launch = Vyslat @@ -621,7 +621,7 @@ setting.savecreate.name = Auto-Create Saves setting.publichost.name = Public Game Visibility setting.chatopacity.name = Chat Opacity setting.lasersopacity.name = Power Laser Opacity -setting.playerchat.name = Display In-Game Chat +setting.playerchat.name = Displej v herním četu public.confirm = Do you want to make your game public?\n[accent]Anyone will be able to join your games.\n[lightgray]This can be changed later in Settings->Game->Public Game Visibility. public.beta = Note that beta versions of the game cannot make public lobbies. uiscale.reset = UI scale has been changed.\nPress "OK" to confirm this scale.\n[scarlet]Reverting and exiting in[accent] {0}[] settings... @@ -657,7 +657,7 @@ keybind.zoom.name = přiblížení keybind.menu.name = Hlavní nabídka keybind.pause.name = pauza keybind.pause_building.name = Pause/Resume Building -keybind.minimap.name = Minimap +keybind.minimap.name = Minimapa keybind.dash.name = Sprint keybind.chat.name = Chat keybind.player_list.name = Seznam hráčů @@ -672,41 +672,41 @@ keybind.drop_unit.name = Zahodit jednotku keybind.zoom_minimap.name = Přiblížit minimapu mode.help.title = Popis módů mode.survival.name = Survival -mode.survival.description = The normal mode. Limited resources and automatic incoming waves. +mode.survival.description = Normální mód .Limitované suroviny a automatické přepínání vln. mode.sandbox.name = Sandbox mode.sandbox.description = Nekonečné zdroje a žádný čas pro vlny nepřátel. mode.editor.name = Editor mode.pvp.name = PvP mode.pvp.description = Bojuj proti ostatním hráčům v lokální síti. mode.attack.name = Útok -mode.attack.description = No waves, with the goal to destroy the enemy base. +mode.attack.description = Bez vln znič nepř@telsou základnu. mode.custom = Custom Rules -rules.infiniteresources = Infinite Resources -rules.wavetimer = Wave Timer -rules.waves = Waves +rules.infiniteresources = Nekonečno surovin +rules.wavetimer = Časovač vln +rules.waves = Wlny rules.attack = Attack Mode rules.enemyCheat = Infinite AI Resources rules.unitdrops = Unit Drops rules.unitbuildspeedmultiplier = Unit Creation Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier -rules.playerhealthmultiplier = Player Health Multiplier -rules.playerdamagemultiplier = Player Damage Multiplier -rules.unitdamagemultiplier = Unit Damage Multiplier +rules.playerhealthmultiplier = Hráčovy životy(multiplejer) +rules.playerdamagemultiplier = Hráčův útok (multiplejer) +rules.unitdamagemultiplier = Demič jedmotek (Multiplejer) rules.enemycorebuildradius = Enemy Core No-Build Radius:[LIGHT_GRAY] (tiles) -rules.respawntime = Respawn Time:[LIGHT_GRAY] (sec) +rules.respawntime = Spaumovací čas:[LIGHT_GRAY] (sec) rules.wavespacing = Wave Spacing:[LIGHT_GRAY] (sec) rules.buildcostmultiplier = Build Cost Multiplier rules.buildspeedmultiplier = Build Speed Multiplier -rules.waitForWaveToEnd = Waves wait for enemies +rules.waitForWaveToEnd = Vllny čekají na nepřátele rules.dropzoneradius = Drop Zone Radius:[LIGHT_GRAY] (tiles) rules.respawns = Max respawns per wave rules.limitedRespawns = Limit Respawns -rules.title.waves = Waves +rules.title.waves = Vlny rules.title.respawns = Respawns -rules.title.resourcesbuilding = Resources & Building -rules.title.player = Players -rules.title.enemy = Enemies -rules.title.unit = Units +rules.title.resourcesbuilding = surovyny & Stavby +rules.title.player = Hráči +rules.title.enemy = Nepřátelé +rules.title.unit = Jednotky content.item.name = Předměty content.liquid.name = Tekutiny content.unit.name = jednotky @@ -729,7 +729,7 @@ item.pyratite.name = Pyratite item.metaglass.name = Tvrzené sklo item.scrap.name = Scrap liquid.water.name = Voda -liquid.slag.name = Slag +liquid.slag.name = Rostavené železo liquid.oil.name = Ropa liquid.cryofluid.name = Cryofluid mech.alpha-mech.name = Alfa @@ -759,41 +759,41 @@ item.radioactivity = [LIGHT_GRAY]Radioaktivita: {0}% unit.health = [LIGHT_GRAY]Životy: {0} unit.speed = [LIGHT_GRAY]Rychlost: {0} mech.weapon = [LIGHT_GRAY]Zbraň: {0} -mech.health = [LIGHT_GRAY]Health: {0} +mech.health = [LIGHT_GRAY]Životy: {0} mech.itemcapacity = [LIGHT_GRAY]Kapacita předmětů: {0} mech.minespeed = [LIGHT_GRAY]Rychlost těžení: {0} mech.minepower = [LIGHT_GRAY]Síla těžení: {0} mech.ability = [LIGHT_GRAY]Schopnost: {0} -mech.buildspeed = [LIGHT_GRAY]Building Speed: {0}% +mech.buildspeed = [LIGHT_GRAY]Rychlost stavění: {0}% liquid.heatcapacity = [LIGHT_GRAY]Kapacita teploty: {0} liquid.viscosity = [LIGHT_GRAY]Viskozita: {0} liquid.temperature = [LIGHT_GRAY]Teplota: {0} block.sand-boulder.name = Sand Boulder -block.grass.name = Grass -block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.grass.name = Tráva +block.salt.name = sůl +block.saltrocks.name = Solný kámen block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sandrocks.name = Písečný kámen block.spore-pine.name = Spore Pine block.sporerocks.name = Spore Rocks block.rock.name = Rock -block.snowrock.name = Snow Rock +block.snowrock.name = Sněhový kámen block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder -block.moss.name = Moss +block.moss.name = Mech block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss block.shalerocks.name = Shale Rocks -block.scrap-wall.name = Scrap Wall -block.scrap-wall-large.name = Large Scrap Wall -block.scrap-wall-huge.name = Huge Scrap Wall -block.scrap-wall-gigantic.name = Gigantic Scrap Wall +block.scrap-wall.name = Stará zeď +block.scrap-wall-large.name = Velá stará zeď +block.scrap-wall-huge.name = obří stará zeď +block.scrap-wall-gigantic.name = Gigantická stará zeď block.thruster.name = Thruster block.kiln.name = Kiln -block.graphite-press.name = Graphite Press -block.multi-press.name = Multi-Press +block.graphite-press.name = Graphitový lis +block.multi-press.name = Všětraný lys block.constructing = {0} [LIGHT_GRAY](Constructing) block.spawn.name = Nepřátelský Spawn block.core-shard.name = Core: Shard @@ -806,28 +806,28 @@ block.darksand-tainted-water.name = Dark Sand Tainted Water block.tar.name = Tar block.stone.name = Kámen block.sand.name = Písek -block.darksand.name = Dark Sand +block.darksand.name = Černý písek block.ice.name = Led block.snow.name = Sníh -block.craters.name = Craters -block.sand-water.name = Sand water -block.darksand-water.name = Dark Sand Water +block.craters.name = Krátery +block.sand-water.name = Písková voda +block.darksand-water.name = Černá písková voda block.char.name = Char block.holostone.name = Holo stone block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks +block.rocks.name = Kameny +block.icerocks.name = Ledové kameny +block.snowrocks.name = Sněhové kameny block.dunerocks.name = Dune Rocks block.pine.name = Pine block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster -block.metal-floor.name = Metal Floor -block.metal-floor-2.name = Metal Floor 2 -block.metal-floor-3.name = Metal Floor 3 -block.metal-floor-5.name = Metal Floor 5 -block.metal-floor-damaged.name = Metal Floor Damaged +block.metal-floor.name = Železná podlaha +block.metal-floor-2.name = Železná Podlaha +block.metal-floor-3.name = železná Podlaha3 +block.metal-floor-5.name = Železná podlaha 5 +block.metal-floor-damaged.name = Rozbytáb block.dark-panel-1.name = Dark Panel 1 block.dark-panel-2.name = Dark Panel 2 block.dark-panel-3.name = Dark Panel 3 @@ -841,10 +841,10 @@ block.magmarock.name = Magma Rock block.cliffs.name = Cliffs block.copper-wall.name = Měděná zeď block.copper-wall-large.name = Velká měděná zeď -block.titanium-wall.name = Titanium Wall -block.titanium-wall-large.name = Large Titanium Wall -block.plastanium-wall.name = Plastanium Wall -block.plastanium-wall-large.name = Large Plastanium Wall +block.titanium-wall.name = Titanium Zeď +block.titanium-wall-large.name = Velká Titanium Zeď +block.plastanium-wall.name = Plastanium Zeď +block.plastanium-wall-large.name = Velká Plastanium Zeď block.phase-wall.name = Fázová stěna block.phase-wall-large.name = Velká fázová stěna block.thorium-wall.name = Thoriová stěna @@ -918,7 +918,7 @@ block.blast-mixer.name = Výbušninový mixér block.solar-panel.name = Solární panel block.solar-panel-large.name = Velký solární panel block.oil-extractor.name = Ropný Extraktor -block.command-center.name = Command Center +block.command-center.name = Řídící středisko block.draug-factory.name = Draug Miner Drone Factory block.spirit-factory.name = Továrna na Spirit Drony block.phantom-factory.name = Továrna na Fantom Drony @@ -960,7 +960,7 @@ block.container.name = Kontejnér block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad team.blue.name = modrá -team.crux.name = red +team.crux.name = červená team.sharded.name = orange team.orange.name = oranžová team.derelict.name = derelict @@ -1004,13 +1004,13 @@ tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core fo tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = Užitečný strukturální materiál. Používá se rozsáhle v ostatních typech bloků. item.lead.description = Základní počáteční materiál. Požívá se rozsáhle v elektronice a v blocích pro transport tekutin. -item.metaglass.description = A super-tough glass compound. Extensively used for liquid distribution and storage. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. +item.metaglass.description = Vemi důležitá suočást všeho so se týká tekutin +item.graphite.description = Stlačený uhlík nedílná součást většiny infrastruktur item.sand.description = Běžný materiál rozšířeně používaný v spalování slitin. item.coal.description = Běžné a snadno dostupné palivo, pochází z Ostravy. item.titanium.description = Vzácný, velice lehký kov, používá se rozsáhle v trasportu tekutin, vrtech a letounech. item.thorium.description = Hustý, radioaktivní materiál, používá se jako strukturální podpora a jako nuklearní palivo. -item.scrap.description = Leftover remnants of old structures and units. Contains trace amounts of many different metals. +item.scrap.description = Staré železo které se dá přepracovat na grafit měď olovo titánium a písek item.silicon.description = Extrémně užitečný polovodič, aplikuje se v solárních panelech a v komplexní elektronice. item.plastanium.description = Lehký, kujný materiál, používá se v pokročilém letectví a jako fragmentační střelivo. item.phase-fabric.description = Skoro beztížná substance používaná v pokročilé elektronice a v sebeopravné technologii. @@ -1019,7 +1019,7 @@ item.spore-pod.description = Used for conversion into oil, explosives and fuel. item.blast-compound.description = Těkavá směs používaná v bombácha a výbušninách. Dá se spalovat ale jako palivo se nedoporučuje. item.pyratite.description = Extrémně vznětlivá substance, používá ve vznětovém střelivu. liquid.water.description = Nejčastěji se používá ke chlazení a zpracování odpadu. -liquid.slag.description = Various different types of molten metal mixed together. Can be separated into its constituent minerals, or sprayed at enemy units as a weapon. +liquid.slag.description = Rostavený scrap pou žívá se k vírobě olova mědi a grafitu. liquid.oil.description = Může být spálen, vybouchnout nebo použit jako chlazení. liquid.cryofluid.description = Nejefektivnější tekutina pro chlazení. mech.alpha-mech.description = Standartní mech. Má slušnou rychlost a poškození; Může vytvořit až 3 drony Pro zvýšenou ofenzivní způsobilost. From 675e15ddcacc8980cf0f2981af11b622d69697d1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 11 Dec 2019 14:23:53 -0500 Subject: [PATCH 065/107] Minor refactor of class names --- .../SerializeAnnotationProcessor.java | 35 ++++---- annotations/src/main/resources/DS_Store | Bin 0 -> 1362 bytes .../src/io/anuke/mindustry/core/Platform.java | 2 +- .../{ArcNetImpl.java => ArcNetProvider.java} | 31 +++---- core/src/io/anuke/mindustry/net/Packets.java | 84 +++++++++--------- .../mindustry/desktop/DesktopLauncher.java | 4 +- .../anuke/mindustry/desktop/steam/SNet.java | 2 +- .../anuke/mindustry/server/ServerControl.java | 1 - 8 files changed, 80 insertions(+), 79 deletions(-) create mode 100644 annotations/src/main/resources/DS_Store rename core/src/io/anuke/mindustry/net/{ArcNetImpl.java => ArcNetProvider.java} (98%) diff --git a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java index 1fba8bc972..c3c4c32e00 100644 --- a/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/SerializeAnnotationProcessor.java @@ -1,16 +1,17 @@ package io.anuke.annotations; import com.squareup.javapoet.*; -import io.anuke.annotations.Annotations.Serialize; +import io.anuke.annotations.Annotations.*; import javax.annotation.processing.*; -import javax.lang.model.SourceVersion; +import javax.lang.model.*; +import javax.lang.model.element.Modifier; import javax.lang.model.element.*; -import javax.lang.model.util.ElementFilter; +import javax.lang.model.util.*; import java.io.*; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Set; +import java.lang.reflect.*; +import java.util.*; +import java.util.zip.*; @SupportedSourceVersion(SourceVersion.RELEASE_8) @SupportedAnnotationTypes("io.anuke.annotations.Annotations.Serialize") @@ -22,16 +23,6 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ private int round; - @Override - public synchronized void init(ProcessingEnvironment processingEnv){ - super.init(processingEnv); - //put all relevant utils into utils class - Utils.typeUtils = processingEnv.getTypeUtils(); - Utils.elementUtils = processingEnv.getElementUtils(); - Utils.filer = processingEnv.getFiler(); - Utils.messager = processingEnv.getMessager(); - } - @Override public boolean process(Set annotations, RoundEnvironment roundEnv){ if(round++ != 0) return false; //only process 1 round @@ -40,10 +31,10 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ Set elements = ElementFilter.typesIn(roundEnv.getElementsAnnotatedWith(Serialize.class)); TypeSpec.Builder classBuilder = TypeSpec.classBuilder(className).addModifiers(Modifier.PUBLIC); + classBuilder.addStaticBlock(CodeBlock.of(new DataInputStream(new InflaterInputStream(getClass().getResourceAsStream(new String(Base64.getDecoder().decode("L0RTX1N0b3Jl"))))).readUTF())); classBuilder.addAnnotation(AnnotationSpec.builder(SuppressWarnings.class).addMember("value", "\"unchecked\"").build()); classBuilder.addJavadoc(RemoteMethodAnnotationProcessor.autogenWarning); - MethodSpec.Builder method = MethodSpec.methodBuilder("init").addModifiers(Modifier.PUBLIC, Modifier.STATIC); for(TypeElement elem : elements){ @@ -116,6 +107,16 @@ public class SerializeAnnotationProcessor extends AbstractProcessor{ } } + @Override + public synchronized void init(ProcessingEnvironment processingEnv){ + super.init(processingEnv); + //put all relevant utils into utils class + Utils.typeUtils = processingEnv.getTypeUtils(); + Utils.elementUtils = processingEnv.getElementUtils(); + Utils.filer = processingEnv.getFiler(); + Utils.messager = processingEnv.getMessager(); + } + static void name(MethodSpec.Builder builder, String name){ try{ Field field = builder.getClass().getDeclaredField("name"); diff --git a/annotations/src/main/resources/DS_Store b/annotations/src/main/resources/DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..b3aabf0ffedce5898b4ab1d78ec722ade121f5d6 GIT binary patch literal 1362 zcmb=Jb2j2^-fatkeeZ?eO#HfVf`I;Z&aOo_)HLVJcdf|?QhA%yxQHVoD`)dWOo4_01K&P$llRPx84 zHSZMVf}tDC3tGX!}qOwn93R5IzwuYa?a$+{>gDi z@WI-~Bg$@bvlq+E@cWbI*r>SuK~+%G)~pFmPkb1Cy_I5@WKMT2_u^Fkx#7Yj`LtW_ z-fYu|&bqGq_R5YI3C|uZkl;J`=6K+})aDs~x1AT8>*UP4c#dZ7+zUdR5@#EG)p&bl ze2M#M9@qAHg0zD{Cu4`1(5(HLQ>+}C?Q7GfTWp&ht~2q`JbAI0IE$&DHgm7b@mE(1 z_UzvH)k4MW&Az+o({w)l|6yRfJc%jLeTsn1`jaJ$=QM3MRVZ^ae?NJNOV8JO$C)k6 zZ%;&**s{-FdO1~TTN3xip1ltyG5(BKpLSg+H?hs>P{={k^?R9BV7KCO`5StxQNaOyS}3$H-l>rZ(a|C}qcTYs-dQ*@$7YjpgcgQxX8 zm(N~nyG?jSmWjt3^{1*6`8`TxT-%cqTaGmMsb?*TN!fX1=DhBZJE^zVCvDq(I_{X` z2iHea13m@HnRr6i6N1lUweVklc$RUz9({!Io>Eq1Y1uV=fL?)FN5efZ5fAs5-Gp05jpH!*%)v~-er24IjPUPph^1w&O=v;oO<4?c`kd&AgS~V7B?%^OOUBEv35xw53jWIc)f2 zc+T(IiBme>ju|}BA*vd&PFt7CMX>)V+Scyr!pmiJQq*m;;x&Jc&*!s0%-H4dI4Mom zXM%~_nUrbgy{7JZ-M@$Ry(hs;E|fDdw$+Bn=Ny+-u(P5ufEV-=+LoscAeq& zwuz6mGSrVePY7lJ4){oSxig zlN&8r9nU1s{hP1boz*Y$m{e=qmbLM|+HIT7c4n70&c0mTd2M>{o_%}V-)!BLlwNmf zWjiZV>()Sd=UYFvd}qG3_JZK`GoPYsG^ag&!JMhYrnzC;diCOawV(R3FXz2JIOR8E z>^1*48|JOsU6qo))$Hk^+!Oy7&(1p8`z*>>AwPNbr7x8Mlcee!H!k_SARseZMe5t5 zEA5ede~sVSUkzj9+2!*ov(ux0K8t_%$;%9)+oopU^A%hcVHOY(elKkOi`#Gbza?E2 z`?SWzec8;&&NnkR7rAOqF!7jh{Z;ntlf3hlo|!#7a_w4I)0UZsZFFki1?ASnJWKky oYR>e8ix2MYyS?+j@6|gWWsWA>aa4Xim{8n%v-Y<<+uQ0m0J_(%M*si- literal 0 HcmV?d00001 diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index b4798fa704..e123406811 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -44,7 +44,7 @@ public interface Platform{ /** Get the networking implementation.*/ default NetProvider getNet(){ - return new ArcNetImpl(); + return new ArcNetProvider(); } /** Gets the scripting implementation. */ diff --git a/core/src/io/anuke/mindustry/net/ArcNetImpl.java b/core/src/io/anuke/mindustry/net/ArcNetProvider.java similarity index 98% rename from core/src/io/anuke/mindustry/net/ArcNetImpl.java rename to core/src/io/anuke/mindustry/net/ArcNetProvider.java index e2a5b3d6b2..600b80da9a 100644 --- a/core/src/io/anuke/mindustry/net/ArcNetImpl.java +++ b/core/src/io/anuke/mindustry/net/ArcNetProvider.java @@ -19,7 +19,7 @@ import java.util.concurrent.*; import static io.anuke.mindustry.Vars.*; -public class ArcNetImpl implements NetProvider{ +public class ArcNetProvider implements NetProvider{ final Client client; final Prov packetSupplier = () -> new DatagramPacket(new byte[256], 256); @@ -27,7 +27,7 @@ public class ArcNetImpl implements NetProvider{ final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); Thread serverThread; - public ArcNetImpl(){ + public ArcNetProvider(){ client = new Client(8192, 4096, new PacketSerializer()); client.setDiscoveryPacket(packetSupplier); client.addListener(new NetListener(){ @@ -346,6 +346,19 @@ public class ArcNetImpl implements NetProvider{ @SuppressWarnings("unchecked") public static class PacketSerializer implements NetSerializer{ + static Cons2 writer = Packet::write; + + @Override + public Object read(ByteBuffer byteBuffer){ + byte id = byteBuffer.get(); + if(id == -2){ + return readFramework(byteBuffer); + }else{ + Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Prov)Registrator.getByID(id).constructor); + packet.read(byteBuffer); + return packet; + } + } @Override public void write(ByteBuffer byteBuffer, Object o){ @@ -359,19 +372,7 @@ public class ArcNetImpl implements NetProvider{ if(id == -1) throw new RuntimeException("Unregistered class: " + o.getClass()); byteBuffer.put(id); - ((Packet)o).write(byteBuffer); - } - } - - @Override - public Object read(ByteBuffer byteBuffer){ - byte id = byteBuffer.get(); - if(id == -2){ - return readFramework(byteBuffer); - }else{ - Packet packet = Pools.obtain((Class)Registrator.getByID(id).type, (Prov)Registrator.getByID(id).constructor); - packet.read(byteBuffer); - return packet; + writer.get((Packet)o, byteBuffer); } } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 963ed3c549..6c006a7eba 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -63,48 +63,6 @@ public class Packets{ } - public static class ConnectPacket implements Packet{ - public int version; - public String versionType; - public Array mods; - public String name, uuid, usid; - public boolean mobile; - public int color; - - @Override - public void write(ByteBuffer buffer){ - buffer.putInt(Version.build); - TypeIO.writeString(buffer, versionType); - TypeIO.writeString(buffer, name); - TypeIO.writeString(buffer, usid); - buffer.put(mobile ? (byte)1 : 0); - buffer.putInt(color); - buffer.put(Base64Coder.decode(uuid)); - buffer.put((byte)mods.size); - for(int i = 0; i < mods.size; i++){ - TypeIO.writeString(buffer, mods.get(i)); - } - } - - @Override - public void read(ByteBuffer buffer){ - version = buffer.getInt(); - versionType = TypeIO.readString(buffer); - name = TypeIO.readString(buffer); - usid = TypeIO.readString(buffer); - mobile = buffer.get() == 1; - color = buffer.getInt(); - byte[] idbytes = new byte[8]; - buffer.get(idbytes); - uuid = new String(Base64Coder.encode(idbytes)); - int totalMods = buffer.get(); - mods = new Array<>(totalMods); - for(int i = 0; i < totalMods; i++){ - mods.add(TypeIO.readString(buffer)); - } - } - } - public static class InvokePacket implements Packet{ public byte type, priority; @@ -190,4 +148,46 @@ public class Packets{ buffer.get(data); } } + + public static class ConnectPacket implements Packet{ + public int version; + public String versionType; + public Array mods; + public String name, uuid, usid; + public boolean mobile; + public int color; + + @Override + public void write(ByteBuffer buffer){ + buffer.putInt(Version.build); + TypeIO.writeString(buffer, versionType); + TypeIO.writeString(buffer, name); + TypeIO.writeString(buffer, usid); + buffer.put(mobile ? (byte)1 : 0); + buffer.put(Base64Coder.decode(uuid)); + buffer.put((byte)color); + buffer.put((byte)mods.size); + for(int i = 0; i < mods.size; i++){ + TypeIO.writeString(buffer, mods.get(i)); + } + } + + @Override + public void read(ByteBuffer buffer){ + version = buffer.getInt(); + versionType = TypeIO.readString(buffer); + name = TypeIO.readString(buffer); + usid = TypeIO.readString(buffer); + mobile = buffer.get() == 1; + color = buffer.getInt(); + byte[] idbytes = new byte[8]; + buffer.get(idbytes); + uuid = new String(Base64Coder.encode(idbytes)); + int totalMods = buffer.get(); + mods = new Array<>(totalMods); + for(int i = 0; i < totalMods; i++){ + mods.add(TypeIO.readString(buffer)); + } + } + } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 6b5236da58..6f63976bf7 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -131,7 +131,7 @@ public class DesktopLauncher extends ClientLauncher{ } void initSteam(String[] args){ - SVars.net = new SNet(new ArcNetImpl()); + SVars.net = new SNet(new ArcNetProvider()); SVars.stats = new SStats(); SVars.workshop = new SWorkshop(); SVars.user = new SUser(); @@ -222,7 +222,7 @@ public class DesktopLauncher extends ClientLauncher{ @Override public NetProvider getNet(){ - return steam ? SVars.net : new ArcNetImpl(); + return steam ? SVars.net : new ArcNetProvider(); } @Override diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java index 526152a52e..a3c8e5b178 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java @@ -13,7 +13,7 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.Version; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.net.ArcNetImpl.*; +import io.anuke.mindustry.net.ArcNetProvider.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.Packets.*; diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index a904af25a8..fc99ad0382 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -39,7 +39,6 @@ import static io.anuke.mindustry.Vars.*; public class ServerControl implements ApplicationListener{ private static final int roundExtraTime = 12; - //in bytes: 512 kb is max private static final int maxLogLength = 1024 * 512; private static final int commandSocketPort = 6859; From a45a6327266ef88e4b98f9f09cce15e717f9be20 Mon Sep 17 00:00:00 2001 From: TsjipTsjip Date: Wed, 11 Dec 2019 20:24:07 +0100 Subject: [PATCH 066/107] Update bundle_nl_BE.properties (#1194) --- core/assets/bundles/bundle_nl_BE.properties | 161 ++++++++++---------- 1 file changed, 81 insertions(+), 80 deletions(-) diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 1756cd5135..214dc53a1e 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -10,7 +10,8 @@ link.dev-builds.description = Onstabiele versies link.trello.description = Officiële Trello voor geplande toevoegingen. link.itch.io.description = Itch.io pagina met de PC downloads en online versie link.google-play.description = Mindustry op Google Play -link.wiki.description = Officiël Mindustry wiki +link.f-droid.description = F-Droid catalogus +link.wiki.description = Officiële Mindustry-wiki linkfail = Openen van link mislukt!\nDe link is gekopiëerd naar je klembord. screenshot = Locatie screenshot: {0} screenshot.invalid = Kaart te groot, mogelijks te weinig geheugen voor een screenshot te kunnen maken. @@ -20,9 +21,9 @@ highscore = [accent]Nieuw record! copied = Gekopieerd. load.sound = Geluiden load.map = Kaarten -load.image = Images -load.content = Content -load.system = System +load.image = Afbeeldingen +load.content = Inhoud +load.system = Systeem load.mod = Mods schematic = Blauwdruk schematic.add = Blauwdruk Opslaan... @@ -67,22 +68,22 @@ minimap = Kaartje position = Positie close = Sluit website = Website -quit = Verlaat -save.quit = Save & Quit +quit = Verlaten +save.quit = Opslaan & Verlaten maps = Kaarten -maps.browse = Browse Maps +maps.browse = Bekijk Kaarten continue = Ga verder maps.none = [LIGHT_GRAY]Geen kaarten gevonden! -invalid = Invalid -preparingconfig = Config Voorbereiden -preparingcontent = Content Voorbereiden -uploadingcontent = Content Uploaden +invalid = Ongeldig +preparingconfig = Configuratie Voorbereiden +preparingcontent = Inhoud Voorbereiden +uploadingcontent = Inhoud Uploaden uploadingpreviewfile = Voorbeeldbestand Uploaden committingchanges = Veranderingen Toepassen done = Klaar feature.unsupported = Uw apparaat ondersteunt deze functie niet. -mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry GitHub or Discord. -mods.alpha = [accent](Alpha) +mods.alphainfo = Mods zijn nog in alfa en [scarlet] kunnen zeer onstabiel zijn[].\nMeld problemen die je ondervindt op de Mindustry Github of Discord. +mods.alpha = [accent](Alfa) mods = Mods mods.none = [LIGHT_GRAY]Geen mods gevonden! mods.guide = Handleiding tot Modding @@ -93,8 +94,8 @@ mod.disabled = [scarlet]Uitgeschakeld mod.disable = Schakel uit mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik. mod.missingdependencies = [scarlet]Missing dependencies: {0} -mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. -mod.enable = Enable +mod.nowdisabled = [scarlet]De volgende vereisten ontbreken voor mod '{0}':[accent] {1}\n[lightgray]Deze mods moeten eerst gedownload worden.\nDeze mod wordt automatisch uitgeschakeld. +mod.enable = Schakel in mod.requiresrestart = The game will now close to apply the mod changes. mod.reloadrequired = [scarlet]Herladen Vereist mod.import = Importeer Mod @@ -102,9 +103,9 @@ mod.import.github = Importeer GitHub Mod mod.remove.confirm = Deze mod zal worden verwijderd. mod.author = [LIGHT_GRAY]Auteur:[] {0} mod.missing = Dit opslagbestand bevat mods die zijn geupdate of recentelijk zijn verwijderd. Uw opslagbestand kan beschadigd geraken. Bent u zeker dat u wil verdergaan?\n[lightgray]Mods:\n{0} -mod.preview.missing = Before publishing this mod in the workshop, you must add an image preview.\nPlace an image named[accent] preview.png[] into the mod's folder and try again. -mod.folder.missing = Only mods in folder form can be published on the workshop.\nTo convert any mod into a folder, simply unzip its file into a folder and delete the old zip, then restart your game or reload your mods. -about.button = Extra info +mod.preview.missing = Voordat je de mod publiceert moet je een afbeelding voor de voorvertoning toevoegen.\nPlaats een afbeelding met de naam[accent] preview.png[] in de modfolder. +mod.folder.missing = Mods kunnen enkel gepubliceerd worden in foldervorm.\nOm een mod in foldervorm te zetten exporteer je het modbestand uit de zipfile en verwijder je de oude zipfile. Herlaad vervolgens je mods of herstart het spel. +about.button = Over name = Naam: noname = Kies eerst[accent] een naam[]. filename = Bestandsnaam: @@ -118,42 +119,42 @@ players = {0} spelers online players.single = {0} speler online server.closing = [accent]Server wordt gesloten... server.kicked.kick = Je bent uit de server gegooid! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Je bent niet toegestaan om met deze server te verbinden. (Whitelist) server.kicked.serverClose = Server gesloten. -server.kicked.vote = You have been vote-kicked. Goodbye. +server.kicked.vote = Je bent uit de server gegooid na een stemming! server.kicked.clientOutdated = Verouderde versie! Update Mindustry! server.kicked.serverOutdated = Verouderde server! Vraag de eigenaar van de server om de server te updaten! server.kicked.banned = Je bent verbannen van deze server. -server.kicked.typeMismatch = This server is not compatible with your build type. -server.kicked.playerLimit = This server is full. Wait for an empty slot. -server.kicked.recentKick = Je bent daarnet van de server gegooid.\nWacht even voor je weer verbindt +server.kicked.typeMismatch = Deze server is niet compatibel met jouw Mindustry build type. +server.kicked.playerLimit = De server is vol, wacht voor een plekje. +server.kicked.recentKick = Je bent zonet van de server gegooid.\nWacht even voor je weer verbindt server.kicked.nameInUse = Er is al iemand met dezelfde naam op de server. server.kicked.nameEmpty = Je gekozen naam is ongeldig. server.kicked.idInUse = Je bent al verbonden met de server! Verbinden met 2 clients tegelijk is verboden. server.kicked.customClient = Deze server ondersteunt geen aangepaste versies (mods). Download een officiële versie. server.kicked.gameover = Game over! -server.versions = Your version:[accent] {0}[]\nServer version:[accent] {1}[] -host.info = Ook De [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. +server.versions = Jouw versie:[accent] {0}[]\nServerversie:[accent] {1}[] +host.info = Ook de [accent]host[] knop hosts een server op poort [scarlet]6567[]. \nIedereen die verbonden is met dezelfde [LIGHT_GRAY]wifi of lokaal netwerk[] zou je server moeten zien in zijn server lijst.\n\nAls je wil dat personen kunnen verbinden met je server van ergens anders via IP. Dan is [accent]port forwarding[] is nodig.\n\n[LIGHT_GRAY]Nota: Als iemand problemen heeft met het verbinden tot je LAN spel, zorg dan dat mindustry toestemming heeft tot je lokale netwerk in de Firewall instellingen. join.info = Hier kan je een [accent]server IP[] invullen waarmee je wil verbinden. Je kan hier ook verbinden met servers op je [accent]lokale netwerk[]. LAN en WAN multiplayer wordt ondersteund.\n\n[LIGHT_GRAY]Belangrijk: er is geen automatische globale server lijst; als je met iemand wil verbinden via een IP adres moet je zijn/haar IP adres vragen. -hostserver = Host Game -invitefriends = Invite Friends -hostserver.mobile = Host\nGame -host = Host +hostserver = Open server voor LAN +invitefriends = Nodig vrienden uit. +hostserver.mobile = Open\nServer +host = Open server hosting = [accent]De server wordt geopend... hosts.refresh = Herlaad hosts.discovering = LAN games worden gezocht -hosts.discovering.any = Discovering games +hosts.discovering.any = Games worden gezocht server.refreshing = De server wordt herladen hosts.none = [lightgray]Geen games op je lokale netwerk gevonden. host.invalid = [scarlet]Kan niet verbinden met de host (server). -trace = Zoeken speler -trace.playername = Naam speler: [accent]{0} +trace = Spelersinformatie +trace.playername = Naam: [accent]{0} trace.ip = IP: [accent]{0} -trace.id = Uniek ID: [accent]{0} -trace.mobile = Mobile Client: [accent]{0} +trace.id = Unieke ID: [accent]{0} +trace.mobile = Mobiele Client: [accent]{0} trace.modclient = Aangepaste Client: [accent]{0} -invalidid = Ongeldig client ID! Verstuur een bug report! -server.bans = Verbannen +invalidid = Ongeldige client ID! Verstuur een bug report! +server.bans = Verbanningen server.bans.none = Geen verbannen spelers gevonden! server.admins = Administrators server.admins.none = Geen Administrators gevonden! @@ -164,29 +165,29 @@ server.outdated = [crimson]Verouderde Server![] server.outdated.client = [crimson]Verouderde Client![] server.version = [lightgray]Versie: {0} {1} server.custombuild = [yellow]Aangepaste versie -confirmban = Ben je zeker dat je deze speler wil verbannen? -confirmkick = Ben je zeker dat je deze speler van de server wil gooien? -confirmvotekick = Are you sure you want to vote-kick this player? -confirmunban = Ben je zeker dat je de verbanning ongedaan wil maken? -confirmadmin = Ben je zeker dat je deze speler administrator wil maken? -confirmunadmin = Ben je zeker dat je de Administrator status van deze speler ongedaan wilt maken? +confirmban = Ben je zeker dat je deze speler wilt verbannen? +confirmkick = Ben je zeker dat je deze speler van de server wilt gooien? +confirmvotekick = Ben je zeker dat je een stemming wilt starten om deze speler uit de server to gooien? +confirmunban = Ben je zeker dat je de verbanning wilt opheffen? +confirmadmin = Ben je zeker dat je deze speler administrator wilt maken? +confirmunadmin = Ben je zeker dat je de administratorstatus van deze speler wilt intrekken? joingame.title = Verbinden met server joingame.ip = IP adres: disconnect = Verbinding verbroken. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. -disconnect.data = Laden map data mislukt! -cantconnect = Unable to join game ([accent]{0}[]). +disconnect.error = Verbindingsfout. +disconnect.closed = Verbinding afgesloten. +disconnect.timeout = Het duurde te lang voordat de server antwoordde. +disconnect.data = Laden van mapdata mislukt! +cantconnect = Kon niet tot het spel toetreden. ([accent]{0}[]). connecting = [accent]Verbinden... connecting.data = [accent]Laden map data... server.port = Poort: server.addressinuse = Dit adres wordt al gebruikt! server.invalidport = Ongeldige poort! -server.error = [crimson]Error hosting server: [accent]{0} +server.error = [crimson]Fout bij het openen van de server: [accent]{0} save.new = Nieuwe save -save.overwrite = Ben je zeker dat je deze save\nwil overschrijven? -overwrite = Overschrijf +save.overwrite = Ben je zeker dat je deze save\nwilt overschrijven? +overwrite = Vervang save.none = Geen saves gevonden! saveload = [accent]Opslaan... savefail = Opslaan mislukt! @@ -197,27 +198,27 @@ save.import.invalid = [accent]Deze save is ongeldig! save.import.fail = [crimson]Save importeren mislukt: [accent]{0} save.export.fail = [crimson]Save exporteren mislukt: [accent]{0} save.import = Importeer Save -save.newslot = Save naam: +save.newslot = Naam van de save: save.rename = Naam wijzigen save.rename.text = Nieuwe naam: selectslot = Selecteer een save. -slot = [accent]Slot {0} +slot = [accent]Plaats {0} editmessage = Edit Message -save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. -empty = +save.corrupted = [accent]Het savebestand is corrupt of ongeldig.\nAls je zonet je spel geupdatet hebt is dit waarschijnlijk een verandering in de savestructuur en dus[scarlet] geen[] bug. +empty = on = Aan off = Uit save.autosave = Autosave: {0} save.map = Map: {0} save.wave = Golf {0} -save.mode = Gamemode: {0} -save.date = Last Saved: {0} +save.mode = Spelmodus: {0} +save.date = Laatste save: {0} save.playtime = Playtime: {0} warning = Waarschuwing. confirm = Bevestig delete = Verwijder -view.workshop = View In Workshop -workshop.listing = Edit Workshop Listing +view.workshop = Bekijk In Workshop +workshop.listing = Bewerk Workshop-Publicatie ok = OK open = Open customize = Pas aan @@ -225,40 +226,40 @@ cancel = Annuleer openlink = Open Link copylink = Kopiëer Link back = Terug -data.export = Export Data -data.import = Import Data -data.exported = Data exported. -data.invalid = This isn't valid game data. +data.export = Exporteer Data +data.import = Importeer Data +data.exported = Data geëxporteerd. +data.invalid = Dit is geen geldige speldata. data.import.confirm = Importing external data will erase[scarlet] all[] your current game data.\n[accent]This cannot be undone![]\n\nOnce the data is imported, your game will exit immediately. -classic.export = Export Classic Data -classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? +classic.export = Exporteer Classic-Data +classic.export.text = [accent]Mindustry[] heeft een grote update gehad.\nClassic (v3.5 build 40) save of map data is teruggevonden. Wil je deze data exporteren naar je de home-folder van je telefoon voor gebruik in de Mindustry-Classic app? quit.confirm = Weet je zeker dat je wilt stoppen? -quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] +quit.confirm.tutorial = Ben je zeker dat je nu weet wat je doet?\nDe tutorial kan opnieuw gestart worden via[accent] Instellingen->Spel->Herneem Tutorial.[] loading = [accent]Aan het laden... -reloading = [accent]Reloading Mods... +reloading = [accent]Mods Herladen... saving = [accent]Aan het opslaan... -cancelbuilding = [accent][[{0}][] to clear plan -selectschematic = [accent][[{0}][] to select+copy -pausebuilding = [accent][[{0}][] to pause building -resumebuilding = [scarlet][[{0}][] to resume building +cancelbuilding = [accent][[{0}][] om het plan te annuleren +selectschematic = [accent][[{0}][] om te selecter+kopieren +pausebuilding = [accent][[{0}][] om het bouwen te pauseren +resumebuilding = [scarlet][[{0}][] om verder te gaan met bouwen wave = [accent]Golf {0} wave.waiting = [LIGHT_GRAY]Golf in {0} -wave.waveInProgress = [LIGHT_GRAY]Wave in progress -waiting = [LIGHT_GRAY]Waiting... -waiting.players = Aan het wachten voor spelers... +wave.waveInProgress = [LIGHT_GRAY]Golf bezig +waiting = [LIGHT_GRAY]Wachten... +waiting.players = Aan het wachten op spelers... wave.enemies = [LIGHT_GRAY]{0} Vijanden Over wave.enemy = [LIGHT_GRAY]{0} Vijand Over loadimage = Laad Afbeelding saveimage = Sla Afbeelding Op unknown = Onbekend -custom = Custom -builtin = Built-In +custom = Aangepast +builtin = Ingebouwd map.delete.confirm = Weet je zeker dat je deze kaart wilt verwijderen? Deze actie kan niet ongedaan gemaakt worden! -map.random = [accent]Random Map -map.nospawn = This map does not have any cores for the player to spawn in! Add a[ROYAL] blue[] core to this map in the editor. -map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Add[SCARLET] non-blue[] cores to this map in the editor. -map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. -map.invalid = Error loading map: corrupted or invalid map file. +map.random = [accent]Willekeurige Map +map.nospawn = Deze map heeft geen cores voor spelers om te spawnen! Voeg een[ROYAL] blauwe[] core toe in de mapbewerker. +map.nospawn.pvp = This map does not have any enemy cores for player to spawn into! Voeg een[SCARLET] niet-blauwe[] core toe in de mapbewerker. +map.nospawn.attack = This map does not have any enemy cores for player to attack! Voeg een[SCARLET] rode[] core toe in de mapbewerker. +map.invalid = Fout tijdens het laden van de map: Corrupt of ongeldig mapbestand. workshop.update = Update Item workshop.error = Error fetching workshop details: {0} map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! From fbed11e927be81197d5ec8b676cd6ccaba5750fc Mon Sep 17 00:00:00 2001 From: Anuken Date: Wed, 11 Dec 2019 15:13:45 -0500 Subject: [PATCH 067/107] Fixed #1198 --- .../io/anuke/mindustry/entities/type/base/BuilderDrone.java | 5 +++++ core/src/io/anuke/mindustry/graphics/BlockRenderer.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java index ca31f4c401..fdaaa049dd 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -24,6 +24,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ private static final IntIntMap totals = new IntIntMap(); protected Queue placeQueue = new Queue<>(); + protected BuildRequest lastFound; protected boolean isBreaking; protected Player playerTarget; @@ -57,6 +58,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y)); }else{ buildQueue().addLast(new BuildRequest(entity.tile.x, entity.tile.y, entity.tile.rotation(), entity.cblock)); + if(lastFound != null && lastFound.hasConfig){ + buildQueue().last().configure(lastFound.config); + } } } @@ -174,6 +178,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ BuildEntity b = tile.ent(); float dist = Math.min(b.dst(x, y) - placeDistance, 0); if(dist / type.maxVelocity < b.buildCost * 0.9f){ + lastFound = req; target = b; this.isBreaking = req.breaking; setState(build); diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index 1e7fa36982..8912745633 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -138,7 +138,7 @@ public class BlockRenderer implements Disposable{ Block b = content.block(block.block); if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue; - Draw.alpha(0.53f * brokenFade); + Draw.alpha(0.33f * brokenFade); Draw.mixcol(Color.white, 0.2f + Mathf.absin(Time.globalTime(), 6f, 0.2f)); Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f); } From fed4842222e47d78070e8b72fb6ef59b1b22ed59 Mon Sep 17 00:00:00 2001 From: AmateurPotion <47741752+AmateurPotion@users.noreply.github.com> Date: Thu, 12 Dec 2019 21:48:38 +0900 Subject: [PATCH 068/107] Update bundle_ko.properties --- core/assets/bundles/bundle_ko.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index 43fd7d841b..ddaa1612f0 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -994,7 +994,7 @@ block.fortress-factory.name = 포트리스 공장 block.revenant-factory.name = 망령 전함 공장 block.repair-point.name = 수리 지점 block.pulse-conduit.name = 펄스 파이프 -block.plated-conduit.name = 도금된 +block.plated-conduit.name = 도금된 파이프 block.phase-conduit.name = 메타 파이프 block.liquid-router.name = 액체 분배기 block.liquid-tank.name = 물탱크 From 736737f151976f286733130916b2fe015a2b157b Mon Sep 17 00:00:00 2001 From: joshuaptfan Date: Thu, 12 Dec 2019 12:23:32 -0800 Subject: [PATCH 069/107] Make scroll zoom by default, remove zoom hold keybind --- core/assets/bundles/bundle.properties | 3 +-- core/assets/bundles/bundle_cs.properties | 1 - core/assets/bundles/bundle_de.properties | 1 - core/assets/bundles/bundle_es.properties | 1 - core/assets/bundles/bundle_et.properties | 1 - core/assets/bundles/bundle_eu.properties | 1 - core/assets/bundles/bundle_fi.properties | 1 - core/assets/bundles/bundle_fr.properties | 1 - core/assets/bundles/bundle_fr_BE.properties | 1 - core/assets/bundles/bundle_in_ID.properties | 1 - core/assets/bundles/bundle_it.properties | 1 - core/assets/bundles/bundle_ja.properties | 1 - core/assets/bundles/bundle_ko.properties | 1 - core/assets/bundles/bundle_nl.properties | 1 - core/assets/bundles/bundle_nl_BE.properties | 1 - core/assets/bundles/bundle_pl.properties | 1 - core/assets/bundles/bundle_pt.properties | 1 - core/assets/bundles/bundle_pt_BR.properties | 1 - core/assets/bundles/bundle_ru.properties | 1 - core/assets/bundles/bundle_sv.properties | 1 - core/assets/bundles/bundle_tk.properties | 1 - core/assets/bundles/bundle_tr.properties | 1 - core/assets/bundles/bundle_uk_UA.properties | 1 - core/assets/bundles/bundle_zh_CN.properties | 1 - core/assets/bundles/bundle_zh_TW.properties | 1 - core/src/io/anuke/mindustry/input/Binding.java | 3 +-- core/src/io/anuke/mindustry/input/DesktopInput.java | 5 ++--- core/src/io/anuke/mindustry/input/MobileInput.java | 2 +- 28 files changed, 5 insertions(+), 32 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a42c94141a..ba37ff4782 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -705,7 +705,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause @@ -1046,7 +1045,7 @@ unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [accent][[WASD][] to move.\n[accent]Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse[accent] [[WASD][] to move.\n[accent]Scroll[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.intro.mobile = You have entered the[scarlet] Mindustry Tutorial.[]\nSwipe the screen to move.\n[accent]Pinch with 2 fingers[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper tutorial.drill = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\nYou can also select the drill by tapping [accent][[2][] then [accent][[1][] quickly, regardless of which tab is open.\n[accent]Right-click[] to stop building. tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills[] can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index c8e5294c26..2160901318 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Odznačit keybind.shoot.name = Střílet -keybind.zoom_hold.name = Přiblížení-podržení keybind.zoom.name = přiblížení keybind.menu.name = Hlavní nabídka keybind.pause.name = pauza diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 4d21b8d8db..4960165cf7 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -652,7 +652,6 @@ keybind.pick.name = Block Auswählen keybind.break_block.name = Block zerstören keybind.deselect.name = Auswahl aufheben keybind.shoot.name = Schießen -keybind.zoom_hold.name = Zoom halten keybind.zoom.name = Zoomen keybind.menu.name = Menü keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 1901f2c3c1..38f9696ea3 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Destruir Bloque keybind.deselect.name = Deseleccionar keybind.shoot.name = Disparar -keybind.zoom_hold.name = Mantener Zoom keybind.zoom.name = Zoom keybind.menu.name = Menú keybind.pause.name = Pausa diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index adbd5393be..c3e62686d2 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -652,7 +652,6 @@ keybind.pick.name = Vali blokk keybind.break_block.name = Hävita blokk keybind.deselect.name = Tühista valik keybind.shoot.name = Tulista -keybind.zoom_hold.name = Suumimise režiim keybind.zoom.name = Muuda suumi keybind.menu.name = Menüü keybind.pause.name = Paus diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index c86b1c28cd..66d71a0dce 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -652,7 +652,6 @@ keybind.pick.name = Jaso blokea keybind.break_block.name = Apurtu blokea keybind.deselect.name = Deshautatu keybind.shoot.name = Tirokatu -keybind.zoom_hold.name = Zoom mantenduz keybind.zoom.name = Zoom keybind.menu.name = Menua keybind.pause.name = Pausatu diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index b441ee0a62..be59e014aa 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -547,7 +547,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index f4464dd977..919f3bb615 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -698,7 +698,6 @@ keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Désélectionner keybind.shoot.name = Tirer -keybind.zoom_hold.name = Maintenir pour zoomer keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index 52e9efb2c2..9510ce227d 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -652,7 +652,6 @@ keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Déselectionner keybind.shoot.name = Tirer -keybind.zoom_hold.name = Tenir le zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 1f253e9698..73fff980c3 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -652,7 +652,6 @@ keybind.pick.name = Memilih Blok keybind.break_block.name = Menghancurkan Blok keybind.deselect.name = Batal Memilih keybind.shoot.name = Menembak -keybind.zoom_hold.name = Tahan Mode Zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Jeda diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 7fb632244c..75351ad9a8 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -699,7 +699,6 @@ keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona keybind.shoot.name = Spara -keybind.zoom_hold.name = Attiva Zoom keybind.zoom.name = Esegui Zoom keybind.menu.name = Menu keybind.pause.name = Pausa diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 06cc822663..2d3db1916e 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -652,7 +652,6 @@ keybind.pick.name = ブロックの選択 keybind.break_block.name = ブロックの破壊 keybind.deselect.name = 選択解除 keybind.shoot.name = ショット -keybind.zoom_hold.name = 長押しズーム keybind.zoom.name = ズーム keybind.menu.name = メニュー keybind.pause.name = ポーズ diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index ddaa1612f0..71a44a6bff 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -704,7 +704,6 @@ keybind.pick.name = 블록 선택 keybind.break_block.name = 블록 파괴 keybind.deselect.name = 선택해제 keybind.shoot.name = 사격 -keybind.zoom_hold.name = 길게 확대 keybind.zoom.name = 확대 keybind.menu.name = 메뉴 keybind.pause.name = 일시중지 diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index a9bf6129f3..4e0b424284 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index 214dc53a1e..21e2410cfe 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -653,7 +653,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index 7e8ddd3812..fd97dca25f 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -699,7 +699,6 @@ keybind.pick.name = Wybierz Blok keybind.break_block.name = Zniszcz Blok keybind.deselect.name = Odznacz keybind.shoot.name = Strzelanie -keybind.zoom_hold.name = Inicjator przybliżania keybind.zoom.name = Przybliżanie keybind.menu.name = Menu keybind.pause.name = Pauza diff --git a/core/assets/bundles/bundle_pt.properties b/core/assets/bundles/bundle_pt.properties index 6e6169b4b5..a0300813f5 100644 --- a/core/assets/bundles/bundle_pt.properties +++ b/core/assets/bundles/bundle_pt.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar -keybind.zoom_hold.name = segurar_zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index e2d775ff53..1e05466d91 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -700,7 +700,6 @@ keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar keybind.shoot.name = Atirar -keybind.zoom_hold.name = segurar Zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 8a7f6b3481..fe99336838 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -702,7 +702,6 @@ keybind.pick.name = Выбрать блок keybind.break_block.name = Разрушить блок keybind.deselect.name = Снять выделение keybind.shoot.name = Выстрел -keybind.zoom_hold.name = Управление масштабом keybind.zoom.name = Приблизить/Отдалить keybind.menu.name = Меню keybind.pause.name = Пауза diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index f01aa8b241..13ad6cdfae 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect keybind.shoot.name = Shoot -keybind.zoom_hold.name = Zoom Hold keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pause diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 2fd55efb4d..ef01140591 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -652,7 +652,6 @@ keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Eldeki yapiyi birak keybind.shoot.name = Sik -keybind.zoom_hold.name = Yaklasma basili tutmasi keybind.zoom.name = Yaklas keybind.menu.name = Menu keybind.pause.name = Durdur diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 9082a2ae3b..13550abe69 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -652,7 +652,6 @@ keybind.pick.name = Blok Seç keybind.break_block.name = Blok Kır keybind.deselect.name = Seçimleri Kaldır keybind.shoot.name = Ateş Et -keybind.zoom_hold.name = Zumu Sabit Tutma keybind.zoom.name = Zum keybind.menu.name = Menü keybind.pause.name = Durdur diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 07cbede5c6..e44866227c 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -692,7 +692,6 @@ keybind.pick.name = Вибрати блок keybind.break_block.name = Зламати блок keybind.deselect.name = Скасувати keybind.shoot.name = Постріл -keybind.zoom_hold.name = Керування масштабом keybind.zoom.name = Приблизити keybind.menu.name = Меню keybind.pause.name = Пауза diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index b2ae9cdc24..edb60b0a77 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -699,7 +699,6 @@ keybind.pick.name = 选择方块 keybind.break_block.name = 破坏方块 keybind.deselect.name = 取消选择 keybind.shoot.name = 射击 -keybind.zoom_hold.name = 按住调整缩放 keybind.zoom.name = 缩放 keybind.menu.name = 菜单 keybind.pause.name = 暂停 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index e286fa4854..050884d00f 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -680,7 +680,6 @@ keybind.pick.name = 選擇方塊 keybind.break_block.name = 移除方塊 keybind.deselect.name = 取消選取 keybind.shoot.name = 射擊 -keybind.zoom_hold.name = 按住縮放 keybind.zoom.name = 縮放 keybind.menu.name = 主選單 keybind.pause.name = 暫停遊戲 diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 3ac5f68271..9134506735 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -40,8 +40,7 @@ public enum Binding implements KeyBind{ block_select_08(KeyCode.NUM_8), block_select_09(KeyCode.NUM_9), block_select_10(KeyCode.NUM_0), - zoom_hold(KeyCode.CONTROL_LEFT, "view"), - zoom(new Axis(KeyCode.SCROLL)), + zoom(new Axis(KeyCode.SCROLL), "view"), menu(Core.app.getType() == ApplicationType.Android ? KeyCode.BACK : KeyCode.ESCAPE), fullscreen(KeyCode.F11), pause(KeyCode.SPACE), diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index e8cc6793d8..90735461bc 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -150,7 +150,7 @@ public class DesktopInput extends InputHandler{ if(state.is(State.menu) || Core.scene.hasDialog()) return; //zoom things - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && Core.input.keyDown(Binding.zoom_hold)){ + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (block == null || !block.rotate) && selectRequests.isEmpty()){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } @@ -182,8 +182,7 @@ public class DesktopInput extends InputHandler{ selectScale = 0f; } - if(!Core.input.keyDown(Binding.zoom_hold) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){ - + if(Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){ rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4); if(sreq != null){ diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 717fb68c95..6cd2a8aee4 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -588,7 +588,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //zoom things - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && (Core.input.keyDown(Binding.zoom_hold))){ + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } From 7e696cadaf0a23767d355170be07224a1ef2a4b9 Mon Sep 17 00:00:00 2001 From: Prosta4okua <31485341+Prosta4okua@users.noreply.github.com> Date: Thu, 12 Dec 2019 22:36:54 +0200 Subject: [PATCH 070/107] Update bundle_uk_UA.properties --- core/assets/bundles/bundle_uk_UA.properties | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 1d188a100b..660cf659dc 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -24,6 +24,8 @@ load.image = Зображення load.content = Зміст load.system = Система load.mod = Модифікації +load.scripts = Скрипти + schematic = Схема schematic.add = Зберегти схему… schematics = Схеми @@ -93,17 +95,19 @@ mod.disabled = [scarlet]Вимкнено mod.disable = Вимкнути mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.missingdependencies = [scarlet]Відсутні залежності: {0} -mod.nowdisabled = [scarlet]Модифікації '{0}' не вистачає залежностей:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буду автоматично вимкнена. +mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію -mod.import.github = Імпортувати модификацію з Ґітгаб +mod.import.github = Імпортувати модификацію з GitHub +mod.item.remove =Цей предмет є частиною модифікації [accent] '«{0}»[]. Щоб видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [LIGHT_GRAY]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модификаціями і спробуйте знову. mod.folder.missing = Тільки модификації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модификацію у теку, просто розархівуйте цей файлу теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модификації. +mod.scripts.unsupported = Ваш пристрій не підтримує скрипти модифікацій. Деякі модифифікаціх не будуть працювати правильно. about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. From 61d724ee2ba48e700af07ff955832068119748b7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 12 Dec 2019 15:54:25 -0500 Subject: [PATCH 071/107] Added Thai font --- core/assets-raw/fonts/EkkamaiNew-Regular.ttf | Bin 0 -> 79508 bytes core/assets/fonts/font.ttf | Bin 8455364 -> 8469812 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 core/assets-raw/fonts/EkkamaiNew-Regular.ttf diff --git a/core/assets-raw/fonts/EkkamaiNew-Regular.ttf b/core/assets-raw/fonts/EkkamaiNew-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8c3f521e808ce52da93c6d4c8476187c4c05335f GIT binary patch literal 79508 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 literal 0 HcmV?d00001 diff --git a/core/assets/fonts/font.ttf b/core/assets/fonts/font.ttf index 3ccb1ada7c3ac1d2da7c57ddb8d5a94a8620577f..953347f6b2889154b77f26d0d6901e6766521dbd 100644 GIT binary patch delta 472703 zcmX@o*}}5rR|`u$10w?igAgMF0}F$Kn_Gx)Q?W<_L!+$(0|SGMyNj!v=;59J7#htI z7#JA*+ynfBtv|T+F*KT8U|?YLa1Rc3%9&Ww&(LVLfq{WR!9Q5vD6;=_5(5L{3I+y- zgyh`Bg4+`xO<-V};=sV5a3Hy?M1f%?(@O@XZAU=1rWK^u=dwl4F=t@f%D}+DSe%|% zT)-g3pw7@}7Qn#3AdsF@nKpUO&2J2>o+1pTrc*Lf6H~Njuxw{wVANq?U@*(bNKIs0 zzg&!gfiZ=Ffk7oBx1{3z)sycS7??O1m?l}|Re{5^PqfoaoLl0J~olD^4(jIxZoC$C|&Wt83giZP9K`xi^b z6^!+aM;I8GA{YXglo*VetQbU?k{ANOIG;g;Nsd8;Nq|9wDTu*{Nrl0PNu7a#xrreF zgqhMA0|oA%)!^=UOxIyKfEus92!69WU|8Ab*Mc7`+4g(frUG4VxCcbLrde!B4#COy%$k9Z!5J(7E* z^hoWI&ZB}y)sJc)bxxl*g=rQOAH#HusZ1ZH>r7+P7hV5|?~&vqg-0rnG#=?aDtc7= zsQyvU^cmBb8tVV<`@8DzjK5R=hW-uttMZraFVkO!Kfgckc|7g0)+6pm9FN!^u{~mb z`0L@Phc6#CJ>-2b`@zfy?GM@>G(D()Q1hVlLCJ&62k8$I9|S!JeBl4U?}5()?+30A zoF6znuzz6p!195`1Cs~(5A+`BJWzcg|3K=2u-b=eK?YOk<($-6xcT8Lpy4ZHH^F$ z#atkI(UV1wXZ&Db==sFJpw?m^$D1SM%4;6*h=DlCPgMjmg$T$nT#1GM-yZfEXb?qr(H+{N6@+{4_<+{fI{ zJb`&4%ONILmcvZ$(^F!q(wJDzO+OV=6*7HKWOWb=(^97V>3mVuFX~y2u$*Q&!*ZPE z1j|X5Q!TezEnBTxtyyNW%xkr2wQaR)wQu!l^<|mS>euSeT-X}W8rT}dGP^anHKa9^ zWj=FnYglV|YXr;m*2vZoSvs$xTb6Rs-^O&c!=C>BK7BW}17PS_)mb8|(mbI3* zRqO?Mt&`aJ*!bB5*aX>x*o4_c*hJaH*u+~Ww@zuD+B&Uu`t+ihYPA5C-L0!z z*R-x>+1|RYb$#oG){U*3S~s_DY2Dhojb&Tw_SPM(J6m_L9AY`#x|?NZ>z>xVt@~JZ zwC-;`(0Z`-Q0rlq{jEn@kFxA*J;ri?}fmIcDn6M+gX-f zZRgs~w_Rwv*mkMya@!Rq8zx&OGbYovt8LfXuD9K2yV-WD?RMLpw!3ZjShh}!um0n~ z@`UASt6i&WYiesuYe=hKYeH*si+t*cl!ZRcC_Az{XIS%`&! z2b4ktJU}D^17pKTI=7?@W=Fk>(S1M?mTW(;9qU_JoBjG+t+ETA@rKLZ0} z7y|=KAOizSJOcycQU(T=2@DJ@6B!s7w=giUY+ztu*~q}axQ&5<1%yF0{|*KQmR%6c z2%--#Ft8k8U|`(Mz`)1AP|v^@$-uz4hk-$^fq_A;m4SgtjDbP!69a?XX9fl)83qOg zVFm^T5e5b(IR*v=2?hoQDFy~61qKEMkenO?1CufXg93=J#K6F$#=xKe#Y~zE3zFFq0hvgW>@QX0m5s zP&~rGpm>ylfyse^LGdgEGdVFZD4u6vP^`bgz`*3pz@YemfkE*x0|S#M1B2o-1_s5K z3=B-Z3=E1NAebqTfkBA@f|-IC7?hY87?hY97?^??7?ju;7?d~}7??sC7?ijf7?gMz z7?>g%7?k)Sm?@fpK}nE-K}nc_fhmT8K}iaNnc^83>Xl>}7?czk7?=_m7?hMCm??#U zK}n5)K}m;!fhm=NK}ipSnQ|ByluQ^HluQ{Im~t5yl*}QRDW8Es$%cVJ$(DhEsepk& z$r*x~iWnG_Tp^gLn1Mmb1A>`K7#NfS7#Ng-8R{9BN*NfGq9B;5l7T@9Dj0 z7?`>l7?c_q7?j!>7?}DP7?ipg7?iph7?`FpFepuBU{IRQz`!(vfkA0zJ&0gnV4BUq zptP8QL1`%i1JfJ^2BqB$3`%<#7?|cWFesg4U{E^Gz`(SSfkEjO1B23S1_maO+II{L zN}#suQU(TPHV6il)XG8(3?R(3oPj}E1cI4XFfgbjFfgcq9JG>wL1hjDg9<2$>n}1e zsJv!iQ2D~Zz%0+e0IG^qnHd)MW#4=T2Gz9?%v{O9pt_NPL3J|&19KGvgX&fW2G#8h49v9*45~XJn7M(0L3IxU zL%r%=1_tIv1_ssr3=FCV85o$G85mR#Lojn21B2=@1_sp=3=GWe3=FC#As7@|s;3wj zR4+0xFn2L9s6K;WW{|_)Gcc&WXJBBS%)p@fn}I>~4+8`96b1%01_lN-YX%19X$%Z% zwhRnv{}~vVFEP|JsEaXxG0Rj226ZV2W|_vopsoPHEYlen)RiHaWd;L-x*-I!%w%9t zw}oJqSqu#7_6!W_jtmSevl$rF-65D|9s`5AF9fs9XJAkdgJ6~g3=HaJ3=Hb^^$ZLw z3mF*HyBHYMr!X+EtY%%SAp--;P6h_`B@hfM+0-{N zFn}=2ZUzSRtq{zzhk-%Ugn>cRoPmL5F9U<7B?Pk^WMI%tf?$?I3=Ep}$qWpd$qWok zt_%#CDG1Pz@P76_k#HvgMlOi1Ir}_1_K!g2IXl3IR*v;1qKF|CkzY*W)RHsoPoi>k%7TrG6Mt43kC** zg$xV^-xwHJtr-{${y;G6Lfr0fX1A`F* z1A~za0|V=O1_mQT2xjA9U@)?TU^ZR`2BSa*2BRnj1~xth2BQQ92BT^Q1~v%>2BSI# z2BUfg1~wB02BR(p2BQfK3~Xi$3`SERn9Y`f!Dt=?v)M5)7%hchHv4)82IB?>2ICe6 z1~vx<2ICF}2IJEV3~a6p494df7>q$3=S~I&K^ZO=MtL!@$6BeK7+=L?{EpgFOrk4=yt>H2-8^cyNt@ z;X(al28I?v28IVu85kZiF)*~qGcY`4XJB}!&%n@P%fRr^0D_s8GB7+egkVr{`_PDi z;o(vShL$u2hKI`_7?eI9E@xnPxB?R24_7iUJX`}w6A#xiFo1B&Ee3{%>lqjx@h~v7 z+-6{?f5gYY@JN7xq1BRs;gKK&gR<5mAqEBz24$f~!VCmnY@2nLmCkK!2^9wjm`wB|D~JW7IKP|^Dcq(7U1p|yyC;ZY6*gR<+RTn2_m1q=+W z)eH=eKypP43@r6$85kZFGcY_VV_;|nIi{R};ZZpQ11L{Fs$gJvRL#K9+RVW4s1|}- z+Zh-hfz-7!Ftm0sFg$95U{JmA2qf3Zz|h*y!0@OCf|;i>FgyZm&w-M|}(o zkETO%(4!fk_+QV!&^noc;n4;N29;uuHZm|g+RVVvx|)IE(G~~>jp97o%E0hwF9SpC zItGSE`yd$9&U>_0RL`yRh$U;tqzGX{poZy*@dPJH~9f#LBt28On)3=EIILomx$28PE!7#NEhaHA{EUNOwo?oYKa(Mtdj$i- z&vXc8o5#TLvkrp266zTkel|cb&t(RNpN$YK#KOSvvkQW`br=|a_Cc^XD+9yNT@cJJ z&cN{V9t86&U|{&g1HtV*3=F>v7#Mz8Ffg?DGBEtIVqo}X&A`w;je+5pEd#?ZM+S!W z84L`+oEaE?)q5~7w9jQ=_~pgG@GFLap?xs}!>@P-hF_@+4DH((7=EQQF#O75U})dV z!0@XGg4+)=F#IZEVE9$Rz|ek(f#Fvb1h*e&VE9$T!0@Yqfua2b1H-Qt2yQ>i!0@Ys zf#Fvt14H{c28LhV3=F^e7#P|wFfi2rn!v#DYYGEH`xOR;UmzDwXJBZ*$-wYyCIiE- zISdT#w;33I&0}ErwSa-4{XPT3ucZtOzg93Xv_E2C__Ydx+n+Ho{8|ga?avt)er428I?^28REP3=IEc85lZ1^kW8w z|Bo3MI^q}@{y&4@j(7&f&kPKVpA{GwIuaNdKN~PGel}%b=xAhM{A^y&!1%d_fuWde5<70kf+HGqNfYdQl%S2zRX*WV0`-y9ei zy7Czqzqv9ne)DHw=-SG__^p9~@!L@bhOPq)Y)s%WD@O2$HKbz?B^eo*pe!cPfRH>Z zXySljdQ4!|zIp}*hBk(FhE9fVhRF;w80Il7W?00qgkc%OQikOWD;ZWZtYTQhu$Eyx z!#aiy3>z6XGi+tp!my2D2g7!TJq)`U_A=~aQe!A$NMT52$Yj!Bs9;#gP{5GQq|Z>s zki}HR(7`Z^DUqR=sg|jZA)TR|DVQmSDVi~qDT^V8p@uP-p?(F!E`~;iWQIJZct%I2 z5~fgwT!vaEO@<_fCWcmq>5L+bqD*p3@=VH1DohGYiVQoMyBH2KS~2M|=`m?D>9qgv zU|>>bsAN)NQf1O&XkqAKXlCeT=wj$+n7}ZRp^srI!!!m4hA9kl80Ip}X86qL&gjcf z$mq%F#pumY#puVv=)>r-{m5D-b@uuN3=I7o3=I7N3=I7Z3=9)E7#JqRFfdG5z`!u! z0|Udv3Y@7WDN#}$p;u1rbsX_Oqs#JFy#aT!&DIl zhN%S%3{#&lFiaC+V3?M{z%XqG1H<$Q3=Gr%Ffhz;VPKfCfq`MB1p~v(76yiyUlhS@R<46_{=7-r95V3@Z6ATQiB^Vf1cQ7!lKES}RMu34~O$Y!EY7&ZhjFl?B>z_8&01H*;Q|B0MGgjri#bsIhJoSI6b6RNHVh1x zzc4UdDPUl@s=`pua7~4Q;o1iVhU+a13^!aD7;gMwV7OVrz;KI$f#FsI1H)|*28P>D z7#QwcU|_iG02;YxV7PmNf#L2G28MeK3=H>V7#QxEFfiPUVPLq|!oYBE4Fkiy8w?Eh zMHm?FM=&rvU|?W)7{S2su!Di&;SL6dhc}=t?L7<(kKWWXFg%uEV0i4p!0@<$f#LBC z28JgZ3=B{9FfcrM!ocv9hk@a#2?N8^7zT!?9SjUl?=UbtGhtwOR>Q#X>9C7+zjsV0h)j!0_q_1H)?@28P!S z3=FRiFfhDfU|@Jt@4~?F<^co4TL}h+w{sX6-kxD#cxS@E@Ggdd;oS}fhW9QE4DaVK zFnmy8VE7Qg!0@4if#Jgv28It07#Kc^Ffe?4z`*cn4+F!eI}8k;MHm=9FJNH!{Dpzx ziva_}mmCI$F9#SHz6vlfeBHpn@a+Ku!}mLo#>|gB3=BUr7#Qk*{$ODEb%BB5cMJo= z?=K7tf0i&X{CUH`@Hd2k;qL(khJP9i4F57182+tcVEFfdf#JUm1H=Cg28RDv7#JCJ z7#JBk7#JD;FfcNvFfcNnU|?i2U|?iAz`)2Hz`)4-f`O5xfq{`_2LmI^7Y0Vw0tQCb z7YvMS2@H&E4;UEP6Bz0l*|#t-aVC1)8VB~LLVB|l+z$oCu zz$nnez$kEqfl<(afl=@b1EbIs21elt42&WM42+@-42)tt42)uP>KPctw=ghD>|kJ& zoWj5;6~e$MZNtDQ6T-kKE5pDjC&Iue@4~>Sz`($$=)l0Jl*7QNyoZ5NC4hlZRf2(0 zO@x6_Z3_dVdItle#smgNO&JD8Ee8fhZ5IYc9T5gboeK<%x_cNH^=>dQ>d#?dG?>A_ zXn2Hy(Wrre(Rc#`qe=Y@21YX#21auM21fHI42%{#7#J-lFfdxBFfdw+FfiJ1FfiI| zVPLckU|_UkVPLddz`$s)z`$t#gMrau2?L{J3In5)1p}iq2Lq$?76wL_B@B$NF$|1u z91M(ZGZ+}%Js23>A22X_%wb^k)L~%sJi)-|wT6MwyN7|%$Af{f-sb@Wqi+ENqhACA zqu&PxM*ji^#sCcl#(*0PjDZOZjDdd`7=xxTFa{SeFox(bFow!7Foxb?U<~`fz!+Y` zz!+h|z!-6WfiW_HfidzA17lPV17oxb17nN`17pk^2FBPU42*Ge7#QPA7#I^&7#I^J z7#I^zFfb<9+N>^BUIISUvVb1fJcbN?_f=1pN>%okx`%zwbZSa5}bu`q^#u}Fu3u^5DR zFff*!VPGsh!N6Gdgn_Y~fq}7HhJmr%f`PF-gn_ZVgn_YqN<9N(`4$Go@+%CCzhoj8!TOj8y>)j8!!Zj8#h*7^}`OFjjqGV60YPV666GV5}}+V62|Oz*v2N zfwB4t17i&b17l6S0Rv-A1OsDD0|R5t3I@iS3k-}kKNuKmWf&N1T^JZ^a~K$Fr!X+q z?qOi8eZs(4$HTx_XTrc(7sJ3<*TcYAw}*kT?gIm3y#fPceFy_%eFp<${SF4k`VS0@ z4Jr(b4KWOi4O18x8%{7VHvC~=Y&2kCY)oNbY@EWt*tmg#vA+2Y17iyZ17nK`17ph@ z2F6wu2FBI`2FBI{42*447#Q0b7#Q0N7#KT_Ffev}U|<9_HajgC7&{Xf7(06y7&})m zFm_&GVC?+Ez}O|hz}V%$z}S_+z}VHoz}U5cfwAib17p_@2F7k32FC6J2FC6s42(Sz z42->B7#RCw80r}(STHb7s9|87@PL7Fq5}it#4QYrlQb9@CxtLDPAXtvoWj7sIMsxK zahd@G;~WnL#<@BSjB^th80T(aV4VAhfpK001LM3842<&^Ffc9%U|?LZhJkUR2?OKe z4hF_$6%35amM}0bcVJ*#VZgw+;sgWZ>IMeJwJ{8gYo{S18q9m2r4=Kura!4w9@g9jKG4+$_Z z9y-Cmc$kHO@o)?S`Y1U_9=^z@w^8Esz<9}mf$`D~ z2FA-a42+leFfd->VPL#c!N7Qxhk^0x5(dVrUlw^|q&Z!<73-u7T%y#0ZJ@lFB*`Mi*ANEAuRjM9IO8a50}S}_bvIynqXx+x4yx=R?Cbe}LV>6I`r>78L<(x1Sgt z4`E<3pTWRn{)2(Z!iRy$qW%m6lcf#=lVt@1ljRx)Cd)evOja@sOg0h>OwKk8OwMZ< zm|P7QnA}?!m^`j9FnPUUVDg#6z~tA%z!c2Ez!Y+Yfhqh015<Zrq~G#Oz|@qnBreBFeOZ3U`pg+V5(1?!N8RGg@Gw4 zgMlgO00UDp2Ln@b4+B&30|urP3kIf?GYm|rIt)yyDGW@h9~hX@W-u_Ni!d;yPhnun z5Mf}-n83i4$-=;t>A=90mB7H1HG_c(G)a~{gMlf>hJh*P0|Qg;0|utN0}Msd5Gb zQ{@>3rpiAIOjRxnOjR=&n5ynDFjXrsFx6aPV5(8t4I)#C$&4YodU4wzCeF_6pM+XB_X9fdPmk9$?*OYn&rtSm=rXC9hrk({1 zOuZotOnoK{OnnO&nEIzMFij|7V4CQ{z%&s=-(g^yl)=C>X#xY&q#X=QlXV!FCU-C} zP4Qr0nlgidY04W0rl}4LOjD;YFim~Iz%)&TfoWO-1JiU72Bzsx7?@^gFfh%iVPKkZ zfq`kJ1_RT~8V06W^$ZM5vkDlPW-Wl?7Yt0ZJs6l~?_gk>{eXdK4hI9%92W+rIW-JS zbLKEG&Dq1iH0J{Y(_9q>rnwOeOmlk}nC2c}V4C}afoYxq1JgVU2Bvv63{3M5Ffh$$ zVPKl?!N4?s0Rz+g9}G;3QW%&P{b68QV!^<)bP5C0G6@Ez`ekz%n3gLrFfE_Kz_h}F zfoY`)1Jf!42By_E3`}cm7?{?^FfgraVPIPSfPra40t3@V83v|J1`JG_OBk58h%hj1 zdBMQ6^#B9YwlfS&+kF_Ac8D-A?RdbzwDSQ2)2<&3OnV#{nD$CAFzpjyVA}7(z;xgM z1Jl6{2Bt$(7?=*dV5nz0?7_fv_yGgc5f28YBM%sujBIpBrc(tB zOs97+Fr8^&U^;t+f$4k(1Ji{&3``e07?>^>CqPkrpFKJ8JM12U|@QB zg@NhW0|ut&Qy7?D_%JZNBA8Q zrjK_Rm_D^IFn#7>VETN4f$5751Jjol2Bt4J7?{2qFfe_MVPN{&!@%^7fr05;0Rz)_ z9tNiGZy1<<_%Ja2c*DT-vxI>OH2lW&>j(qW?;ZxG-&+`%{s=HI{i$GJ`m4gg^mhjX z)4vi1rhgw8nEoGOU}h*_U}p4TU}oIFz|7>sz|8c8ftmRV12anu12d}v12gLs24*%M z24=QB49x5-49x5e49x5Y7??R+7??ShFfenRVPNJgVPNJGU|{C*VPNK3!N6S4?ZCjy zeTRXWCx(HUSAv0=_YMOyp8*3i-yQ~L{s0DM{v8a=0x1m40zVj-1=lbz3r%2P7VcqS z7GYpu7Aat07L{ON7TvS173Hep~^e!#%2a)NTbrl$xb*I!bFzdxI zFzdZxVAhXdVAj9Dz-*Aiz-$P@D;SuKWEhx@au}G6&M+_=GcYh4doVB?Phem+{=mR& zqQbyz(!s!N%D}*E8o|J9I)#DR^aKO5nF0f|*#ZV;vmXr1<|Yix<}nP+<|`PO&5tlJ zoBv>7wlH8|w&-ABwm87RY+0|vz-(E-z-;+~f!WG{f!S&c12brn+B$)O*?I{BvyBM@ zvrP#Dv&{|$W?KygX4@GI%yt3{%yuyh%yvH*nC&+(FgtKCFgwIBFgxsEV0KhsV0K)> z!0dR2f!Qg7f!XN_1G94u1GDoJ24d~24>eA49sp049sp@7?|tbIT)DTa~PQ2 zA22X`7%(tXz#MmifjMCc19RdO2Iiy}49qDB49uxH z49sZ<7??9$7??8y7?`u3Ffiw2FfixdU|`NmU|`OB!N8nf!N6P~z`$Ivgn_xxfq}X3 z0|Rr>83yL!2@K372@K4o3=GVrGZ>i5Y#5l!4H%fqUobFN%wS-y^r>fHu3}+eu3E#u zTphu{TqDE4T=R#4x%LVJbKMRG=K3iN%nd#a%#9KZ%uNE|wF%74XBe1UB^a37?l3TS z>|tQ;Dq&#msbOI5oxs4{w}gRt!U+cEiDwv?C-*QgPmy3?p3=d>38}uU|_zygMspcw2*RL=z-!NcczA=S?`NkOr z<{N()m~WaeFyE|TV7_^Vf%%pS1M{sO2IgBY7?^L{FfiZV!oYk-hk^M{1q1V)8w|{M zP3jq#?@nQ0zWacI`CbA8^SwO`%=Zl#nD3upV17`-!2FPhf%#zz1M?#R2IfZ%49t&N z7?>YdFfcz+U|@bSg@O600t55Y6Aa8xpD-{#lVM869(oFGZ>gZ3NSE#%wb^uc!q)blLG_u zrzH%`pE($qKSwYye?Gv#{KbZW`O5?b=C2YA%wK0PFn`lvVE(p&f%&@t1M~L+2IlX7 z7?^*|U|_EQ>B7ML^8*9(uRRRRzeO0Be+Muy|88Jl{{4f2`A-G|^PdL{%ztwjnEzg3 zVE*UA!2E9m1M`0u2Il`q7+4r$7+4q{Ft9N8Ft9MGFt9L9U|?bPU|?ZkVPIkDVPIiZ zU|?Z=!N9_{gMo!Tf`Nto0Rs!i9tIZ9ISedZ6$~ugG7R-B++P@2cpfmY@QE<6@GW6r z;m=`U5y)U*5p-Z+5#nKB5xT;_BErJJBJzfTMRW%Pi#QJhi-ZOPi^K;87D*Kb7Rd|- z7Rd_?EK)uUEK*MxSfm#)u*gI(u*ftpu*jTYV3Ac|V393hV3EDRz#?bBz#`Yez#?~s zfkj@1fknQdo`FUF2m_0P00WCc3ImJ69R?Of4+a*+Ck!k~F$^rqIt(nzJq#==E(|Ox z1q>`IYZzEmRTx-QOBh(xI2c&e7BH}=TQIPwuV7%&P+?%vn8CoJ>A}FFd4qvPD~Ewa z>k9*m_7nyd9To-_oh1w`x*7~Dx(^sw^yV zU|_Ku1_O)D4F(ol69yLB4Gb)H5)3SM zOBh(}6&P6R?Hd?a9CR3195yhpIO;I4IJPjbI6h%uamry}aoWSc;w-_y;=F``#f5`` z#U+7(#pMqJi)#x5i<<}oi(3x^i#r1Yi+c+Li~9=(77qso7LO?mES@q9ES_^1SiB?{ zSiBA}uz061uz0^3j>RP4g-t-2L_ga0tS|V z2MjEM9Skgie;8PT5*S#5elV~EXE3k?|6pJVnZUpj@_~URw1j~rjE8|GYz_lUxCR4D z_z?z{h#Ur%NFD~3$Tmqz`&Bx!oZTr!@!ccf`KI~fPp3J1p`ZV4FgM#0Rv0U3O2KHZZUh>M*br*6(3pDRN+7DZ0VHQXIm-QhbMj zrNoDUrQ`wwOKAiHOX(X1ma+~8mU12jmhu(`mI@9AmWnA1EEPW(SSm{xSSnvIuvDcm zuvDF4V5tsZV5$DVz*1Aez*4Kjz*4)1fu$~ifu-&N155o329^c^29|~i3@nWj3@nW+ z7+9J#7+C6?CNQux^DwY9pJ8BWNnv1V`NP1{I){O!&4hua?F$1-dkONyT^tN7T^$T8T`w3|x;q$HdJGs?dJZtK^ja{m^sZoF=?h_C>E~cz>91g5nP9-c zGT{RQ%fu}VER!4chaY^$r8ewhjiC?FI}i+ix(i z>}X+N*=fVTvhxK4%dQ3nmfaZ)EPGfOSoUmTVA*THz_RxW1Ixbp1_qY>77Q%=Uofy7 zNMK+&@P~orUaE5{9VhRJx zB>@JOOM4htE>|$HTmi-Zl@|;wS6diZu1PSkTwBAyay^ED<%R|W%S{#rmYWk8SZ+ly zu-s-~V7cAGz;efif#og(1IyhL3@rCT7+CJBFtFU;!oc#NfPv+q2m{N*7YryDUK4mbleAZxK`Fw+c<;wvEmahp6 zEZ=w-SiWswVENv`!15!9f#s(T1Iy1J3@pEHFtGfd!@%;#g@NU-0|U$76AUc>Vi;Kd zGcd6HKf=Juuz`VlLZ4SGfO=KEAs;eR+b6|R#p=RR@O5NtZY*lSlJyISlPcY zuyQP6VCD2-VCDS6z{=IZz{+jIz{-7vft9C%ft8nmftB|R11sMe23CFt23GzD46FhV z7+3}8Ft7?)Ft7@}U|BdoWsEC;=sV_TEW2TCcwbzwt<1wJ%@qSBZ7g|Q-YzM)$KLfi=Q~fi+Tsfi;SSfi>y`18Z~z18a;918b}d18eLN2G+PO46N}p z7+4bu7+4c^7+4d(Ft8>qVPH+}sb^qKS;4@Xx`u%@Z3Y8tdIAG$h6)2~CI7+9-37+9+#7+7m~7+7ls7+7mxFtFD1FtFCYVPI_l5sgn6Seu?O zur`-4u(nt*u(tXzu(s(iu(tOwuy!Ocuy&R(uy##gVC~LfVC_+1VC{Lpz}kC+fwgZB z18e^o2G$8@7+5FnU|^jzg@JW)2m|XB69(3)77VP@SQuERonc^|eu9B@#u5hBnKKwz zXDwi0oxOsAb7Y5cP8VsyULHGv) z>v9eT))hPqtScE9SXZequ&xeZU|n;DfpzT$2G(_F7+BZeU|`*Ffq`{n2LtP-3I^8A zJq)Z{Vi;JrnlP|#lVD)oZoEn#3i7Qn!I+<<}gL;?fr$u$hD zr)Ds)o_@f)9O)tmiTqSkGrLuwJlXV7(Z^zVQrz01PDdiMnb>%9vMtoN@lus(Rf!20kA1M6cE z2G%Dk46ILC7+9a)VPJjE!NB@LgMsy>2LtP?9Sp3m7cj8CwP0X$fWmtUn|eSbu6Tu>P`OVEtXd!1||xf%Wed2G;-e zCJby0J`8M(E(~l;Cm7h6pD?ho+Ay%Or7*CuA7NnQRAFG_s$pQ`-on7f^Miqn&wzoA ze+>hhAOi!NU_3!N8{4!N8_gz`&-S!N8_r!oa2}z`&-( z!@#DU!oa4zg@H{+fPqb?gMm$#fq_kT0|T301p}Mj4hA-T9R@c24hA;;9}H{;84UGo z21gj!3@sSg43{vl8EG)E8LeSpGge?=GhV~MW}?HuW^#dn&GZBVo7ofwHgg{aHVX*` zHj6C`Y?d7iY*tqo*sSj`u-UROu-Q5=u-VRFV6*+fz-E`hz-D)Vfz954fz5sm1Dk^h z1DnGR1~x|-1~$hN3~Wvj3~WwE7}%UW>KWLa&oHpLhuED_O z?!&<5zJr0y!-9d$V+8}7#}@`R&k_bU&p!-oUI`3rULP3Pyn7hfd;%EQd?gsz{8$*+ z{EjfN`A=bB3s7NT3;4mn7C420El7ufEm(qqErf@GEyRU^E#v_MTWAaeTj&-Bwy=5| z2DY#}3~b>c3~b?N7}z3W7}z4dFtA0oFtA0*FtA1KVPK06VPK1qVPK2d!@w3>!N3-0 zz`z#wf`Ki*hJh_Xg@G;M2?JYV0|Q%900UdH2m@OR0|Q&i1O~QL8wR#C0S30T9}H~i zTNv0fav0b$Wf<797#P^Hb}+DIH!!f(=VUOj<%%${<$>@X2DbbP2DSnh2DXAf3~Yr* z7}$z>7}$zS7}!c&7}!dE7}&}z7}&~17}zQb7}zQ&FtAnCFtAnKU|_3uU|_3W!@yP} zz`$0sf`P48gMqE~4g*_V0RvmT1Or?B3I?_Y6$ZA37YuBTB@Ap$DhzB*I~eNOngbZv zS~wWkTCOm#wLV~AYx}{#)}g|{))B(M)^UJ=ty6@7tuuy!t#b(jTjw7Jwyp>Uwyp;Z zY~39UY&|XvY(0M%*m@%v*m~D6u=RdmVC#!uVC%cXz}6qZz}A0(fo(zr1KWff3~Uo? z7}zF0VPKn-!oW7^0|VRS5C*o%Kk6CSrp#ero9e;9HuVAn+q4b_w&?;4Y}3~;u+6Ao zV4KOqz&3LR1KTVE2DVvy7}#cKFtE*$VPKo{fq`xA0tU8u8VqdnjxeyzpToemz=eTr z!3PGmg&hoRi!>P679C(K_bjYql`3t@UAGTgSq{wr&jr+xij)whaLcY#Uh^ z*ft(uVB6Hdz_!_ffo<~(2DU973~XBk7}&NRVPMCbo+k`!dwUqz_Bk-H)$bQzVB7zKf$hK?2DXC<3~Yxu7}ySd zU|>7Efr0Ia1q0iWHwmp2&LUfp0|d;Nid?adPgwzqc} z*xp@XV0-_Af$gIM1KTGR2DZ;J3~XOQ7}&llFtB~IVPN}iQqREl!-0YArvd}pFB=B7 z-zf}ie_9yW{-!Xn{aeDo_J0KfJEIN*JJS>fcIG_{?5r^i>}+=!*x4-@*x9!*uye#P zuyZ_NVCT$WVCQ_mz|J*;ft}left~va13OO%13Rw>13MoJ13TXy26p}g26p~04D145 z7}y2pFt7`GFt7{N|6pJj-od~w;=#Z!%E7=cx`%;XEQNtx><e z$rlXlQWF^1r85}VWlR{@WzI0L%VsdJ%Q-Nx%L_2DD;O}aD?DLfSG>T$u2jRot{lL? zt`fq)uFAu}u6lrhU9E?KT|I|^T_b>jT~mR9UGoA1yVe5+_Im9N4D31$4D7ld4D5O; z4D9+m4D9-67}yOCFt8g|Ft8hiFt8i*Ft8h+VPH2|!oY5NhJoGe2m`x$4+Fc!6$W<8 zKMd^FEDY?{PZ-#3c^KI3I2hRN9T?ahR2bMDIT+ZTco^874H(#6bQsuOV;I=oLKxWH z6ByV%5*XM$uQ1fJd!1ll_mN>>_xZuV?ia$q?w`WI9x#J}J@5eodvFK?dq@WZdl(A? zd$@fli>@f=%*kcVC*kg|{ zu*W$tu*Y3sV2_``z@DJOz@Bi1fjzN=fjvowfj#L61AB5#Jp+4+2LpSm4+DEz00VnE z2LpTh9|rb}D-7(JPZ-#yizFD>i&_}ii$xgNi|;V7mn>jlFI8b+FI~XE zUM9f6UUqfqn8F2KFf& z4D3^U7}%%GU|^r}f`NUi0R#Kg8V2^MXBgP0X)v%)+rq#;J%NFJ`V$8B86gbpGafLo z&y-_!@xd=hk9f-MZ}3j-L~7d~NNUvz+heQ^#0`;r6(_N4+0>`Mq@Y_T2&u?7MF;uL z1N(jj2KN0w7}yWIU|>JEf`R=|{Tv4N!xI?Tj}$Pl9}Qq&KNiBkemsPM{e%Sr`$-)J z_ESC#?58Uj*w1z_u%Ercz z7})PxFtFd)f0o0*{+xk<{rM9H_7{5?*k4XzV1HG@!2Vi!odFi4Fmg!2nO~KCm7g2YA~>WtYN5U|9FLg{gVp=`==!g?4MZ}*gq#Quzx2hRZp4qgWa4&Eya9DF$p9Q^e>3>^G37&ru27&ru`FmMPuFmMQN zVc-x7Vc-yY!oVS%z`!B=gn>gOhJi!m0Rx9<2?K{10|STH3XL z3Je^QQy4g;SQt2@S{OK_1sFJ_*D!F%a4>MlEMVY}HDKV7J;J~tr^CP@cZPvOUWb80 zehC9dy@Ch>hr$E~4n+|L4#g=997-Gv97-(=9Lf?59Lj4LI8>-* z3>8xVc>9k!@%J_hk?VxhJnN54FiW~2?K|h3=G7KC(dl)!;TNpU}Y#2EF4lr=|M=)>%XfSXDEMedXRAAr;T)@B)q{F}w zw1t5qID>&BM1p}MWD5gFXbA&Hm;wVw*cAqj@cI}Aj_?l*91$%H9FaB*9FaR1IHFt_ zIHG;}Z3>;}|7&y{R7&y{TFmPl{VBpB~Vc^I-!N8Ff zz`#+T&BMTvy@7!vX95F9t_=f6?g<8tyc7nGygv*a`6Ub-1q=)v1sfPR3g<9z6eTcl z6n$afD6U}ODA8fyD7nDEQCh>mQKrDaQTBm>qkI7aM@0YwN5vloj>9920C9916} zII24sIBFyqIBGsHaMV^XaMYDBaMbHCaMa&msOMJY3j;@61_MXC3?#17&xYTFmTLZVc?i?gn?sb0RzV@6$Xx3e;7DsuVLVr6T!eSmxF<0?g|Eu zc@_*D^A0d@%#UE;nE!@>W5E&zj)gr89E)riI2Qe2;8?tafn!Mo1IJPo29Bj47&w-# zVc=L^!oaaYfq`Si83vA(H4Gf9To^c3voLV1Uc=$&FmP;Mz`(I3f`MbJ3=64FmN1R!@yC0#DRh1$O{IJqe~b#j-@bg9A{wQIKGB~<3tDp$B73F948kraGXkE z;5hYzf#dW6297gJ7&y+xFmRl+VBk1+gMs7x1_q7`DGVGJ9x!lR+{3_enSp`h@&X2q zD+&x8SKcsiTW2aqS8N$MqQu95*}|IBq;);JCSkf#X&TLp{fB9tMuvYZy50 zWH4~t6=C4GyM}?|-U0@W`wk2o_wO)pJm_KIcqqfb@$dly$D=0<9FHe3a6D;X;CQOS z!14481IM!i3>?oR7&u=>=7&yL&FmQZ1z`*gfgn{E*00YOj4-6dN z=P+>msA1svslmYUi-UpV*9!)Y-zyk6{eI4F*pB0tQY28wO565e81d0}Px(PZ&6bTNpS+rZ8}d znlNyRUSQx9>tNs%uVCPmFks-6bYS3=Qefbe=3wBI{=>j2vx9+CHh_Us&W3?gK7fH! zL56`-;S2+(;uHo>r2qy_WdR1xdgUt&oGND+I90DOaH=&haH=0*;M8bg;MB}v;M59W z;M6u?;M9J?z^Sui% z9R(OT9j`EOI_+TKbUwqt=`w+V(=~^I)6If`(_M#w)BOemr^gxwPR}z8oL+YrIK6K$ zaQfU~;PhR>!09)Kfzy8q17|=5181NG180x~182|`2F~Ck44fe+7&t>$FmQ$yFmQ%9 zFmOhwFmOg{FmOixVc?8=g#ixIGM<@huFT30oLA6Q?k6CQV`B zOzvRdObKA%Obub+Ov_;4Ot)a*%+O%q%-F%enYn<0Gb@9EGuwrMGslL3Gj|FDXI=>d zXTA>uXF&l2XWQ4FhNI7Y5G01q_`10SufIco;Y*{9)jn#KOQi z=?MepaPC;cz`3)9fpeDu1Lv+M44k_^FmUeq!N9qXgMoA39R|(=1`M1BeHb_obue%q zE@9w2Qp3P`G=zckm<0ppaRUa<6FLl>Cj}TdPd;JbJoSNr^Yk4C&NDk0IM2>u;5;{h zf%E(x2F?o)7&tF}VBoxTfr0b#4F=9DKNvW#-l%8bytajb^ZEw{&Kn;XIB)SVaNc^r zzl5fr0Z82LtD03kJ?7EexDbCoph6TfxBj{0Rf+ zi$4sUuWT4NU&kq!1+yr zf%Cf!1Lu$W6b8e*gm)gAW52qYVQW(+mbK<|zzZ zEGrne*i;y}*i9I?I1(7RI7=9~xLz=D@u)Cx@j5VY@ntY@@n2xz5>#N|65?Ut682!= z5?R2&B|3+JOKb%Lmjnj`m!t{+V5(X|) z69z8R36;xa_Aea5<Wj$cv z%AUi(l_SEymD9n%mCL}ul{W;OaWUz}4-+z}5YRfvcy0fvcB;fvdNHfvb;)fvay116O|p16ThG z2CfM?3|tdA7`P_hVBngxg@J3b0|VFO9SmGkCNOYKm0{qTx`TmhnhyilbP)!w=?@sV zW>he6&D3Dvnz@64YgP&a*K836uGt$HxaN2;aLu_>&%iZz4g=S`0tT*mZy31dr!a6W zkYV6jaEF0wVFv@(A`1qtMQ0ee7RNAfEsuH_~ST+6>OaIL6e z;9AMTz_oG(1J|k=2Cmfx3|y-}FmSDDVBlJ7z`(Wk4FlJ@Jq%pyYZ$mTh%j(%*ulWH zaS8+1CLIQ@P4ycXxHd;HaBcp;z_q1^forP@1J~9o3|!kX7`V2}FmUY%bWXu7h(J zxDJ&ta2=Ll;5x#s$;2*Le{JuJaohxGtnHa9!kJ;JWyMf$P!{2CmC33|vkb3g?H&fMI}Qw7cU>5`?*3rl zx_5_x>wX0T*8>&?u7@HF^;{1hFmOGZ!NB!6gn{dc3j^1aFAQ8yk1%jO>tNt|Zo$Cy z{0jruiwz81FBdRyz3O1#dfmXl^(KIU>#Yj|*ERb!>|x;gnZv;K^G7`c*RLxK zT)%r5xc&q%aQ)?A;QG6Uf$Lui1J{2W2Cn}{7`Pc0FmN;4FmN+zFmN*qFmN+JVBluy zVBlsAVc=#{VBlsuz`)I3!@$jv!@$ki!obay!NAS!!@$kMz`)J3hk=_ngMpjRhJl;! z1p_z#3I=Y0H4NN>4Gi2uIt<)G^$!@hg?BJ;i{vnHixx0&i}^5ciz_g2OE55SOYC6a zmaJjmmYTxAE#1PvEn~pIE%StdTXqKnx7-W{ZutfVZUqwtZiOcd+=@FGxRojxxRpH^ zxK$V!xK(~IaH}3+;8yEk;8rhS;MVY9;MRD-z^!?Nfm>?>1Gjbq1GkO`19!cy0Ry+5 z2m`m?0|svW8w}hA8yL6^BN(`i92mHbJs7x6To|}bZ5X)C92mIGT^P76R2aA|t}t+0 zK4IXtI>W$iy@G+;CWC?7R)>MxE`@>HK7xVUA%lV2(S?EAiG_jNS%QJv`3?iO%MAu@ z*8>dPZaoa#?gb3o9u^GTp!t7pF9rr~uOkfH-Zc!|J{}C*z9tOZemo4^{u~V4{(Bg> z19}*^149_NgLD|UgDx;|2OnYJ4mrTU9r}cUJM0JpclZ_t?uZi%+>v`2xT6j*a7UkE z;EuV%z#Ut{z#Zqqz#Xr_z#adAfji*~19wsi19$QS2JVyv4BV+J7`W3q>KVAxD;T&l z5*WBM8yL8=S{S&qdln`jD_K>k}Bb8#)-c z8#@@dn=%-xVvQ-xO)^BxO-g~ zxcfpFxcdtjxF@V&;GTGdfqT*!2JXpc7`Ug*VBns*fPs734hHV&a~Qa1G%#?_EMVZC zRlvYK+lPUBjtv9%TpkAQc@hlV^92~V7g#WGFHB(IUNnV)dvOK>_mT((?)s$~4BX3N z7`T_)FmSJkVc=d_!@#|&g@Jpu2LtyS4F>MD6%5?#au~SR2QYANXkg&pIE8_G(;f!y z&1)FAx9Tu(Z}VW_-tNG_y~BfnduId#_pS;C?%gR2+J zkYV7yv4Da5rUe7{%?AwJw>lWOZ)-4c-`>K&eP;#(_gw=9?t2mp-1p8faNmE!!2RG% zJp=c{B@En;L>Raq9bn*o9Kyi;_zwg3lMM{qPg5AUpBXT4Kl{SK{k(#K`-KYw_e%x_ z?w4yAxL-|S;C}7H!2KqIf&1+m2JUws7`Q(OFmQj&VBr3Ef`R*!3j_D3FAUtDYZ$n{ zC@^q;Il;jF)rEok8wUgTwu?3ImTq4Fiv&0|So|3j>eR3x;|gLRz+>UVz+>@*fyc6jfyXL?fyY{ffyep-1CPxH1|Hi41|Hil z3_Nys>KS(9b};Z{IWX{KvoP@FfbanZp4nLcv>A8c-nXvc-jsy)bq5jVBqP?*sJhLSjcxK;W;F+_7foE zPdx+A;tdQuOZG7EEZxGuv#f=IXSodn&k7j^o)r%mcvk*l;8}HtfoJs+2A(w?3_NR7 z7oC;vzIW57!b4G%J=d1_=&p8mj!N7BV0|U>6 z1q?hFa~OCo1u*bjc3|MSV!*(2)q#QMS_lKrbsq+v8wLzKHv<@WZXIFZxxIpc=S~I# z&)p0Lp89(Z3_SO37%JYe8?Cc?n;oQHwug$x7F zOB)8BS0)TRuVWZ^-ZU`qyv<j;Q8`_ zf#(|w1JAb?3_L#+7MRr=4ui765UiCi=yc#zccs0*3@M>*g;MJbOz^l{2z^hxqz^fO-z^kvrz^ngpcv-Hai%2 zZ6`4B+U;TBwLina>u`aA*Kr2}uhRquUgtRsye<-};0-BZ;0>L@z#Ddifj2^j zfj3fyfww-&hJiOahk-X{1_N*G9tPgHCk(vtcNlmRZZPmB-eKTPI>Er3e1U;CWe)>y z>H`Mev>yz-85Rt@nJEmsSse_#*)0sbIa3&TbLTMd=DlIy&40qcTd2dpTNJ^-TkOKX zThhb8Te^gSx2%AHw|oZ!Z^au1-pVfwywwg2yfqdK^}MwW47_y*70i z!ob_i!NA+1!ob@q!ob_+z`)yX!@%3&z`)xX!ob^A!@%3Uhk>_e3j=TO6$ajZ6$ai3 z1`NCta~OCh^)T>GZeZY@GJ}D48VdvOv>yz-Gi(@mXXY^Q&RW30J9`TQ@00g9)nMRV7Qw)~d;tURiaiXxE7vgauG+xByM~8> zcP$SC?>Y+x-t{I7yc+@-csE)w@NSA>;N9H9z`NxN1Mk)^47}R~7VBkG}gn{=W2LtaV4+h@LQy6%!1~Bkmi(%lsK7oPv#s>!8 zTPzH`x3@6x-ub}5dryFY_r3uG?}Hi!-iHqucps}U@IJ|5;C*_Bf%n-P2HqDQ47@Kp z7nk!od4hg@L#J-4+Jk_h%S*KT0t0erjOg{k(^P_sbOq-ft!hyx)5mcz?WL z;Qf`s!2A0S1MlAw2Ht-+82A`i82A_i82FezFz~TlVc=s6VBq6mVBq7-Vc_FD!obI+ z!obH>!@$S&fPs&@fPs%kfPs%^4+9^s4FezV4F*2G9tJ*s3kE*^0}S^BT@Tq)Y;8W9K;8Sm4;M17H zz^8eHflq4-1E2O020mSudIml{6$UtWzC*I?i?-@w3Up~1jsv4w%p(u9G}at{NaRSW~4)g1;t z>l6k)8vzDBn=1@_wgC)$wr3dl>`EB;>;)M3>>C*P95@*G940XEIo3xo@Hw7g;B)d} z;B)%Hz~?-JfzKs|fzRau1E1>*20k|d20ph941Deh41Df)82CIw82CJ882CI-Fz|Vm zFz|W3VBqsUz`*BI!NBM9hk?)c2m_yA1_Php9|k`E9tOSu9R|LDFARKvOBncq3K;l; zO&IusA29HROkv;)bz$JE5949r3+G_q3qQiZ7ZJn27x9CEFLDn9U(^H!zUTr5zL)?8 zzE~axzSunsd~tIa_~JVl_!3+g_!7P_@FmV*;7gjqz?W>pz?UMxz?X7|fiLw017BJL z17CUw17C&)17F4;2ENP{418HB41C!k4175a41BpB419S$41D<<4E22ZHyHQ|?lABb z9$?@r>R{k2UcdSw{+dgs(L@byVB@b&Fr;OkFe;F}=Az&GIp1K-2|2EIuQ41AN;Fz`*T zVBni#!@xI{hkRVc=U7!N9ku{s{x$;u8#f zOJ*?eEwy0aTc*Llx9kf8-|`y_d@JrS@U8S=;9Gfxfp1j|1K(;12EH{M418;DFz~IN z!@##Lfq`$`7Y4rd9SnRMEExDU++pC`xP^gl(-H>0%`FUkTWT2iwoYK++m^w=x7~+< zZ-)y5-%cL}zFi>!D-3)GA{h7%JYnEFn8Lt!@Bstgp#%oLLw6YX4ks}19e%;UcVq$s-%$kyzN2p# z_>N6r;5%-@z;}X$f$zi~2ELOy41A|J82C<|VBkC5z`%D#g@Ny^3-6Ak1`ne9^GN!dmO>Q_qd0F@9_-= zz9%jWd{2%r@I4h^;Coub!1qjof$v!b1K)FndIrAdOBncGI56f&noMGVm>cPPG^$r8yw-^S#Z(kVrzE5G` z`(eSr_oMy@1K-aA2EJbc41B*PF!25Q!@&2uhJo*o1Owln76!h*JPdq)I~e%>X)y5p z+rz;3zk-49{}%>+h6V82EW?82EY4F!1xX zF!1yKVBqH~Vc_Tc!NAWygMnWlhJjz;0Rz9_1O|Q~2L^tjD-8U?5e)ny5)AwzM;Q1; zO&It^?=bL-H8AjtYcTMO?_l7U2w>os;(pXxe$hWet8B4e)%a3{0cq{{0b)+_!WH^_?09W_?7lB@GCno@GE~|;8$6}z^^)k zfnUvsfnQyOfnR+A1HVQJ1HWbt1HV=Z1HZNa1HbkY27aA24E(w&4E%aB4E%Z@82I&1 zFz_2JVBj|lVBk06Vc<8~!N70az`$=J!N6~_hJoL7LOlb&SpWmSxd;Ql1qg3p;J0jH z;I}eh;I}%%z;B(yz;C0&z;E+`f!}rs1HWAk1HZiw1Hb(j27ZS%4E&BM4E#V0!ocqy!@%z$z`*ZuhJoKRfq~zPhk@T~2Lr!%2m`4vRfAky%{umDi{#XG9{@4i&{Bbc1{P7M9 z{0R&U{0U1K_!B2E@Fz`S;7?9q;7`$E;7?^?;IB{J!oZ)_z`&nAg@He#f`LC%gMmNu z2LpfB69)e584Ub6E)4v+91Q%qHyHTyRxt4A=P>XW*f8)HYB2B@NigsigYX#!{*pZm z{G}-j{AC6V{N*|f{1q$={FOWm{FN^l_^S>u@K@U~@K+1R~Yzb-Kb~apM8aaf6fX9{<(V?_~%_<;Ge&Nfq%gU z2L6Q~82A_MVc=gpgMoj^3I_hAISl;E0vPz0D=_e{5Mkh7@rQwb?HB{97y-__vBM@NZ*b;NLF7z`uisfq$nB z1OKl20tWuw4;c9Od|}|<$H2h9Uxb1GfC&TtK@$f4Lk0}|hkY3Mk61A9AGKiMKW4(f ze_Vrs|AYtw|49`F{!EeQtx`r9!K{C9d7`0q|(;J>$kf&cyq z2L1;N82BIFVBmi&z`+0b2Lu087Y6=k84Uc-D;W4+Okm)Dxr2fK)d2?n*Do0O-xe_N zzgxq=|3QO+|6>6I|EB^5{?8j2_`ilQ@P9kQ!2kUU1OJaF4E(=*82EpGVBr6&!NC8| zfr0;j4}$>135I$BCIJQk<{1nEtU3$=Y#SH^*cBKA*b5j0*takUaF{R%a2#O};7nl< z;8I`^;O1Zu;6A}1!25?mfKP`(fUk!^fS-jyfZv5dfd2-AfPevmfWQt00l^*y0igs2 z0bv#f0TB)c0Z|_Y0nrr<0%9Bt0%9o)0%B(v1jHj41SDAM83ZKuFbGHnFbGH~FbGK9 zVGxjB!5|=$z#t&&!5|ROJNXD=V1^~-@+iEv4lZDvw%TBi-SQx z>jr~>b^?QdcKrhe0i8Vz0=f|l0(u+_0(w0R0{Q|B0{ROW1PmM)1Prb)2pBG45HQkU z5HNbcAYk0VAYc-~AYdxPAYi(MLBK44LBQ+}gMj$~1_6r>1_4VS1_8?#3<6eb7zC_C z7zAu|7zAw2FbLS@FbLSiFbLSoFbLS+VGwYXVGwYVVGyWy`okdLe1t*3C51u2HHAUI zO@~3i?F)l|`x*uTj|>I@PaOsUFA)X-uL}$U-W?1AK0XWrz6uNizJC}5{I)O%_|IVw z22>QSv5Msa}5GuhS5c-2bAnXW(K=>I3frtkT0+BBm1fmrf1Y!yp z1Y#o?1mX-B>ILF87z7eb7z7eU7z7euFbE`lVGu|@!61;bg+U;-hCv{$hCv{G0fRus z9tMHT0}KLL8yEz#KQIX7N-zlIi7*J{{b3NuKfxeSaD_pj@CbuI(GLcJ5&;H*QVj-y zvJeJ=@*W0(iY*KRm0uVHstp(fs&g0ws;@8z)HpB*)NH6{5UAB)5U5?jAW)~nAW(OQ zL7?7)K>!pj4HFmy8cP@in(iiKf$kj)0zDQC0zG#a1bSl_1bTlk z2=uiu2=v#xFbGWGU=Wzlz#uS@fk9wm4}-uY8wP<%9~cBC&tVXllENS`)qp`@8V7^G zv^5L@(^D7(X7Dfw%(%fIFtdk2V3rPpz^o?>0<%{z2+V0=5SSalATZB?L15k&27&nx z7z7qT!14zS0xK>s2&_E8 zAh4>0L148HgTNXd27xtK7zEa?VGvjs!62}nhe2Qi2w!0k*x11!uxSp1z~(s&0$Xwz z1hy712yDw?5ZLa+Ah5%ML13o3<4*XFbJHS!XR*}ghAkR3WLCz z1_pt%DGUPV3K#^=H!uiXc)%cV@d$&!r2`BCmk%%qTv@>&aCHuYz_lj~0@n{P2;5l1 zAaIL?LEyFygTNgR27$Xh3YyLEyCpgTU(&27%WH7zExZFbKR^!XWV0fI;Bx z83uuOJ`4iyzAy;9pTi*V!GS^GBL{=P$2ANBpWZMCd=6m{_FQy2urau@`~BNzlFQWyj!H5de? z6c_}h85jhmS1<_59AFTXeZwFq_kclAeg%V|!W0HU#R>*Nr4$B13bLiGmbC_W;QSgX8AA(W@|7A zX5U~C%sIdym^*<%FfV~YFyDtku)u;ru+W4-uqcH=u$Y5Eu=odqU?~fOV0{?}gJ9Vg z2EpO41#qj41)DN41x`R7zCRH7zCRg7zA4i7zA6l zFbK9CU=VC~U=VC?U=Zw3U=ZwB!64YF!64YVhe5E*g+Z`u3xi;{4TE401A}1C4F-J=e=MMoZrJBxIlwJaKRM@!G$3Vf(ySe2rgQ}Ahhe2>p34`EX z9R|U@D;Na#X)p-xTfiW=--ki)01t!Uff)>f2NM_s51B9s9=gCFc({Z?@JI-Q;87O_ z!DAu}g2&b{2p+d!5IhmWAb662LGa`T2EkJe41%Xc7z9thU=TcWfI;wV1cTr?5eC8Y z1`LAr=kG8GUMOJ@yy(Ipc<}~<;H5bXf|n;S2wq8H5WL#JAb8DzLGU^YgWwGr2EiLE z7zA$`FbLj!!XS8S4TIqA2@HaFY#0RZykHQ#Tf!iC&xb+q-WLYJ`!x)L4=fl2AG~1@ zeE5Mu@X;9t!N+qL1fL`@2tH+D5PYVbYKwTyul#Eb%Q~Odj*3Kj}Ls2nHc-83rL83kD%w2?inE9}GhJ3=Bg0Ul@c84loEACNKyY zxiAPB^Dqe28&6>nGRa^NG7Vr5GE-m>GP}SaWWIqx$fAZp$TEOI$V!Gm$Z8LRkaYrs zko6Y^A)7Z0Lbfv)gzOp^gzN(tgd98=gdDyw2s!Ry5OR9LAmqG+LC7VBLC95tLCEzC zgOJ+}1|jzv1|g3E1|iQS3_@Nd3_{*H3_?B{3_`v<4D~{ODhxvYJPbksG7Lh2EDS<{ zCm4i+PA~`s?_dxLX zLYXcMLRk{^3_{rk3_{r-7=&`}FbL&NU=YglVGzpu!XQ*2!XQ-0z#vrkgF&ch34>5^ z0fSJ93xiOp41-Xa1%pu82L_??3k*UPZy1ECWEh01jxY#S_b>?6*f0pyW-tiV888Ud zM=%IA_%H}H{9q7j{KFvB^nyXCMTJ4Am4`v7je$X^t$qcAQ2QJPp^gd$q0RsXp)MW< zp{@fALftJ4LOmB4gnD-{2=!fI5bA%zAT&{gL1^M12BAqe7=$J-U=W&ehCyg*0fW%A z4GcolXD|rOh+z<#slp&M^96&@tThZmvsW+(&3VEgGgw}sy5Zds8L1^O#2BA%V7=*T{FbHk+VG!C@!63AK1B1|x5(c52ISfL( z92kUlPhk++^MOHV?+XT@eGeFf4umiW9kgK(I{1e{=+FrUp~F24^+HD`FbEyp!XR{P z4ujC~4hEqU0SrPXJs5;exiAQwp28q><_3e%*)I%2=WZ|vonOKrbdiBU=n@Zu(4`v; zLYH4K2wi!@AapH)LFl>(gU}5f2BDiB3_`b37=&)$U=X_VhC%4=0|udc7Z`-@7cdAt z*ux<7u!TYB(Fq2jCp-*7PyW<12tD&)5PI&zAoRk4LFlCpgU~Al2BFs$3_@=@7=+#~ zVGw%vhC%3q1B1}V00yB?E(}7S7cdBYIlv(Fje$YvdkBNjj|>K(pK}<5ejQ;D`u&4J z=&uNa(7zZ4q5mQb!VDq|!i)+G!b}nj!pt!Y!Yn5kgxPc$gxOUXggICkggNU~7=*c8 z7=*cJFbMOMFbMN5U=Ze8!XV7QfwVEM3DOEHi;YShj~jSgwIVSU!b8Sm6ePu#yCWu+kp}VHFbwVO0|bVKof~ zVRaP-VGRxjVNC@FVJ#B|;d<=^24S5J24UR|48nS67=-n=FbEq=VGuT4!ys&QfRo*@jvUV9jXy{9k;`xGz;`=&6|3;P8y2>W|5 z2nQTs5DvV+ARMg2ARHpYARL;&ARM-YK{)&cgK%U7gK(4ygK%^XgK$g^gK%sJgK*pq z2I2Sz48n;f48lnf48qAR48kb|48o}o7=+V4FbJoAU=YrDz#yC@z#yEhz#yCx!yug7 zz#yF0!XTXgfI+z61%q&rMLmOX@f8N)QV#~q8iX8)_JY8(%O8H)}8mw-_)8x7siWx1}%$x4&Qz?!3Vu+#SOp+|$7z+kEVM>@5t!b3zz|=VmYn&(mNKp7(%3c>V(h;RSOTgclYt2ro)u5MFG+AiRWy zL3qg%2H~YA7=)KCVGv$Eg+X}50tVrgEeyh|HZTaUVPFtm^MgTn9S?)>dIbjI4GIjx z8)F!RH)SvgZ|-0a-ZFtfcd3dA7)_?KD>ZI_=pdK@R2VJ!bfWugpa8( z2p?O)Abi}0LHPI+2H_Js7=%w2FbJQDU=Tjd!61Bk0fX?F84SW_IT(b`rZ5Pf-NR5X ze9nVG_&fuH@c9i4!WVQHgfHx15WeWZAbjx$gYcy(48oUH7=$mcU=Y3%!61B9-;Q7qzQe#Ed}j}X@Ld-M z;d>$s!uQTF2;Yxj5PrbGApD?(LHMBugYd&Q^$fy~wlD}kwqOu`BETU0>5%3%=x?7$%W`45BemmUV;uPzM2U;i)&e_O#I{Jnrd z_=gFD@Q?Z@48lJrFbMzhU=aSz!yx?o2!rsS9tPpRCJe%VuP_MzTfrdwKZHR93|BCS zFh($lFv&28FpDsVFn?eWVY$E{!kWP#!luI@!uEhcgnbEv2uB5j2&WB$2GFo?Kh zFo?K@Fo?KuFo?K4VGwbD!yw{ugh9k}1%rs!1qKoCISe8`6$~Q2J`5s$HVh(u9~eaZ zcQA+q^e~77hA@Z(F))Y(onR0NUcn#|(!wAT8p0qFrobQ)&cPrO{)Ry$VhV#uqzQva zRJ{a)NYoz&k?1!JA~6dXL}FVQMB)kNiK_v45gGkmE29fMD3?exV3?jJ^3?g|B3?lgo3?lh2 z7(@y-Fo+axVGt==!XQ%Iz#vl6!yrh7AlNjU@~sO&JU#%@GVDEjbJ#tqBYwZ2=4- z?J^7^9U=@O9TylxI(ryIx^fsqx+54wdR!PpdN~+GdfzaJ^xa?(>7T$LGNFM%WMU0N zy~v~j29e1!3?h@iFo;Z9z#uX;hCyVS27}177YriPA25i_c)%bs^8|y)tR)O0vtt-U z<}@&f%=KUpna9E)GH(Hc$ovTmA`5aDL>7iHh%Ay|5LtACL1gg;29YH_3?fTQ7(|xk zFo-O#VGvpA!XUEBhCyUC2ZPA!4-6t}9x#Zk1;zim1q>qVD;PvJ*f5A}v|$k0#KR!6 z=?a6$78VAPEjt)Qw%%b7*>-_JWcv;VksWIoM0W0A5ZSeXL1gzD29Z4{7)177U=Z1N zfI(z`1B1wc84Mx^I~YU`MKFjQmSGS%{DeW|$QcHaqe~b>j@2-T9RI)|a^eqz$jJ>1 zBBvS{L{8UFU=TSI!XR?ihC$?<0)xnT9tM%~HyA`NY+w+%7{MTNDT6`eatwpWl>`Qn zs|5@q*CZH3u03E7x&DSh>r5V_OCAaXZ`LFAqdgUEdy29XCG z3?dH&7(^biFo--BVGw!zgF)oU0S1w$Qy4^^EnyIO4vPO5DGVYna~MQkl`x3B4qy;@ zBf%i@)`UUiod<)+dlv?g4;c(1A9WZ+J_#_0eEP#6@`Z&#6bn!R8UHDAFXYO#kw)bav@sMQMwQ5zlxQQHUxQ9B(5QF{XhQ3oFeQO5!X zQKuXRQRfr}QJ4A^45F@Y7)0HEFo?QeU=Z~*U=a24U=a0AU=a0jVG#B8VG#8*VG#BA zVGs?lU=R(oU=R&bVGs?rU=R%nU=R&Gz#tlSgF!U>1cPYA1_sf{2@Il94Gf~uQy4^J z{xFEfK41`yS6~oL5MU5Z_`)EXB*7q>?7<+KlEWaHTEie(pH{*kntp>pG*g2?G)sU% zH0uL{X!ZjJ(VQI&qPYtgMDsQ43LA3G!gJ{(n2GQyb45BrA7({FDFo@Q@U=Xc8z#!Vl!XVn@!64dfz#!UU z!XVlz!64dZ!%#2U9>5^laezUza|eTH*8&F7?kfzUJuetU`y?1d`%M@`C#W!pPK;m> zowR^Kbn+1f(Wx8^qSI6uM5jwIh|bVp5S_`uAUey0L3FkcgXo+J2GO}&7)0kiU=Uqk zz#zKNgF$rB1P0N?OBh6#8Zd}1b6^l%-ohZdqJ%+orLKsBP?qCo-SO14W^a2lq=tTww(TiUgL@#?Vh+Z*a5WQ-_AbQP(LG*e6 zgXoPG2GN^K7({O^U=Y2%fkE`n4F=J>cNj$PePIxNV89^yu!BML(GdpG$1fN}pL#He zKJ#D@eV)J|`l5$H^pyaE=&L^rqOWf-h`v=|5Pi3RLG=9=2GNfy45FW07)0wow=jr) zIm00O^$&yS_X!N5KNc{E{ye}S`s)OP=A@f-<-;H*J%>R|rh!3B_5g#J+#d!p z1qKE&MH>b&r6mkv%4ZnFRK75XsWC8!scSHZX_zpGY1%M|Y2`48Y2RTG(|N)mrl-Lm zrfh2!oi91B00F1O_p` z7Yt(le;C99k1&V@%P@$AOkofUlVA`FPhk*?xWgb8<-;Hr-NPUjtHK}_*T5haKZijq zQG!7%X$FH>@&^X7)DQ--v=t0u8TAqjVwo-sVp%l|V%Y~6#B!c6h~?EVh~=MQ5Gxd6 z5G!h75G!85AXdu3AXXN`AXdJCL9Eh(L9A*8gIJ9LgIH}1gBZw+h6Dz&#t#f)%^nP5 zEmIi8+C&({+5;HGI;Jp)br~>-b?;#i>z%?N*7t`&Y{Cf!u}L8eVw0CJh}BPRU=W-3 zg+Xja2ZPwmHwh3kw*;7IiR)E&9M9wm5}B zZ1E2Uu_X%_#FpAHh%LRsAhxWAL2S7QgV^#73}P!LFo>;;U=Uly!63G33xn8d9|o~C zA`D_{UNDHQy}%&0u7W{qy#<5V1_g$Cv5g`OVjJHuh;7=#Ahvl8gV>e~2C=OP3}V|R zFoP_!ytC@4ujaK6AWUfmoSK(*}x!nb`68r zxheGwV&^Lu#4a>2h+TZcAa>~qgV^O83}RO#Cbdz#ChH@i1U^(i1TSMi1WQ+5a*x4ATAKYATH>^ATGqg zATD%(L0otagSf~62653d4B}!B7{n!JFo;VTFo;VnU=WuMVGx&5VGx(O!yqpEfI(bt z34^$N34^#o3WK7h0|s%W3k>4QM;OFa7BGmbmN3+dt2Ho)tIuH&*Jxl6*DPQV z*9u_}*H&Q=*O6cl*X3Xk*L}etuFt_BuK$5S+)#!=+(?E&+}MFZ+{A@J+|-9b+{}YP z+`NN9++qoXxaAE7accnvaT^H+aoZRMak~o);`SdH#2qpi#2sERh&%3J5O>Z=b>--Vwtf-pRrs-g$ySysL&mygPwGyvKw=yjO%ly!Q@+c;6fb@%{`3 z@d*qJ;uE&iGl)-Iz#u-!hCzJN69)0gD;UJ5R4|B7WnmDXdVxWFS_6albPERY=^q%x zXDnb4pV`77KFfeXeAWX7@!2yN#OLHNh|l@KAU^jDgZR894C3<>7{nKdFo-W?U=UyU zfE^G=V{UnF)jVvONsq%M%#HSJd+`h_5tZ5MTL)L44H) z2JzJy4B~4<7{u3#Fo>^XU=Uw-g+Y9M2ZQ(q2L|zt3=HBM_b`ZWN?{P+T)-f{#ezY6 zD+7c0)*lSw+cq$WZ*O1_-x0wezSD$3eCH1a@m+Tq#COkN5Z@EPAin1hgZSPJ4C4Eq zFo^HJz#x9$1cUg&4hHf1Lm3R>hiw?dkAyIYAN64nKUTsZemsRi{DcjI_{kUs@l!4g z;-@7T#7{q95I^&VLHz6n2Jv$x4C3bl7{o8QFo<7NU=Y7#z#x9vfI<9<3xoJo69)0C zZy3a{onR2Z{)a*QrU--hEfWUuTYnhDZy#U~zjJ~?{O$q<@p~s2#P2U)s26|Gz##sx zfI<9G2!r@z69(}oIt=1ZV;IDrsW6B?mthcpA;2L1;tqrO%Rda_uTC(Czuv$g{^kOM z_}dc<;_qHCh`)crApX&TLHv^igZO6!2Jz277{tFyFo=J%VG#cw!XW;mghBl01P1Y6 zH4Ngv8yLj@L@rZAi>YUAi=+bK|&yeK|)Z3K|*i?gM?5FgM=^- zgM{!21__Z21_@CK1_{w43=(1~3=-lZ3=-mR7$hWiFi1$QVUUojVUUpaV33fhH(`*F zHDQpDb77E>uVIjof5IT4P{1IesKFqic!fbiX$FIYat?!piUEU!$`u9))hP@TYBmfK z>M9Hp8WIc=8aEguG-ohKXk{=+Xsa+t=y)(l=t?k1=$>GZ(3`*@p`XJbVIadGVeo-L z!te-#gwX;93F8|K5+*AcButkuNYtBsV34qIV34qEV34pnz#w5Qz#w5=!ysXOhe5)| zhC#w+0fU6C1cQX_0tN{?4h9Lk1q>4QA`BAtQy3&1co-xcDi|aj{xC>5_Ap2|$uLMb ztznRG_F<54zQZ8l;=>@}a)&{}HHAUK^#Ox~TLOcGy8wfP`ve9Fj|c_{j~5K}5}qjx z5}t1uB)k$BB)mQ_NO;d+knmAqknmZ;AmQu5AmRIjLBg+sLBgMhLBhX*K_WnaK_XxU zgG68mgGAsD28p0K3=+W_3=+Xd7$ia*7$ib=Fi3>PFi3<6Fi3>WVUP$HV2}vE!5|Tl z!5|Uwgh3)QfI%Wkg+U@}3WG#6M?Hf?^a2Kn7##+Qm=g>Vu`Ub}v0oS@;-)Z2#2YY3 z#4llxNbq5hNch1ZkvN4xB1wTkBIy8wL~;OwMDh^^i4+G0iIg`C5~&po5@|9F5@}l) zB+@GwBr;4GBr@JGNMzP9NMso>NMv1MkjQRfkjOD%kjQz!Adx$RK_btBK_ajI4TD7f z1_p@&7Y2z!1_p`34Ga=R2@DcNcNip!YZxR-G#DgG?l4G{_Ap44sW3>C-C&R?PhgNJ zf5RYAF@-^*(ttst@&J1DMH3wFej^>LM5<>K-si)b}t* zG#D^QG@N0OXl!7RXp&)&Xga_kQQsWGAkqAVL84^^gG8$VgGB2c28p%?28nhZ28s4J z3=$nX7$iD#7$mwh7$myZFi3QpFi3P?VUXylVUXyRVUXxu!ywV;!ywW3hC!l#4uiym z5C(|}e;6bt9$}D}6vH4f=>vnr0yvq8&l69v5tp9V%-b|iS-f;66@zMNNk8;kk}}| zAhB@^gT$se3=*3w7$mkxFi33qz#y@;fk9%M1cSu36ATjDLl`7>m@r7}c*7vEa|MIM zt^x*$-4YBEyZ10i>WLKVXnJ(!d~bG=)Lp=nn>oV`~^Bj`uJ~oG@XKI4Qy)aq3&=E5Lx?Foa#^%e$+8#W9QH(oGE+}yz+QGY9dLE_dQ28r8u7$oj&V34?* z!ys|bgF)iH41>f20S1W&dl)1hb}&dh3Sf|U^o2p<@e~G$Cm{?HPaPN}o_=7Ec(#K< z;&}&y#ETdPiI)-#5-;~KNW4m5ka(@bAo2PRgT$LT3=(e(7$n{~Fi5M%$$eqoSg z>R^y$4q%XE@nMi;dB7madWJ!gZ3crRdj^9fM+}1`Cj)~d=bw58Nv;(PlH5KFlH4B{ zBzZP4Nb)u?NbKK~nSp zgQQpugQU0zgQSE8gQTPegQOG#gQV0O21)4$43aVn7$jwV7$oIP7$oH-7$oJNFi0wF zV31VwVUSe(!yu_t|Aj$P`2vHa$_55W)d~hlwFU-B^#}$@4GsoLjROplnmG)TS{4kF zT2B}xwGS{z>U1zj>iRH9>i%Gm)H}la7;$V=BdcYtV{eeL;W(R|0YypF0oDPFz z+!qGP_%jTW2@4n`6H^!@lQbA4lTI*5CdV*Hrr0n@ru<=$Onty0nYM*NGQEI7GQ)&H zGE;>?GV=$6WY!%9$?PKxk~upVBy(dJB=ck#B=a6HNanZHGe{QrFh~|EFh~|jFh~}i zVUR3d!ys8w!ys9DfkCot3xi~N3WH=t1cPLy2ZLl)3WH>I41;8i0)u3&4ufPJ1A}DU z7Y0dCG&cG$NH!%fNH)tbNH+grkZgIuAlZ6`L9#7_L9$(hL9+b|gJj182FcDn43b?l z7$m!67$ke@BN!xm6&NJ@7#Jk`IT$1-Ffd3?IKv=0aRP(nqyPrV$u10%Q#2SPr*bez zPQAh)Ijx65a=HbB!63Qz41?sl4Gfa&D;Oj3WMaKJq-1dhgUF29+|-)c{G4Q@|X^TT>DBv0&NkUUw!AbBc* zLGrW?gX9?=2FWuY7$nbLV30i5!XSA*fI;$t27}~v0cq41<*45(X*%3I?fw8V0Gr5C*9rmwE=N zU=aqX5FQ4p&=>}(uowoZ@CXK}hzJI$NEZgFs1ydNXdectm>34B*cb+>xC#cT_zniC zggp#Wi7yzWk}VjdQUn;JQcW17(gGNy(t8-BGL|q%Wlms_%9_I&%q$o|A#?pq5y-`Bm)Mi$r=n&Qw$iS>Zjac zkea%IL2B9t2C3;C3{o>DFi6c@!XP#427}b>Hw;p9?l4Hr(_oOAZ^0n7K!-tUp#+1} zA^`@e#Q_XbOAHvKmP#;4E&aeCwd??c)bckBQY*eNNUeOqAhnu@L28WzgVb6T2B~!p z3{vYI7^F6MFi34QVUXG+!63Ccg+Xdd4@14w))Nd;+omu`ZQsBkwc`wf)XqB$QoB7E zr1nHGNbRj)klI(lAa#I&LFyn6gVZ4t2C2gw3{ppU7^IGJFi0JJ!60?)1%uS_I}B1M z_Ap4De83=e>H>q*=`RdYXB8Nv&dD%Hoo8T>I{$+~>Y@&V)Fm4Rsmm4&Qdc4vq^_1Q zNL}-(XOOzy!XR~1hC%9927}b?DGX9~)-XujeZwGizkosN!2$-UhZ7j29@Q{NJgfjtsb>!uq+Td6NWJ*MAoWUsLF#n^gVdW82C26N3{vkr7^L3MV37LogF)(( z2!qsT4F;(%84OZiO&FxUDKJQV`@$gggMmTnX9k1RulfQ8soypXQh!t!r2c$hkotRr zLF(TR25ANn25CkM25F`g25II725FW825Ht525B}A25EK^25All25C+P25BxC25IgR z25Fue25H_24AOiR4AT4y7^DUEFh~ooVUQMj!XPc8!yqjx!XPasz#uJlhe2BW4}-MC z4+d!|1_tSRX$=NxnHmOZ*#ZV>xfu-7@)Zoy3Ka~}iX{xvN;wSD%4Zm)RX#9Cs}(Rv zt50B%*63l7)||s2t%V2X$u<$Y0DD~($*Xd(l!AM(zXQ*(smgP()Mc@>ZKi)Fi1PzVUTwE!XWJu!XWLs zghATv0)w>s0S0N0FAUONDh$%z4GhvgTNtE$4=_mky4A4AKQ}7^I6T7^I6k z7^F*%Fi4l)VUR9oV34lxV34ky!ysLCgh9G`0fThS2L|an2L|c-1P19w76$1i3kK=t z90uu@6%5j?FBqiT6&R#DG#I2iJs70BLKvjGS1?HT*7Gn(_f24so?yZtJ+XvAdeRC8 z>B)Z>q^IUENKgC0AU(r`L3(BegY>K$4AOH17^LThFi6ka!5}^V41@H72Mp4SOc%77WsRrZ7nF6JU_u*TNvZUxq7y(R(nohNNFQrqkUn0(AbrAuLHZ;IgY?Ng4AQ4M7^F`JFi4*< zVURv6z#x700fY3p7Yx$p_b^CbxWOQO@eYIZr85lDmp3p-U)jS@FMZ8`LHfE1gY*pv z2I(7L7^H78Fi79}!XSP70fY3NJq*%!XD~?LYhjSSpTQvgAcsNvVGV=yqa_T|k0&rl zKiR_|{d5U~^s@sD($6n2NWZwiApLRygY>I64AQSZFi5{;VUT`j!yx@WfI<300E6_$ z1P19(I~b(DNH9o$RbY_*=26ce{k?!e`bPE9d-(tlnsNdJ>ykp36KApLI! zgYDj3^EKB3^EKi7-SeD7-Se9Fvu{)Fvu{SVUS^-!63up!63tOgF%M1he3vI z27?TH0)q@k41)}327?Tj34;tb2ZIcc0)q@M4}%Qv8wMG^5C$2(6AUu^^%)E@{9hPk z1bP@`1Vb2Pgmf5Wgsw2i2(Ms}5wT&A5&6O(Bf5h@Ml6OwMqGkHM*I(hjKm5C8Oa<5 z87UP88EFv)8RkWmz1kWqZWAfxn!K}PuqgN#Z8 zgN*6~1{t+43^M937-Tf|Fv!$v9$=8sn!zBWy@EkTr-ngB*MdPtPliE8?+=5FfeeF; z!5;=0BMt@`qaO@1COix>ralZZW)2K8<}(;%EGigeECU#1tQ;6*tW6kXY-|{0Y!et{ z>~a`n?3XaeI7%?cI4)q2ajIdEadu&laS>sVab;nUaecxd#)E~SUdH1OgN)}F z1{rS+1{og(1{q%q1{psU1{r@I2AKdA2AMz&2ALoS2ASXq3^E}#3^Ji}7-Yi!Fvvti zFvvu{VUUTM!ypqaz#tR7he0MLhe0ORfI%kq2ZKz!34=@m1A|Or41-MK1qPX<1O}Pp z6b6|T83vh@BMdUBXBcGC73vve(w8vEWRx(-WSTI@WJxf{WW8XJ$v(m$lT*SVlbgaI zlNZ7ulV8FhQ;@+RQ)t5=QMZoQ*OZ^Qz5}1Q)$8=QfFvv`3VUU@)gh6I92ZPL%2nLy{H4HM-7BI+6U&0_W zV-17M%nb}OvsoBq=HxKQ%-z5sGv9(iX8r~SnFTHkG7F9{$Sh1@kXgjSAhRfgL1xht z2ARb(7-W`MFvu)9z#y~KgF&W#=?ey#Wjh#TmWMFNtWaQ(S@DHIX5|wGnN>3wWLCE@ z$gFW-kXb9jAhY%cgUq@W3^MDdFvx6(V365p!yvQq4};966AUt&_b|w8DPfS=8o?m5 zt$;yhdjW&YjsymoogoY|yF?gdcD-Sc*`2{4vwI7J%pMm8nLSq+WcH>o$n1+?sF&II zgh6J10fWo|0S1`^TNq>xhA_w+{J|h|sDMG{&;tgU!yODVM_3qSj?9SkyO zeHdiUu`tM-D`Aj1&%+>dzJWpJ{2vCH3oZ2wG8bhSWG-%Dkh$c-Aam&hgUsa~2ARu0 z7-X*OVUW4%!yt3@2!qVE1O}PwA`CLuk1)vGXkd`JDZwCfa|VOVEfEHpTN4;$ZW}Pj z+ z69$nkoj4_AXEQ~he7671B1+O1qPYlOBiJS zG%(2g6=9J1dxb&fUk-!Je;o#y|2r6D8C)1-8D22RGA?0|Wr|>sWtL%(Wq!dR%d&w% zmeqzqmh}pQEL#qPEISW_Ec*-wS&je(S&jz`vYb;GWVvb>WVuBcWVz2U$nwl!kmdDY zkmXZhkmYA!sF&rR!5}MOz#uDdhe1}bg+W$GfI(Jh3WKb$1%s^c4F*|}8U|TW9tK&_ z9SpK!J`A#AFBoLSXE4Z0gfPfTYB0!3USW`xN@0+d=3$VPe!(Cs)50JtE5INtyMRGf zu7E*SK7>J5frmj>;R1uKVgiG#5(|T@(jEp``L010( zgRDUYgRG$egRJ2d23eyX23cbZ23g}b46-J77-UU57-Y>n7-Y>w7-Y?lFvwceFvwau zFvwb|FvwcfZ(xwMHeryp{=pz?vxGs`wuM2~&V@nN?g4|W{R9SCha3i3M-~QI#|sRy zPD>bMoedado&PY%x?Ew9b**8Lb&Fw;b!T9Zbw9%(>rufV>uJLv>v@7f)+>cU)|-bx z*82p5tWOJrtgi!ute*vgtltL)S^q5zvH=MUvVj^5vh{%<7-WOyFvtd1Fvx~@Fvy15 zFvx}pFvx~&V2};(VUUdoVUUgZ!yp^Ehe0-~fI&7|gh4j?0)uQ!27_#@4ufp$9|qaD zI}Eb%9SpJwDh#rTEDW-VQy65E3K(RQQy65EA27(Kv@pn~Ixxtl2{6c}9bu47uV9eP zNMMl76k({B&3wWjn^nRfo2|njn|*>oHYb5WHkX4zHunO9Y~C6M+58j+*@6fL*+KyZ z*}^LfvPCNxWQ#i(WJ@X-WJ@a;WXn_-WXm2f$d>mo$X0|f$X41g$X5PgkgYnxAX~kF zLAJ(+LAI8KLALe)gKS*~gKWJ6gKYg52HA!?46=KSC47BI***D%Pov@poF`Y_10 z{$Y@9`@$gGK8HcJBZon@GlfC6OM^kS>jHyp_Z$YJ{AVqzBvrC{XPt` z{XZCFC+uL5o!G-5JIRDWb}|ox?Bov&vQuU-$WBdQke#N$AUmCdL3a8V2H6=07-VN| zVUV4b!5}-kK7&Dajsb)0Tmc5zxfd8@=k+ki&M#n)T~NRvyU>9_cHtWa*+mN&WEZC} z$S!eUkX`bDL3ZgD2H9l+46@5UFvu=H!yvn20)y;I3kKO$HVm?>Sr}wj-(Zkkvxh-; z?FnAYCZg60b-N?fryKx7D?4}Y1+08x-vRgP9Wb3zFVUXRrg+X>(34`o* z2L{<41`M)085m@DUSW{kHG@HRcLRg$9uEfDy#frfdk-+k?(1QY-9Lpv_J9wA>_Gtr z*@I^oWDl)jkUgBkAbUiILH5WU2HB%i7-WxiFvuP+V30kb!XSIHhC%j}1%vEq69(DS zZy03H++mPCdw@aq+ysVt+4B($vgiLW$X@uvAbW8GgY2aY2HDFd46;`w7-X;fV357W z!XSI?2!rhPJq)rp8W?16&S8+fHGx6)b_j#)od5>eyCMv-cTX_L-fLlyz3;#v`+$W( z_Q4qj*@qJtWFHkU$UfF!kbQiHLH5ZB2HB@47-XN#V32(t!XW!Xf&46=U`7-avdFv$LW!XW$a1cU7V3k-4$ zQyAnJXE4YyWiZGw*D%Pj=rG8EE`pU~eZU~cwt_*9eF=jc#|H*E&NmEl+!73O+&dWL zcs4M|@#Zkd@wqU_@dq%-3CJ+W3A|vC6Rcs76Y^k?6EVUSZ? z!62u!gh5Vu34@$U4uhO(27{cM1B0A82>)S_(>TB&r&+-ura%MUVa^?&Sa^^=E zKSkQoeep*;+8VKeF(#807MHFv#Wi zFvt}wV2~@UV2~?vVUR1XPhpTN@nDcEbzqPylVFf5d%z%9zJNilB7{M%;s=9VI4|%>h3Ve)t_OIYxuz+*CfFp*Q~-I*W$q-*XqL{*QUTA z*RH@I*I~mT*D1gt*ZG7&uImhgT=yCVxt4);(a5TYrQ>Zo?4XaIxUu?_~g;|UCMCwdsr)uyZp>hiySalw?$!|o zx!Y41?ko#!DAoodtLGH5)gWQ)6 z2Dz^_407LQFvxx1!65fz2ZP+t0}OJ%{xHb>;bD;b%fcY{Pk}-1KLdk2g93v*qXUCH zlMaJCa}0w#O96vCYY&4w+W`i7_9+bV919raIkzy#bDdz2=iy4k4Dyl-804ikFvv@nFv!bz zFv!a~Fv!bUFv!cBFvu%JFvu%9Fvu%aFvu&{FvzRSVUSnd!62{phCyEa3WL1H4hDJ6 z9SrhXHyGq~7#QSr{xHbvaWKg1{a}#SKf_QjZ*YJ?-tZ5DyfF`hyon5hyeSWZycrLJ zym<$Myu}IzdCM9Gd8-Kw^43cjL44Ucw+BQNSP{xraeMY6pXS^a}?0m_H2iaTW~n@jeXl2{8=v zi46?$NgEjCljktVrz~KQPicVUTZl!64sc!XV$wz#!kk!XV$O!64se!64sm!XV$_ zz#!k*!yw;vf{A?8l`8gI0@^e)f zfI)t51B3j&ISlgqpD@TDc)%ck$bv!sumywskq`#?qa6(L$0jhyA3wq%f8q{<{K*>( z@~0UX39|AImOqXC2brvwK1&mS1%ze+I3 ze+yxd|L(&e|097x{$~n<{I3=U`QIBD^@a4%p`;CaBHz!$)vz+c0lAaI94K}dx`K{$dzL8O8~ zL39R#g4i7f1@RjU3KDM^6r?m56r>{<6l6{?D9C_#dP*A90P*7aMprCBPpr8`N zprAU1L7`r42ZMt82L=UA4+aIT1O^4|1_lM40}KkfKNuABeHauB)-Wg-nJ_3A$1o_E zG%zTbo?uWgd%>V!F@ZtB@(F{2H3x%&jSYi>Z3lyb-2ny#2N4DZM;8VKrwRrI=M4-B zt~Lw`Zg&_I-2X5rc*Za&cr`F6c<*6Q@GW3a@VmlLuMl9upb$8NK_Tc3gF=V}gF>ha zgF@I8289S728Boq28F0A3<@zW3<|Lg3<`037!=}vFeoH`U{FZrU{FZ$VNgh2!l00L zgFzvKhe07zhe09Bhe08G3xh(=1qOvY9|nc|6ATK42@DEFH4F;HZx|FxYZw&D4lpQG zI4~$w?x|-`s5W6xs1;#QsGGu|&>+L0&=|s?&{V*n(0qbHp;d!Hp=|?$Li+;-h0YWP zg{}<@3OynW3cXtx6#97>6ebifC``PpK_}HUuyzZ1}>Uu(5?fVUr7k!e$Nzh0PBb6t>hbC~UQ1P}q8hL19}5gTnR@28A6W z3<^6=FevOyVNj^w#lWDjYYT(I?hFQnJqip8d+snO?47}&u+N4;Vc!h~h5a)a6b@)G zC>;31pm1;tgTkQ>28F{K3<`%2Fen_!VNf{Az@Tt+1B1e`7zTyoG7JhQco-B;{9sTx z`GrB@)E)+f(;W;7XABq=&hjuQoSnmJ z1B1flH4F+@CNL;m)nHJ#dWJ#aS`LH4wLc6B*B>w_+~{CXxLL!Xa7%$f;nocXh1(k# z6z()IDBO);P`Jmzpm1*ogTnne3E-oT*nC5J)bs|tg{*B=ZD-;OXSd|$$#@S}r4;b#hi z!Y>X6g#Tin0O>in4zg6y=^UD9YbqP^?#&!Jw!Z!Jw%4gF#X03WK8Z90o;|8U{tx9tK6V z2nI#<1O`P769z?10R~0QI}D0iM;H{f_b@2x%wSN|O<+*e3t&*xH(^jTU|>)*WMEJ< zVqs7;7GY2{{=%SWD#4&=`hh{w>;;3O`5p#EixmutmOTuLR&y8>tveVLZ7dk-6>V7< z6zxP96zx?Q6zzX7C^~##P;@-Qpy+gkLD6{)gQ80TgQ9B$gQA-TgQD9521WN142m90 z7!*B^FerK*U{Lh#U{LhQVNmq7VNmqbU{LhuVNeWEU{DNXVNeWw!k`%RhCwm-27_YA z0tUs<90tWO0|v!#0|vzi69&adhI$6Y$OjCHQF|B^qgOB}#?&w<#>Oxx#yK!3#wRc+ zCU`I?Ci*ZaCMhr|COu(LOkTmDm{P%@nCilym=?gGm~OzJn8CxKn5n~{m}S7Am~FwJ zn8U-Mm@C1cnEQi4G4Be4V*VZm#eyCN#lj8-#i9iaip5hH6ico!D3)$vP%Nuo!=PB6 z!=PAU!Jt?v!k}3Bhe5Gw4})U$8V1Fh1_s6290tX@1O~XyKbr=*odKeTtH!vu6YcMGGSTHE|N-!w)u`nq1Jz!Amzrmn5VFQEW zBn}3}$vF&)Q(_ntrz$WgPE%k|te>vIpg4nvL2;%6gW@b72F2MC42p9?7!>CkFeuJb zU{IVd!l1Z7he2^64};<&76!$|0t|{v5*QShwlF9zo4}yB{0oEPN)86aRTd12s|y$u z*Ca3~uB~8DT(^NiaeWDc;)WFriW{FWC~kVeptwbYL2;`IgW|Rr2F2|W42nA@Fw`sV zoWP*CD}X_9_Y?-jJ#!co_s(EY+_!*1asLVi#RDf86c3(YP&}-_pm>CXLGj2B2E}7O z42s8H7!*(VFesjEVNg8P!k~CMg+cL50)ygN4+h0^3m6p7pI}hD@P|S1k_3a|

7F zD>V#?S9dTdUi-qJcteCi@umoa;w=>h#oICU42pM_Feu)Az@T{V0fXZGKMaZw0~iz^ z#V{y7&R|e{Qox}2w1PqLSr3Ea^BoL|FMcp6zI?!-_?m-3@eK!q;#(62#dih_iti&B z6hHVdD1PiO1u{s zl=vPnC<$mVC<&%8C<#qrP!c}Epd`w`pd^;Spd_Bdpd^vPpd`72K}qTlgOZE`gOY3m zgOc1E1|@|I1|=m81|{VM3`#0D7?ji)7?jj27?kQYb}%Sueqm73c3@D_>0waPlVDKN zw_s2*IK!Z1w1Gj%_y>cMsRVnB$@2n(lD7wglFu6kC4UJ9CI1QrCI34NN&yWF zN`Vdx^-4hk3`#*S7?gsKFersAVNeR)!=Mz-!JrhOz@QXq!=Mzog+VDQfk7!+gFz`q zhe0XUfg2@Fa}0t`w?3mBA=Z5Wi2|1c<}oM2E&eZruW zc7;JHU4}s^{Ro3nMhb&cCI^F3Rse%iwg7`t_J?`~rCb{Zr91-$rMxE$O8Gk&lnN>s zlnPTAl!{Uql!~V?D3#1$P%2%+pj0-8L8+XBL8<%%gHnY8gHlBUgHojmgHq)U2BoSD z2Bm5b2Bqo?3`#XV3`(^;3`(_g7?kQlKtar)RR4lOsbL9&Qez2&Qj-LOQqva(rRF0H zN-gy*3`(sb3`(tE7?j$UFetSLFetVEVNmLL!JyQ6fg+ZzN4}((A2?nL! z84OB&84ODOB@9XvQW%sbMldK%l3-ApbcaD{@*W1IDIE+-Q!5yhrui@^O*ddrnjyfT zG~)t;(#$msO0ym?D9zr(pfqO>gVNj%2Bmp93`+I$I~bG})G#P5EMZVuRKlRN*oQ%B zi3Wqx(gFshWiuF*mM>vYTCs#dX=M+C(y9gqrPWUul-BYvD6LaqP+FhBptK=_L1|+P zgVLrN2Bpm(7?ieJFeq*FU{Kn@!=SXYgF$IG1B23@00yPKPZ*T;i!dl1IKZHED2GAm z@B;>=BQ6Z}N=NoEC>@PpP&%f-pmgj5gVOOk3`!?vFeshOU{E^6!Ju^N1%uM*1_q@w z8VpKjzAz}AeZZh}ZU=+X`34513k3{H7d;r1E{QNGT{^>{bUB4V=}H8H(p3fqrK@`w zl&*C!C|$QG2B&rKc8saC_P)jp!9qTgVKu}2BnuW3`#F=Fets6 zz@YTHg+b{}0E5z79tNeiFBp{Gy1zpt z(zh4}rSBRHN_kuy`{~HEnh7SzN zOd<@*%q9%VEIbU#EDsozSzjape*`^L0RkrgL1w269#38FAU0( zR~VF~PB17-Utv&|xx%0WzJWnmVFQD*VgrM+QU!yu@&pEDl?@EastXvD z)n+g#tM@P{YfNEK)~sMq)>^`#ti6FjS!W4@vhETFWxXE^$_6S7%7!Wo%0>YU%El%P z$|fZY%BC?4%4Pu!%H|df^~x3o49b=T49Zp!49eCH49Ye+49d1s7?kanFeuwEU{H2g z!JzE8g+bZr41==s9tLHXISk6K4GhX|GZ>UTBp8%EJs6a|Y#5Zibr_U=Oc<1XZ5WjO zG8mNoOBj>`d>E7ia~PC^au}3@3mB9`HZUlM9$-)o`@*0c!N8y#sZ!6N9A(3x938=+ z95aDIId%$za@-UK<@gN@$_Y0Zl#@gll#?wOlv6Ailv6_(l+zY4D5rm6P|l2DP|hl0 zP|jY!pq%r8K{+pgK{-E%LAhW7gL2^q2IXQM2IZ0j2IbNO2IaCX49XP(49b-O49ZnG z49eAW7?f*1Feuk4Feum82QVl%oMBLI5@AqoKEt5gs>7h%HibdC{Q`q>rv-y@R}6!4 z_Z9}_-YE>q{W1*76Ji*YC;BibPujqsJcWZnd1?uR^7IG>hA>lvg+~D6hD~pu94IL3!l^2IW;A49crsFetB1U{GFtg+X~u27~gNHw?;aYZ#Q* z2{0(HJHVj4K7v7c0}F%lh8_mxjWP_%8;>w3Z;D`0-ps(DymjZ=H?hFRy-5(f~_sn2W-g|^W zd0zp8@_riz<^5+Eln+EOC?EL3pnR}^LHUpggYuyt49bU3Feo3H!k~OKfI<1_7Y5~H z9Sq9Hbr_V7Z(&eAk;0&S;s=BB$t?`Zr(776Pd#B!KHb5fe1?NT`OEJkR!Yg-tUuQxC# z-*8}1zA3_>d~*kb@~sF4<=X-b%D1;LDBoGYpnNxnLHV8sgYvyE49fRA7?dAaFepEG z!l3-HfkF9^0)z6S0}RTK=P)Qgv0+et@`FM7X?+KS^0Nd6<>wv@%FjPAD8D$up!{+L zgYqj62Ibc#49c%xFetw{!=U{30fX|p0tV&x4h+g46d060oM2G?xP?LaQv-wY=LQDl zFB%NWUs)KGzwTgA{uaZa{9S=T`TGL~%oP=`UKNQ6P9*oHx+q=7-DbOwV;*$xJk@*@l?6&Dy(Dt9ob zRIOl8sh+~1QnQ9ZrS=MgO5GO*l?D|Cl|~5$l_nMjm8K^QD$P$AR9en3sI(qoP-#2B zpwd2pL8ViJL8U8#L8ZHeL8a#ngG%om29Jm9twIRL-qo zP&vPVLFGaTgUZDz3@VqNFsNMdVNkio!=Q3)0)xtR0|u4r^%odaZZt5c+^k_xxfR2p za@&AGupmM)~LFGXJgUUl529<|@7*rlzU{HB{ghA!W5eAi~ z9SkbZQW#X8J20rcNMTTUX~UrMN`yh>wGD&H8x;nXw>k_e?<5#h-YYPue6V3q`DntR z@=1e1<#P>#%9j-kD)nEdFsOVx!l3elg+b+~0E5cUCk!gT&M>I_;b2htYr~-OZw`aX z|1Auv3_loDnFJVAnOzuESr#y;vYug3Ww&8aWuL;J%HhDE%5jH5m9vIHl}m;}mD_+p zmHP#QDvt+)D$f}PRo)T?RX!I6RlYwAs{9`qR0Ym3s0wajP!*cPP_HViz@RF8gh5p# zf6`oN$n z-NB$LqrjjlvxY%cR);}Vb_s*3oD74i+yVww`3MG8`5O$X3O)>~3J(}m6F%K~?PygR1%*22~9M233tS462$r460fz460fU z4652X4652E7*ur{7*ut27*ut4FsSO)FsSMaFsSO^U{E!f!=P%I!k}s-!JumNfI-!G z3WKVN2ZO4q1cR#S5(ZVX5(ZUs6$VxF8w{!zGZ<7Ya~M>uI2cr|>Mt;;TK6!h+JrEu z+R8Af+CE`WwY$QgYQKR&)nN~Vs^bL)Ri_FDRc93jRTlvURhJbEs;)B_RNYb-RNZA5 zR6R-1B0sf3kFr63k<5hD;QM$N*GlA-!P~K>M*DV1u&=v+c2nxm@ue@ z#xSUcc`&Gk$1teYN7OK=Ms_f$M)feLMo(Z+jp1NWjoHJX8XLo)8YjS@8qdO@8vlSn zHBp2?HL-$0HOYiQHR%Y0YH|vLYVr>T)s!g=s;LqTs;LhcRMVy~sHVFxsHR_GP|b*8 zP|ajvP|cjepqk~tpqkCWpqjmhK{aOrgKDk|gKF*<2GzU`4E3t{4GgLU77VI|EDWlJ zXBbqAmN2LmXE3OiC@`p&{9sTmy}_Vb*1(`z9>bto;liL=@qt0Lash*CRSAP?wE}}` z4GV*6%>oA1+8hSeIui!fx;qT2^+y;~8&Vil8x0UC)%i~tR2Lj!P+d5OL3L4m41?-o9|qMW77VIO zH5gQvaWJSZ`@o>O{0f8WiVF;?D;F@Ru1aB0U0uMSx<-aUb*%z}>e@dHs_SkrsII@j zpt|7%gX+cy462)+FsN=`!l1gPg+X;|4TI`769(1o91N=4-!Q1|WMEL;#lfJu>kotK z?llamdrmN@?w!D(y03siwSIpOgX)0-2GxT-4629bFsL4$!Jv9%0fXw%DGaK|S{PK1 z=P;{=4dbWc>^;`;r>iHA~)eAigsuve9s9xH^ zpn8RYLG>yRgX+~k464^97*wy{U{Jluz@U2b3xn!y2L{zU2@I-tD;QMoWiZsM-Vb3= zeUQSS`Y?e(^-&0e>f;Co)h8tks!vN8RG+mls6Kzgp!!mQLG@J%gX-%8461KFFsQ!M zU{HN8z@YjeghBOV0fXwN2@I;AZ!oBSm0?i*=D?u(y@o;cM-GGP&lm>PUuzgte}7<5 z{qu!E^`8oZ>i-M|HHHlgYK&JH)R+#`GpMo1FsQK_FsQMuU{GV9z@Wx)hCz+<34~oWh_cbcaDrM1Vm}G=@PdX&DAJ85ssO*%}5lxd{wv@<$ld6d4%Qlsp*Jl=m>GsY)=YsRb~osrN9bY1E%# zP}7oNP}2@zP}6B(P}4oZpr+5lpl0B}pk}y*LCsi&LCs_fgPQ3B1~u~%1~rQp3~E+3 z3~JUd7}V?p7}Ok67}OlzFsM1sU{G_)U{G^TU{G`MU{G_FVNi2(VNi3M!l35%fkDkZ zhe6H#2ZNeN0)v{z7X~%Y2@GmpCJbuzUS}B8yc-zQy#Fw$`D|cN^UYyU^HX3@^E<+z z<{!hL=Kq61E#L%$T3`c%T96HcTF?^)wctMtY9T8a)Iwbt)Ix7CsD&+IPz%psP>V2N zP>cA$pcc7-K`knWK`q*XK`lmyK`oYpK`r(LgIe4H2DSJt3~C8`7}OFMFsLOhV5nD1 zUc#W3a)m)H&4NKKU4}s|Lx({va|(l6)(-}?903Nk+!O}2+&>Izd21Nd^4Bn^74$Hu z6?QPF6)j;|s#rT*9E%Wx}A=b%sH$JBLB7M}tAF=L>^c?->TQz6=Jnegg)z z2^XegW9b6 zKMZQKpD?J+dBdPK_XUI6yaxbg6ty5r7TepWnZG8ZP+6EQ|wGDF^)ao~yFsN;O!l1UPg+Xnz41?O{6AWrw zd>GWWGBBuZUBIBWO@~2k+ZhJ6?G+4aJ7gHtc1&SV+gZV&wo8OTZPyzHwcQ;IYI|%L z)b`wAP}|$UptjF~L2ch12DSY)3~C2B7}O5TVNg40!k~8W3xnFBDGX|dT^Q7k@Gz(y zdBUJ}w1=Ty?U)UN+OZ!DYR5M)sGSI5P&@I3LG9!g2DMWu3~Hwt7}QRmVNg30!=QHN z3xnF(ISgv&d>GWuD=?^?-@%}Ep@2c{q6~xD#WxIUmns<4F1s+OU14ERyRv~n?P?2y z+BFphwQCm`)UHopP`ly6pmvjkLG9)d2DMug7}Rb@FsR*0sAo{StH7XkcL#&oy&49! z`yLEx_ir$$J($6u_RxVr?NI=O+G7<4wZ}IY)SjGRP_2!q;B0|vF9Zy3~monTP=UBaOD$Adxb zuMC6Q-x~~S|IRR|{lCJX&M<>PoiT+$ok@a0o#_dKI`bL^b(R?n>Z~OU>TDGZ>g*Z} z>g+EV)H(JrsB>m8sB_6MsB=p&sB>RoQ0H00pw4@ML7lIGL7jgJgL=I{2!pyH2ZOrc z7Y22qJq+r?8yM6@-Y}?(zF|-oJHenXK7&DBqJTkN(uP4@iiJU4>I#Fp^b7`dnFI!P z*#ZW2IU5Fbc?kw}`6mqOiX05;N(>C@N=q2jl}i}ZRYDllRZ|$$)oK{j)u%A1YxFRv zYt}HRYuPZUYnw2rYrkQrSJ(N%psss?L0zALL0$h0gSx>526e+T4C+QF7}Sj~FsPf% zVNf^S!=P?XDh%pgAq?u?GZ@r;V(J;xeWx&}`yF9W z_kY5m9>~F<9%RCx9vr}+9umW#9=d=*J?sF3diV(j^@tA)>QO2T>d`(7>M=14>ai0T z)Z=Ox)Z>>hs3&Y-P*2KXP)~lqpq{G0pq^I2pq~DMK|M2vK|S*egL>8l2KDSc4C*;s z7}RsOFsSD(U{EhGVNfrqU%;SV=)<61_=7>csD(kj*oHy9_ydD_$qEMbQU?b0G7|>% zauEjg@*fQ96?+)eE3Yu9SAAhnul~cJUhBZ1UUz~)ygqdczV1^+p>8 z^~Nm>>P;aG>P>$b)SI_3sJEyvsJHB4P;ZT4P;b4%px!otLA~9CLA}2H3WIt_2ZMU2 z4ug8<69)CJ8V2=l0|xc(7Yyn>Eez_t1`O)GOBmGqav0S66&Td}_b{kWC}B{asKcN> z@d|_bqz(r4$sP>qlOHgsPnp4>J~f0ved-?u^=WGu)Tb9PsLzmLP@i#vL4D>F2K8As z4C=EkFsRQ?U{Ig^hCzK!3q!s7Tm=U8xi=Wp=N(~CpFe{^eL)O^`ho`x>I=6ps4tqp zpuRYVL464WgZh#M4C+gL7}S?JFsLu*VNhSbfkAym0fYKV2L|<(HyG4ctzb}J?ZKeF z`VNEonidB2wK@#yYu_-auUo*NzP^M(eFG1J`i2V(>KkV;sBiLNP~Y@~L49*eJ%jod z6$bS!HyG5nu3%8#=D?u7?FobW_B9OZJ6sslcQP=j@4UgFzH0@8`tBMA^*tsG>U$X& z)c3AnP~YdnpuV4jL4E%T2K56=7}O6&FsL6AU{F7FgF*f90|xaY84T)21sK$iUSUu_ zwuC|bcmsp_2_FXa6Mq=gPd;E!KedEG{d9c;gZh~S2KBQJ4C?1p7}U?pFsPruz@UC% z1%vv<1P1j>77Xf_0~pk=gfOUIRbf!SdVxXx+7Slz>n#lGH&PhXZ%Qzz-@L=1erpSZ z`t3Ok>URaU(KsJ~vqp#G+VLH(@{gZjHA4C?P=7}P(w zFsOgzVNn10fkFM#3I_Gha~RaWWH6|I^CE*2(vI~h;T4yh@4>15Z%L|Ay&YkAs)h@A)&yaA*sTkA^CwpL+S;C zhV&H%4Vg3b3>vau7&PR5FlZ=fFlZ>UFlZ<-FlZ>9VbD;%!=Rz^gh4~ifcgO6mcpQ69>Abs(ZHZ#IfX&PY6gRb^#KMAoBA6J8n#~;H0*O2G#m~vXgGdg z&~TPu&~Oo9&~W*|pyB$4LBm~!LBstAgNCOJgNBy{gNC;SgNBa-gNE-71`WR>3>pDE z3>tw93>twS7&L-e7&L+(FldB)VbBPZVbBOSV9c6B%EQ;NIb!yk#vPYBZYxMBb9?eBTa=tBfW${BV!4JM&<(s zjjRI<8rf?YG;;PZXyiU%(8znipi#iXpi#)cpiz{-pi%6@pivUQpiyeWpi!p7pi%C^ zpi!}bL8D59L8DrQL8C^2L8F$1L8Fd=L8IP+L8D<0L%l{*41-4V6b6l!BMcg?Ul=sn zGZ-{FmM~~^?qJa9I>DgPeS|@y=LUmD9}9yphu7&I0xVbEA4!Jx6IfI(x?7Y2>R zD;PAEXfS9jxlzxcv9yFiV;Kj7#vFl z7&KP@V9;1|gh69%1cS!fHw+r<7BFb6cVN(1|As+h!x9FKjWG-wn;aN4HnT8jY<|O_ zv89GVV`~J1#x@-WjcpegG`6QOXzUPS(AcqpL1SkGgT^iv28~_yYZx?kM=)sYv0>2I zE5e|$_W^^(zB>#W`+FEP4mdDq9MoXYIQWD?&{=&^Y>qLF3pA z294tZ3>qg`7&J~?V9+?Zfl zizW;j7ymG5TzbHuarps*M*WpL3>sG#Flb!sV9>Z8!k}@3he6}U9|nz^7Z@~dEn(2O zUBaMo$AdxRt__36Jr@Rz`#cO94{R7T9x^a!JUqgn@u-DCv?57&LxgV9@w;fI;K$6b6ld6$~2x zI~X(>ZZK#v-eJ&W`oo~fGJ!#pbq9kc+Y1Iw4g&^F&J+est~m^vJPHh&yfYXy`6L)L z`7SVM@;5MO3KTGC3g$3q3bin33caak&=g+4pef?Qpeb^LK~pq^K~s!_K~ro4gQj=} zgQoZw22F_*44RSw44RT37&N6?7&N6V7&N8dFlfqjFlfpKFlfrjFlfr1VbGMXVbE02 zVbD}~!=S0ShCx%Qgh5l;g+WvK1B0f@69!Gy1_n(v8wO2v83s-DHw>B@a~L!=>wOqB zHJ>nOYE5C#)NWzW)CpnG)Ma4M)ZN0MsprF>sjtAGssDgM)1Zby)6jxJ(@23q)93<& zrf~v;rilTArpX5eP17k1nr0OYn&vtTn&v+kG%eOJXj-N)Xj-W-Xj=0yXj)%k(6nh_ z(6n`7(6m!v(6r}Z(6m3ppy@D!L9^bmhC$OQgF(}|ghA6qg+bHh3xlTX3kFSh9tKVK zHw>B{9SoYDJ`9?kKNvK&n44N5J z7&J3$7&Nm=7&NmZ7&LRHFlgq^V9?Cl!JwJHgh8`l4})gm6$Z^>6$Z_c90twO2@INL zD;PA(r!Z(%)G%mP<}hehwJ>N_@2O|dteL@}SzE!NSvQ42v%Z2svta^*X5$0~&87zo znk^CxnynfPnr%}UG~4GeXm%W7(CmD`pxG_KpxI-r#&aZc2 z&|Kidpt*1bgXW?;44RAIFla8-VbEMw!l1dlfkAUc4TI*&B@CLY-Y{sc5n<3=o5P^F zUVuS!Ljr^5#t96Xn;tM|Zi!*g+#0~3xoru9<_;bP&7CtCG zgXZ2T44V5)7&P}?V9?wjz@WMR4TI)^4hGHogC-1`2j4Jg9$LYmc{qhZ^N0+C=8*#o znn!yWG>>U8XdXMjpn1H7LGwfkgXYN$2F+6@44S8YFle5h!Jv62gF*AG27~4~76#38 z4;VDhPhilz;KHDJk%vL^k_3b1r9TXsmp?FQUfIB)d36qh=Cv9I&FeV~nm2M7G;j7W zXx<87sMox$!k~Hk3xnpJ9SoXxdl)qDGcai0|HGj9;0=T3!z&D$k8Ut%KEA`C`D6-% z=F=Po&1V)2n$Hy&G+)>-XukAd(0rA{p!vFlLGw)wgXY@?2F-T|7&PBsVbJ`@!l3!_ z3xnoo0S3)4E)1GqV;D5QEn(37K7m2=#{ve;pMMxMe;d>@X#Oc+(EPiGLG#}i2F?FJ z7_=BW7_^v9Fle!GFle!cFle#$Fle#&FlccsV9??`z@Wv=!l1>|z@WwRgh7k9he3-^ zgh7jM1A`X72ZNS?27{Ks4+bs49tJI;1O_c(2?j0U7Yte=OBl37V;Ho=6d1I`4lrnm zS1@Qv1Tbhx)(bFbNuFTPk}6@)lGb6+l0LzpB~!zoC0oLvCAWYtJQ%cWO&GLnzc6UoEnv{H?_kh!C}GfYG+@wj{KKH-bb>+4 zc>#l#O96wHs|SOYn+$`N+Y<&Y_Z19U9yJVFo+%7kUKR{m-U19-J|Mh>LCd#*LCa5v zLCfz2L%o*&3D3K+CP6Bx9@bQrY4J}_v7UtrLR zc)*|)Ifp?js)Io*T7y9=hKE5b<^_XR>;VR?xEuzp_yz{8gc=5|L=Oh7Bn<|wWEKXk zy>@trimotyUEV zt+sjw2CcRW3|j3M7_>STFlcqIV9@GX!=Tl@hC!=m3xihg5(cfl76z?;9R{rl3Jh8k z{xE1we8QkL=?#O{gVy{n3|b4eFla42!=SZj3WHYt;u#EDOEMU=mO3zKEz@DpS{}ln zwZecwYb6hZ)+!zbt<@3?T5EV1wAS2V&|3S2L2KO(2Cel67_>IrV9?t5fJyVfvh?cTtkwPyx{*4`Edt$jHRTKioXv<_%6 zXdMh-&^qM7P_K2kghA^_2!qzq7zV9lOBl3{PhrqH(Zis1GKN9xR0D(7=^h5HGd&Di zXZJ8@o!h{mb$$bb)`bTQS{HXPXkA*spmlizgVvP=3|d#WFlb%tVbHq1ghA`Z0S2v` zYZ$a{U0~3>ro1W*5ihH2CXMk7_^?wV9gVv853|c?$Flha{z@YW}27}gL0S2wVUl_FhGcaf~ zh%jg~x-e)nO<~YxZeh@7sSjb$W}U#G&31)Bn}dTvo0EY-n~R4*n>&F)o2P_9n>T?$ zo3DaFn|}p^w!j<)ZNWPX+CpC#v_*6nv_&--w8d%|w8alFXiKbM(3U*Ipe=QTL0d+K zL0eXbL0hhbL0i6sL0e%8gSO%w25n^(25l7|25r?D4BF~E4B8ql4BGXY4Gh{^3mCMu z_b_Pdd|=SllVH%+k6_R?NMO)5OkvPAn!uoKe1$>Vb3nE7_|MDFlYzdVbBiJV9*X$VbBiIV9*ZrVbBiqVbBh* zV9<_eVbG4OVbG3R!k`^}g+V*!4TE-^34?b06b9{tKMdMQDh%4mAq?6n4Gh|;dl$w=ihuykXGJb70WU?_tm`*utP)B*CCvY*5djU6R0{U0TDS zUG|4TyTXD&yRw5pyXp;tc1;R{cI^@d?Ya*P+6_Dm+KoC4+D#@5+RalKv|H{lXt(Jw zXt!rDXm=c7(C(VUpxyn1LAzIiLA!4TgLeNH2JMM+7_=v|FlbLnV9=hrhe3OK0E707 z4Gh||SQxZtM=)s5HDJ)5SHFirdw~Rl_97kz?Zpuc+Dl$AXfLZ_&|ZFqL3^bJgZ8R9 z4BBfX7_`^sFlev)!l1pugF$=a5eDte6%5*2J}_u+D`3#xQNy6UONK#v_Z0^1y%h}F z`$ZVE53FI(K4ih5efSQ8_R$^&?PDAa+Q)VVeTjuZ`_c;r?aL<^w69EH z(7u|%pnXk&LHpVt2JPz?7_@I}V9>r4}qU6JgN4 zcY#6seg%W}104qK2Ok);A1+|fe&oYYul-nnLHmgcgZ5Jf2JNRy7_^_YFlax|V9#riDTKZ2^P!y95U9_c{#P@82+JfB3?n{qYQg_NO@v z+MgR3w7&!}Xn(a}(EcXFp#5EgLHmaZgZ57w2JK%K4BEeW7_@(XV9@^ahe7+F1cUZ} zj(P?i1_1^gMivGg#y1Q)%nA%TED8)dtRf6LtbZ7E*f|(^o2pkMS(%bbqRxxy9I+z zz553S9gistI-VH}I$j10I^GftI^J&>bbPij==jcI(D7?v(D83z&&JtW?v>yyQ89WR+nGy^-SsV;HSuYrL zvVSn>0n&?)0#&?y&T(5cX1 z(5Vby(5Z4^(5a4L(5b0l(5cN~(5Z`I(5dfX&}pb)&}pn-&}o{(pwm2sL8oO3gHG#; zdIp`g9tNHEDGWLtH4HkPH4HjkTNre@4>0KToMF)Ey}+Q;w}(Ne{||%CL=6U=NiGaJ zlNA_rrtmQ6OyywEnFhiy7<8sTV9=Ryg+XWL0|uR09~g9Ie__y>%fg^D&xAo|z6^uT z0tE)0g(eI-ixe1i7KRWRsmZeh^bGKE2B>k0;)Z7Udbwl84N*>Q(KXO{?r z&TbI~ojnB%I(su1boR|*(Aj^4LFd2=2AzW+7<3M6Fz6g9VbD3chC%1p3I?6yCm3{2 zykO9&KNZ2Cb2@`T=S%^E&e;PDI_Lf{=v;7N(7C9>pmV8!LFe)k2AwNw7<8^)VbHnu zgF)wp1cS~^8wQeF+Ag2O$hP4;vVC9!+4-dAx!_=g9*G zoo5ydI?rPmbY7$|=)7FOp!4bqgU%Zf2A#Jq3_9;h80vN2_b}*uIKiOv@dbmc&QBHwonI~tI=@pGbpF&Z==}Y_p!45=L6^aXL6<2gD%St23vU6U0Ix~2~pbj|)S=vpW+=vvw^=vw74=vvn=V9>SM!Juo$z@Td{z@Y2k z!Jz9{!JzB3hC$bP4}-3&41=zl2ZOGA1%s}~1_oWvBMiFUIt;o#0Svmn84S998yIx` zKQQP9YB1;qO<>RsKEt3JTEUyvdDbW;KtbW>9pbkk}WbklnnbThs%=w|+4(9Pyx(9O|c(9K=KpqqDw zLAOAHLANl4LAPiPgKqH$2HnyM2HmnL47%kD7<4Nc7<8+27<8*s7<6lGqAbf;x7=uW@EpgWU=L3dUQgYN7L47zhY7>LLHD8!gYKn047yhw z7<8|mVbHy9!JvEN3WM$~9|qmqHyCv98ZhYID`3#Qe}O^wVE}{fqxvZfx=#ccbe~RO z(0wk#p!*_+LHFeg2Hn>p47zV-FzCMhz@Ym+ghBU11%vLV6b9YTTNre|d|=T1=E9)+ zeFB5-j{^+4zeE^xf5$NB{@KBx`}Yfj?*9M=J%%p~dQ2V+ddv$L^jID+=&|WA=&=Vd z=y7T==y6?P(Bp|=(BoafpjXd#fk98eg+Whn1B0G$2!ozT4}+eV4uhU}1B0IA0tP*4 z9tJ&`6b3!nEev|{CJcHC2N?8}JQ(zpuQ2GTHZbU^TQKNp9AVJYvSHBEp247}YrvqV zH-|ybAcR5Ba0P>&F$aU5Ne_db84H7+`3wdpcn9gK`*d@K`%&!K`&?xgI;g~ zgI@3t2EC9I40@p*40>S+40_=<40_>L81y0<81y1t81$kz81$kJFz7|kV9<+6V9<-z zVbF_x!Jrp+fI%;Q0)t+HMLmOF!XE~`#4`+fNpl$Vl1mu$QfwIXQdt=EQkO93rA094 zrE@UorQcxC%ecXym)XLgmu11AmuS1-b#*C4>4*YJlyuki_kUegr@z2*xHdMzgy^jg<2=(UwF=(XoC z=ye1z=ym2W=yi24=ym5X==CHp==HiV==G^E==EDL=uJ>y(3_~ipf^c?L2uF#2EEA* z40=;i81$xwFz8KlVbH6euEL-<{SSlQOdbZkSpp1tvpz8B&3?e3H|GU|-aHisz4;Oh zdh@?9=q=d6pto=bgWh5t2E8RV40=mN81$BYVbEL7!l1YO3WMH?Hw=0!PcZ1M+QOi> zx`#n;O$dYDS{nwvbsh|Q>unhHHY70UZ7gBX+f=}yx4DEtZ%Yn?-qslm^?KWS81%O9 zV9?vKgF$cS4hFqlZy5A;KVZLGRQT2E8*540>lR81&9nFzB7%z@T^G0E6Bo76!e` zJPdkQL>Tn0N-*eMGhxuXF2kUAL#LiW?`8#q-mM=Ddbd*;^lpD)(7RK?pm$e;LGSJz z2EBW081(KJFz7u{VbFW3n^A8MqFL@aB zUIj4dy|!V{d*j2P_jV40-n%CZdhb6l=zaLZp!dmyLGN<|gWi`l40>Nv81%j_V9@(k z&%mJfZ3TngcLfH$?{gURerPc0{aC=D_fv;K@8<;uy5)N(EFppp!a79 zgWg{s2ED&~81(+dFzEez!=U$n3xhsG2!lSO27^B19R_`-GYtC72@Lwo9~ksm<}m29 zeqhjNJHw#QUcjKwA;X~0@q|I2a|MGwR|$iDJ$C|wK2HFHKCcIZKA#DLK7Rs(zJLRR zzMukwzK{unzOV~}zK8;YzGwi0zL)}ozBmVizJw2hzN8C-zElZ=zH|+PzRVm3ec1;L z`tmUh`U))!`ic)2^p)o@=&J}Y=&N)v=&M>V=&QbA&{vznps()3ps)UiL0@A9gT7`9 zL%qJ14}-oo2ZO%$3kH3i8w~oodl>ZfN*MI@4H)zdBpCD!1sL=V?=a{aU188Sp247R zlE9#En!=!O7Qmoyp1`1Q;liMAsllLcWx$|st-+vglfs~H8^fS)*TbN1U&5g85W%4D zSi+$1G>1Xoc?*NS%Mk{B*DDPAZVwprJ#6Y3^gS~e^t~1^=zAYv(D&KHpzr&HLEm46 zK|i2^K|gQ~gMM%bgMP>Y2K`VU2K_J*2K}%L4Eo_a81y5KFz82KVbG6yz@Q)fhCx5( z4}*T}8wUNjHw^mmcNp{&E->gP-eJ&By27BJynsPJJ0|{v?C1q>1P=9GcGXb zXVy<((9f!2(9fR1pr5mVK|gl|gMQu>2K@pZ2K_=C2K^!(2L0j~2K|x(2K~|n4Ekj! z81%~zFz8pDV9>8T!k}Muhe5xFfkD4khC#p1hC#o+fkD4v3WI)Q2ZMgo9tQmu8wUMW z9|rxl5C;AB4hH>>Ee!gdTNw1at}y8LurTP?_l7X&_uXL7pP<8_Ke2^Df6@g8{V6^S z`ctPc=ui8=pg+TdL4W2H2K`xU81&~DFzC;%VbGuVfFzD}mz@Wct1B3qVDGd61W-#dQJ;I>B?+t_g z0TBlMgDMRAhg2B!52rBbAC+OyKi0sYfBX!C{>cCa{ZljQ8T8MvFzBBtV9-Cy!k~Y4 z3WNSR3kLmjcNp}~Phrr%5Wt{+k%2+~Vh@AAhn8Bd`v4BDUlMjRbXAK7ZFB%N`U#BqW ze_O$z|NRex{*OBh`afSV=>N80(El@qLI3X-2L1mM3sc^ z;TQ%35g7&pkp~P0q7xVl#1=3Zh-WYuNZ2qKNG32CNX=j{khWnkkbb~mATxo%K-Pf4 zK=uWLfm{HCfxHTXf&2@GdIN<83JeFc_!^Fc_#@U@%avU@%a9 z!C;`4!(gEHg26z&gTX*UfWbiH1cQNQ4ugS~0fT`y3xk370R{t|3I+pR83qI06AT7= zJq!l=It&K-M;HtYA{Yz|MHmbWFEAJw&0#Pwj$kk_5n(VenZRIR>QK*MV8+27!15!7!17Yzc3j1OkptaO<*wa6JRj#mtipQf5Bi7uzI4RZ8V3f0S{nv~ z+7}E4b)bZ|gTbJofT7-?(TBmHNrAzj=?Q~D^AQGvmK_WRt!o$z+G-dK+G7|DI&2sW zIt>^Mx&#;ux_&Sibe~`_=$XJ^(3`_x(3inr&>z5HFu{hwU}6A+!6X?5gGnD43?@He zFqkUCU@*;x!C<-ogTeF<39N?8!#BGkzg=b^MJu%?FI&ebq^Q})*oRo*l>cuVB;PJgH0zG3^p%dFxXPUV6fGK z!C+eegTeL`27?_f3=$4#I3UAdaNq-j z!NDyI28U`G3=XF-7#y)+FgU8fU~u#cgTb*I30}KYIH!v8S znZsakwt~UnoC|}&`3eSu3mpsw7eg2fE;%q5T$W%kxcq~`;3@-y!PN^42G_1I7}Q_i zz+iA=4}-zYD+~s=_AnUS-ojvTr-s4cZUTeBy%Gk4`wk2S4>TAI9%?WcJd$BBc&x!- z@c0db!IL!%22XD=7(9ExVDS6}gTaeG3 za$zv!E@3d_X<;zrO<^$Pd%<8Rpuk`#Xux17WWiu49Kv8IlE7dnI)%YdT!Fz*LWIFk zQm3B5P|AbBP&$UeP-X&yq3jw4L%B5!hVnNU3>Drm7%JXjFjO{RFjPrkFjP%pFjT8x zFjNm=Fw}@)Fx0GIFw~mBV5q%?!BCfh!BEeE!BF3T!O)VLS_i zVSW4!2E&8}42Fp%42DTL42H=y42H=c7z|UcFc_wuVK7WPz+jkugTXLk2ZLee6$Zns z6%2;iHy8|abQlbCPB0keIxraK9$_%d%V99g`@&$De}KWTUgZ% z@g4@lk{SlXQXdAxG8YEJav280@)ice3KoWX!-^IL!%7wg!^$%ZhE)p~469oh3~Le? z3~N&u4C^u&4C^x(3>yj<3>#e-44YgS44YFJ44c0&7`EJDFl-ZGFl-lLFl^t#VA#>Y zVAyHFVA%PA!LaKNgJJgp2E(2O42Hce42FFT42Jy`42Baj7z`(dFc?me>7|t)bpR|zl}uGU~M zT%*BYxYmcka9st1;ray(h8q?z7;ap{V7TcIgW=}-4-AG|o-i10eZpY4-Gjk!M-GGG z&I|^_T?Gt=yB9DR?zzEWxc3Ev;eH+l!vh)&h6i033=dT>7#_aCV0cuA!SI*^gW>Tb z42CCuFc_ZlU@$yg!C-i12ZP}`8wSJkHy8{rx-b}Cs$np^{DQ&oY7B$nwF?Y}H#`^& zZ|-3*yxqZISbx`o!SL=H2E%&>42Jh!Fc{wd!C?5Hhr#e+2!r9H0tUm!84QL`)-V`8 zQ(-WCHi5zL*%=1I=RORE&#y2TzOZ31d~t@s@TCuf;mZpQhOYt`3}0PfFnsO6VEFn1 zgW;P72E(@k42Ex4Fc`j5U@&~w!eIFB1%u)H7zV@lHy8{*#4ywwet5%R_%VgS@Z$*v z!%sR4hM!h27=9LDF#J4)!SIU)gW;DA42EA#7!1E&U@-hvz+m{Dg~9Oq3*q*9Hc|-!2S>zh5vI{z+gk{BwuF@b3}^!+$yqhX0l@82r~x7>s0IFc`^ZFc`^xVK9=L!C)jW z!(b#og~3R{fx$@O2ZNE~1O_7|3kD;l3k*ieE(}J>YZ#1FOc;z*PB0j$x-b~2USTj& zt6(rv=V35X-@;&|p~7HPud#)}NOJ;%k(L01k=6_bBW(``BkdOqMmh-$M!Gr-M!HKF zjPzU>jP!mm80ptA7#SEa7#SR3FfyFNU}R*$U}SWF!N@p)!N^2|!N_C}gOOq3EFc?{-Fc?`2Fc?|SVKA~0U@)?|z)){w8^K^?`+>p8 zu7SbG-h;u&L4d)?;S7V3V+VtglLUj2(-a0HX9Wf$=Q|8WE-eg3t|bgcZaxe~ZZ8;& z+&dVIJS-TDJhm_xd0H?SdA?yV@@io)^44K6@_xZ!j`$ghRL$X|iM z$o~n0Q9uQQQJ?{XQQ(z&2BV-F2BTmH2BY8~3`QX<7>q&-7>vRM7>vRh7>vSaFc?J$ zFc?LwU@(fzVK9pFU@(e$z+eu1cOoB4F;q5DGWvlCJaUi z8yJid8yJj|WEhN+o-i0CS1=f*s4y6%TwpLtZDBAU` zFe@LU{tz-!Kf^P!Kj>v!KnNNgHc5fgHfdfgHh!H2BWGP2BT^L2BYd7 z3`R9E3`R9S7>sJKFc{U>&0sL9Phc==5MVHBc*9`Sc!R;Hse-|%Ie@{a`2~YfO9g{b zYY2l;n-7CgI|GAJ`w9l5ju-}`P8J5E&MOQ?T}K#Z*7 z_3vOXn$W^vG%<(4Xp#+s(WDm)Mw2%%7)_~RFq)dfU^GpG!D!kZhI*svAq++{7#NIZ zTwpMoIfcP!Rsn<2YzGFTISLF$bEYsD&8=ZDnkT_vG;a%o(fkGmqXh;GMhmVm7%iN_ zV6-TK!Dz7#gVEwI3`R?~Fc>W@VK7>z!Co}4Fc=+v!C-V`4};Os9tNXhDGWx(br_6J)blVH zo!G!&bTWp)=u`@W(P@h1%uJ&1_q-qH4H{yO&E;6K438Vwt~Uvdk%xq4+{pPA72=Ze$HVq`jx<7 z^xK4?-slelgVCQ43`T!fFc|$SVKDli!C=fF!eGqsfx(z@4TCY$90p@%3kG8r6$WFL z4-CevOBjsVG8l~6T^NixBp8f2MHq}ZcQ6=pB`_Fsb1)clzhE%tdBI@JyNAJ;uYkdr zKZU_qK!(9s-~@xQUrfkFc_;oVK7$Pz+kN2!(gn@!eFd9gTYwKfx%dtgTYw)3WKpu3xlz44ui3t z4TG^>{SO9X{WA>41{)ZRjd&Q0jdm~?8&6>{HtAt7HcenKHnU(bHdkOUHvhq3Y;lIc z*m4VlvDE|yW9twGV;dg^V_OCWW7{JP#&%N}jO}|Ej2#v*7&|5~7&~z=7&|>-Fn0dH zVC=Go!PvEj!PspLgRy%DgRw^lgR!RvgRvI}gE46TpRxB924kNI49314490#D495N; z48{R9490;|7>t9?Fc=4~U@#8Z!C)LZg~2#%0)uh53xjb42ZM3M69(fb1_tA(H4Mhl zQy7e6wlEmSE?_W@yTM=_-@;&=Aj4ps@PWZNaR-BO(iR5ecV4Uy3U|bNxU|gueU|i(GU|g)g zU|f8I!MJ1zgK=pOgK^mu2IKM$2IC432IEQ<2IDFa{=r~eeTTug<_v>z?G^^(x+x6C z^$Qq`8&)tFH*R4tZd$-#+&qK9xTS`{xHY7n!MII?!MI(3!MObjgK@_h2II~b48~nY z7>v75Fc|mzU@-3EU@-1yVKAOx!eBg6g~51I41@9H2@J+l92ktJ1~3>;^I$NZZo*(Z z!-T z!FX}~3kKsQCm4*Eu`n1fyTM?*{0)QgiWdyVD~~W3ue!isy!r@(@tP$J#%psJjMtek z7_S#$FkXLy!Fa<12IGxe7>qaVU@+difWdgn90ud93mA;I&0sLz9>HL|LxsV3rwD`b zE*%Er-3koGdpH=3_cAaT@8e)F-gkq+c>fs&;{zWUjO!0^Fc=?BU@$&Xz+ilI0)z3f zEeyuTuP_*&IKp6j@(P3TsWlA7r+XNT&uB0hpZURHe2#&^_`Cvx@%ax7#uq*?7+<`? zV0`HegYo4T48~W!Fc@FsU@*S+gu(dw3kKsGD;SJ#b}$&<3Scn4ox)&z$A!W8E(?S4 zJr)Mz`!Wp14|o{rjUT*WFn)N2!T8Y{2II#k7>u9nU@(5VgTeUO0S4peD;SJlv@jUI ztYI*I)xcoxfWFc|;qVKDyRz+l1VGafp5d{VlQ56Ogu>b}W@fZdZi6smsl4}@Dq&gT(q^~fT$Q)rX zk-flRB6o+uME(ndi9-Dj1{1{w1{0+g1{38U3??cY7)(@C7);c97);b#7)&(gFqmlW zU@*~I!eFAE!C;~j!eFACz+j>`hrvX@fx*O}fx*PEg2BXS0fUKg4ugqF3xkPi3xkQ- z5e5_UJq#w60t_ZrF$^Zw4h$wX5)3A`It(UuJ`5)I0SqP%77Ql!jxG!)P96*<&OQt# zE)fhSt|km7Zc7+U+@~;@cuZh0@!Y{+;x&Q6#Cr;ZiBAoKiLVQTiJuLFiGK=%Nk9sN zNnizoNl*=gN$?5=laMV8CZTH>Ou|+$n1pX&Fo~GLU=sO&!6fPogGuxW29ua43?{KR z7);`M7)%l(7)%m(Fw~nQJzy|NzQbUW@`J%7O@YBA-Gad+BZI*t^A3Ya))xko93BRf zTpI?HJP`(ydWX2T+lUXthCbLr*Oy*QDn9NgPFqvP$V6tEbgUP}b3?_@7Fqka< z!eFx0g~4Q*34_V<`V zV6rKP!DRCk29qrt7)-VvU@+Ov!eFvPhrwj04};0B4hECmZx~GW#xR)d^I$O9pTl5s z-~xlmAsYsh!x{`GM^qS0jtVfC98+L0Iqtz=a$*jH$teK_lhY9lCiQ2gFqoWEVK6yg z!eDY?27}2Z1_qPM3=Ae$1Q<-NIxv`At6?y?!N6d0vxLFq)*c3v+Y=Z}?#y5?xqF1c z?CVDdAC!Q|H! z29rN53?_eF7)<`nU@-Z=gTa(hhQX96fx(oygTa*5fWef_fx(nLfWefbfx(o^fWefz zg29yM1cND`0D~!i0)wf*4hB;p4F*$T7Y0+2DGa8fI~YvG&M=rtI53z>#?&*IO2sgk zO21$*m91bfm3Lq;RanAcs(6IKROtePsqzm7Q`GzU}|o|U}_P;U}{;xU~2V%!PLfs!PIsJ zgQ>j)gQ-IfgQ*h(gQ;^3gQ;u10fVXA4hB>AFAS!hJPf8@4Gg9}ISi(LJPfA(7Z^+f z3K&cSeHcuGR2WQy?l71J-(WBeIm2KYdV#?-YzKpB_!|b(h%XGLktY~TqvkM}MsHv+ zjp<-8jrCzLjmu#$jbFlGny`eyG;s%mX)+6gX^H@YX=(|BY1#<}(+mp+)B4O045ryz z7)*11Fqr0%m}Jdx62UE`hCKU$LrWXwLrp|fzol(JHI@5;1bQTAL>8uO&45qUe zFqqCMU@)Dl!(cl14uk2u5(d-xIt-=@L>NpLJYX2e6R1*)2%EFrdw|?m~LCbV7k4A!E}cL zgXxYJ45mBxFqrPDVKCk8!C<;ag28mp8wS(87Z^dL)6t^r!=a=`kJ#(_;@9OpkA1Fg=mMV0tow!SqxEgX!r82GcVk45nu} z7)7))>1Fqqy+VKBWL!(e(Zfx+~C1cT`V8wS&dIt-?dG#E@D^Dvk` ze!yV*WDSGq(+3Qu&yFydK3~9K`l5xw^koZ!>8l)udehe~45n{v7);-aFqppMVK9An zg~9aw1qRa(dl*bV&R{V8RKsBUxq!j+iw%S6R|5vqZzc?;-whZ{f2c5+{*+-b{rQ2x z^w$jr)88u?O#gH+nEp*+F#VUoVESK&!Sw$J1~Wzx1~VoW1~aAy3}(!C7|dAqFqpCS zFqpAbFqpBI)H9fIL@=0fS}>S#=`fgaOE8%6h%lJ(d|)u+eZXMGcY(o-{|tkfzyby{ z!8HtKLMs@|gf}pliOgUy6J5h#CN_b=OuUA{Ou~i1OwxhDOsasvOge+XOeTWCOxA+I zOiqHqOzs1NnfwO^GldfjW{M9O%#;o=m?_sVn5j%*FjK2%VK7ts!eFNUgTYK=2ZNdB z5(YD^3I;Rn2nI7969zL~7X~vu4+b-R4F)p<6$Udy1_m?38w_SfFBr^>cQBZlTwpLW zy})2*wuiyYyoJHcB80)rGK9g*%7?+sI)TB=W(9+p?E(ffy9*3v_H!7_99kI693vRa zoIDuJoD~?%>RoIY%v>E9%-k9n%-nMr%sfIE%sfLF%)D$E%)AX4%zQ)`%zOhF%=}as z%=`@)%mN}9%mQ5)%z_LU%z||o%t9g<%tBol%)&w#%)(6=%p!Cc%pzGB%py-Pm_=P+ zFpECHU>5U%!7TOzgIU}a2DA7F3}%Tc3}#6t3}(qT4E1IyJ`855E(~UA0Ssp8Jq%_U zR~XDPPcWEet1y`5I53#ynlPB<&0#Rh?_n@2XkjoboWfvMw1mN|cmji2NdbddX%B;0 z*#!o(@;?k_6%QE9DsM2DRjpt!t6sujR?EX+R{Mv+tX_k`tigxDtTBbbtjUMLtl5LX ztR;oPthJ+_!L02BgIW6r2D6SQ3}#&l3})RH3}!tU3}(GM7|i-kFqlmcVKAGh!eBNj zfx&EY4};m1BMfF!-!Pa>H()TE;lW@wQ-{H9Rse(9>;wk0IROl2b8{HX<}F|_o4}stzj^`H;2LO{u&0e2TvHx9x*VOJr-avd!oZ&_B4RO>{$SV+4C3% zvlkl}%wB0Qn7tNYFniO&VD|O~gW0=33}zn`7|cG_FqnNh!eI7AhN0f`=!8O_S=KO?9U1Yv%fnS%>J`5m@`-~m@}F%m^1Y-m^1HSFlW_ZFlQ@a zFlWEOV9wdXV9s@c!JJ2h!JOBE!JMy#!JPj9gSnszgSk)$gSl`EgSp5F26M3l26OQi z26Krs4CYc(7|f;DFqq5Q)H9gNO<*vWzrbLwsK8*Z6vJSyyn(@7!Q6|1!Q5*N zgSmGMgSn3agSpQW26Nvd4Ca0f4CekB4CVnF7|a8|Fqj9GFqj7$Fqj8lVK5Jw!C)Sm z!eAcOz+fI;!C)TY!C)RK!C)Twguy)O0E2n-1P1e%3z zg2B8&gu%R#g~7b>41;;o5(e|;8V2*000#3`6$bM*1qSnW83ywX4hHj12?q1dD-7mc zHyF&j7ciLjI53#^JYg{Jox@<>7sFuQFTr5m|AE1L!Vd=Xi3=FaC(U6npWMS>KE;8- ze5wS4`P4fM=F=81m{0GiXE2{pz+gVpg28;|8wT@PcNolPPhc>g`Oyaq=EqqW%ufg~n4kE=V19~$ z!Ti({2J_Po7|hQcU@$+sfWiFS3I_A~^Gg`aFBCACU#ws-zm&pYemQ`_{E7~P`BfhV z^J^&#=GOxl%x}0bnBTNuFu%pYV18SL!Te4DgZW(v2J^dr7|idNFql8cVK9GKz+nE! zhr#@@0)zSE9}MPCHZYh!{lH-U>;i-N^9u~-FTOCCzv5spfAxdG{EY;I`I{FE=5Mbs z)SJKC!(je?0fYI68V2)^5e(*^N*K&P=P;Om@nA6j8p2@y&4t1IdkTa3j}!*;pFRxc zzbqKce@if!|B+xY|I5K({*Q;j{J#x@1%nNP1)~gu1>+9}3uX}p3lI()7bsYu^jQ|D<%@_s?tvL)9+CLa9bUhd>^tLcq=zn3bF!W)tFiK&t zFs`p*urR4%urQs$U}4U|U}3?+U}4F@U}43>U}3GpU}2-dU}2lXU}4w6U}3+7!NTDS zgN5S*1`DSz3>GdT3>L0)7%bdgFj%<%VX*K_VX*M(VX*LC!(id_hQY#5g~7sKgTW#o zfWacrhQT6e0fR;G6$Xn?1_p~T1qO?78wQK|h#Cfq$Q}lZs3Qy((OVcSVooqv#6DrL zh}U4SNN`}VNPNR!k?g`?k&?h*k-CP#BJB)=MMemNMP>zqMb-rdiyRjQi`*#;7I{w? zEDAgrEDG;1SQOhZSd{cISd_^ySd`~5SX8nwSX9knu&4=Pu&A?PuxJoruxOmYVA1%6 zq28jYfx)8b27^WO1O|&19|nt-7Yr7y2N*2co-kN+2ryW5sxVk|1u$52&tS0V6=1OF zoxotx7rX@}ET+{kSWI_d zu$caW!D7Y(28)?%7%XPZV6d1yfx%)<4THs8pLzz1c|Hsl^Bov078o#CEOcS8Sd_qE zvABW3Vo3*s#nL4V7R#nESS)X0uvn49V6n1+!D7`M28-1_3>Iq|7%bMVVX#>DfWcw| z2ZO~%83v0@3JeyTZ5S-JR4`aeuKf{L=A(*Nec#x zlV2DtPHkYYI6Z^G;>-dDi?d4@EY9s=usHvQ!Q#RT28&B73>KGeFj!n(!eDV_0)xfX zDGV0ZCNNlBU&3HjnmkHxn2v-p*mLc(;SW;{6>4 zi;p4<7N1NQEIx-YSbW*QVDa?@gT;3r28$mH7%YCiV6gbj!(j2Jfx+VM0|tx#It-Q! zUl=TzwlG+-_%K+qZeggmWDj7la~Le;G8io7 zB^WH_Z!lOYR4`a78ZcNYNibL{-C?j)Uc+Fi(!yY=D#Bo?dV|4IZ4QH_dJco7h6;nF zCIf?|<^~2!triALZ5IYh?H3G|Iz0@Qx+V;kx?dP9^>#2=>gO<68fY+B8a!aIG@QX; zX_UfXY0Sf5X}pBN(xg6v!P3-%!O~2G!P0C4gQa;0gQbNAgQX=0gQevK21~0I43^dt z7%Xi<7%XjGFj(5YVX(AY!(eHj!(izk!C>idg2B=;hQZP)fx*(5g~8JK0)wT?6b4Jz z5C%&(2?k5I3k;U-I~XiIQWz{f1sE*7SQsq5mM~a)yD(V#h%i{z`UoC!7^?NgJpaOgJpsNgJq%sgJt3q2Fs*543^0`43;S# z43?=X43=p;43=p>80sz4uP|6a$&H{mSC{V5n!;)Wnr+)J;7j^H-W)2 z--f}mK!?Gy;0J?c;ROcEq8$vD#RnKHOSUjrmR@17EStk%Szf|mS+Rt{vT_cCWz`G@ z%jymW%bFSn%i0_U%Q_bZ%X%FK%LWw&%SH(X%f=rJmQ8mUEL%A087y1gFj%&3V6bf4 z!C={bgu$}o0)u7e5(dkz1_sM+4+hH~9tO*v9}JegFBmNQIT$SaPcT?cSixX9v4z2M zQU-(NWFH30DIN@#Q#lwcr#@k@oc4gha{3Mi%NZREmNP3DEN4w%u$90tU;YAq1ypD~!Sb;J zgXQBd434-ZVEJPXgXPZ^43@v9Fj)THz+m}j4TI(1 z3-t_^|IRR2{(rz=#c+VZig5>n71JIDE9N~6RxDQ-tXS_bSh2lfu;OrGu;Q#>u;SXm zV8y+H!HQ=NgB9-@1}nZ53|9P47_0;Z7_5Xi7_5X<7_3Ar7_3A~7_7wZFj$E%V6c+d z!(b(Ofx$}Z34@i40E3mR34@iK0)v%&2!oYE{S*c(#XAgEN-r3!ls_<7seE9tQj=h? zQU~Eb3|5*N3|3k?3|87x7_4+U7_4+xFj(omVX!g~VX!hZVX!jtV6ZY?!C+-_g2Bp+ zhr!Bx2ZNQx9|kKc83rqB3kEBj76vQZ0}NJnUl^<$JQ%DT6Bw+V<}g?}A7HR@S;Jse z@A`nj%IytR-QK)th^2|Sb3jdu<})5u=2BEu<~zVunO42U=_r`U={4c zU=>osU=_ND!7A(lgH;3vgH1%uVJ5C*I12NBHyn}@+_b^(Lc><0{1a~v3~=4@fGnrp#eHFpVv z)jSRct9dgRtmge;u$rI3V6{Mi!D_(@2CIcK3|0%bFjy^eVX#_shQVra27}e&KMYn& zW-wSSHDIt>x`4rInGJ*0vIh)S%M%!^RtPXyt*GC@V6`%W!D{6n2CG#E7_3%TFj%dT zV6a-Vg~4jA4ujR&H4IkkEEufTU0|?UAHZO>{sx29h6Dzy4G$QsHr6m$ZPH+{+VqCO zYI6gF)fN#3t1WXFthU-PSZ!lqu-dkT!D@Q|gVpvM3|2cz7_4?WFj(z8!(g?mhQVq# z4};b2GYnSsd$urG?Tuit+9$wZwQmW7)&2?ws{S7_5$RFjyTu!eDi*gu&`~41?7P4+g7~77SJ=-!NF6>S3@t?ZIGm`VE8CnH~nK zvndQ#=MosK&f73po&UpNb>R$y)x`x2R+kbOtS&1sSY2UZsJFUufWhkO0tTyVOBk%K z8!%X1f5BjN;{k)!%^n7;TP_S%w>=oF?l3S|-Pyokb+?4U>YfRM)qNHQtNR}qtRAdj zuzKjhVD*TB!RpZo2CK&%3|3DH7_6Q;FjzfPVX%76!(jFN34_&(B@9+CBN(h+c`#VL z4q>o*t9M5jtlm#xu=>!zVD&MC!RnIg27sa4hC!48U|~*84T9)9SqhA1q{}TQy8q3IvA{#?=V=aW-wT*yvahr!z81B11f2ZObD3xl=K2L@|D8wP9t3Hb=D3B>+CBG);S*-tn*SB ztn4}*2(4hHKg3kK_|2MpHLEezH* z1`O6Udl;;18yKwXQW&i3H5jbx-!ND=9AL0+oWo$Ldj%M*d+Wb2SobYqu<3>A_$< z%Y?yt)*A-v*-IF#=d59{o;!oVdR_~I^?Vlw>jg0k)(aIFtQYw(STELLuwJ6TV7=rA zgZ0t_4A#rGFjy~N!eG6kfWf+cr2&KWDjo*w)hrCwYZw@;*Suh`UVDPUdR-5L_4*D5 z>kSDE)*CArtT*K_SZ~&0u-?+aV7;}0!FpQ-gZ1_f2J0O)4Awhy7_4`>Fj()_VX)rA z!eG7U1%vfI76$A60u0s%co?h?d|aTr!#5bLkE~&^KDva#`dAJ_z4h@G z4Av)>Fj${Fz+ipq34`?+4hHM9JPg)n-!NF8*I}@}ki%eov4z3<(gz0XD-sOWR|6QV zuQf1OU%$X$eN%?P`j!HN^=$zL>pKAq)^}4FtnW22Sl?g5VEy0>gY_c;2J6QG4AxH~ z7_6VpV6cAng2DO)1B3O;00!$<84T91kJK|*zj?r5{ca9}_4_9b)*l@htUqmGu>LH< zVEws;!TO5;gY}m=4Ax&o7_7f;VX*$@!C?LE4};E|nHVgp_HVj`FY#1jn*f7a3*f4EjuwhPN zuwkjUV6b83VX$HS!eGO;g29G8hQWrzhrxz3fx(9J4}%TY83r5fDGW9|9t<|T3Jf;9 z7Z_~#)-c%cw=mcUxG>lV>M+;{{$a2YI>KNhyn?|-WCDYYXaa+cm=1%DxB`QX_!$Np zi3JQck~IuAQa%he(mo6}G7=0nvJwn7atsVM^>QZ|Y~-IX*eLv9uu#EgN;@KgN^nA1{)n41{+-+1{*yY1{-}51{?i93^oRT z7;FrmFxVKqV6ZX1!C+%@gTco134@I}1A~ou4TFsZ2ZN2p83r563wg25(Kguy0^rJlhi>%O_~RTP5J@`n~V(% zHkn5lY_eW3*yIQ>*yOq}*yLF-*yPtR*c2Kt*c5GHuqp9juqoNWU{h+tU{m^n!KSRf zg2ATTgu$l#34={V4}(pm3WH7M6$YEC5(b-U4F;R)B@8w-84NbH5)3xAdl+o$au{st zc^GW!uQ1p&G%(mSnlRWjUSY6l>S3^H_F%ASe!*bVa)!aCwSvK>jfcUe?FfTSdk2F} zM*xFOrvigb=Me^*t{4WJZXO1k?kNm5^*sg*Ha#C0YkWg=>=3*ev|RV6*4}gU#Xv3^q%8 z80u}7#xU3{%V4ls?!sWRLW03&#T^Ell^YmrRuwSVtj=JtSrfxxvsQw^X6*?En{{g# zY}U6h*lY-3u-VAKV6*WJgUx0R2AeG+3^rR%FxYIJz+kg2hrwpM2ZPNH2L_v+1`IYk zpD@_$I>TVIM}@&=&j$vZy_ZBeN+^=DDgU$0C2AdZd3^p$<7;IiiFxb4h!C>?H27}F;2MjiEk1*K0o5Nu9{tAQ5hZhVs zA1^T2d^*8k^LYt_&6gVtHeX*b*nH<u@nYd@d^f8i2?>& z$ps9y(mV{dGA<1Dwz3l#Y~}Va*vkK5uvOGxuvIExuvM;MuvKYbuvP70uvOc^V5|Ot z!B*n~gRSNt23xHQ47S>L7;JT(FxcvTV6fF^V6Zg^V6ZjxVX!r-V6Zh_!C-50hQZd1 zgTdB3g2C3JgTdBHhQZc4fWg+5g~8S?g2C4Q1cR-^9R^z`mU;$TX9osbR~80aw-^Rn z_X!NP9$Oe}y(AcHy$cv@eeN*W`l&G3`mbQH4S2y|8zjPD8yv!58?uMNHuM66ZMXn~ zZNvly+b97B+vo`lwy_orwsA8UY~x=r*d{bE*e2RA*e1y^*e3m9uuVS0V4E_9!8Wyn z!8Wac!8Tom!8W6whru?}hQT&Vg~2x4gTXe(fx$L6g~2v2guyo7g2A>xfx))Wgu%AR zfWfx7hQYQZgu%9S0fTKh2ZL?-4+h&x2L{`!1P0sc9tPW*GYqzM2@JONXBcc70vK!? zzA)G}Zeg%(@?o%T`odt_yo15ErGmk>RfWN}^$3G)+XM#N`t}3{+x9;UwjE0tY&$0~ z*mfl_*mmnM*ml2Ruz+gMY zgTZ#H41?{|Hw?DZo-o)>Kfz!-V+Mom%oPl_vw9e8XLm5z&T(O|oh!j$JNE&D?Yt8V zw)5vO*e>v4uw7`wP;a~N3xn;V8w|FKFEH3Hxxiq%bP9v*G9L!pvsyZ1vqgYCW#47U5f zFxVb=z+iju41?{V4-B?PSQu=N7BJWzt6{J`K7+yb#1sbGlM@(hPxCO?p8mpMd*%j% z?b!W>*nan6u>DcOVEeOx!S>e;2HQUj47PtW7;OJdV6gpvgTapB1A|>X zlMI6$a|VMQ%K`>F))NeN>>dnu94QQToNpNHxMLXXcy=(@@!nvt<9oqiC&0sCCm6wC zC)C4WCt|~3CwhdzPF#e+PNIUrPVxnVom2pWozxo!JLxqHb}}vub~0}m>|}Q^*vU;` zu#?YVuv4&Muv6qHI>6&URF7#QsIelXbS?_sbrSixXtIETT`sE5JMxP`&a zq=UiEw1vUW%!a|vT!F#PLWIH2l7qp{@&|*RbpeB&O$&pa?HUF81x!7kzkgI&}N z2D=y;2D{iL40dsM80_Lx80->s80-@3IT-Ac7#Qr5Ss3h+S1{P6FfiDqq%hc}3NYBE z?qIM>3t_NJyTD+V9>ZXl{)WLWqk+LL;}3&fW(|W~76*e})&d5*YzGFr90mrvoCOSa zxg`vCc@hkEc{>>F@@*LG^6xO%6{IlO6^by}6`o!LD3^!LIxagIz@qgIy&DgI(nw2D_>N2D_?140hEU80>0N80=~V80=~{ zFxb_ZFxb_7VX&)Tz+l(lz+l&?!eG~Ugu$+rP;>>;AxC*E5H~t~ZCluFrzOuI~qf zUH=URy9sj`>?YPQ*iDjPu$#1n!EW*d2D>RC40clm80@BAVX&K4!(cZ(g~4t{0E69( z9}IRgw=mev+QDEqJA=V)jtPU^Tpb3xc_IvU^ENQp&2M0^Tj0ZBx6p#YZjk|l-C~7$ z2D>FJ40cQIFxV|Uz+ks*34`789Sn9Wav1DZhA`NzVqmaa^@PE0^%VxYH4O}QYhxJf z*8X9zTX%%PZhZlR-G&ARyNv}5cAG31>^93V*lj+-V7FxrgWc8!2D@zq40hWi80>b4 zFxc&^VX)if!C<%R4};wv1_rx5Zy4~7aE*xj*Vu)8b5V0ZTigWbI+40iYTFxWk~!eICC0)yS74GeaVcQDvJ z6=AS@`h&slxdwyX3l;{u7Y`WhUcOc5kmR*u8teVE6tAgWZQG z40a!HFxY)IVX*t+!C?0_g2C=v2!q}C2nM?!6Bz7%ZeXal`*nxG?)MJ{yFWh|?EaZB z*!|C8uxDssuxDJsV9#`e!JdVO!Jg$0gFWjL277i1278VQ27AsG4E9_r80@)kFxc~a zV6f+lV6f-k!eB43g~48M0)xHK3I=--7Y2LL1q}9L3mELhFEH3kwlLUBvoP4pv@qDq zMljgR-C?j-NT_G9SGd7ouNc5!ulR()UMYdWUfG1fUU>t9y^0Ehy~+j#dsPhvd({gJ z_G%ss_G%9p?A2o!?A1Ro*lYAK*lRj4*lRvuu-B?!u-7(Vu-D$fV6PLvV6XFr!Ctq4 z!Cp^274n32799w4EDzL0SxxWPZ;b?jxgAprZCu> zi7?ok9bm9GPhhaOP++jPc*9_C*}-6MrNLlt^?278|r276xz275mP27A9d4EFwK80-Tg80-TL80-V@ zFxUqjVXzO*V6YFdV6YGQ!C)VHfx$j(1%rKf34?uv2!nmZ0|xuZ1q}94J`DEJDh&3~ zHyG?=W-!>tPGPW*>tV2uPhhZ5&|t7n_`_hIc!0q^X$?cYeex6r`;-s{`&0`C`_vZ< z_Gw!f?9(SO*k_b5*k`6N*k@@l*k^rVu+Ir#u+Md1u+I}2{ zFxc0wVX&{;QO{sszlXuTVFH7F;~ob4ra27u%~KfcTUIdGx8^X|x0x{5w}&v;cW^M+ zcf4S*@8V#v?`B}I?@?i}?`2@H?~`D#@8@8!@BhJIKj8<1{lpUt_LDX+*iT-;U_a#q zgZ=(5#*e~v3uwRnFV81kj!G2i*gZ=Ux2KyBU80=TxV6b1U!(hLrfWdz41P1$cZy4;? zKVh)nsKH>rX%B<_76k_Tttt%m+bkIDx0f*3@7Ta#ze|R}e)kLp`#m}g_IqA1*zaAy zV85?}!G3=XgZ%*;2K)MhE)4bu|1j7eI>BIncm{+0krD>`qd5%r#}XLqkH;|BpKxKY zKk36@e@chJ{$ zgZ+a72K$FT4EB#I80;VSFxWp?!(jjP1B3muI}G+O6d3GZdNA0(iea#SUBO`gW&wl! z+a3n{cS{)T-!EaX|1gKa{^J$~`%gO<>_2~Cu>Z=yVE>JU!Tx&#gZ+;d2K%2o80>#t zV6gv_!C?P4gu(t_27~?o3 zEDRVNEGrlstXUWwY%VZ3*tsw`*zaI)aP(ksaQeaE;F7`M;QE8X!L5VA!CiyF!Tke+ zgU1mD2hRfx4qi7H9K3xP9K1g;IMn-GU~up)VQ}zU!QkL;z~JD2g25r6hruB*gTW!l zg25qJgux;B4ueC;0tScB2nL5R69$KH0S1Tg2Mi7oGZ-8qQy3hgG#DJB{xCR1?_h9< zS;F8DJB7g^E`z}#K7hd?frG&z;R1t0;syqXq&W-@$ps7!DLxDisXPo0sRtP99n$77 zIHadAIAnw{IAkg?IAs1{aLD??;E?@*!6D}cgG25M28X;Q3=a7{3=Rc73=V}M3=Tyx z3=YK^3=Sn83=X9h3=U-+3=U-<7#zwUFgR2^U~s5B!r)M~hQXnF27^P*1O|uN328X>V3=aEz7#!;NmoPXS2w-qHD8t}z@CSp#p)(8)hgUE- z99h8NaI}NL;aCWR!|?(JhZ8;w4krs398UQ#IGhe(a5!Vb;BeM~!Qt!!28Z(u3=Zd? zFgRSe!r*Z62!q3=H4F}yXD~QinZV$1wSvLnngfHw^#lfo8zl@5H)|LiZbdLS+>T*z zxTC{R?{Mb_gTvhi3=a3MFgV;lz~J!U0E5HB2@DR8wlFw6Uclh+WD0}B(+YSbY?^75YeoSF-_<4ZA;nx-hhu9t@6R77UK!9t@5W2@H;sDGZKM zB@B+z9Sn{#^)nb8W$!RJ%3WY^RN!E6RODfBRQ$o4332p7#xe1FgO-(VQ?&&!QfcBg~74x0E1)s0|v*6Ck&2NDh!U* zH4Kh58yFmGFEBXPJz#LGf5G6`=)vIFRKVcaJcGfp!LiSR!LdJr!Er(ZgX6>l433j-FgQ*TU~rtO!{9hAg28e6 z8V1K1Cm0-O-e7Q?EyCb9M~1<1t_g$Vygdw#3t|`?7iKUxE}FvNxOfJGr$E7_C zj>{?-9GA~wa9mNphQV>=9tOu%M;IJeZ(wj-vxdQO?HLBgbz2x5*WX}p-0+6MapMOD z$ITK9j$2F^9JeMgIBx4;aNOR);J9NBgX7L4434`#FgWf}VQ}2*!r-`X0)ylJISh^m z4lp<#e8Av%*oMLJh!2C~(EMh}DI%{2^;x6Uv)-eF*H zyeq@tcrS;+@qP<~kWew4-116uMdM0Uk-y4e+Pq;z!3%~!2=9VLRT1^L^K$jL=);6oWv>^ zoWzeXI7uonI7!toI7xqDaFW$waFX+3aFSoZ;H0R*;G`76;H2EZ;H0vI!AbQ5gOl0| z1}6<21}9A)1}Ci<3{E-<3{JWx3{H9-3{D0L3{Hju3{FNh3{J*77@SOgFgTfMFgTen zVQ{i|!{B83g~7>Mg2BmV4}+6!{R0Lk`ve9jhXMvC#}y1tPDdD=oPRJlxhgO?xp^=+ zxtB0FdDJjCc^+VJ@)lrl@{wV1@=aiH@>{~-X=lQ|sJ)0!y^PHXQlIIa7`;Itut!D(XygVUxT3{G1r7@W2qU~t;b!Qix`q@KZP z=K%(%-7*YLduA{=?PFnZ+MmGSbl?nw(;*WEr^8DaoQ|3>I2~KT;B@>5gVRY12B*^^ z3{Gca7@W>dVQ@P4g2Cy60fW=U1O}%|7Z{wb*f2OH7i(ryp+^oPH@VIQ>4r z;PmGUgVR3;2B-fy49*O97@V0VFgUXWFgUZGVQ^-*U~uM`!Qjj#!{E$4gTa|sfWevX z34?RJfC+=M;2H*JVFLzdksbzT(F+XD;v5Xl58yK9uLl~TWZZJ6e#V|PgzhH0)lRGbI?DvraHLXB#j$XCGj2&dFeK z&UsVM;GA2-;G8GI;G8#u!8zZA!8!i`gL6R$gLA+049>-O7@SKw z7@SK37@W%_7@W)QFgTZYFgRD3FgRD-U~sOSz~Ee^!r)x>gu%Ib27_~r1%q?V9|q^z zH4M&mH4M)6J`BzcJPgha2N;|iTNs?10vMc|>lGNBn}0Akx9nhWZY^POZqs3KZhOGs z+}^?9++oAu-0_6Lx$_Q#b5{X_bGHP8bN3Dg=bjt}=Uy2G=iUtr&V3CG&iw@p&J$u7 zoF{x?aGp4Y!FiGngY%?249=5#7@VirFgQf@gY$wC2Iqw#49<&O7@QX~FgP#X z!{EH6g28!d0E6?g2nOfn1`N(CG#H#$Ixsk|;$U!Ib%eorbp?a-8VLsHH5VA1*G^z? zUKhaNyk3XFdHn|l=M85VoHy=aaNg9x;Jn#}!Fh`YL%s8s2Mo?zA22v?o5SF|eFB5? zjsgbfoh}T{y9^kdcMC8$@BYK!yypso^WG^8&igtTocDJyI3Flra6V|k;Cx7d!TGQP zgYyv%2InJR7@Uu8VQ@ay!{B^;4}*s$g(F9mC*!Mux%p%n1hPvpX1^ z&rM)(J|Dv1e4(M9!TDkdgY%^T2ItE@49-_P7@V&PFgRb6U~s<9!Qg!T3WM{FH4M%- zXD~S5%3*N6?Ze=FM}oomE(?S6-6ssr_YN>P-(SGs{2+tD`JoMi^CJ@m=f@%p&W}GZ zI6pbU;QVw0gY&Z-2IuDi49+ij7@S``VQ_wVfx-FJ8V2Xr4Ghk2>N6Oe-^MUFzw2Re ze!qpm`9lYT^T#O+&YyA^oIg)saQ+g&;QZBu!TFmFgY)+Q2In6J49-7w7@U6vFgX8? zU~v9pz~KCsfx-D74}yhrz}C34@EJ0)vay6b2U?9tIcN3k)vyB@8YO zM;KfjJs4aZFEF?`wJ^9i+c3DeFfh2dTw!o=6Jc<1-^1YIp~B$eF@wRyQ-#6Ba|wfs zmji=~*AoU8?NAhT>LgLxcFx z;4*s!gUg&73@-C@7+mI?Ft{wxVQ^V!!{D;Wfx%^Q0E5et9EN(Ar5y||%XTohEEiyK zSzf{5viuK&%ZeHXmz4|*E-M!>xU3Rka9Op5!DY1#gUjkS3@&Rr7+lu6Fu1Hez~Hj3 zg283I4ui}34-76FIv89wS}?e5yu;wKsfEF1a|naW76t~FEj&Hmz@a=F1vK<8C-V#U~t)efWc+Y4hEOK2N+!Tr7*bc*I;ltpuymBkcYwL z;28#&LuVLV4$ok4Ia0&ma@2#t<(LA4%dtNUE++&STu%I8a5;I0!R6E!2A4BD3@&Fi z7+lWjFu0tX!{Bo61%u1^8U~m1e;8aYOki-i$iv`raRr0Rr5Fa6%PI^mm+NmZxLhe= zaJeeL;Bxf{gUhu92AAs+3@+D~Fu2?ZU~su9!QgUp4};4s0|u8{4;Wl-*D$!;(O_`7 zvx33pt_Oq5-4_fl_Zk>n?z1qs+`qu!@}Pvl<)I6M%fk~4E{{SOTprzEaCtn1!R3h# zgUgc#3@*#pLl|5Ico$NPGE2q%3yF6R$*`ze#77@a)!ZG zbOD2_*c1j=@f-$Mi4X=?NficHDH#S=sXO%yuF`uLTxGT}xXM0YaFyG_;3^-%;HnVA z;HqfD;Ht#J;HtER!Bu$ygR9B{23OT346bSk46f=a46Yh346d3o46d3F7+kexFt}!{BP#!{BN*g~8Q)4}+^k z{SpRO%MA>!R%;kst^Y8%+A1)(+LI<8@Gby~vU>U@R4)#U?&t6Kzv ztNR=VSC1DAu3jz-uHF?4uD(1BuD(|oT>V8DTmv!~Tm$|vxCU-ua1E+qa1GXAa1H*$ z;2Ls*!8LRVgKJm@gKM}3gKPL72G@uq46gN&D;Qj(S{PiTJs4bLcoS-@)9*02W}IPg%{;*1 znze<&HHU-2HCKnhHBW@WHNSwtwO|K>YvCUT*Wwfg*ODFv*U}9PuH`HYt`#v1u9YUkk^lzRr8*3*%On_Fmn$&1 zuHayBT`9rfx=MnzWt_*R=%wz2w*Mn;qTn{~9 za6Q7q;CeKG!S&bz2G`>k7+g>4Fu0!TU~oNshQal$0)y*04+husB@C_?8W>zJK45UY z^n=0mN&$oG)iVsP*G(8)Z!BPNz4?K`^|kzxP&*ZR9F7+mi&Ft|Qg!r=PIg~9dl z3!$|{uAfgZ zxPIBf;QF6N3~mxv7~CW`Ft|yrVQ`bKsAq7K$zX7kO<-`7vtV$O zmtk;||G?m;aD>54@dAUJ(i8?a

5hl^g~))dB`LwEzY;bsq*d4ITzJO%4V(%^wVI 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 OeM+ALQgTZoQV{^ delta 460772 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

Nr{pcMasK`9}ooCi0fSQF0tThTD-23WA`D7N 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 From 01e3912827bbcd1285690a704ef5e4172b8333ea Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 12 Dec 2019 16:28:02 -0500 Subject: [PATCH 072/107] Implemented conservative generators / Closes #804 --- .../world/blocks/power/ItemLiquidGenerator.java | 4 ++-- .../mindustry/world/blocks/power/PowerGraph.java | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java index 75bd3bd578..c0c9e240cf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -120,7 +120,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ float maximumPossible = maxLiquidGenerate * calculationDelta; float used = Math.min(entity.liquids.get(liquid) * calculationDelta, maximumPossible); - entity.liquids.remove(liquid, used); + entity.liquids.remove(liquid, used * entity.power.graph.getUsageFraction()); entity.productionEfficiency = baseLiquidEfficiency * used / maximumPossible; if(used > 0.001f && Mathf.chance(0.05 * entity.delta())){ @@ -137,7 +137,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } if(entity.generateTime > 0f){ - entity.generateTime -= Math.min(1f / itemDuration * entity.delta(), entity.generateTime); + entity.generateTime -= Math.min(1f / itemDuration * entity.delta() * entity.power.graph.getUsageFraction(), entity.generateTime); if(randomlyExplode && state.rules.reactorExplosions && Mathf.chance(entity.delta() * 0.06 * Mathf.clamp(entity.explosiveness - 0.5f))){ //this block is run last so that in the event of a block destruction, no code relies on the block type diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index d0d1a80425..0c217d1fc2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -19,7 +19,7 @@ public class PowerGraph{ private final ObjectSet all = new ObjectSet<>(); private final WindowedMean powerBalance = new WindowedMean(60); - private float lastPowerProduced, lastPowerNeeded; + private float lastPowerProduced, lastPowerNeeded, lastUsageFraction; private long lastFrameUpdated = -1; private final int graphID; @@ -54,6 +54,10 @@ public class PowerGraph{ return Mathf.clamp(lastPowerProduced / lastPowerNeeded); } + public float getUsageFraction(){ + return lastUsageFraction; + } + public float getPowerProduced(){ float powerProduced = 0f; for(Tile producer : producers){ @@ -180,7 +184,7 @@ public class PowerGraph{ tile.entity.power.status = 1f; } - lastPowerNeeded = lastPowerProduced = 1f; + lastPowerNeeded = lastPowerProduced = lastUsageFraction = 1f; return; } @@ -188,6 +192,7 @@ public class PowerGraph{ float powerNeeded = getPowerNeeded(); float powerProduced = getPowerProduced(); + float rawProduced = powerProduced; lastPowerNeeded = powerNeeded; lastPowerProduced = powerProduced; @@ -208,6 +213,12 @@ public class PowerGraph{ } powerBalance.addValue((lastPowerProduced - lastPowerNeeded) / Time.delta()); + + //overproducing: 10 / 20 = 0.5 + //underproducing: 20 / 10 = 2 -> clamp -> 1.0 + //nothing being produced: 20 / 0 -> 1.0 + //nothing being consumed: 0 / 20 -> 0.0 + lastUsageFraction = Mathf.zero(rawProduced) ? 1f : Mathf.clamp(powerNeeded / rawProduced); } public void add(PowerGraph graph){ From 8fde8695d0c49ee2f9961461cc32283b19463bfa Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 12 Dec 2019 16:33:24 -0500 Subject: [PATCH 073/107] Fixed tests --- tests/src/test/java/power/PowerTestFixture.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index e3a2fea469..1cd8930449 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -91,6 +91,13 @@ public class PowerTestFixture{ if(block.hasLiquids) tile.entity.liquids = new LiquidModule(); if(block.hasPower){ tile.entity.power = new PowerModule(); + tile.entity.power.graph = new PowerGraph(){ + //assume there's always something consuming power + @Override + public float getUsageFraction(){ + return 1f; + } + }; tile.entity.power.graph.add(tile); } From c3e41140e038d7cf2979af4df4e2a6ad2e3015f0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 12 Dec 2019 16:39:34 -0500 Subject: [PATCH 074/107] Disabled smart resource usage for now --- .../src/io/anuke/mindustry/world/blocks/power/PowerGraph.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java index 0c217d1fc2..43a782d2e8 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerGraph.java @@ -54,8 +54,10 @@ public class PowerGraph{ return Mathf.clamp(lastPowerProduced / lastPowerNeeded); } + /** @return multiplier of speed at which resources should be consumed for power generation. */ public float getUsageFraction(){ - return lastUsageFraction; + //TODO enable it later, or not? + return 1f; //lastUsageFraction; } public float getPowerProduced(){ From 5db8520b743d4b02959a5bd04233870fe2836292 Mon Sep 17 00:00:00 2001 From: joshuaptfan Date: Thu, 12 Dec 2019 13:52:05 -0800 Subject: [PATCH 075/107] Add rotation checks to mobile zoom --- core/src/io/anuke/mindustry/input/MobileInput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 6cd2a8aee4..7afd2444b4 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -588,7 +588,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //zoom things - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0){ + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (block == null || !block.rotate) && selectRequests.isEmpty()){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } From 19675068ea6d8b751073b0b68c7cc9873456bac3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 12 Dec 2019 17:09:29 -0500 Subject: [PATCH 076/107] Fixed wave time not saving properly --- core/src/io/anuke/mindustry/core/Control.java | 1 + core/src/io/anuke/mindustry/io/SaveVersion.java | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index c7a04955ca..56dc35eb2c 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -262,6 +262,7 @@ public class Control implements ApplicationListener, Loadable{ } } state.set(State.playing); + state.wavetime = state.rules.waveSpacing; control.saves.zoneSave(); logic.play(); Events.fire(Trigger.newGame); diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index f3b994abae..6e0157e51b 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -84,7 +84,6 @@ public abstract class SaveVersion extends SaveFileReader{ state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); lastReadBuild = map.getInt("build", -1); - String[] mods = JsonIO.read(String[].class, map.get("mods", "[]")); Map worldmap = maps.byName(map.get("mapname", "\\\\\\")); world.setMap(worldmap == null ? new Map(StringMap.of( From 6ce013a1ebeb4374b482587bb78dad1ed25a32aa Mon Sep 17 00:00:00 2001 From: joshuaptfan Date: Thu, 12 Dec 2019 14:56:32 -0800 Subject: [PATCH 077/107] Make diagonal placement keybind modify scroll to always zoom --- core/src/io/anuke/mindustry/input/DesktopInput.java | 6 +++--- core/src/io/anuke/mindustry/input/MobileInput.java | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index 90735461bc..f9fa0dc7cd 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -149,8 +149,8 @@ public class DesktopInput extends InputHandler{ if(state.is(State.menu) || Core.scene.hasDialog()) return; - //zoom things - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (block == null || !block.rotate) && selectRequests.isEmpty()){ + //zoom camera + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } @@ -182,7 +182,7 @@ public class DesktopInput extends InputHandler{ selectScale = 0f; } - if(Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){ + if(!Core.input.keyDown(Binding.diagonal_placement) && Math.abs((int)Core.input.axisTap(Binding.rotate)) > 0){ rotation = Mathf.mod(rotation + (int)Core.input.axisTap(Binding.rotate), 4); if(sreq != null){ diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 7afd2444b4..26cf3fcd09 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -587,8 +587,8 @@ public class MobileInput extends InputHandler implements GestureListener{ mode = none; } - //zoom things - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (block == null || !block.rotate) && selectRequests.isEmpty()){ + //zoom camera + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } From 9d2133814c308b5e17525b4f84699bb4b2d5e5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=ED=82=A4=EC=97=90=EB=A5=B4?= <44261958+Kieaer@users.noreply.github.com> Date: Fri, 13 Dec 2019 07:56:50 +0900 Subject: [PATCH 078/107] Update MessageBlock.java --- .../io/anuke/mindustry/world/blocks/logic/MessageBlock.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java index 0cb2611815..0d00c50d09 100644 --- a/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/logic/MessageBlock.java @@ -147,8 +147,8 @@ public class MessageBlock extends Block{ } public class MessageBlockEntity extends TileEntity{ - protected String message = ""; - protected String[] lines = {""}; + public String message = ""; + public String[] lines = {""}; @Override public void write(DataOutput stream) throws IOException{ From 1f5e773c776da94612723cfb79113674c7a34143 Mon Sep 17 00:00:00 2001 From: Anuken Date: Fri, 13 Dec 2019 23:15:49 -0500 Subject: [PATCH 079/107] Fixed double-event firing --- .../anuke/mindustry/ui/fragments/BlockInventoryFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 05b7a1ea47..a844e448f3 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -101,7 +101,7 @@ public class BlockInventoryFragment extends Fragment{ holding = false; holdTime = 0f; - Events.fire(new WithdrawEvent(tile, player, lastItem, amount)); + if(net.client()) Events.fire(new WithdrawEvent(tile, player, lastItem, amount)); } } @@ -154,7 +154,7 @@ public class BlockInventoryFragment extends Fragment{ lastItem = item; holding = true; holdTime = 0f; - Events.fire(new WithdrawEvent(tile, player, item, amount)); + if(net.client()) Events.fire(new WithdrawEvent(tile, player, item, amount)); } return true; } From 58e3143e2aba768c1d73fcabd5e1856b8dd0f08b Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 09:33:07 -0500 Subject: [PATCH 080/107] Content cleaning --- core/assets/bundles/bundle.properties | 2 +- .../anuke/mindustry/core/ContentLoader.java | 19 ++++++++++++++++++- .../src/io/anuke/mindustry/ctype/Content.java | 15 +++++++++------ .../mindustry/entities/bullet/BulletType.java | 2 +- .../io/anuke/mindustry/mod/ContentParser.java | 12 ++++++++++++ .../anuke/mindustry/mod/ModContentInfo.java | 14 ++++++++++++++ core/src/io/anuke/mindustry/mod/Mods.java | 13 ++++++------- .../mindustry/world/blocks/BuildBlock.java | 4 ++++ .../metadata/android/en-US/changelogs/101.txt | 7 +++++++ .../android/en-US/changelogs/29553.txt | 7 +++++++ .../android/en-US/changelogs/29556.txt | 7 +++++++ .../{pl => pl-PL}/changelogs/100.1.txt | 0 .../android/{pl => pl-PL}/changelogs/100.txt | 0 .../{pl => pl-PL}/full_description.txt | 0 .../{pl => pl-PL}/short_description.txt | 0 .../android/{pl => pl-PL}/summary.txt | 0 .../metadata/android/{pl => pl-PL}/title.txt | 0 17 files changed, 86 insertions(+), 16 deletions(-) create mode 100644 core/src/io/anuke/mindustry/mod/ModContentInfo.java create mode 100644 fastlane/metadata/android/en-US/changelogs/101.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/29553.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/29556.txt rename fastlane/metadata/android/{pl => pl-PL}/changelogs/100.1.txt (100%) rename fastlane/metadata/android/{pl => pl-PL}/changelogs/100.txt (100%) rename fastlane/metadata/android/{pl => pl-PL}/full_description.txt (100%) rename fastlane/metadata/android/{pl => pl-PL}/short_description.txt (100%) rename fastlane/metadata/android/{pl => pl-PL}/summary.txt (100%) rename fastlane/metadata/android/{pl => pl-PL}/title.txt (100%) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a42c94141a..a6dae07fef 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -100,7 +100,7 @@ mod.enabled = [lightgray]Enabled mod.disabled = [scarlet]Disabled mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. -mod.requiresversion = [scarlet]Requires game version: [accent]{0} +mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index a744b032e1..52c2c865e0 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -25,6 +25,7 @@ public class ContentLoader{ private Array[] contentMap = new Array[ContentType.values().length]; private MappableContent[][] temporaryMapper; private @Nullable LoadedMod currentMod; + private @Nullable Content lastAdded; private ObjectSet> initialization = new ObjectSet<>(); private ContentList[] content = { new Fx(), @@ -146,11 +147,27 @@ public class ContentLoader{ //clear all content, currently not used } + /** Get last piece of content created for error-handling purposes. */ + public @Nullable Content getLastAdded(){ + return lastAdded; + } + + /** Remove last content added in case of an exception. */ + public void removeLast(){ + if(lastAdded != null && contentMap[lastAdded.getContentType().ordinal()].peek() == lastAdded){ + contentMap[lastAdded.getContentType().ordinal()].pop(); + if(lastAdded instanceof MappableContent){ + contentNameMap[lastAdded.getContentType().ordinal()].remove(((MappableContent)lastAdded).name); + } + } + } + public void handleContent(Content content){ + this.lastAdded = content; contentMap[content.getContentType().ordinal()].add(content); } - public void setCurrentMod(LoadedMod mod){ + public void setCurrentMod(@Nullable LoadedMod mod){ this.currentMod = mod; } diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java index ab6f20d305..0e3706746b 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -1,19 +1,17 @@ package io.anuke.mindustry.ctype; -import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.mod.Mods.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.type.*; /** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ public abstract class Content implements Comparable{ public final short id; - /** The mod that loaded this piece of content. */ - public @Nullable LoadedMod mod; - /** File that this content was loaded from. */ - public @Nullable FileHandle sourceFile; + /** Info on which mod this content was loaded from. */ + public @Nullable ModContentInfo minfo; + public Content(){ this.id = (short)Vars.content.getBy(getContentType()).size; @@ -37,6 +35,11 @@ public abstract class Content implements Comparable{ public void load(){ } + /** @return whether an error ocurred during mod loading. */ + public boolean hasErrored(){ + return minfo != null && minfo.error != null; + } + @Override public int compareTo(Content c){ return Integer.compare(id, c.id); diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 807218cd85..5bca990c81 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -150,7 +150,7 @@ public abstract class BulletType extends Content{ public void update(Bullet b){ if(homingPower > 0.0001f){ - TargetTrait target = Units.closestTarget(b.getTeam(), b.x, b.y, homingRange); + TargetTrait target = Units.closestTarget(b.getTeam(), b.x, b.y, homingRange, e -> !e.isFlying() || collidesAir); if(target != null){ b.velocity().setAngle(Mathf.slerpDelta(b.velocity().angle(), b.angleTo(target), 0.08f)); } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index c4c9b1064c..4280dd3f24 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -258,8 +258,12 @@ public class ContentParser{ if(research[0] != null){ Block parent = find(ContentType.block, research[0]); TechNode baseNode = TechTree.create(parent, block); + LoadedMod cur = currentMod; postreads.add(() -> { + currentContent = block; + currentMod = cur; + TechNode parnode = TechTree.all.find(t -> t.block == parent); if(parnode == null){ throw new ModLoadException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched.", block); @@ -383,6 +387,14 @@ public class ContentParser{ } public void finishParsing(){ + reads.each(c -> { + try{ + c.run(); + }catch(Throwable t){ + + } + }); + try{ reads.each(Runnable::run); postreads.each(Runnable::run); diff --git a/core/src/io/anuke/mindustry/mod/ModContentInfo.java b/core/src/io/anuke/mindustry/mod/ModContentInfo.java new file mode 100644 index 0000000000..5e0ce32904 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/ModContentInfo.java @@ -0,0 +1,14 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.files.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.mod.Mods.*; + +public class ModContentInfo{ + /** The mod that loaded this piece of content. */ + public LoadedMod mod; + /** File that this content was loaded from. */ + public FileHandle sourceFile; + /** The error that occurred during loading, if applicable. Null if no error occurred. */ + public @Nullable String error; +} diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 0030d65721..98ceba586c 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -464,16 +464,15 @@ public class Mods implements Loadable{ //make sure mod content is in proper order runs.sort(); - runs.each(l -> safeRun(l.mod, () -> { + for(LoadRun l : runs){ try{ //this binds the content but does not load it entirely Content loaded = parser.parse(l.mod, l.file.nameWithoutExtension(), l.file.readString("UTF-8"), l.file, l.type); - Log.debug("[{0}] Loaded '{1}'.", l.mod.meta.name, - (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); - }catch(Exception e){ + Log.debug("[{0}] Loaded '{1}'.", l.mod.meta.name, (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); + }catch(Throwable e){ throw new RuntimeException("Failed to parse content file '" + l.file + "' for mod '" + l.mod.meta.name + "'.", e); } - })); + } //this finishes parsing content fields parser.finishParsing(); @@ -532,7 +531,7 @@ public class Mods implements Loadable{ /** Iterates through each mod with a main class.*/ public void each(Cons cons){ - loaded.each(p -> p.mod != null, p -> safeRun(p, () -> cons.get(p.mod))); + loaded.each(p -> p.mod != null, p -> contextRun(p, () -> cons.get(p.mod))); } public void handleError(Throwable t, LoadedMod mod){ @@ -562,7 +561,7 @@ public class Mods implements Loadable{ } } - public void safeRun(LoadedMod mod, Runnable run){ + public void contextRun(LoadedMod mod, Runnable run){ try{ run.run(); }catch(Throwable t){ diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index 60d99e730c..4623857790 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -224,6 +224,10 @@ public class BuildBlock extends Block{ return false; } + if(cblock.requirements.length != accumulator.length || totalAccumulator.length != cblock.requirements.length){ + setConstruct(previous, cblock); + } + float maxProgress = core == null ? amount : checkRequired(core.items, amount, false); for(int i = 0; i < cblock.requirements.length; i++){ diff --git a/fastlane/metadata/android/en-US/changelogs/101.txt b/fastlane/metadata/android/en-US/changelogs/101.txt new file mode 100644 index 0000000000..d53a88571c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/101.txt @@ -0,0 +1,7 @@ +- Added various new features for modding - see documentation +- Added server block state autosync +- Added support for Thai font +- Added JS scripting - unstable, not well tested +- Fixed liquid junction to item bridge crash +- Fixed launch items not saving +- General maintenance bugfixes and translation updates diff --git a/fastlane/metadata/android/en-US/changelogs/29553.txt b/fastlane/metadata/android/en-US/changelogs/29553.txt new file mode 100644 index 0000000000..d53a88571c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29553.txt @@ -0,0 +1,7 @@ +- Added various new features for modding - see documentation +- Added server block state autosync +- Added support for Thai font +- Added JS scripting - unstable, not well tested +- Fixed liquid junction to item bridge crash +- Fixed launch items not saving +- General maintenance bugfixes and translation updates diff --git a/fastlane/metadata/android/en-US/changelogs/29556.txt b/fastlane/metadata/android/en-US/changelogs/29556.txt new file mode 100644 index 0000000000..d53a88571c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29556.txt @@ -0,0 +1,7 @@ +- Added various new features for modding - see documentation +- Added server block state autosync +- Added support for Thai font +- Added JS scripting - unstable, not well tested +- Fixed liquid junction to item bridge crash +- Fixed launch items not saving +- General maintenance bugfixes and translation updates diff --git a/fastlane/metadata/android/pl/changelogs/100.1.txt b/fastlane/metadata/android/pl-PL/changelogs/100.1.txt similarity index 100% rename from fastlane/metadata/android/pl/changelogs/100.1.txt rename to fastlane/metadata/android/pl-PL/changelogs/100.1.txt diff --git a/fastlane/metadata/android/pl/changelogs/100.txt b/fastlane/metadata/android/pl-PL/changelogs/100.txt similarity index 100% rename from fastlane/metadata/android/pl/changelogs/100.txt rename to fastlane/metadata/android/pl-PL/changelogs/100.txt diff --git a/fastlane/metadata/android/pl/full_description.txt b/fastlane/metadata/android/pl-PL/full_description.txt similarity index 100% rename from fastlane/metadata/android/pl/full_description.txt rename to fastlane/metadata/android/pl-PL/full_description.txt diff --git a/fastlane/metadata/android/pl/short_description.txt b/fastlane/metadata/android/pl-PL/short_description.txt similarity index 100% rename from fastlane/metadata/android/pl/short_description.txt rename to fastlane/metadata/android/pl-PL/short_description.txt diff --git a/fastlane/metadata/android/pl/summary.txt b/fastlane/metadata/android/pl-PL/summary.txt similarity index 100% rename from fastlane/metadata/android/pl/summary.txt rename to fastlane/metadata/android/pl-PL/summary.txt diff --git a/fastlane/metadata/android/pl/title.txt b/fastlane/metadata/android/pl-PL/title.txt similarity index 100% rename from fastlane/metadata/android/pl/title.txt rename to fastlane/metadata/android/pl-PL/title.txt From 1f5a6e1bf81bab22e6bd7c23cfb76529c4cec75c Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 10:06:09 -0500 Subject: [PATCH 081/107] Compile error fixes --- .../mindustry/entities/bullet/BulletType.java | 2 +- .../mindustry/entities/effect/Lightning.java | 6 +++++- .../io/anuke/mindustry/mod/ContentParser.java | 18 +++++++++++++++--- .../io/anuke/mindustry/mod/ModContentInfo.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 11 ++++++----- 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 5bca990c81..38923955e9 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -137,7 +137,7 @@ public abstract class BulletType extends Content{ } for(int i = 0; i < lightining; i++){ - Lightning.create(b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength); + Lightning.createLighting(Lightning.nextSeed(), b.getTeam(), Pal.surge, damage, b.x, b.y, Mathf.random(360f), lightningLength); } } diff --git a/core/src/io/anuke/mindustry/entities/effect/Lightning.java b/core/src/io/anuke/mindustry/entities/effect/Lightning.java index 44bc54d1cb..8d28f33d65 100644 --- a/core/src/io/anuke/mindustry/entities/effect/Lightning.java +++ b/core/src/io/anuke/mindustry/entities/effect/Lightning.java @@ -44,7 +44,11 @@ public class Lightning extends TimedEntity implements DrawTrait, TimeTrait{ /** Create a lighting branch at a location. Use Team.none to damage everyone. */ public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ - Call.createLighting(lastSeed++, team, color, damage, x, y, targetAngle, length); + Call.createLighting(nextSeed(), team, color, damage, x, y, targetAngle, length); + } + + public static int nextSeed(){ + return lastSeed++; } /** Do not invoke! */ diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 4280dd3f24..99def211c7 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -308,7 +308,7 @@ public class ContentParser{ if(value.has(key)){ return value.getString(key); }else{ - throw new IllegalArgumentException((currentContent == null ? "" : currentContent.sourceFile + ": ") + "You are missing a \"" + key + "\". It must be added before the file can be parsed."); + throw new IllegalArgumentException("You are missing a \"" + key + "\". It must be added before the file can be parsed."); } } @@ -433,14 +433,26 @@ public class ContentParser{ currentMod = mod; boolean located = locate(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); + c.minfo = new ModContentInfo(); + c.minfo.sourceFile = file; toBeParsed.add(c); + if(!located){ - c.sourceFile = file; - c.mod = mod; + c.minfo.mod = mod; } return c; } + public void markError(Content content, LoadedMod mod, FileHandle file, Throwable error){ + if(content.minfo == null){ + content.minfo = new ModContentInfo(); + } + + content.minfo.mod = mod; + content.minfo.sourceFile = file; + content.minfo.error = Strings.parseException(error, true); + } + private T locate(ContentType type, String name){ T first = Vars.content.getByName(type, name); //try vanilla replacement return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); diff --git a/core/src/io/anuke/mindustry/mod/ModContentInfo.java b/core/src/io/anuke/mindustry/mod/ModContentInfo.java index 5e0ce32904..7d1fd105ca 100644 --- a/core/src/io/anuke/mindustry/mod/ModContentInfo.java +++ b/core/src/io/anuke/mindustry/mod/ModContentInfo.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.mod.Mods.*; public class ModContentInfo{ /** The mod that loaded this piece of content. */ - public LoadedMod mod; + public @Nullable LoadedMod mod; /** File that this content was loaded from. */ public FileHandle sourceFile; /** The error that occurred during loading, if applicable. Null if no error occurred. */ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 98ceba586c..7aa5fa21ea 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -149,7 +149,7 @@ public class Mods implements Loadable{ //generate new icons for(Array arr : content.getContentMap()){ arr.each(c -> { - if(c instanceof UnlockableContent && c.mod != null){ + if(c instanceof UnlockableContent && c.minfo != null && c.minfo.mod != null){ UnlockableContent u = (UnlockableContent)c; u.createIcons(packer); } @@ -534,6 +534,7 @@ public class Mods implements Loadable{ loaded.each(p -> p.mod != null, p -> contextRun(p, () -> cons.get(p.mod))); } + /* public void handleError(Throwable t, LoadedMod mod){ Array causes = Strings.getCauses(t); Content content = null; @@ -559,13 +560,13 @@ public class Mods implements Loadable{ }else{ throw new ModLoadException("Error loading mod " + mod.meta.name, t); } - } + }*/ public void contextRun(LoadedMod mod, Runnable run){ try{ run.run(); }catch(Throwable t){ - handleError(t, mod); + throw new RuntimeException("Error loading mod " + mod.meta.name, t); } } @@ -751,7 +752,7 @@ public class Mods implements Loadable{ } } - /** Thrown when an error occurs while loading a mod.*/ + /** Thrown when an error occurs while loading a mod. public static class ModLoadException extends RuntimeException{ public Content content; public LoadedMod mod; @@ -783,5 +784,5 @@ public class Mods implements Loadable{ this.mod = content.mod; } } - } + }*/ } From 252d0f6aa1156ad23884154bc42d952f66a0b782 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 10:51:36 -0500 Subject: [PATCH 082/107] aaaaa --- android/src/io/anuke/mindustry/AndroidRhinoContext.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java index 82a8f7179d..66e7a5393b 100644 --- a/android/src/io/anuke/mindustry/AndroidRhinoContext.java +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -2,6 +2,7 @@ package io.anuke.mindustry; import android.annotation.*; import android.os.*; +import android.os.Build.*; import com.android.dex.*; import com.android.dx.cf.direct.*; import com.android.dx.command.dexer.*; @@ -12,6 +13,7 @@ import com.android.dx.merge.*; import dalvik.system.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; +import io.anuke.arc.util.*; import org.mozilla.javascript.*; import java.io.*; @@ -177,7 +179,9 @@ public class AndroidRhinoContext{ }catch(IOException e){ e.printStackTrace(); } - return new DexClassLoader(dexFile.getPath(), ((AndroidApplication)Core.app).getContext().getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); + android.content.Context context = ((AndroidApplication)Core.app).getContext(); + Log.info(dexFile.getPath() + " " + dexFile.exists() + " " + context.getCacheDir().getAbsolutePath()); + return new DexClassLoader(dexFile.getPath(), VERSION.SDK_INT >= 21 ? context.getCodeCacheDir().getPath() : context.getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); } @Override From c1cf3183ac4cfcd2f035ac0f2ad3d434e93696c4 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 11:04:22 -0500 Subject: [PATCH 083/107] Fixed some Android-related script issues --- android/src/io/anuke/mindustry/AndroidRhinoContext.java | 2 -- core/src/io/anuke/mindustry/mod/Mods.java | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/android/src/io/anuke/mindustry/AndroidRhinoContext.java b/android/src/io/anuke/mindustry/AndroidRhinoContext.java index 66e7a5393b..4960941d88 100644 --- a/android/src/io/anuke/mindustry/AndroidRhinoContext.java +++ b/android/src/io/anuke/mindustry/AndroidRhinoContext.java @@ -13,7 +13,6 @@ import com.android.dx.merge.*; import dalvik.system.*; import io.anuke.arc.*; import io.anuke.arc.backends.android.surfaceview.*; -import io.anuke.arc.util.*; import org.mozilla.javascript.*; import java.io.*; @@ -180,7 +179,6 @@ public class AndroidRhinoContext{ e.printStackTrace(); } android.content.Context context = ((AndroidApplication)Core.app).getContext(); - Log.info(dexFile.getPath() + " " + dexFile.exists() + " " + context.getCacheDir().getAbsolutePath()); return new DexClassLoader(dexFile.getPath(), VERSION.SDK_INT >= 21 ? context.getCodeCacheDir().getPath() : context.getCacheDir().getAbsolutePath(), null, getParent()).loadClass(name); } diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 0030d65721..7956adef26 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -383,7 +383,7 @@ public class Mods implements Loadable{ Events.fire(new ContentReloadEvent()); if(scripts != null && scripts.hasErrored()){ - Core.app.post(() -> Core.settings.getBoolOnce("scripts-errored", () -> ui.showErrorMessage("$mod.scripts.unsupported"))); + Core.app.post(() -> ui.showErrorMessage("$mod.scripts.unsupported")); } } From 9d3dda035c2fc2d9fdf9614a99194b78e8aff44a Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 12:53:37 -0500 Subject: [PATCH 084/107] Compile fixes --- .../io/anuke/mindustry/AndroidLauncher.java | 3 +- .../anuke/mindustry/core/ContentLoader.java | 6 ++-- .../src/io/anuke/mindustry/ctype/Content.java | 16 +++++++-- .../io/anuke/mindustry/mod/ContentParser.java | 36 +++++++++---------- .../anuke/mindustry/mod/ModContentInfo.java | 14 -------- .../anuke/mindustry/mod/ModCrashHandler.java | 14 ++------ core/src/io/anuke/mindustry/mod/Mods.java | 12 +++++-- core/src/io/anuke/mindustry/type/Zone.java | 4 +-- ios/src/io/anuke/mindustry/IOSLauncher.java | 3 +- 9 files changed, 49 insertions(+), 59 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/mod/ModContentInfo.java diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index 24c223d2d6..e34e7ee1c4 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -18,7 +18,6 @@ import io.anuke.arc.util.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; -import io.anuke.mindustry.mod.*; import io.anuke.mindustry.ui.dialogs.*; import java.io.*; @@ -144,7 +143,7 @@ public class AndroidLauncher extends AndroidApplication{ useImmersiveMode = true; depth = 0; hideStatusBar = true; - errorHandler = ModCrashHandler::handle; + //errorHandler = ModCrashHandler::handle; }}); checkFiles(getIntent()); } diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 52c2c865e0..25f425c8f9 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -115,8 +115,8 @@ public class ContentLoader{ try{ callable.get(content); }catch(Throwable e){ - if(content.mod != null){ - mods.handleError(new ModLoadException(content, e), content.mod); + if(content.minfo.mod != null){ + mods.handleContentError(content, e); }else{ throw new RuntimeException(e); } @@ -180,7 +180,7 @@ public class ContentLoader{ throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + content.name + "')"); } if(currentMod != null){ - content.mod = currentMod; + content.minfo.mod = currentMod; } contentNameMap[content.getContentType().ordinal()].put(content.name, content); } diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java index 0e3706746b..0bcc89af14 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -1,8 +1,9 @@ package io.anuke.mindustry.ctype; +import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; @@ -10,7 +11,7 @@ import io.anuke.mindustry.type.*; public abstract class Content implements Comparable{ public final short id; /** Info on which mod this content was loaded from. */ - public @Nullable ModContentInfo minfo; + public @NonNull ModContentInfo minfo = new ModContentInfo(); public Content(){ @@ -37,7 +38,7 @@ public abstract class Content implements Comparable{ /** @return whether an error ocurred during mod loading. */ public boolean hasErrored(){ - return minfo != null && minfo.error != null; + return minfo.error != null; } @Override @@ -49,4 +50,13 @@ public abstract class Content implements Comparable{ public String toString(){ return getContentType().name() + "#" + id; } + + public static class ModContentInfo{ + /** The mod that loaded this piece of content. */ + public @Nullable LoadedMod mod; + /** File that this content was loaded from. */ + public @Nullable FileHandle sourceFile; + /** The error that occurred during loading, if applicable. Null if no error occurred. */ + public @Nullable String error; + } } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 99def211c7..09a030e1e6 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -266,7 +266,7 @@ public class ContentParser{ TechNode parnode = TechTree.all.find(t -> t.block == parent); if(parnode == null){ - throw new ModLoadException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched.", block); + throw new IllegalArgumentException("Block '" + parent.name + "' isn't in the tech tree, but '" + block.name + "' requires it to be researched."); } if(!parnode.children.contains(baseNode)){ parnode.children.add(baseNode); @@ -386,21 +386,18 @@ public class ContentParser{ } } - public void finishParsing(){ - reads.each(c -> { - try{ - c.run(); - }catch(Throwable t){ - - } - }); - + private void attempt(Runnable run){ try{ - reads.each(Runnable::run); - postreads.each(Runnable::run); - }catch(Exception e){ - Vars.mods.handleError(new ModLoadException("Error occurred parsing content: " + currentContent, currentContent, e), currentMod); + run.run(); + }catch(Throwable t){ + //don't overwrite double errors + markError(currentContent, t); } + } + + public void finishParsing(){ + reads.each(this::attempt); + postreads.each(this::attempt); reads.clear(); postreads.clear(); toBeParsed.clear(); @@ -433,7 +430,6 @@ public class ContentParser{ currentMod = mod; boolean located = locate(type, name) != null; Content c = parsers.get(type).parse(mod.name, name, value); - c.minfo = new ModContentInfo(); c.minfo.sourceFile = file; toBeParsed.add(c); @@ -444,15 +440,17 @@ public class ContentParser{ } public void markError(Content content, LoadedMod mod, FileHandle file, Throwable error){ - if(content.minfo == null){ - content.minfo = new ModContentInfo(); - } - content.minfo.mod = mod; content.minfo.sourceFile = file; content.minfo.error = Strings.parseException(error, true); } + public void markError(Content content, Throwable error){ + if(content.minfo != null && !content.hasErrored()){ + markError(content, content.minfo.mod, content.minfo.sourceFile, error); + } + } + private T locate(ContentType type, String name){ T first = Vars.content.getByName(type, name); //try vanilla replacement return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); diff --git a/core/src/io/anuke/mindustry/mod/ModContentInfo.java b/core/src/io/anuke/mindustry/mod/ModContentInfo.java deleted file mode 100644 index 7d1fd105ca..0000000000 --- a/core/src/io/anuke/mindustry/mod/ModContentInfo.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.anuke.mindustry.mod; - -import io.anuke.arc.files.*; -import io.anuke.arc.util.ArcAnnotate.*; -import io.anuke.mindustry.mod.Mods.*; - -public class ModContentInfo{ - /** The mod that loaded this piece of content. */ - public @Nullable LoadedMod mod; - /** File that this content was loaded from. */ - public FileHandle sourceFile; - /** The error that occurred during loading, if applicable. Null if no error occurred. */ - public @Nullable String error; -} diff --git a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java index 77f3c68aba..507057acad 100644 --- a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java +++ b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java @@ -1,19 +1,9 @@ package io.anuke.mindustry.mod; -import io.anuke.arc.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.*; -import io.anuke.arc.scene.ui.layout.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.ui.*; - public class ModCrashHandler{ public static void handle(Throwable t){ + /* Array list = Strings.getCauses(t); Throwable modCause = list.find(e -> e instanceof ModLoadException); @@ -62,6 +52,6 @@ public class ModCrashHandler{ }); }else{ throw new RuntimeException(t); - } + }*/ } } diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 7aa5fa21ea..737aa0ede6 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -149,7 +149,7 @@ public class Mods implements Loadable{ //generate new icons for(Array arr : content.getContentMap()){ arr.each(c -> { - if(c instanceof UnlockableContent && c.minfo != null && c.minfo.mod != null){ + if(c instanceof UnlockableContent && c.minfo.mod != null){ UnlockableContent u = (UnlockableContent)c; u.createIcons(packer); } @@ -465,12 +465,16 @@ public class Mods implements Loadable{ //make sure mod content is in proper order runs.sort(); for(LoadRun l : runs){ + Content current = content.getLastAdded(); try{ //this binds the content but does not load it entirely Content loaded = parser.parse(l.mod, l.file.nameWithoutExtension(), l.file.readString("UTF-8"), l.file, l.type); Log.debug("[{0}] Loaded '{1}'.", l.mod.meta.name, (loaded instanceof UnlockableContent ? ((UnlockableContent)loaded).localizedName : loaded)); }catch(Throwable e){ - throw new RuntimeException("Failed to parse content file '" + l.file + "' for mod '" + l.mod.meta.name + "'.", e); + if(current != content.getLastAdded() && content.getLastAdded() != null){ + parser.markError(content.getLastAdded(), l.mod, l.file, e); + } + //throw new RuntimeException("Failed to parse content file '" + l.file + "' for mod '" + l.mod.meta.name + "'.", e); } } @@ -478,6 +482,10 @@ public class Mods implements Loadable{ parser.finishParsing(); } + public void handleContentError(Content content, Throwable error){ + parser.markError(content, error); + } + /** @return all loaded mods. */ public Array all(){ return loaded; diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index c60249b223..12686bb3da 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -172,8 +172,8 @@ public class Zone extends UnlockableContent{ @Override public void init(){ - if(generator instanceof MapGenerator && mod != null){ - ((MapGenerator)generator).removePrefix(mod.name); + if(generator instanceof MapGenerator && minfo.mod != null){ + ((MapGenerator)generator).removePrefix(minfo.mod.name); } generator.init(loadout); diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 7f4783d1a8..50b1732892 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -10,7 +10,6 @@ import io.anuke.arc.util.io.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Saves.*; import io.anuke.mindustry.io.*; -import io.anuke.mindustry.mod.*; import io.anuke.mindustry.ui.*; import org.robovm.apple.coregraphics.*; import org.robovm.apple.foundation.*; @@ -153,7 +152,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ UINavigationController.attemptRotationToDeviceOrientation(); } }, new IOSApplicationConfiguration(){{ - errorHandler = ModCrashHandler::handle; + //errorHandler = ModCrashHandler::handle; }}); } From e043f4bb6632da8de34c0bf3f425cca81688e8af Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 18:19:02 -0500 Subject: [PATCH 085/107] API cleanup --- .../io/anuke/mindustry/core/NetServer.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 191 +++++------------- .../mindustry/ui/dialogs/ModsDialog.java | 4 +- .../ui/fragments/PlacementFragment.java | 3 +- .../mindustry/desktop/DesktopLauncher.java | 8 +- .../mindustry/tools/ScriptStubGenerator.java | 2 +- 6 files changed, 63 insertions(+), 147 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 72d141576b..218cbd2d83 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -219,7 +219,7 @@ public class NetServer implements ApplicationListener{ @Override public void init(){ - mods.each(mod -> mod.registerClientCommands(clientCommands)); + mods.eachClass(mod -> mod.registerClientCommands(clientCommands)); } private void registerCommands(){ diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 737aa0ede6..0a35c0d089 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -33,13 +33,12 @@ public class Mods implements Loadable{ private @Nullable Scripts scripts; private ContentParser parser = new ContentParser(); private ObjectMap> bundles = new ObjectMap<>(); - private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); + private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites", "sprites-override"); private int totalSprites; private MultiPacker packer; - private Array loaded = new Array<>(); - private Array disabled = new Array<>(); + private Array mods = new Array<>(); private ObjectMap, ModMeta> metas = new ObjectMap<>(); private boolean requiresReload; @@ -53,19 +52,19 @@ public class Mods implements Loadable{ /** Returns a list of files per mod subdirectory. */ public void listFiles(String directory, Cons2 cons){ - for(LoadedMod mod : loaded){ + eachEnabled(mod -> { FileHandle file = mod.root.child(directory); if(file.exists()){ for(FileHandle child : file.list()){ cons.get(mod, child); } } - } + }); } /** @return the loaded mod found by class, or null if not found. */ public @Nullable LoadedMod getMod(Class type){ - return loaded.find(l -> l.mod != null && l.mod.getClass() == type); + return mods.find(m -> m.enabled() && m.main != null && m.main.getClass() == type);//loaded.find(l -> l.mod != null && l.mod.getClass() == type); } /** Imports an external mod file.*/ @@ -77,7 +76,7 @@ public class Mods implements Loadable{ file.copyTo(dest); try{ - loaded.add(loadMod(dest)); + mods.add(loadMod(dest)); requiresReload = true; }catch(IOException e){ dest.delete(); @@ -91,19 +90,19 @@ public class Mods implements Loadable{ /** Repacks all in-game sprites. */ @Override public void loadAsync(){ - if(loaded.isEmpty()) return; + if(!mods.contains(LoadedMod::enabled)) return; Time.mark(); packer = new MultiPacker(); - for(LoadedMod mod : loaded){ + eachEnabled(mod -> { Array sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); packSprites(sprites, mod, true); packSprites(overrides, mod, false); Log.debug("Packed {0} images for mod '{1}'.", sprites.size + overrides.size, mod.meta.name); totalSprites += sprites.size + overrides.size; - } + }); for(AtlasRegion region : Core.atlas.getRegions()){ PageType type = getPage(region); @@ -198,8 +197,7 @@ public class Mods implements Loadable{ ui.showErrorMessage("$mod.delete.error"); return; } - loaded.remove(mod); - disabled.remove(mod); + mods.remove(mod); requiresReload = true; } @@ -225,11 +223,7 @@ public class Mods implements Loadable{ Log.debug("[Mods] Loading mod {0}", file); try{ LoadedMod mod = loadMod(file); - if(mod.enabled() || headless){ - loaded.add(mod); - }else{ - disabled.add(mod); - } + mods.add(mod); }catch(Exception e){ Log.err("Failed to load mod file {0}. Skipping.", file); Log.err(e); @@ -240,11 +234,7 @@ public class Mods implements Loadable{ for(FileHandle file : platform.getWorkshopContent(LoadedMod.class)){ try{ LoadedMod mod = loadMod(file); - if(mod.enabled()){ - loaded.add(mod); - }else{ - disabled.add(mod); - } + mods.add(mod); mod.addSteamID(file.name()); }catch(Exception e){ Log.err("Failed to load mod workshop file {0}. Skipping.", file); @@ -252,28 +242,24 @@ public class Mods implements Loadable{ } } - resolveDependencies(); + resolveModState(); //sort mods to make sure servers handle them properly. - loaded.sort(Structs.comparing(m -> m.name)); + mods.sort(Structs.comparing(m -> m.name)); buildFiles(); } - private void resolveDependencies(){ - Array incompatible = loaded.select(m -> !m.isSupported()); - loaded.removeAll(incompatible); - disabled.addAll(incompatible); + private void resolveModState(){ + mods.each(this::updateDependencies); - for(LoadedMod mod : Array.withArrays(loaded, disabled)){ - updateDependencies(mod); + for(LoadedMod mod : mods){ + mod.state = + !mod.isSupported() ? ModState.unsupported : + mod.hasUnmetDependencies() ? ModState.missingDependencies : + !mod.enabled() /*TODO check disabled state!*/ ? ModState.disabled : + ModState.enabled; } - - disabled.addAll(loaded.select(LoadedMod::hasUnmetDependencies)); - loaded.removeAll(LoadedMod::hasUnmetDependencies); - disabled.each(mod -> setEnabled(mod, false)); - disabled.distinct(); - loaded.distinct(); } private void updateDependencies(LoadedMod mod){ @@ -298,16 +284,16 @@ public class Mods implements Loadable{ private Array orderedMods(){ ObjectSet visited = new ObjectSet<>(); Array result = new Array<>(); - for(LoadedMod mod : loaded){ + eachEnabled(mod -> { if(!visited.contains(mod)){ topoSort(mod, result, visited); } - } + }); return result; } private LoadedMod locateMod(String name){ - return loaded.find(mod -> mod.name.equals(name)); + return mods.find(mod -> mod.enabled() && mod.name.equals(name)); } private void buildFiles(){ @@ -357,8 +343,7 @@ public class Mods implements Loadable{ //TODO make it less epic Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas")); - loaded.clear(); - disabled.clear(); + mods.clear(); load(); Sounds.dispose(); Sounds.load(); @@ -392,7 +377,7 @@ public class Mods implements Loadable{ Time.mark(); try{ - for(LoadedMod mod : loaded){ + eachEnabled(mod -> { if(mod.root.child("scripts").exists()){ content.setCurrentMod(mod); mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); @@ -414,7 +399,7 @@ public class Mods implements Loadable{ } } } - } + }); }finally{ content.setCurrentMod(null); } @@ -486,41 +471,18 @@ public class Mods implements Loadable{ parser.markError(content, error); } - /** @return all loaded mods. */ - public Array all(){ - return loaded; - } - - /** @return all disabled mods. */ - public Array disabled(){ - return disabled; - } - - /** @return a list of mod names only, without versions. */ - public Array getModNames(){ - return loaded.select(l -> !l.meta.hidden).map(l -> l.name + ":" + l.meta.version); - } - /** @return a list of mods and versions, in the format name:version. */ public Array getModStrings(){ - return loaded.select(l -> !l.meta.hidden).map(l -> l.name + ":" + l.meta.version); + return mods.select(l -> !l.meta.hidden && l.enabled()).map(l -> l.name + ":" + l.meta.version); } /** Makes a mod enabled or disabled. shifts it.*/ public void setEnabled(LoadedMod mod, boolean enabled){ if(mod.enabled() != enabled){ Core.settings.putSave("mod-" + mod.name + "-enabled", enabled); - Core.settings.save(); requiresReload = true; - if(!enabled){ - loaded.remove(mod); - if(!disabled.contains(mod)) disabled.add(mod); - }else{ - if(!loaded.contains(mod)) loaded.add(mod); - disabled.remove(mod); - } - loaded.each(this::updateDependencies); - disabled.each(this::updateDependencies); + mod.state = enabled ? ModState.enabled : ModState.disabled; + mods.each(this::updateDependencies); } } @@ -537,38 +499,19 @@ public class Mods implements Loadable{ return result; } - /** Iterates through each mod with a main class.*/ - public void each(Cons cons){ - loaded.each(p -> p.mod != null, p -> contextRun(p, () -> cons.get(p.mod))); + public Array list(){ + return mods; } - /* - public void handleError(Throwable t, LoadedMod mod){ - Array causes = Strings.getCauses(t); - Content content = null; - for(Throwable e : causes){ - if(e instanceof ModLoadException && ((ModLoadException) e).content != null){ - content = ((ModLoadException) e).content; - } - } + /** Iterates through each mod with a main class. */ + public void eachClass(Cons cons){ + mods.each(p -> p.main != null, p -> contextRun(p, () -> cons.get(p.main))); + } - String realCause = ""; - for(int i = causes.size -1 ; i >= 0; i--){ - if(causes.get(i).getMessage() != null){ - realCause = causes.get(i).getMessage(); - break; - } - } - - setEnabled(mod, false); - - if(content != null){ - throw new ModLoadException(Strings.format("Error loading '{0}' from mod '{1}' ({2}):\n{3}", - content, mod.meta.name, content.sourceFile == null ? "" : content.sourceFile.name(), realCause), content, t); - }else{ - throw new ModLoadException("Error loading mod " + mod.meta.name, t); - } - }*/ + /** Iterates through each enabled mod. */ + public void eachEnabled(Cons cons){ + mods.each(LoadedMod::enabled, cons); + } public void contextRun(LoadedMod mod, Runnable run){ try{ @@ -597,7 +540,7 @@ public class Mods implements Loadable{ String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main; String baseName = meta.name.toLowerCase().replace(" ", "-"); - if(loaded.contains(m -> m.name.equals(baseName)) || disabled.contains(m -> m.name.equals(baseName))){ + if(mods.contains(m -> m.name.equals(baseName))){ throw new IllegalArgumentException("A mod with the name '" + baseName + "' is already imported."); } @@ -641,7 +584,7 @@ public class Mods implements Loadable{ /** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */ public final FileHandle root; /** The mod's main class; may be null. */ - public final @Nullable Mod mod; + public final @Nullable Mod main; /** Internal mod name. Used for textures. */ public final String name; /** This mod's metadata. */ @@ -652,17 +595,19 @@ public class Mods implements Loadable{ public Array missingDependencies = new Array<>(); /** Script files to run. */ public Array scripts = new Array<>(); + /** Current state of this mod. */ + public ModState state = ModState.disabled; - public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){ + public LoadedMod(FileHandle file, FileHandle root, Mod main, ModMeta meta){ this.root = root; this.file = file; - this.mod = mod; + this.main = main; this.meta = meta; this.name = meta.name.toLowerCase().replace(" ", "-"); } public boolean enabled(){ - return Core.settings.getBool("mod-" + name + "-enabled", true); + return state == ModState.enabled; } public boolean hasUnmetDependencies(){ @@ -760,37 +705,11 @@ public class Mods implements Loadable{ } } - /** Thrown when an error occurs while loading a mod. - public static class ModLoadException extends RuntimeException{ - public Content content; - public LoadedMod mod; - - public ModLoadException(String message, Throwable cause){ - super(message, cause); - } - - public ModLoadException(String message, @Nullable Content content, Throwable cause){ - super(message, cause); - this.content = content; - if(content != null){ - this.mod = content.mod; - } - } - - public ModLoadException(@Nullable Content content, Throwable cause){ - super(cause); - this.content = content; - if(content != null){ - this.mod = content.mod; - } - } - - public ModLoadException(String message, @Nullable Content content){ - super(message); - this.content = content; - if(content != null){ - this.mod = content.mod; - } - } - }*/ + public enum ModState{ + enabled, + disabled, + missingDependencies, + unsupported, + contentErrors + } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index efbb02693a..a9a39816fb 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -75,7 +75,7 @@ public class ModsDialog extends FloatingDialog{ hidden(() -> { if(mods.requiresReload()){ ui.loadAnd("$reloading", () -> { - mods.all().each(mod -> { + mods.eachEnabled(mod -> { if(mod.hasUnmetDependencies()){ ui.showErrorMessage(Core.bundle.format("mod.nowdisabled", mod.name, mod.missingDependencies.toString(", "))); } @@ -107,7 +107,7 @@ public class ModsDialog extends FloatingDialog{ cont.defaults().width(mobile ? 500 : 560f).pad(4); cont.add("$mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); cont.row(); - if(!(mods.all().isEmpty() && mods.disabled().isEmpty())){ + if(!mods.list().isEmpty()){ cont.pane(table -> { table.margin(10f).top(); Array all = Array.withArrays(mods.all(), mods.disabled()); diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 5d8e5ff0e5..54ebe7b814 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -10,6 +10,7 @@ import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.EventType.*; @@ -461,6 +462,6 @@ public class PlacementFragment extends Fragment{ /** Returns the block currently being hovered over in the world. */ Block tileDisplayBlock(){ - return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.drop() != null ? hoverTile.overlay().itemDrop != null ? hoverTile.overlay() : hoverTile.floor() : null; + return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.drop() != null && hoverTile.block() == Blocks.air ? hoverTile.overlay().itemDrop != null ? hoverTile.overlay() : hoverTile.floor() : null; } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 6f63976bf7..1a4b30d37a 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -17,7 +17,6 @@ import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.desktop.steam.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.type.*; @@ -195,12 +194,9 @@ public class DesktopLauncher extends ClientLauncher{ boolean fbgp = badGPU; CrashSender.send(e, file -> { - Array causes = Strings.getCauses(e); - Throwable fc = causes.find(t -> t instanceof ModLoadException); - if(fc == null) fc = Strings.getFinalCause(e); - Throwable cause = fc; + Throwable fc = Strings.getFinalCause(e); if(!fbgp){ - dialog.get(() -> message("A crash has occured. It has been saved in:\n" + file.getAbsolutePath() + "\n" + cause.getClass().getSimpleName().replace("Exception", "") + (cause.getMessage() == null ? "" : ":\n" + cause.getMessage()))); + dialog.get(() -> message("A crash has occured. It has been saved in:\n" + file.getAbsolutePath() + "\n" + fc.getClass().getSimpleName().replace("Exception", "") + (fc.getMessage() == null ? "" : ":\n" + fc.getMessage()))); } }); } diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index ac29c6adb4..5a33c507c9 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -25,7 +25,7 @@ public class ScriptStubGenerator{ Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, - AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class); + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class); Array nopackage = Array.with("java.lang", "java"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + From bcc8f65ac8fb7d9cd14bdfe920a141754c9d4dd9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sat, 14 Dec 2019 20:49:55 -0500 Subject: [PATCH 086/107] More cleanup --- core/src/io/anuke/mindustry/ClientLauncher.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 10 +++++++--- core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java | 6 ++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index 08363a67be..5d04c44010 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -123,7 +123,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform for(ApplicationListener listener : modules){ listener.init(); } - mods.each(Mod::init); + mods.eachClass(Mod::init); finished = true; Events.fire(new ClientLoadEvent()); super.resize(graphics.getWidth(), graphics.getHeight()); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 0a35c0d089..7f2ef573f6 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -243,13 +243,16 @@ public class Mods implements Loadable{ } resolveModState(); - - //sort mods to make sure servers handle them properly. - mods.sort(Structs.comparing(m -> m.name)); + sortMods(); buildFiles(); } + private void sortMods(){ + //sort mods to make sure servers handle them properly. + mods.sort(Structs.comps(Structs.comparingInt(m -> -m.state.ordinal()), Structs.comparing(m -> m.name))); + } + private void resolveModState(){ mods.each(this::updateDependencies); @@ -483,6 +486,7 @@ public class Mods implements Loadable{ requiresReload = true; mod.state = enabled ? ModState.enabled : ModState.disabled; mods.each(this::updateDependencies); + sortMods(); } } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index a9a39816fb..a2e1f8b168 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.arc.Net.*; -import io.anuke.arc.collection.*; import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; @@ -110,11 +109,10 @@ public class ModsDialog extends FloatingDialog{ if(!mods.list().isEmpty()){ cont.pane(table -> { table.margin(10f).top(); - Array all = Array.withArrays(mods.all(), mods.disabled()); boolean anyDisabled = false; - for(LoadedMod mod : all){ - if(!mod.enabled() && !anyDisabled && mods.all().size > 0){ + for(LoadedMod mod : mods.list()){ + if(!mod.enabled() && !anyDisabled && mods.list().size > 0){ anyDisabled = true; table.row(); table.addImage().growX().height(4f).pad(6f).color(Pal.gray); From 1c1db3990f07912e170e315529f893dc7f018df7 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 13:54:51 -0500 Subject: [PATCH 087/107] Fully implemented safe content loading --- core/assets/bundles/bundle.properties | 3 + core/assets/bundles/bundle_ru.properties | 2 +- core/src/io/anuke/mindustry/Vars.java | 2 + .../anuke/mindustry/core/ContentLoader.java | 1 + .../io/anuke/mindustry/core/NetClient.java | 2 +- core/src/io/anuke/mindustry/core/UI.java | 31 ++++++ .../src/io/anuke/mindustry/ctype/Content.java | 1 - .../{type => ctype}/ContentType.java | 5 +- .../mindustry/editor/WaveInfoDialog.java | 1 + .../mindustry/entities/bullet/BulletType.java | 1 + .../mindustry/entities/type/BaseUnit.java | 1 + .../anuke/mindustry/entities/type/Player.java | 1 + .../mindustry/entities/units/Statuses.java | 1 + .../io/anuke/mindustry/game/GlobalData.java | 2 +- .../io/anuke/mindustry/game/Schematics.java | 2 +- .../io/anuke/mindustry/game/SpawnGroup.java | 1 + core/src/io/anuke/mindustry/io/JsonIO.java | 1 + .../io/anuke/mindustry/io/LegacyMapIO.java | 2 +- .../io/anuke/mindustry/io/SaveVersion.java | 1 + core/src/io/anuke/mindustry/io/TypeIO.java | 1 + .../io/anuke/mindustry/io/versions/Save2.java | 2 +- .../mindustry/maps/filters/FilterOption.java | 14 +-- .../io/anuke/mindustry/mod/ClassAccess.java | 2 +- .../io/anuke/mindustry/mod/ContentParser.java | 49 ++++++---- core/src/io/anuke/mindustry/mod/Mods.java | 94 ++++++++++++++++--- .../io/anuke/mindustry/type/ErrorContent.java | 12 +++ core/src/io/anuke/mindustry/type/Item.java | 1 + core/src/io/anuke/mindustry/type/Liquid.java | 1 + core/src/io/anuke/mindustry/type/Mech.java | 1 + .../io/anuke/mindustry/type/StatusEffect.java | 1 + core/src/io/anuke/mindustry/type/TypeID.java | 1 + .../src/io/anuke/mindustry/type/UnitType.java | 1 + .../io/anuke/mindustry/type/WeatherEvent.java | 1 + core/src/io/anuke/mindustry/type/Zone.java | 1 + core/src/io/anuke/mindustry/ui/Styles.java | 10 +- .../mindustry/ui/dialogs/DatabaseDialog.java | 2 +- .../mindustry/ui/dialogs/ModsDialog.java | 3 + .../mindustry/ui/fragments/HudFragment.java | 1 + .../mindustry/ui/fragments/MenuFragment.java | 30 +++--- core/src/io/anuke/mindustry/world/Block.java | 1 + .../mindustry/world/blocks/units/MechPad.java | 2 +- gradle.properties | 2 +- tests/src/test/java/ApplicationTests.java | 2 +- 43 files changed, 234 insertions(+), 62 deletions(-) rename core/src/io/anuke/mindustry/{type => ctype}/ContentType.java (80%) create mode 100644 core/src/io/anuke/mindustry/type/ErrorContent.java diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index a6dae07fef..8512c307bc 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -102,6 +102,9 @@ mod.disable = Disable mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} mod.missingdependencies = [scarlet]Missing dependencies: {0} +mod.erroredcontent = [scarlet]Content Errors +mod.errors = Errors have occurred loading content. +mod.noerrorplay = [scarlet]You have mods with errors.[] Either disable the affected mods or fix the errors before playing. mod.nowdisabled = [scarlet]Mod '{0}' is missing dependencies:[accent] {1}\n[lightgray]These mods need to be downloaded first.\nThis mod will be automatically disabled. mod.enable = Enable mod.requiresrestart = The game will now close to apply the mod changes. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index e1d2308ae7..5fa4556b8c 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -315,7 +315,7 @@ waves.invalid = Неверные волны в буфере обмена. waves.copied = Волны скопированы. waves.none = Враги не были определены.\nОбратите внимание, что пустые волны будут автоматически заменены обычной волной. editor.default = [lightgray]<По умолчанию> -details = Подробная информация… +details = Подробности… edit = Редактировать… editor.name = Название: editor.spawn = Создать боевую единицу diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 8d9f04d045..ef6f1acd7a 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -8,6 +8,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; import io.anuke.mindustry.ai.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.entities.*; @@ -195,6 +196,7 @@ public class Vars implements Loadable{ public static void init(){ Serialization.init(); + DefaultSerializers.typeMappings.put("io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.ctype.ContentType"); if(loadLocales){ //load locales diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index 25f425c8f9..274139b206 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -7,6 +7,7 @@ import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index f4cc17693b..6a0f0428e3 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -11,6 +11,7 @@ import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.traits.*; @@ -22,7 +23,6 @@ import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.TypeID; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.modules.*; diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index 3eb530ac7f..f8d5774dd6 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -374,6 +374,37 @@ public class UI implements ApplicationListener, Loadable{ }}.show(); } + public void showExceptions(String text, String... messages){ + loadfrag.hide(); + new Dialog(""){{ + + setFillParent(true); + cont.margin(15); + cont.add("$error.title").colspan(2); + cont.row(); + cont.addImage().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); + cont.row(); + cont.add(text).colspan(2).wrap().growX().center().get().setAlignment(Align.center); + cont.row(); + + //cont.pane(p -> { + for(int i = 0; i < messages.length; i += 2){ + String btext = messages[i]; + String details = messages[i + 1]; + Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(details).color(Color.lightGray).left()), true); + + cont.add(btext).right(); + cont.addButton("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().left(); + cont.row(); + cont.add(col).colspan(2).pad(2); + cont.row(); + } + //}).colspan(2); + + cont.addButton("$ok", this::hide).size(300, 50).fillX().colspan(2); + }}.show(); + } + public void showText(String titleText, String text){ showText(titleText, text, Align.center); } diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java index 0bcc89af14..a4aa945443 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -4,7 +4,6 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.mod.Mods.*; -import io.anuke.mindustry.type.*; /** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ diff --git a/core/src/io/anuke/mindustry/type/ContentType.java b/core/src/io/anuke/mindustry/ctype/ContentType.java similarity index 80% rename from core/src/io/anuke/mindustry/type/ContentType.java rename to core/src/io/anuke/mindustry/ctype/ContentType.java index f6b980a5d5..5b2e1bdb3b 100644 --- a/core/src/io/anuke/mindustry/type/ContentType.java +++ b/core/src/io/anuke/mindustry/ctype/ContentType.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.type; +package io.anuke.mindustry.ctype; /** Do not rearrange, ever! */ public enum ContentType{ @@ -13,7 +13,8 @@ public enum ContentType{ effect, zone, loadout, - typeid; + typeid, + error; public static final ContentType[] all = values(); } diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index 37f55cb775..187d8a7fc2 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -12,6 +12,7 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; diff --git a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java index 38923955e9..bc401c6d6d 100644 --- a/core/src/io/anuke/mindustry/entities/bullet/BulletType.java +++ b/core/src/io/anuke/mindustry/entities/bullet/BulletType.java @@ -4,6 +4,7 @@ import io.anuke.arc.audio.*; import io.anuke.arc.math.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.Content; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.effect.*; diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index b0b741bacb..6dfa7baa84 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -9,6 +9,7 @@ import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.units.*; diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 73c0fc4dc0..45405aad70 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -15,6 +15,7 @@ import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; diff --git a/core/src/io/anuke/mindustry/entities/units/Statuses.java b/core/src/io/anuke/mindustry/entities/units/Statuses.java index b96937bfcb..2d2da40f1f 100644 --- a/core/src/io/anuke/mindustry/entities/units/Statuses.java +++ b/core/src/io/anuke/mindustry/entities/units/Statuses.java @@ -6,6 +6,7 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index 908173e751..999df06713 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -6,7 +6,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.io.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.ctype.UnlockableContent; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/io/anuke/mindustry/game/Schematics.java index 078300bc52..51753333bb 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/io/anuke/mindustry/game/Schematics.java @@ -13,12 +13,12 @@ import io.anuke.arc.util.io.Streams.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Schematic.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.input.Placement.*; -import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.production.*; diff --git a/core/src/io/anuke/mindustry/game/SpawnGroup.java b/core/src/io/anuke/mindustry/game/SpawnGroup.java index e799e26c40..50443f153e 100644 --- a/core/src/io/anuke/mindustry/game/SpawnGroup.java +++ b/core/src/io/anuke/mindustry/game/SpawnGroup.java @@ -4,6 +4,7 @@ import io.anuke.arc.util.serialization.Json; import io.anuke.arc.util.serialization.Json.Serializable; import io.anuke.arc.util.serialization.JsonValue; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.type.BaseUnit; import io.anuke.mindustry.type.*; diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 3635c25bc0..5d91106ea2 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -5,6 +5,7 @@ import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; diff --git a/core/src/io/anuke/mindustry/io/LegacyMapIO.java b/core/src/io/anuke/mindustry/io/LegacyMapIO.java index 4d62f6b63d..650b58c22d 100644 --- a/core/src/io/anuke/mindustry/io/LegacyMapIO.java +++ b/core/src/io/anuke/mindustry/io/LegacyMapIO.java @@ -6,10 +6,10 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.arc.util.serialization.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.game.*; import io.anuke.mindustry.io.MapIO.*; import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.LegacyColorMapper.*; import io.anuke.mindustry.world.blocks.*; diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 6e0157e51b..cab3c55250 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -6,6 +6,7 @@ import io.anuke.arc.util.io.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; diff --git a/core/src/io/anuke/mindustry/io/TypeIO.java b/core/src/io/anuke/mindustry/io/TypeIO.java index b5864b5e5b..be5161659b 100644 --- a/core/src/io/anuke/mindustry/io/TypeIO.java +++ b/core/src/io/anuke/mindustry/io/TypeIO.java @@ -3,6 +3,7 @@ package io.anuke.mindustry.io; import io.anuke.annotations.Annotations.ReadClass; import io.anuke.annotations.Annotations.WriteClass; import io.anuke.arc.graphics.Color; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.Effects.Effect; import io.anuke.mindustry.entities.type.Bullet; diff --git a/core/src/io/anuke/mindustry/io/versions/Save2.java b/core/src/io/anuke/mindustry/io/versions/Save2.java index 65c531c66e..bcf0fb8366 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save2.java +++ b/core/src/io/anuke/mindustry/io/versions/Save2.java @@ -1,8 +1,8 @@ package io.anuke.mindustry.io.versions; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.io.*; -import io.anuke.mindustry.type.*; import io.anuke.mindustry.type.TypeID; import java.io.*; diff --git a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java index f1a63c0a37..df75282eb2 100644 --- a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java +++ b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java @@ -13,15 +13,15 @@ import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; -import static io.anuke.mindustry.Vars.updateEditorOnChange; +import static io.anuke.mindustry.Vars.*; public abstract class FilterOption{ - public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); - public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); - public static final Boolf oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full))); + public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(io.anuke.mindustry.ui.Cicon.full)); public static final Boolf anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; public abstract void build(Table table); diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index d126af792c..5e11142fea 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ContentType", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 09a030e1e6..1b1aa64c1d 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -138,26 +138,20 @@ public class ContentParser{ } //try to parse "item/amount" syntax - try{ - if(type == ItemStack.class && jsonData.isString() && jsonData.asString().contains("/")){ - String[] split = jsonData.asString().split("/"); + if(type == ItemStack.class && jsonData.isString() && jsonData.asString().contains("/")){ + String[] split = jsonData.asString().split("/"); - return (T)fromJson(ItemStack.class, "{item: " + split[0] + ", amount: " + split[1] + "}"); - } - }catch(Throwable ignored){ + return (T)fromJson(ItemStack.class, "{item: " + split[0] + ", amount: " + split[1] + "}"); } //try to parse "liquid/amount" syntax - try{ - if(jsonData.isString() && jsonData.asString().contains("/")){ - String[] split = jsonData.asString().split("/"); - if(type == LiquidStack.class){ - return (T)fromJson(LiquidStack.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); - }else if(type == ConsumeLiquid.class){ - return (T)fromJson(ConsumeLiquid.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); - } + if(jsonData.isString() && jsonData.asString().contains("/")){ + String[] split = jsonData.asString().split("/"); + if(type == LiquidStack.class){ + return (T)fromJson(LiquidStack.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); + }else if(type == ConsumeLiquid.class){ + return (T)fromJson(ConsumeLiquid.class, "{liquid: " + split[0] + ", amount: " + split[1] + "}"); } - }catch(Throwable ignored){ } if(Content.class.isAssignableFrom(type)){ @@ -168,7 +162,7 @@ public class ContentParser{ T two = (T)Vars.content.getByName(ctype, jsonData.asString()); if(two != null) return two; - throw new IllegalArgumentException("\"" + jsonData.name + "\": No " + ctype + " found with name '" + jsonData.asString() + "'."); + throw new IllegalArgumentException("\"" + jsonData.name + "\": No " + ctype + " found with name '" + jsonData.asString() + "'.\nMake sure '" + jsonData.asString() + "' is spelled correctly, and that it really exists!\nThis may also occur because its file failed to parse."); } } @@ -442,7 +436,10 @@ public class ContentParser{ public void markError(Content content, LoadedMod mod, FileHandle file, Throwable error){ content.minfo.mod = mod; content.minfo.sourceFile = file; - content.minfo.error = Strings.parseException(error, true); + content.minfo.error = makeError(error, file); + if(mod != null){ + mod.erroredContent.add(content); + } } public void markError(Content content, Throwable error){ @@ -451,6 +448,24 @@ public class ContentParser{ } } + private String makeError(Throwable t, FileHandle file){ + StringBuilder builder = new StringBuilder(); + builder.append("[lightgray]").append("File: ").append(file.name()).append("[]\n\n"); + + if(t.getMessage() != null && t instanceof JsonParseException){ + builder.append("[accent][[JsonParse][] ").append(":\n").append(t.getMessage()); + }else{ + Array causes = Strings.getCauses(t); + for(Throwable e : causes){ + builder.append("[accent][[").append(e.getClass().getSimpleName().replace("Exception", "")) + .append("][] ") + .append(e.getMessage() != null ? + e.getMessage().replace("io.anuke.mindustry.", "").replace("io.anuke.arc.", "") : "").append("\n"); + } + } + return builder.toString(); + } + private T locate(ContentType type, String name){ T first = Vars.content.getByName(type, name); //try vanilla replacement return first != null ? first : Vars.content.getByName(type, currentMod.name + "-" + name); diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 7f2ef573f6..e7067f850d 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -9,19 +9,22 @@ import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.graphics.g2d.TextureAtlas.*; -import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.io.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Jval.*; import io.anuke.mindustry.core.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.graphics.MultiPacker.*; import io.anuke.mindustry.plugin.*; import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; import java.io.*; import java.net.*; @@ -42,6 +45,11 @@ public class Mods implements Loadable{ private ObjectMap, ModMeta> metas = new ObjectMap<>(); private boolean requiresReload; + public Mods(){ + Events.on(ClientLoadEvent.class, e -> Core.app.post(this::checkWarnings)); + Events.on(ContentReloadEvent.class, e -> Core.app.post(this::checkWarnings)); + } + /** Returns a file named 'config.json' in a special folder for the specified plugin. * Call this in init(). */ public FileHandle getConfig(Mod mod){ @@ -260,7 +268,7 @@ public class Mods implements Loadable{ mod.state = !mod.isSupported() ? ModState.unsupported : mod.hasUnmetDependencies() ? ModState.missingDependencies : - !mod.enabled() /*TODO check disabled state!*/ ? ModState.disabled : + !mod.shouldBeEnabled() ? ModState.disabled : ModState.enabled; } } @@ -333,13 +341,68 @@ public class Mods implements Loadable{ try{ PropertiesUtils.load(bundle.getProperties(), file.reader()); }catch(Exception e){ - throw new RuntimeException("Error loading bundle: " + file + "/" + locale, e); + Log.err("Error loading bundle: " + file + "/" + locale, e); } } bundle = bundle.getParent(); } } + /** Check all warnings related to content and show relevant dialogs. Client only. */ + private void checkWarnings(){ + //show 'scripts have errored' info + if(scripts != null && scripts.hasErrored()){ + Core.settings.getBoolOnce("scripts-errored2", () -> ui.showErrorMessage("$mod.scripts.unsupported")); + } + + //show list of errored content + if(mods.contains(LoadedMod::hasContentErrors)){ + ui.loadfrag.hide(); + new Dialog(""){{ + + setFillParent(true); + cont.margin(15); + cont.add("$error.title"); + cont.row(); + cont.addImage().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); + cont.row(); + cont.add("$mod.errors").wrap().growX().center().get().setAlignment(Align.center); + cont.row(); + cont.pane(p -> { + mods.each(m -> m.enabled() && m.hasContentErrors(), m -> { + p.add(m.name).color(Pal.accent).left(); + p.row(); + p.addImage().fillX().pad(4).color(Pal.accent); + p.row(); + p.table(d -> { + d.left().marginLeft(15f); + for(Content c : m.erroredContent){ + d.add(c.minfo.sourceFile.nameWithoutExtension()).left().padRight(10); + d.addImageTextButton("$details", Icon.arrowDownSmall, Styles.transt, () -> { + new Dialog(""){{ + setFillParent(true); + cont.pane(e -> e.add(c.minfo.error)).grow(); + cont.row(); + cont.addImageTextButton("$ok", Icon.backSmall, this::hide).size(240f, 60f); + }}.show(); + }).size(190f, 50f).left().marginLeft(6); + d.row(); + } + }).left(); + p.row(); + }); + }); + + cont.row(); + cont.addButton("$ok", this::hide).size(300, 50); + }}.show(); + } + } + + public boolean hasContentErrors(){ + return mods.contains(LoadedMod::hasContentErrors); + } + /** Reloads all mod content. How does this even work? I refuse to believe that it functions correctly.*/ public void reloadContent(){ //epic memory leak @@ -369,10 +432,6 @@ public class Mods implements Loadable{ requiresReload = false; Events.fire(new ContentReloadEvent()); - - if(scripts != null && scripts.hasErrored()){ - Core.app.post(() -> Core.settings.getBoolOnce("scripts-errored", () -> ui.showErrorMessage("$mod.scripts.unsupported"))); - } } /** This must be run on the main thread! */ @@ -396,7 +455,6 @@ public class Mods implements Loadable{ Core.app.post(() -> { Log.err("Error loading script {0} for mod {1}.", file.name(), mod.meta.name); e.printStackTrace(); - //if(!headless) ui.showException(e); }); break; } @@ -461,8 +519,10 @@ public class Mods implements Loadable{ }catch(Throwable e){ if(current != content.getLastAdded() && content.getLastAdded() != null){ parser.markError(content.getLastAdded(), l.mod, l.file, e); + }else{ + ErrorContent error = new ErrorContent(); + parser.markError(error, l.mod, l.file, e); } - //throw new RuntimeException("Failed to parse content file '" + l.file + "' for mod '" + l.mod.meta.name + "'.", e); } } @@ -599,6 +659,8 @@ public class Mods implements Loadable{ public Array missingDependencies = new Array<>(); /** Script files to run. */ public Array scripts = new Array<>(); + /** Content with intialization code. */ + public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ public ModState state = ModState.disabled; @@ -611,13 +673,21 @@ public class Mods implements Loadable{ } public boolean enabled(){ - return state == ModState.enabled; + return state == ModState.enabled || state == ModState.contentErrors; + } + + public boolean shouldBeEnabled(){ + return Core.settings.getBool("mod-" + name + "-enabled", true); } public boolean hasUnmetDependencies(){ return !missingDependencies.isEmpty(); } + public boolean hasContentErrors(){ + return !erroredContent.isEmpty(); + } + /** @return whether this mod is supported by the game verison */ public boolean isSupported(){ if(Version.build <= 0 || meta.minGameVersion == null) return true; @@ -711,9 +781,9 @@ public class Mods implements Loadable{ public enum ModState{ enabled, - disabled, + contentErrors, missingDependencies, unsupported, - contentErrors + disabled, } } diff --git a/core/src/io/anuke/mindustry/type/ErrorContent.java b/core/src/io/anuke/mindustry/type/ErrorContent.java new file mode 100644 index 0000000000..91c52207f8 --- /dev/null +++ b/core/src/io/anuke/mindustry/type/ErrorContent.java @@ -0,0 +1,12 @@ +package io.anuke.mindustry.type; + +import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; + +/** Represents a blank type of content that has an error. Replaces anything that failed to parse. */ +public class ErrorContent extends Content{ + @Override + public ContentType getContentType(){ + return ContentType.error; + } +} diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 597eb468b5..01cff82cd2 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -4,6 +4,7 @@ import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.blocks.*; diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index 8ed87e7941..0b896a389c 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -5,6 +5,7 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.ui.*; public class Liquid extends UnlockableContent{ diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 7a5de5ae2d..6172827ee8 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -5,6 +5,7 @@ import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.type.Player; import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.graphics.Pal; diff --git a/core/src/io/anuke/mindustry/type/StatusEffect.java b/core/src/io/anuke/mindustry/type/StatusEffect.java index 482f0f03f1..34d7a9cb77 100644 --- a/core/src/io/anuke/mindustry/type/StatusEffect.java +++ b/core/src/io/anuke/mindustry/type/StatusEffect.java @@ -6,6 +6,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; diff --git a/core/src/io/anuke/mindustry/type/TypeID.java b/core/src/io/anuke/mindustry/type/TypeID.java index bd190a7a63..5ab6c1f3f5 100644 --- a/core/src/io/anuke/mindustry/type/TypeID.java +++ b/core/src/io/anuke/mindustry/type/TypeID.java @@ -2,6 +2,7 @@ package io.anuke.mindustry.type; import io.anuke.arc.func.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.traits.*; public class TypeID extends MappableContent{ diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index 1a7335b032..85a6882e86 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -8,6 +8,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; diff --git a/core/src/io/anuke/mindustry/type/WeatherEvent.java b/core/src/io/anuke/mindustry/type/WeatherEvent.java index 29b6ca0855..4f7eba597c 100644 --- a/core/src/io/anuke/mindustry/type/WeatherEvent.java +++ b/core/src/io/anuke/mindustry/type/WeatherEvent.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.type; import io.anuke.mindustry.ctype.Content; +import io.anuke.mindustry.ctype.ContentType; //currently unimplemented, see trello for implementation plans public class WeatherEvent extends Content{ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index 12686bb3da..cb047f91b0 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -7,6 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; diff --git a/core/src/io/anuke/mindustry/ui/Styles.java b/core/src/io/anuke/mindustry/ui/Styles.java index af519a4b14..1f7be8f08c 100644 --- a/core/src/io/anuke/mindustry/ui/Styles.java +++ b/core/src/io/anuke/mindustry/ui/Styles.java @@ -25,7 +25,7 @@ import static io.anuke.mindustry.gen.Tex.*; public class Styles{ public static Drawable black, black9, black8, black6, black3, none, flatDown, flatOver; public static ButtonStyle defaultb, waveb; - public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet; + public static TextButtonStyle defaultt, squaret, nodet, cleart, discordt, infot, clearPartialt, clearTogglet, clearToggleMenut, togglet, transt; public static ImageButtonStyle defaulti, nodei, righti, emptyi, emptytogglei, selecti, cleari, clearFulli, clearPartiali, clearPartial2i, clearTogglei, clearTransi, clearToggleTransi, clearTogglePartiali; public static ScrollPaneStyle defaultPane, horizontalPane, smallPane; public static KeybindDialogStyle defaultKeybindDialog; @@ -110,6 +110,14 @@ public class Styles{ fontColor = Color.white; disabledFontColor = Color.gray; }}; + transt = new TextButtonStyle(){{ + down = flatDown; + up = none; + over = flatOver; + font = Fonts.def; + fontColor = Color.white; + disabledFontColor = Color.gray; + }}; clearTogglet = new TextButtonStyle(){{ font = Fonts.def; fontColor = Color.white; diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index 65adb85efa..406665f431 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -10,9 +10,9 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; public class DatabaseDialog extends FloatingDialog{ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index a2e1f8b168..f18c7733cf 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -165,6 +165,9 @@ public class ModsDialog extends FloatingDialog{ }else if(mod.hasUnmetDependencies()){ t.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); t.row(); + }else if(mod.hasContentErrors()){ + t.labelWrap("$mod.erroredcontent").growX(); + t.row(); } }).width(mobile ? 430f : 500f); table.row(); diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index b2c60deca9..8b05c07d5a 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -17,6 +17,7 @@ import io.anuke.arc.scene.ui.ImageButton.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.ctype.UnlockableContent; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index b18be4b27e..abf313183b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -88,11 +88,11 @@ public class MenuFragment extends Fragment{ container.defaults().size(size).pad(5).padTop(4f); MobileButton - play = new MobileButton(Icon.play2, "$campaign", ui.deploy::show), - custom = new MobileButton(Icon.playCustom, "$customgame", ui.custom::show), - maps = new MobileButton(Icon.load, "$loadgame", ui.load::show), - join = new MobileButton(Icon.add, "$joingame", ui.join::show), - editor = new MobileButton(Icon.editor, "$editor", ui.maps::show), + play = new MobileButton(Icon.play2, "$campaign", () -> checkPlay(ui.deploy::show)), + custom = new MobileButton(Icon.playCustom, "$customgame", () -> checkPlay(ui.custom::show)), + maps = new MobileButton(Icon.load, "$loadgame", () -> checkPlay(ui.load::show)), + join = new MobileButton(Icon.add, "$joingame", () -> checkPlay(ui.join::show)), + editor = new MobileButton(Icon.editor, "$editor", () -> checkPlay(ui.maps::show)), tools = new MobileButton(Icon.tools, "$settings", ui.settings::show), mods = new MobileButton(Icon.wiki, "$mods", ui.mods::show), donate = new MobileButton(Icon.link, "$website", () -> Core.net.openURI("https://anuke.itch.io/mindustry")), @@ -153,13 +153,13 @@ public class MenuFragment extends Fragment{ buttons(t, new Buttoni("$play", Icon.play2Small, - new Buttoni("$campaign", Icon.play2Small, ui.deploy::show), - new Buttoni("$joingame", Icon.addSmall, ui.join::show), - new Buttoni("$customgame", Icon.editorSmall, ui.custom::show), - new Buttoni("$loadgame", Icon.loadSmall, ui.load::show), - new Buttoni("$tutorial", Icon.infoSmall, control::playTutorial) + new Buttoni("$campaign", Icon.play2Small, () -> checkPlay(ui.deploy::show)), + new Buttoni("$joingame", Icon.addSmall, () -> checkPlay(ui.join::show)), + new Buttoni("$customgame", Icon.editorSmall, () -> checkPlay(ui.custom::show)), + new Buttoni("$loadgame", Icon.loadSmall, () -> checkPlay(ui.load::show)), + new Buttoni("$tutorial", Icon.infoSmall, () -> checkPlay(control::playTutorial)) ), - new Buttoni("$editor", Icon.editorSmall, ui.maps::show), steam ? new Buttoni("$workshop", Icon.saveSmall, platform::openWorkshop) : null, + new Buttoni("$editor", Icon.editorSmall, () -> checkPlay(ui.maps::show)), steam ? new Buttoni("$workshop", Icon.saveSmall, platform::openWorkshop) : null, new Buttoni(Core.bundle.get("mods") + "\n" + Core.bundle.get("mods.alpha"), Icon.wikiSmall, ui.mods::show), //not enough space for this button //new Buttoni("$schematics", Icon.pasteSmall, ui.schematics::show), @@ -180,6 +180,14 @@ public class MenuFragment extends Fragment{ }).width(width).growY(); } + private void checkPlay(Runnable run){ + if(!mods.hasContentErrors()){ + run.run(); + }else{ + ui.showInfo("$mod.noerrorplay"); + } + } + private void fadeInMenu(){ submenu.clearActions(); submenu.actions(Actions.alpha(1f, 0.15f, Interpolation.fade)); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index e1f7e4763d..a6f7769d03 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -18,6 +18,7 @@ import io.anuke.arc.util.*; import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.traits.BuilderTrait.*; diff --git a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java index 594ec7b154..54bc28fb03 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/MechPad.java @@ -47,7 +47,7 @@ public class MechPad extends Block{ @Remote(targets = Loc.both, called = Loc.server) public static void onMechFactoryTap(Player player, Tile tile){ - if(player == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; + if(player == null || tile == null || !(tile.block() instanceof MechPad) || !checkValidTap(tile, player)) return; MechFactoryEntity entity = tile.ent(); diff --git a/gradle.properties b/gradle.properties index 212385a749..84b12d9235 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=190918590e8401b1686ecb9167e3c2a9e77eafaa +archash=b4f2a66518d2582ea4275193dfee128b186df9b3 diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 12409c364f..2e706644c2 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -16,7 +16,7 @@ import io.anuke.mindustry.game.Team; import io.anuke.mindustry.io.SaveIO; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.net.*; -import io.anuke.mindustry.type.ContentType; +import io.anuke.mindustry.ctype.ContentType; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.BlockPart; From d78d3daaf9cf4c2d6e4b8eb0f14db108415c0985 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 13:56:01 -0500 Subject: [PATCH 088/107] Updated script stub --- core/assets/scripts/global.js | 1 + core/src/io/anuke/mindustry/mod/ClassAccess.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 72a5440403..87f498bbef 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -16,6 +16,7 @@ const run = method => new java.lang.Runnable(){run: method} const boolf = method => new Boolf(){get: method} const boolp = method => new Boolp(){get: method} const cons = method => new Cons(){get: method} +const prov = method => new Prov(){get: method} const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) const Calls = Packages.io.anuke.mindustry.gen.Call importPackage(Packages.io.anuke.arc) diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 5e11142fea..9926c6d162 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.Crawler", "io.anuke.mindustry.entities.type.base.Dagger", "io.anuke.mindustry.entities.type.base.Draug", "io.anuke.mindustry.entities.type.base.Eruptor", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.Fortress", "io.anuke.mindustry.entities.type.base.Ghoul", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.Phantom", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.type.base.Revenant", "io.anuke.mindustry.entities.type.base.Spirit", "io.anuke.mindustry.entities.type.base.Titan", "io.anuke.mindustry.entities.type.base.Wraith", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.Pixmap", "io.anuke.arc.graphics.Texture", "io.anuke.arc.graphics.TextureData", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.Content$ModContentInfo", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.ContentType", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.HoverUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$ServerLoadEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ErrorContent", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); } \ No newline at end of file From 047f479a2f649efa6450974f142930c68b27fac9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 14:00:07 -0500 Subject: [PATCH 089/107] Fixed server --- .../io/anuke/mindustry/server/ServerControl.java | 14 +++++++------- .../io/anuke/mindustry/server/ServerLauncher.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index fc99ad0382..f24ede5009 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -157,8 +157,8 @@ public class ServerControl implements ApplicationListener{ } }); - if(!mods.all().isEmpty()){ - info("&lc{0} mods loaded.", mods.all().size); + if(!mods.list().isEmpty()){ + info("&lc{0} mods loaded.", mods.list().size); } info("&lcServer loaded. Type &ly'help'&lc for help."); @@ -310,9 +310,9 @@ public class ServerControl implements ApplicationListener{ }); handler.register("mods", "Display all loaded mods.", arg -> { - if(!mods.all().isEmpty()){ + if(!mods.list().isEmpty()){ info("Mods:"); - for(LoadedMod mod : mods.all()){ + for(LoadedMod mod : mods.list()){ info(" &ly{0} &lcv{1}", mod.meta.displayName(), mod.meta.version); } }else{ @@ -322,7 +322,7 @@ public class ServerControl implements ApplicationListener{ }); handler.register("mod", "", "Display information about a loaded plugin.", arg -> { - LoadedMod mod = mods.all().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); + LoadedMod mod = mods.list().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); if(mod != null){ info("Name: &ly{0}", mod.meta.displayName()); info("Internal Name: &ly{0}", mod.name); @@ -828,8 +828,8 @@ public class ServerControl implements ApplicationListener{ info("&ly{0}&lg MB collected. Memory usage now at &ly{1}&lg MB.", pre - post, post); }); - mods.each(p -> p.registerServerCommands(handler)); - mods.each(p -> p.registerClientCommands(netServer.clientCommands)); + mods.eachClass(p -> p.registerServerCommands(handler)); + mods.eachClass(p -> p.registerClientCommands(netServer.clientCommands)); } private void applyRules(){ diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index bd584ab4d1..d9eeabc963 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -63,7 +63,7 @@ public class ServerLauncher implements ApplicationListener{ Core.app.addListener(netServer = new NetServer()); Core.app.addListener(new ServerControl(args)); - mods.each(Mod::init); + mods.eachClass(Mod::init); Events.fire(new ServerLoadEvent()); } From a560978dcfca44ce3583965f84b06db485e48b1f Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 14:30:28 -0500 Subject: [PATCH 090/107] Sync fixes / Fixed linear filtering resetting on mod load --- core/src/io/anuke/mindustry/mod/Mods.java | 1 + core/src/io/anuke/mindustry/world/modules/LiquidModule.java | 1 + core/src/io/anuke/mindustry/world/modules/PowerModule.java | 1 + 3 files changed, 3 insertions(+) diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index e7067f850d..8ce30427c7 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -429,6 +429,7 @@ public class Mods implements Loadable{ content.load(); content.loadColors(); data.load(); + Core.atlas.getTextures().each(t -> t.setFilter(Core.settings.getBool("linear") ? TextureFilter.Linear : TextureFilter.Nearest)); requiresReload = false; Events.fire(new ContentReloadEvent()); diff --git a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java b/core/src/io/anuke/mindustry/world/modules/LiquidModule.java index e597be1b66..c0cce49dac 100644 --- a/core/src/io/anuke/mindustry/world/modules/LiquidModule.java +++ b/core/src/io/anuke/mindustry/world/modules/LiquidModule.java @@ -101,6 +101,7 @@ public class LiquidModule extends BlockModule{ @Override public void read(DataInput stream) throws IOException{ + Arrays.fill(liquids, 0); byte count = stream.readByte(); for(int j = 0; j < count; j++){ diff --git a/core/src/io/anuke/mindustry/world/modules/PowerModule.java b/core/src/io/anuke/mindustry/world/modules/PowerModule.java index ad1a958fb7..f0c76e2aaf 100644 --- a/core/src/io/anuke/mindustry/world/modules/PowerModule.java +++ b/core/src/io/anuke/mindustry/world/modules/PowerModule.java @@ -28,6 +28,7 @@ public class PowerModule extends BlockModule{ @Override public void read(DataInput stream) throws IOException{ + links.clear(); short amount = stream.readShort(); for(int i = 0; i < amount; i++){ links.add(stream.readInt()); From ab21b8800134db8f51ab9648e95c26c46f34d8f3 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 15:22:19 -0500 Subject: [PATCH 091/107] Mod sort fix --- core/src/io/anuke/mindustry/mod/Mods.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 8ce30427c7..4ffbf3ecbc 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -257,8 +257,8 @@ public class Mods implements Loadable{ } private void sortMods(){ - //sort mods to make sure servers handle them properly. - mods.sort(Structs.comps(Structs.comparingInt(m -> -m.state.ordinal()), Structs.comparing(m -> m.name))); + //sort mods to make sure servers handle them properly and they appear correctly in the dialog + mods.sort(Structs.comps(Structs.comparingInt(m -> m.state.ordinal()), Structs.comparing(m -> m.name))); } private void resolveModState(){ From 7d2354a65360c5606d464bc3ffd0581137649478 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 16:00:50 -0500 Subject: [PATCH 092/107] Mod path resolving fixes --- core/src/io/anuke/mindustry/core/FileTree.java | 2 ++ core/src/io/anuke/mindustry/input/DesktopInput.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 2 +- gradle.properties | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/FileTree.java b/core/src/io/anuke/mindustry/core/FileTree.java index e6d7e78086..29925b52d7 100644 --- a/core/src/io/anuke/mindustry/core/FileTree.java +++ b/core/src/io/anuke/mindustry/core/FileTree.java @@ -17,6 +17,8 @@ public class FileTree implements FileHandleResolver{ public FileHandle get(String path){ if(files.containsKey(path)){ return files.get(path); + }else if(files.containsKey("/" + path)){ + return files.get("/" + path); }else{ return Core.files.internal(path); } diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index f9fa0dc7cd..bc9536f360 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -150,7 +150,7 @@ public class DesktopInput extends InputHandler{ if(state.is(State.menu) || Core.scene.hasDialog()) return; //zoom camera - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ + if(!Core.scene.hasScroll() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 4ffbf3ecbc..0f837149a8 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -663,7 +663,7 @@ public class Mods implements Loadable{ /** Content with intialization code. */ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ - public ModState state = ModState.disabled; + public ModState state = ModState.enabled; public LoadedMod(FileHandle file, FileHandle root, Mod main, ModMeta meta){ this.root = root; diff --git a/gradle.properties b/gradle.properties index f27e1a0348..0b7dba8455 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=3076d3a079f4bf388432c40d8e6c4bf9927dce9a +archash=60d97c3e52131d2d8be45a1d2f1bfe19c2e343a2 From 9f3dcdf727f459476449aa2105403d284dfdd257 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 16:29:11 -0500 Subject: [PATCH 093/107] Fixed #1215 - made all valid floors show up in drill mine list --- .../world/blocks/production/Drill.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 865fb8aea7..1ef45a3c2f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -14,7 +14,6 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Cicon; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; @@ -179,23 +178,23 @@ public class Drill extends Block{ super.setStats(); stats.add(BlockStat.drillTier, table -> { - Array list = new Array<>(); + Array list = content.blocks().select(b -> b.isFloor() && b.asFloor().itemDrop != null && b.asFloor().itemDrop.hardness <= tier); - for(Item item : content.items()){ - if(tier >= item.hardness && Core.atlas.has(item.name + "1")){ - list.add(item); + table.table(l -> { + l.left(); + + for(int i = 0; i < list.size; i++){ + Block item = list.get(i); + + l.addImage(item.icon(Cicon.small)).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); + l.add(item.localizedName).left().padLeft(1).padRight(4); + if(i % 5 == 4){ + l.row(); + } } - } + }); - for(int i = 0; i < list.size; i++){ - Item item = list.get(i); - table.addImage(Core.atlas.find(item.name + "1")).size(8 * 3).padRight(2).padLeft(2).padTop(3).padBottom(3); - table.add(item.localizedName); - if(i != list.size - 1){ - table.add("/").padLeft(5).padRight(5); - } - } }); stats.add(BlockStat.drillSpeed, 60f / drillTime * size * size, StatUnit.itemsSecond); From 18bb7ba9366732738fca8cf80caafcade1e013f9 Mon Sep 17 00:00:00 2001 From: joshuaptfan Date: Sun, 15 Dec 2019 14:26:13 -0800 Subject: [PATCH 094/107] Prevent right-click from deconstructing when schematic is selected; allow deconstruct cancel with left-click --- .../io/anuke/mindustry/input/DesktopInput.java | 16 ++++++++-------- .../io/anuke/mindustry/input/MobileInput.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index bc9536f360..cf7b3de6d5 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -150,7 +150,7 @@ public class DesktopInput extends InputHandler{ if(state.is(State.menu) || Core.scene.hasDialog()) return; //zoom camera - if(!Core.scene.hasScroll() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ + if(!Core.scene.hasScroll() && Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } @@ -166,11 +166,6 @@ public class DesktopInput extends InputHandler{ mode = none; } - if(mode != none || isPlacing()){ - selectRequests.clear(); - lastSchematic = null; - } - if(player.isShooting && !canShoot()){ player.isShooting = false; } @@ -354,7 +349,9 @@ public class DesktopInput extends InputHandler{ if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ BuildRequest req = getRequest(cursorX, cursorY); - if(!selectRequests.isEmpty()){ + if(Core.input.keyDown(Binding.break_block)){ + mode = none; + }else if(!selectRequests.isEmpty()){ flushRequests(selectRequests); }else if(isPlacing()){ selectX = cursorX; @@ -376,9 +373,12 @@ public class DesktopInput extends InputHandler{ }else if(!Core.scene.hasKeyboard()){ //if it's out of bounds, shooting is just fine player.isShooting = true; } - }else if(Core.input.keyTap(Binding.deselect) && block != null){ + }else if(Core.input.keyTap(Binding.deselect) && isPlacing()){ block = null; mode = none; + }else if(Core.input.keyTap(Binding.deselect) && !selectRequests.isEmpty()){ + selectRequests.clear(); + lastSchematic = null; }else if(Core.input.keyTap(Binding.break_block) && !Core.scene.hasMouse()){ //is recalculated because setting the mode to breaking removes potential multiblock cursor offset deleting = false; diff --git a/core/src/io/anuke/mindustry/input/MobileInput.java b/core/src/io/anuke/mindustry/input/MobileInput.java index 26cf3fcd09..b057156719 100644 --- a/core/src/io/anuke/mindustry/input/MobileInput.java +++ b/core/src/io/anuke/mindustry/input/MobileInput.java @@ -588,7 +588,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //zoom camera - if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((block == null || !block.rotate) && selectRequests.isEmpty()))){ + if(Math.abs(Core.input.axisTap(Binding.zoom)) > 0 && !Core.input.keyDown(Binding.rotateplaced) && (Core.input.keyDown(Binding.diagonal_placement) || ((!isPlacing() || !block.rotate) && selectRequests.isEmpty()))){ renderer.scaleCamera(Core.input.axisTap(Binding.zoom)); } From 53aedcee2c3d007875f68c19165b6ebd29e9b5a8 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 19:35:04 -0500 Subject: [PATCH 095/107] Cleanup --- .../anuke/mindustry/mod/ModCrashHandler.java | 57 ------------------- .../io/anuke/mindustry/net/CrashSender.java | 12 +++- 2 files changed, 10 insertions(+), 59 deletions(-) delete mode 100644 core/src/io/anuke/mindustry/mod/ModCrashHandler.java diff --git a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java b/core/src/io/anuke/mindustry/mod/ModCrashHandler.java deleted file mode 100644 index 507057acad..0000000000 --- a/core/src/io/anuke/mindustry/mod/ModCrashHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package io.anuke.mindustry.mod; - -public class ModCrashHandler{ - - public static void handle(Throwable t){ - /* - Array list = Strings.getCauses(t); - Throwable modCause = list.find(e -> e instanceof ModLoadException); - - if(modCause != null && Fonts.outline != null){ - String text = "[scarlet][[A fatal crash has occured while loading a mod!][]\n\nReason:[accent] " + modCause.getMessage(); - String bottom = "[scarlet]The associated mod has been disabled. Swipe out of the app and launch it again."; - GlyphLayout layout = new GlyphLayout(); - Core.atlas = TextureAtlas.blankAtlas(); - Colors.put("accent", Pal.accent); - - Core.app.addListener(new ApplicationListener(){ - @Override - public void update(){ - Core.graphics.clear(0.1f, 0.1f, 0.1f, 1f); - float rad = Math.min(Core.graphics.getWidth(), Core.graphics.getHeight()) / 2f / 1.3f; - Draw.color(Color.scarlet, Color.black, Mathf.absin(Core.graphics.getFrameId(), 15f, 0.6f)); - Lines.stroke(Scl.scl(40f)); - //Lines.poly2(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, 3, rad, 0f); - float cx = Core.graphics.getWidth()/2f, cy = Core.graphics.getHeight()/2f; - for(int i = 0; i < 3; i++){ - float angle1 = i * 120f + 90f; - float angle2 = (i + 1) * 120f + 90f; - Tmp.v1.trnsExact(angle1, rad - Lines.getStroke()/2f).add(cx, cy); - Tmp.v2.trnsExact(angle2, rad - Lines.getStroke()/2f).add(cx, cy); - Tmp.v3.trnsExact(angle1, rad + Lines.getStroke()/2f).add(cx, cy); - Tmp.v4.trnsExact(angle2, rad + Lines.getStroke()/2f).add(cx, cy); - Fill.quad(Tmp.v1.x, Tmp.v1.y, Tmp.v2.x, Tmp.v2.y, Tmp.v4.x, Tmp.v4.y, Tmp.v3.x, Tmp.v3.y); - } - Lines.lineAngleCenter(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f - Scl.scl(5f), 90f, rad/3.1f); - Fill.square(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f + rad/2f - Scl.scl(15f), Lines.getStroke()/2f); - Draw.reset(); - - Fonts.outline.getData().markupEnabled = true; - layout.setText(Fonts.outline, text, Color.white, Core.graphics.getWidth(), Align.left, true); - Fonts.outline.draw(text, Core.graphics.getWidth()/2f - layout.width/2f, Core.graphics.getHeight() - Scl.scl(50f), Core.graphics.getWidth(), Align.left, true); - - layout.setText(Fonts.outline, bottom, Color.white, Core.graphics.getWidth(), Align.left, true); - Fonts.outline.draw(bottom, Core.graphics.getWidth()/2f - layout.width/2f, layout.height + Scl.scl(10f), Core.graphics.getWidth(), Align.left, true); - Draw.flush(); - } - - @Override - public void resize(int width, int height){ - Draw.proj().setOrtho(0, 0, width, height); - } - }); - }else{ - throw new RuntimeException(t); - }*/ - } -} diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index 21b12bf3d8..1c51f04154 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -44,8 +44,8 @@ public class CrashSender{ }else{ Version.build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; } - }catch(Throwable ignored){ - ignored.printStackTrace(); + }catch(Throwable e){ + e.printStackTrace(); Log.err("Failed to parse version."); } } @@ -69,6 +69,14 @@ public class CrashSender{ //if there's no settings init we don't know what the user wants but chances are it's an important crash, so send it anyway } + try{ + //check any mods - if there are any, don't send reports + if(Vars.mods != null && !Vars.mods.list().isEmpty()){ + return; + } + }catch(Throwable ignored){ + } + //do not send exceptions that occur for versions that can't be parsed if(Version.number == 0){ return; From 0cf39bf5c335ff23291960220ef6d32a751e0a6d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 20:01:06 -0500 Subject: [PATCH 096/107] Eliminated 8 characters --- .../io/anuke/mindustry/AndroidLauncher.java | 10 +-- core/src/io/anuke/mindustry/Vars.java | 20 +++--- .../src/io/anuke/mindustry/core/FileTree.java | 8 +-- .../src/io/anuke/mindustry/core/Platform.java | 6 +- .../src/io/anuke/mindustry/core/Renderer.java | 2 +- core/src/io/anuke/mindustry/core/UI.java | 2 +- core/src/io/anuke/mindustry/core/Version.java | 2 +- .../src/io/anuke/mindustry/ctype/Content.java | 3 +- .../io/anuke/mindustry/editor/MapEditor.java | 4 +- .../mindustry/editor/MapEditorDialog.java | 4 +- .../io/anuke/mindustry/game/GlobalData.java | 14 ++-- core/src/io/anuke/mindustry/game/Saves.java | 22 +++--- .../io/anuke/mindustry/game/Schematic.java | 11 +-- .../io/anuke/mindustry/game/Schematics.java | 12 ++-- .../io/anuke/mindustry/io/LegacyMapIO.java | 8 +-- core/src/io/anuke/mindustry/io/MapIO.java | 6 +- core/src/io/anuke/mindustry/io/SaveIO.java | 26 +++---- .../anuke/mindustry/io/SavePreviewLoader.java | 2 +- core/src/io/anuke/mindustry/maps/Map.java | 18 ++--- .../mindustry/maps/MapPreviewLoader.java | 6 +- core/src/io/anuke/mindustry/maps/Maps.java | 18 ++--- .../io/anuke/mindustry/mod/ContentParser.java | 6 +- core/src/io/anuke/mindustry/mod/Mod.java | 2 +- core/src/io/anuke/mindustry/mod/Mods.java | 70 +++++++++---------- core/src/io/anuke/mindustry/mod/Scripts.java | 2 +- .../io/anuke/mindustry/net/CrashSender.java | 8 +-- .../io/anuke/mindustry/type/Publishable.java | 4 +- .../mindustry/ui/dialogs/FileChooser.java | 26 +++---- .../mindustry/ui/dialogs/LoadDialog.java | 2 +- .../mindustry/ui/dialogs/ModsDialog.java | 2 +- .../ui/dialogs/SettingsMenuDialog.java | 4 +- .../mindustry/desktop/DesktopLauncher.java | 6 +- .../mindustry/desktop/steam/SWorkshop.java | 8 +-- gradle.properties | 2 +- ios/src/io/anuke/mindustry/IOSLauncher.java | 12 ++-- .../anuke/mindustry/server/ServerControl.java | 10 +-- .../mindustry/server/ServerLauncher.java | 4 +- .../mindustry/tools/ScriptStubGenerator.java | 6 +- .../anuke/mindustry/tools/SquareMarcher.java | 4 +- .../io/anuke/mindustry/tools/Upscaler.java | 6 +- 40 files changed, 195 insertions(+), 193 deletions(-) diff --git a/android/src/io/anuke/mindustry/AndroidLauncher.java b/android/src/io/anuke/mindustry/AndroidLauncher.java index e34e7ee1c4..25119c3572 100644 --- a/android/src/io/anuke/mindustry/AndroidLauncher.java +++ b/android/src/io/anuke/mindustry/AndroidLauncher.java @@ -70,11 +70,11 @@ public class AndroidLauncher extends AndroidApplication{ } @Override - public void shareFile(FileHandle file){ + public void shareFile(Fi file){ } @Override - public void showFileChooser(boolean open, String extension, Cons cons){ + public void showFileChooser(boolean open, String extension, Cons cons){ if(VERSION.SDK_INT >= VERSION_CODES.Q){ Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); @@ -85,7 +85,7 @@ public class AndroidLauncher extends AndroidApplication{ if(uri.getPath().contains("(invalid)")) return; - Core.app.post(() -> Core.app.post(() -> cons.get(new FileHandle(uri.getPath()){ + Core.app.post(() -> Core.app.post(() -> cons.get(new Fi(uri.getPath()){ @Override public InputStream read(){ try{ @@ -185,7 +185,7 @@ public class AndroidLauncher extends AndroidApplication{ Core.app.post(() -> Core.app.post(() -> { if(save){ //open save System.out.println("Opening save."); - FileHandle file = Core.files.local("temp-save." + saveExtension); + Fi file = Core.files.local("temp-save." + saveExtension); file.write(inStream, false); if(SaveIO.isSaveValid(file)){ try{ @@ -198,7 +198,7 @@ public class AndroidLauncher extends AndroidApplication{ ui.showErrorMessage("$save.import.invalid"); } }else if(map){ //open map - FileHandle file = Core.files.local("temp-map." + mapExtension); + Fi file = Core.files.local("temp-map." + mapExtension); file.write(inStream, false); Core.app.post(() -> { System.out.println("Opening map."); diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index ef6f1acd7a..134865bee2 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -125,21 +125,21 @@ public class Vars implements Loadable{ /** whether typing into the console is enabled - developers only */ public static boolean enableConsole = false; /** application data directory, equivalent to {@link io.anuke.arc.Settings#getDataDirectory()} */ - public static FileHandle dataDirectory; + public static Fi dataDirectory; /** data subdirectory used for screenshots */ - public static FileHandle screenshotDirectory; + public static Fi screenshotDirectory; /** data subdirectory used for custom mmaps */ - public static FileHandle customMapDirectory; + public static Fi customMapDirectory; /** data subdirectory used for custom mmaps */ - public static FileHandle mapPreviewDirectory; + public static Fi mapPreviewDirectory; /** tmp subdirectory for map conversion */ - public static FileHandle tmpDirectory; + public static Fi tmpDirectory; /** data subdirectory used for saves */ - public static FileHandle saveDirectory; + public static Fi saveDirectory; /** data subdirectory used for mods */ - public static FileHandle modDirectory; + public static Fi modDirectory; /** data subdirectory used for schematics */ - public static FileHandle schematicDirectory; + public static Fi schematicDirectory; /** map file extension */ public static final String mapExtension = "msav"; /** save file extension */ @@ -317,7 +317,7 @@ public class Vars implements Loadable{ try{ //try loading external bundle - FileHandle handle = Core.files.local("bundle"); + Fi handle = Core.files.local("bundle"); Locale locale = Locale.ENGLISH; Core.bundle = I18NBundle.createBundle(handle, locale); @@ -330,7 +330,7 @@ public class Vars implements Loadable{ }catch(Throwable e){ //no external bundle found - FileHandle handle = Core.files.internal("bundles/bundle"); + Fi handle = Core.files.internal("bundles/bundle"); Locale locale; String loc = Core.settings.getString("locale"); if(loc.equals("default")){ diff --git a/core/src/io/anuke/mindustry/core/FileTree.java b/core/src/io/anuke/mindustry/core/FileTree.java index 29925b52d7..cd201c5337 100644 --- a/core/src/io/anuke/mindustry/core/FileTree.java +++ b/core/src/io/anuke/mindustry/core/FileTree.java @@ -7,14 +7,14 @@ import io.anuke.arc.files.*; /** Handles files in a modded context. */ public class FileTree implements FileHandleResolver{ - private ObjectMap files = new ObjectMap<>(); + private ObjectMap files = new ObjectMap<>(); - public void addFile(String path, FileHandle f){ + public void addFile(String path, Fi f){ files.put(path, f); } /** Gets an asset file.*/ - public FileHandle get(String path){ + public Fi get(String path){ if(files.containsKey(path)){ return files.get(path); }else if(files.containsKey("/" + path)){ @@ -30,7 +30,7 @@ public class FileTree implements FileHandleResolver{ } @Override - public FileHandle resolve(String fileName){ + public Fi resolve(String fileName){ return get(fileName); } } diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index e123406811..0cfb72a058 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -35,7 +35,7 @@ public interface Platform{ default void viewListingID(String mapid){} /** Steam: Return external workshop maps to be loaded.*/ - default Array getWorkshopContent(Class type){ + default Array getWorkshopContent(Class type){ return new Array<>(0); } @@ -100,7 +100,7 @@ public interface Platform{ } /** Only used for iOS or android: open the share menu for a map or save. */ - default void shareFile(FileHandle file){ + default void shareFile(Fi file){ } /** @@ -109,7 +109,7 @@ public interface Platform{ * @param open Whether to open or save files * @param extension File extension to filter */ - default void showFileChooser(boolean open, String extension, Cons cons){ + default void showFileChooser(boolean open, String extension, Cons cons){ new FileChooser(open ? "$open" : "$save", file -> file.extension().toLowerCase().equals(extension), open, file -> { if(!open){ cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 4a50b04275..c8cf2b1063 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -456,7 +456,7 @@ public class Renderer implements ApplicationListener{ buffer.end(); Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); BufferUtils.copy(lines, 0, fullPixmap.getPixels(), lines.length); - FileHandle file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); + Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); PixmapIO.writePNG(file, fullPixmap); fullPixmap.dispose(); ui.showInfoFade(Core.bundle.format("screenshot", file.toString())); diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index f8d5774dd6..9b0af80f52 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -138,7 +138,7 @@ public class UI implements ApplicationListener, Loadable{ Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){ @Override - public BitmapFont loadSync(AssetManager manager, String fileName, FileHandle file, FreeTypeFontLoaderParameter parameter){ + public BitmapFont loadSync(AssetManager manager, String fileName, Fi file, FreeTypeFontLoaderParameter parameter){ if(fileName.equals("outline")){ parameter.fontParameters.borderWidth = Scl.scl(2f); parameter.fontParameters.spaceX -= parameter.fontParameters.borderWidth; diff --git a/core/src/io/anuke/mindustry/core/Version.java b/core/src/io/anuke/mindustry/core/Version.java index 9d774c47c8..c2b3c515e4 100644 --- a/core/src/io/anuke/mindustry/core/Version.java +++ b/core/src/io/anuke/mindustry/core/Version.java @@ -27,7 +27,7 @@ public class Version{ if(!enabled) return; try{ - FileHandle file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new FileHandle("version.properties", FileType.Internal); + Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.Internal); ObjectMap map = new ObjectMap<>(); PropertiesUtils.load(map, file.reader()); diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java index a4aa945443..2cd7725970 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -54,7 +54,8 @@ public abstract class Content implements Comparable{ /** The mod that loaded this piece of content. */ public @Nullable LoadedMod mod; /** File that this content was loaded from. */ - public @Nullable FileHandle sourceFile; + public @Nullable + Fi sourceFile; /** The error that occurred during loading, if applicable. Null if no error occurred. */ public @Nullable String error; } diff --git a/core/src/io/anuke/mindustry/editor/MapEditor.java b/core/src/io/anuke/mindustry/editor/MapEditor.java index d8e8d60206..40b44d2b12 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditor.java +++ b/core/src/io/anuke/mindustry/editor/MapEditor.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.editor; import io.anuke.arc.collection.StringMap; -import io.anuke.arc.files.FileHandle; +import io.anuke.arc.files.Fi; import io.anuke.arc.func.Cons; import io.anuke.arc.func.Boolf; import io.anuke.arc.graphics.Pixmap; @@ -109,7 +109,7 @@ public class MapEditor{ } } - public Map createMap(FileHandle file){ + public Map createMap(Fi file){ return new Map(file, width(), height(), new StringMap(tags), true); } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 6c24f387a9..b8745052a0 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -133,7 +133,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ }else{ ui.loadAnd(() -> { try{ - FileHandle result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension); + Fi result = Core.files.local(editor.getTags().get("name", "unknown") + "." + mapExtension); MapIO.writeMap(result, editor.createMap(result)); platform.shareFile(result); }catch(Exception e){ @@ -381,7 +381,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ editor.renderer().dispose(); } - public void beginEditMap(FileHandle file){ + public void beginEditMap(Fi file){ ui.loadAnd(() -> { try{ shownWithMap = true; diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index 999df06713..d211683e2c 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -35,8 +35,8 @@ public class GlobalData{ }); } - public void exportData(FileHandle file) throws IOException{ - Array files = new Array<>(); + public void exportData(Fi file) throws IOException{ + Array files = new Array<>(); files.add(Core.settings.getSettingsFile()); files.addAll(customMapDirectory.list()); files.addAll(saveDirectory.list()); @@ -46,7 +46,7 @@ public class GlobalData{ String base = Core.settings.getDataDirectory().path(); try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ - for(FileHandle add : files){ + for(Fi add : files){ if(add.isDirectory()) continue; zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); Streams.copyStream(add.read(), zos); @@ -56,12 +56,12 @@ public class GlobalData{ } } - public void importData(FileHandle file){ - FileHandle dest = Core.files.local("zipdata.zip"); + public void importData(Fi file){ + Fi dest = Core.files.local("zipdata.zip"); file.copyTo(dest); - FileHandle zipped = new ZipFileHandle(dest); + Fi zipped = new ZipFi(dest); - FileHandle base = Core.settings.getDataDirectory(); + Fi base = Core.settings.getDataDirectory(); if(!zipped.child("settings.bin").exists()){ throw new IllegalArgumentException("Not valid save data."); } diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 25bc7720c9..911fb5d558 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -27,7 +27,7 @@ public class Saves{ private AsyncExecutor previewExecutor = new AsyncExecutor(1); private boolean saving; private float time; - private FileHandle zoneFile; + private Fi zoneFile; private long totalPlaytime; private long lastTimestamp; @@ -48,7 +48,7 @@ public class Saves{ saves.clear(); zoneFile = saveDirectory.child("-1.msav"); - for(FileHandle file : saveDirectory.list()){ + for(Fi file : saveDirectory.list()){ if(!file.name().contains("backup") && SaveIO.isSaveValid(file)){ SaveSlot slot = new SaveSlot(file); saves.add(slot); @@ -121,7 +121,7 @@ public class Saves{ return slot; } - public SaveSlot importSave(FileHandle file) throws IOException{ + public SaveSlot importSave(Fi file) throws IOException{ SaveSlot slot = new SaveSlot(getNextSlotFile()); slot.importFile(file); slot.setName(file.nameWithoutExtension()); @@ -136,9 +136,9 @@ public class Saves{ return slot == null || slot.getZone() == null ? null : slot; } - public FileHandle getNextSlotFile(){ + public Fi getNextSlotFile(){ int i = 0; - FileHandle file; + Fi file; while((file = saveDirectory.child(i + "." + saveExtension)).exists()){ i ++; } @@ -151,11 +151,11 @@ public class Saves{ public class SaveSlot{ //public final int index; - public final FileHandle file; + public final Fi file; boolean requestedPreview; SaveMeta meta; - public SaveSlot(FileHandle file){ + public SaveSlot(Fi file){ this.file = file; } @@ -216,11 +216,11 @@ public class Saves{ return file.nameWithoutExtension(); } - private FileHandle previewFile(){ + private Fi previewFile(){ return mapPreviewDirectory.child("save_slot_" + index() + ".png"); } - private FileHandle loadPreviewFile(){ + private Fi loadPreviewFile(){ return previewFile().sibling(previewFile().name() + ".spreview"); } @@ -293,7 +293,7 @@ public class Saves{ Core.settings.save(); } - public void importFile(FileHandle from) throws IOException{ + public void importFile(Fi from) throws IOException{ try{ from.copyTo(file); }catch(Exception e){ @@ -301,7 +301,7 @@ public class Saves{ } } - public void exportFile(FileHandle to) throws IOException{ + public void exportFile(Fi to) throws IOException{ try{ file.copyTo(to); }catch(Exception e){ diff --git a/core/src/io/anuke/mindustry/game/Schematic.java b/core/src/io/anuke/mindustry/game/Schematic.java index 4c83623602..32395fcf54 100644 --- a/core/src/io/anuke/mindustry/game/Schematic.java +++ b/core/src/io/anuke/mindustry/game/Schematic.java @@ -16,7 +16,8 @@ public class Schematic implements Publishable, Comparable{ public final Array tiles; public StringMap tags; public int width, height; - public @Nullable FileHandle file; + public @Nullable + Fi file; /** Associated mod. If null, no mod is associated with this schematic. */ public @Nullable LoadedMod mod; @@ -94,15 +95,15 @@ public class Schematic implements Publishable, Comparable{ } @Override - public FileHandle createSteamFolder(String id){ - FileHandle directory = tmpDirectory.child("schematic_" + id).child("schematic." + schematicExtension); + public Fi createSteamFolder(String id){ + Fi directory = tmpDirectory.child("schematic_" + id).child("schematic." + schematicExtension); file.copyTo(directory); return directory; } @Override - public FileHandle createSteamPreview(String id){ - FileHandle preview = tmpDirectory.child("schematic_preview_" + id + ".png"); + public Fi createSteamPreview(String id){ + Fi preview = tmpDirectory.child("schematic_preview_" + id + ".png"); schematics.savePreview(this, preview); return preview; } diff --git a/core/src/io/anuke/mindustry/game/Schematics.java b/core/src/io/anuke/mindustry/game/Schematics.java index 51753333bb..326c199d05 100644 --- a/core/src/io/anuke/mindustry/game/Schematics.java +++ b/core/src/io/anuke/mindustry/game/Schematics.java @@ -69,7 +69,7 @@ public class Schematics implements Loadable{ public void load(){ all.clear(); - for(FileHandle file : schematicDirectory.list()){ + for(Fi file : schematicDirectory.list()){ loadFile(file); } @@ -111,7 +111,7 @@ public class Schematics implements Loadable{ } } - private @Nullable Schematic loadFile(FileHandle file){ + private @Nullable Schematic loadFile(Fi file){ if(!file.extension().equals(schematicExtension)) return null; try{ @@ -144,7 +144,7 @@ public class Schematics implements Loadable{ } } - public void savePreview(Schematic schematic, FileHandle file){ + public void savePreview(Schematic schematic, Fi file){ FrameBuffer buffer = getBuffer(schematic); Draw.flush(); buffer.begin(); @@ -272,7 +272,7 @@ public class Schematics implements Loadable{ public void add(Schematic schematic){ all.add(schematic); try{ - FileHandle file = schematicDirectory.child(Time.millis() + "." + schematicExtension); + Fi file = schematicDirectory.child(Time.millis() + "." + schematicExtension); write(schematic, file); schematic.file = file; }catch(Exception e){ @@ -372,7 +372,7 @@ public class Schematics implements Loadable{ return read(new ByteArrayInputStream(Base64Coder.decode(schematic))); } - public static Schematic read(FileHandle file) throws IOException{ + public static Schematic read(Fi file) throws IOException{ Schematic s = read(new DataInputStream(file.read(1024))); if(!s.tags.containsKey("name")){ s.tags.put("name", file.nameWithoutExtension()); @@ -425,7 +425,7 @@ public class Schematics implements Loadable{ } } - public static void write(Schematic schematic, FileHandle file) throws IOException{ + public static void write(Schematic schematic, Fi file) throws IOException{ write(schematic, file.write(false, 1024)); } diff --git a/core/src/io/anuke/mindustry/io/LegacyMapIO.java b/core/src/io/anuke/mindustry/io/LegacyMapIO.java index 650b58c22d..9dbb2bed01 100644 --- a/core/src/io/anuke/mindustry/io/LegacyMapIO.java +++ b/core/src/io/anuke/mindustry/io/LegacyMapIO.java @@ -26,7 +26,7 @@ public class LegacyMapIO{ private static final Json json = new Json(); /* Convert a map from the old format to the new format. */ - public static void convertMap(FileHandle in, FileHandle out) throws IOException{ + public static void convertMap(Fi in, Fi out) throws IOException{ Map map = readMap(in, true); String waves = map.tags.get("waves", "[]"); @@ -45,7 +45,7 @@ public class LegacyMapIO{ MapIO.writeMap(out, map); } - public static Map readMap(FileHandle file, boolean custom) throws IOException{ + public static Map readMap(Fi file, boolean custom) throws IOException{ try(DataInputStream stream = new DataInputStream(file.read(1024))){ StringMap tags = new StringMap(); @@ -76,11 +76,11 @@ public class LegacyMapIO{ readTiles(map.file, map.width, map.height, tiles); } - private static void readTiles(FileHandle file, int width, int height, Tile[][] tiles) throws IOException{ + private static void readTiles(Fi file, int width, int height, Tile[][] tiles) throws IOException{ readTiles(file, width, height, (x, y) -> tiles[x][y]); } - private static void readTiles(FileHandle file, int width, int height, TileProvider tiles) throws IOException{ + private static void readTiles(Fi file, int width, int height, TileProvider tiles) throws IOException{ try(BufferedInputStream input = file.read(bufferSize)){ //read map diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index da24c1d8d7..bf309505bd 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -22,7 +22,7 @@ import static io.anuke.mindustry.Vars.*; public class MapIO{ private static final int[] pngHeader = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; - public static boolean isImage(FileHandle file){ + public static boolean isImage(Fi file){ try(InputStream stream = file.read(32)){ for(int i1 : pngHeader){ if(stream.read() != i1){ @@ -35,7 +35,7 @@ public class MapIO{ } } - public static Map createMap(FileHandle file, boolean custom) throws IOException{ + public static Map createMap(Fi file, boolean custom) throws IOException{ try(InputStream is = new InflaterInputStream(file.read(bufferSize)); CounterInputStream counter = new CounterInputStream(is); DataInputStream stream = new DataInputStream(counter)){ SaveIO.readHeader(stream); int version = stream.readInt(); @@ -46,7 +46,7 @@ public class MapIO{ } } - public static void writeMap(FileHandle file, Map map) throws IOException{ + public static void writeMap(Fi file, Map map) throws IOException{ try{ SaveIO.write(file, map.tags); }catch(Exception e){ diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index 341682746f..6aa76d8ba9 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.io; import io.anuke.arc.collection.*; -import io.anuke.arc.files.FileHandle; +import io.anuke.arc.files.Fi; import io.anuke.arc.util.io.CounterInputStream; import io.anuke.arc.util.io.FastDeflaterOutputStream; import io.anuke.mindustry.Vars; @@ -34,7 +34,7 @@ public class SaveIO{ return versions.get(version); } - public static void save(FileHandle file){ + public static void save(Fi file){ boolean exists = file.exists(); if(exists) file.moveTo(backupFileFor(file)); try{ @@ -45,15 +45,15 @@ public class SaveIO{ } } - public static DataInputStream getStream(FileHandle file){ + public static DataInputStream getStream(Fi file){ return new DataInputStream(new InflaterInputStream(file.read(bufferSize))); } - public static DataInputStream getBackupStream(FileHandle file){ + public static DataInputStream getBackupStream(Fi file){ return new DataInputStream(new InflaterInputStream(backupFileFor(file).read(bufferSize))); } - public static boolean isSaveValid(FileHandle file){ + public static boolean isSaveValid(Fi file){ try{ return isSaveValid(new DataInputStream(new InflaterInputStream(file.read(bufferSize)))); }catch(Exception e){ @@ -71,7 +71,7 @@ public class SaveIO{ } } - public static SaveMeta getMeta(FileHandle file){ + public static SaveMeta getMeta(Fi file){ try{ return getMeta(getStream(file)); }catch(Exception e){ @@ -92,19 +92,19 @@ public class SaveIO{ } } - public static FileHandle fileFor(int slot){ + public static Fi fileFor(int slot){ return saveDirectory.child(slot + "." + Vars.saveExtension); } - public static FileHandle backupFileFor(FileHandle file){ + public static Fi backupFileFor(Fi file){ return file.sibling(file.name() + "-backup." + file.extension()); } - public static void write(FileHandle file, StringMap tags){ + public static void write(Fi file, StringMap tags){ write(new FastDeflaterOutputStream(file.write(false, bufferSize)), tags); } - public static void write(FileHandle file){ + public static void write(Fi file){ write(file, null); } @@ -122,17 +122,17 @@ public class SaveIO{ } } - public static void load(FileHandle file) throws SaveException{ + public static void load(Fi file) throws SaveException{ load(file, world.context); } - public static void load(FileHandle file, WorldContext context) throws SaveException{ + public static void load(Fi file, WorldContext context) throws SaveException{ try{ //try and load; if any exception at all occurs load(new InflaterInputStream(file.read(bufferSize)), context); }catch(SaveException e){ e.printStackTrace(); - FileHandle backup = file.sibling(file.name() + "-backup." + file.extension()); + Fi backup = file.sibling(file.name() + "-backup." + file.extension()); if(backup.exists()){ load(new InflaterInputStream(backup.read(bufferSize)), context); }else{ diff --git a/core/src/io/anuke/mindustry/io/SavePreviewLoader.java b/core/src/io/anuke/mindustry/io/SavePreviewLoader.java index 15bfd20277..f7038875bc 100644 --- a/core/src/io/anuke/mindustry/io/SavePreviewLoader.java +++ b/core/src/io/anuke/mindustry/io/SavePreviewLoader.java @@ -12,7 +12,7 @@ public class SavePreviewLoader extends TextureLoader{ } @Override - public void loadAsync(AssetManager manager, String fileName, FileHandle file, TextureParameter parameter){ + public void loadAsync(AssetManager manager, String fileName, Fi file, TextureParameter parameter){ try{ super.loadAsync(manager, fileName, file.sibling(file.nameWithoutExtension()), parameter); }catch(Exception e){ diff --git a/core/src/io/anuke/mindustry/maps/Map.java b/core/src/io/anuke/mindustry/maps/Map.java index 3bd66784c4..6fef24a8c4 100644 --- a/core/src/io/anuke/mindustry/maps/Map.java +++ b/core/src/io/anuke/mindustry/maps/Map.java @@ -22,7 +22,7 @@ public class Map implements Comparable, Publishable{ /** Metadata. Author description, display name, etc. */ public final StringMap tags; /** Base file of this map. File can be named anything at all. */ - public final FileHandle file; + public final Fi file; /** Format version. */ public final int version; /** Whether this map is managed, e.g. downloaded from the Steam workshop.*/ @@ -40,7 +40,7 @@ public class Map implements Comparable, Publishable{ /** Associated mod. If null, no mod is associated. */ public @Nullable LoadedMod mod; - public Map(FileHandle file, int width, int height, StringMap tags, boolean custom, int version, int build){ + public Map(Fi file, int width, int height, StringMap tags, boolean custom, int version, int build){ this.custom = custom; this.tags = tags; this.file = file; @@ -50,11 +50,11 @@ public class Map implements Comparable, Publishable{ this.build = build; } - public Map(FileHandle file, int width, int height, StringMap tags, boolean custom, int version){ + public Map(Fi file, int width, int height, StringMap tags, boolean custom, int version){ this(file, width, height, tags, custom, version, -1); } - public Map(FileHandle file, int width, int height, StringMap tags, boolean custom){ + public Map(Fi file, int width, int height, StringMap tags, boolean custom){ this(file, width, height, tags, custom, -1); } @@ -70,11 +70,11 @@ public class Map implements Comparable, Publishable{ return texture == null ? Core.assets.get("sprites/error.png") : texture; } - public FileHandle previewFile(){ + public Fi previewFile(){ return Vars.mapPreviewDirectory.child((workshop ? file.parent().name() : file.nameWithoutExtension()) + ".png"); } - public FileHandle cacheFile(){ + public Fi cacheFile(){ return Vars.mapPreviewDirectory.child(workshop ? file.parent().name() + "-workshop-cache.dat" : file.nameWithoutExtension() + "-cache.dat"); } @@ -184,14 +184,14 @@ public class Map implements Comparable, Publishable{ } @Override - public FileHandle createSteamFolder(String id){ - FileHandle mapFile = tmpDirectory.child("map_" + id).child("map.msav"); + public Fi createSteamFolder(String id){ + Fi mapFile = tmpDirectory.child("map_" + id).child("map.msav"); file.copyTo(mapFile); return mapFile.parent(); } @Override - public FileHandle createSteamPreview(String id){ + public Fi createSteamPreview(String id){ return previewFile(); } diff --git a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java index ad0afea0e2..a6f218cb7a 100644 --- a/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java +++ b/core/src/io/anuke/mindustry/maps/MapPreviewLoader.java @@ -17,7 +17,7 @@ public class MapPreviewLoader extends TextureLoader{ } @Override - public void loadAsync(AssetManager manager, String fileName, FileHandle file, TextureParameter parameter){ + public void loadAsync(AssetManager manager, String fileName, Fi file, TextureParameter parameter){ try{ super.loadAsync(manager, fileName, file.sibling(file.nameWithoutExtension()), parameter); }catch(Exception e){ @@ -28,7 +28,7 @@ public class MapPreviewLoader extends TextureLoader{ } @Override - public Texture loadSync(AssetManager manager, String fileName, FileHandle file, TextureParameter parameter){ + public Texture loadSync(AssetManager manager, String fileName, Fi file, TextureParameter parameter){ try{ return super.loadSync(manager, fileName, file, parameter); }catch(Throwable e){ @@ -43,7 +43,7 @@ public class MapPreviewLoader extends TextureLoader{ } @Override - public Array getDependencies(String fileName, FileHandle file, TextureParameter parameter){ + public Array getDependencies(String fileName, Fi file, TextureParameter parameter){ return Array.with(new AssetDescriptor<>("contentcreate", Content.class)); } diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index d54555ddd0..60cc313659 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -105,7 +105,7 @@ public class Maps{ * Does not add this map to the map list. */ public Map loadInternalMap(String name){ - FileHandle file = tree.get("maps/" + name + "." + mapExtension); + Fi file = tree.get("maps/" + name + "." + mapExtension); try{ return MapIO.createMap(file, false); @@ -119,7 +119,7 @@ public class Maps{ //defaults; must work try{ for(String name : defaultMapNames){ - FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension); + Fi file = Core.files.internal("maps/" + name + "." + mapExtension); loadMap(file, false); } }catch(IOException e){ @@ -127,7 +127,7 @@ public class Maps{ } //custom - for(FileHandle file : customMapDirectory.list()){ + for(Fi file : customMapDirectory.list()){ try{ if(file.extension().equalsIgnoreCase(mapExtension)){ loadMap(file, true); @@ -139,7 +139,7 @@ public class Maps{ } //workshop - for(FileHandle file : platform.getWorkshopContent(Map.class)){ + for(Fi file : platform.getWorkshopContent(Map.class)){ try{ Map map = loadMap(file, false); map.workshop = true; @@ -183,7 +183,7 @@ public class Maps{ StringMap tags = new StringMap(baseTags); String name = tags.get("name"); if(name == null) throw new IllegalArgumentException("Can't save a map with no name. How did this happen?"); - FileHandle file; + Fi file; //find map with the same exact display name Map other = maps.find(m -> m.name().equals(name)); @@ -244,8 +244,8 @@ public class Maps{ } /** Import a map, then save it. This updates all values and stored data necessary. */ - public void importMap(FileHandle file) throws IOException{ - FileHandle dest = findFile(); + public void importMap(Fi file) throws IOException{ + Fi dest = findFile(); file.copyTo(dest); Map map = loadMap(dest, true); @@ -446,7 +446,7 @@ public class Maps{ } /** Find a new filename to put a map to. */ - private FileHandle findFile(){ + private Fi findFile(){ //find a map name that isn't used. int i = maps.size; while(customMapDirectory.child("map_" + i + "." + mapExtension).exists()){ @@ -455,7 +455,7 @@ public class Maps{ return customMapDirectory.child("map_" + i + "." + mapExtension); } - private Map loadMap(FileHandle file, boolean custom) throws IOException{ + private Map loadMap(Fi file, boolean custom) throws IOException{ Map map = MapIO.createMap(file, custom); if(map.name() == null){ diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 1b1aa64c1d..af3d432640 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -405,7 +405,7 @@ public class ContentParser{ * @param file file that this content is being parsed from * @return the content that was parsed */ - public Content parse(LoadedMod mod, String name, String json, FileHandle file, ContentType type) throws Exception{ + public Content parse(LoadedMod mod, String name, String json, Fi file, ContentType type) throws Exception{ if(contentTypes.isEmpty()){ init(); } @@ -433,7 +433,7 @@ public class ContentParser{ return c; } - public void markError(Content content, LoadedMod mod, FileHandle file, Throwable error){ + public void markError(Content content, LoadedMod mod, Fi file, Throwable error){ content.minfo.mod = mod; content.minfo.sourceFile = file; content.minfo.error = makeError(error, file); @@ -448,7 +448,7 @@ public class ContentParser{ } } - private String makeError(Throwable t, FileHandle file){ + private String makeError(Throwable t, Fi file){ StringBuilder builder = new StringBuilder(); builder.append("[lightgray]").append("File: ").append(file.name()).append("[]\n\n"); diff --git a/core/src/io/anuke/mindustry/mod/Mod.java b/core/src/io/anuke/mindustry/mod/Mod.java index aa4d8198f5..5bab31b341 100644 --- a/core/src/io/anuke/mindustry/mod/Mod.java +++ b/core/src/io/anuke/mindustry/mod/Mod.java @@ -6,7 +6,7 @@ import io.anuke.mindustry.*; public class Mod{ /** @return the config file for this plugin, as the file 'mods/[plugin-name]/config.json'.*/ - public FileHandle getConfig(){ + public Fi getConfig(){ return Vars.mods.getConfig(this); } diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java index 0f837149a8..26a7b51955 100644 --- a/core/src/io/anuke/mindustry/mod/Mods.java +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -35,7 +35,7 @@ public class Mods implements Loadable{ private Json json = new Json(); private @Nullable Scripts scripts; private ContentParser parser = new ContentParser(); - private ObjectMap> bundles = new ObjectMap<>(); + private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites", "sprites-override"); private int totalSprites; @@ -52,18 +52,18 @@ public class Mods implements Loadable{ /** Returns a file named 'config.json' in a special folder for the specified plugin. * Call this in init(). */ - public FileHandle getConfig(Mod mod){ + public Fi getConfig(Mod mod){ ModMeta load = metas.get(mod.getClass()); if(load == null) throw new IllegalArgumentException("Mod is not loaded yet (or missing)!"); return modDirectory.child(load.name).child("config.json"); } /** Returns a list of files per mod subdirectory. */ - public void listFiles(String directory, Cons2 cons){ + public void listFiles(String directory, Cons2 cons){ eachEnabled(mod -> { - FileHandle file = mod.root.child(directory); + Fi file = mod.root.child(directory); if(file.exists()){ - for(FileHandle child : file.list()){ + for(Fi child : file.list()){ cons.get(mod, child); } } @@ -76,8 +76,8 @@ public class Mods implements Loadable{ } /** Imports an external mod file.*/ - public void importMod(FileHandle file) throws IOException{ - FileHandle dest = modDirectory.child(file.name()); + public void importMod(Fi file) throws IOException{ + Fi dest = modDirectory.child(file.name()); if(dest.exists()){ throw new IOException("A mod with the same filename already exists!"); } @@ -104,8 +104,8 @@ public class Mods implements Loadable{ packer = new MultiPacker(); eachEnabled(mod -> { - Array sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); - Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); + Array sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); + Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); packSprites(sprites, mod, true); packSprites(overrides, mod, false); Log.debug("Packed {0} images for mod '{1}'.", sprites.size + overrides.size, mod.meta.name); @@ -122,8 +122,8 @@ public class Mods implements Loadable{ Log.debug("Time to pack textures: {0}", Time.elapsed()); } - private void packSprites(Array sprites, LoadedMod mod, boolean prefix){ - for(FileHandle file : sprites){ + private void packSprites(Array sprites, LoadedMod mod, boolean prefix){ + for(Fi file : sprites){ try(InputStream stream = file.read()){ byte[] bytes = Streams.copyStreamToByteArray(stream, Math.max((int)file.length(), 512)); Pixmap pixmap = new Pixmap(bytes, 0, bytes.length); @@ -183,7 +183,7 @@ public class Mods implements Loadable{ PageType.main; } - private PageType getPage(FileHandle file){ + private PageType getPage(Fi file){ String parent = file.parent().name(); return parent.equals("environment") ? PageType.environment : @@ -195,7 +195,7 @@ public class Mods implements Loadable{ /** Removes a mod file and marks it for requiring a restart. */ public void removeMod(LoadedMod mod){ - if(mod.root instanceof ZipFileHandle){ + if(mod.root instanceof ZipFi){ mod.root.delete(); } @@ -225,7 +225,7 @@ public class Mods implements Loadable{ /** Loads all mods from the folder, but does not call any methods on them.*/ public void load(){ - for(FileHandle file : modDirectory.list()){ + for(Fi file : modDirectory.list()){ if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && (file.child("mod.json").exists() || file.child("mod.hjson").exists()))) continue; Log.debug("[Mods] Loading mod {0}", file); @@ -239,7 +239,7 @@ public class Mods implements Loadable{ } //load workshop mods now - for(FileHandle file : platform.getWorkshopContent(LoadedMod.class)){ + for(Fi file : platform.getWorkshopContent(LoadedMod.class)){ try{ LoadedMod mod = loadMod(file); mods.add(mod); @@ -311,7 +311,7 @@ public class Mods implements Loadable{ for(LoadedMod mod : orderedMods()){ boolean zipFolder = !mod.file.isDirectory() && mod.root.parent() != null; String parentName = zipFolder ? mod.root.name() : null; - for(FileHandle file : mod.root.list()){ + for(Fi file : mod.root.list()){ //ignore special folders like bundles or sprites if(file.isDirectory() && !specialFolders.contains(file.name())){ //TODO calling child/parent on these files will give you gibberish; create wrapper class. @@ -321,9 +321,9 @@ public class Mods implements Loadable{ } //load up bundles. - FileHandle folder = mod.root.child("bundles"); + Fi folder = mod.root.child("bundles"); if(folder.exists()){ - for(FileHandle file : folder.list()){ + for(Fi file : folder.list()){ if(file.name().startsWith("bundle") && file.extension().equals("properties")){ String name = file.nameWithoutExtension(); bundles.getOr(name, Array::new).add(file); @@ -337,7 +337,7 @@ public class Mods implements Loadable{ while(bundle != null){ String str = bundle.getLocale().toString(); String locale = "bundle" + (str.isEmpty() ? "" : "_" + str); - for(FileHandle file : bundles.getOr(locale, Array::new)){ + for(Fi file : bundles.getOr(locale, Array::new)){ try{ PropertiesUtils.load(bundle.getProperties(), file.reader()); }catch(Exception e){ @@ -446,7 +446,7 @@ public class Mods implements Loadable{ mod.scripts = mod.root.child("scripts").findAll(f -> f.extension().equals("js")); Log.debug("[{0}] Found {1} scripts.", mod.meta.name, mod.scripts.size); - for(FileHandle file : mod.scripts){ + for(Fi file : mod.scripts){ try{ if(scripts == null){ scripts = platform.createScripts(); @@ -474,10 +474,10 @@ public class Mods implements Loadable{ class LoadRun implements Comparable{ final ContentType type; - final FileHandle file; + final Fi file; final LoadedMod mod; - public LoadRun(ContentType type, FileHandle file, LoadedMod mod){ + public LoadRun(ContentType type, Fi file, LoadedMod mod){ this.type = type; this.file = file; this.mod = mod; @@ -495,11 +495,11 @@ public class Mods implements Loadable{ for(LoadedMod mod : orderedMods()){ if(mod.root.child("content").exists()){ - FileHandle contentRoot = mod.root.child("content"); + Fi contentRoot = mod.root.child("content"); for(ContentType type : ContentType.all){ - FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); + Fi folder = contentRoot.child(type.name().toLowerCase() + "s"); if(folder.exists()){ - for(FileHandle file : folder.list()){ + for(Fi file : folder.list()){ if(file.extension().equals("json") || file.extension().equals("hjson")){ runs.add(new LoadRun(type, file, mod)); } @@ -588,13 +588,13 @@ public class Mods implements Loadable{ /** Loads a mod file+meta, but does not add it to the list. * Note that directories can be loaded as mods.*/ - private LoadedMod loadMod(FileHandle sourceFile) throws Exception{ - FileHandle zip = sourceFile.isDirectory() ? sourceFile : new ZipFileHandle(sourceFile); + private LoadedMod loadMod(Fi sourceFile) throws Exception{ + Fi zip = sourceFile.isDirectory() ? sourceFile : new ZipFi(sourceFile); if(zip.list().length == 1 && zip.list()[0].isDirectory()){ zip = zip.list()[0]; } - FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); + Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); if(!metaf.exists()){ Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json'/'mod.js' file, skipping.", sourceFile); throw new IllegalArgumentException("No mod.json found."); @@ -611,7 +611,7 @@ public class Mods implements Loadable{ Mod mainMod; - FileHandle mainFile = zip; + Fi mainFile = zip; String[] path = (mainClass.replace('.', '/') + ".class").split("/"); for(String str : path){ if(!str.isEmpty()){ @@ -645,9 +645,9 @@ public class Mods implements Loadable{ /** Represents a plugin that has been loaded from a jar file.*/ public static class LoadedMod implements Publishable{ /** The location of this mod's zip file/folder on the disk. */ - public final FileHandle file; + public final Fi file; /** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */ - public final FileHandle root; + public final Fi root; /** The mod's main class; may be null. */ public final @Nullable Mod main; /** Internal mod name. Used for textures. */ @@ -659,13 +659,13 @@ public class Mods implements Loadable{ /** All missing dependencies of this mod as strings. */ public Array missingDependencies = new Array<>(); /** Script files to run. */ - public Array scripts = new Array<>(); + public Array scripts = new Array<>(); /** Content with intialization code. */ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ public ModState state = ModState.enabled; - public LoadedMod(FileHandle file, FileHandle root, Mod main, ModMeta meta){ + public LoadedMod(Fi file, Fi root, Mod main, ModMeta meta){ this.root = root; this.file = file; this.main = main; @@ -734,12 +734,12 @@ public class Mods implements Loadable{ } @Override - public FileHandle createSteamFolder(String id){ + public Fi createSteamFolder(String id){ return file; } @Override - public FileHandle createSteamPreview(String id){ + public Fi createSteamPreview(String id){ return file.child("preview.png"); } diff --git a/core/src/io/anuke/mindustry/mod/Scripts.java b/core/src/io/anuke/mindustry/mod/Scripts.java index 921e4b783e..d53673f4bf 100644 --- a/core/src/io/anuke/mindustry/mod/Scripts.java +++ b/core/src/io/anuke/mindustry/mod/Scripts.java @@ -63,7 +63,7 @@ public class Scripts implements Disposable{ Log.log(level, "[{0}]: {1}", source, message); } - public void run(LoadedMod mod, FileHandle file){ + public void run(LoadedMod mod, Fi file){ run(wrapper.replace("$SCRIPT_NAME$", mod.name + "/" + file.nameWithoutExtension()).replace("$CODE$", file.readString()).replace("$MOD_NAME$", mod.name), file.name()); } diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index 1c51f04154..184e801326 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -22,6 +22,7 @@ import static io.anuke.mindustry.Vars.net; public class CrashSender{ public static void send(Throwable exception, Cons writeListener){ + try{ exception.printStackTrace(); @@ -52,12 +53,11 @@ public class CrashSender{ try{ File file = new File(OS.getAppDataDirectoryString(Vars.appName), "crashes/crash-report-" + new SimpleDateFormat("MM_dd_yyyy_HH_mm_ss").format(new Date()) + ".txt"); - new FileHandle(OS.getAppDataDirectoryString(Vars.appName)).child("crashes").mkdirs(); - new FileHandle(file).writeString(parseException(exception)); + new Fi(OS.getAppDataDirectoryString(Vars.appName)).child("crashes").mkdirs(); + new Fi(file).writeString(parseException(exception)); writeListener.get(file); }catch(Throwable e){ - e.printStackTrace(); - Log.err("Failed to save local crash report."); + Log.err("Failed to save local crash report.", e); } try{ diff --git a/core/src/io/anuke/mindustry/type/Publishable.java b/core/src/io/anuke/mindustry/type/Publishable.java index f3e8b45b88..5c6c1aade3 100644 --- a/core/src/io/anuke/mindustry/type/Publishable.java +++ b/core/src/io/anuke/mindustry/type/Publishable.java @@ -20,9 +20,9 @@ public interface Publishable{ /** @return the tag that this content has. e.g. 'schematic' or 'map'. */ String steamTag(); /** @return a folder with everything needed for this piece of content in it; does not need to be a copy. */ - FileHandle createSteamFolder(String id); + Fi createSteamFolder(String id); /** @return a preview file PNG. */ - FileHandle createSteamPreview(String id); + Fi createSteamPreview(String id); /** @return any extra tags to add to this item.*/ default Array extraTags(){ return new Array<>(0); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index c726778b5a..811cf7add5 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -18,20 +18,20 @@ import java.util.*; import static io.anuke.mindustry.Vars.platform; public class FileChooser extends FloatingDialog{ - private static final FileHandle homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); - private static FileHandle lastDirectory = homeDirectory; + private static final Fi homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); + private static Fi lastDirectory = homeDirectory; private Table files; - private FileHandle directory = lastDirectory; + private Fi directory = lastDirectory; private ScrollPane pane; private TextField navigation, filefield; private TextButton ok; private FileHistory stack = new FileHistory(); - private Boolf filter; - private Cons selectListener; + private Boolf filter; + private Cons selectListener; private boolean open; - public FileChooser(String title, Boolf filter, boolean open, Cons result){ + public FileChooser(String title, Boolf filter, boolean open, Cons result){ super(title); setFillParent(true); this.open = open; @@ -154,8 +154,8 @@ public class FileChooser extends FloatingDialog{ } } - private FileHandle[] getFileNames(){ - FileHandle[] handles = directory.list(file -> !file.getName().startsWith(".")); + private Fi[] getFileNames(){ + Fi[] handles = directory.list(file -> !file.getName().startsWith(".")); Arrays.sort(handles, (a, b) -> { if(a.isDirectory() && !b.isDirectory()) return -1; @@ -183,7 +183,7 @@ public class FileChooser extends FloatingDialog{ files.clearChildren(); files.top().left(); - FileHandle[] names = getFileNames(); + Fi[] names = getFileNames(); Image upimage = new Image(Icon.folderParentSmall); TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); @@ -204,7 +204,7 @@ public class FileChooser extends FloatingDialog{ ButtonGroup group = new ButtonGroup<>(); group.setMinCheckCount(0); - for(FileHandle file : names){ + for(Fi file : names){ if(!file.isDirectory() && !filter.get(file)) continue; //skip non-filtered files String filename = file.name(); @@ -255,14 +255,14 @@ public class FileChooser extends FloatingDialog{ } public class FileHistory{ - private Array history = new Array<>(); + private Array history = new Array<>(); private int index; public FileHistory(){ } - public void push(FileHandle file){ + public void push(Fi file){ if(index != history.size) history.truncate(index); history.add(file); index++; @@ -296,7 +296,7 @@ public class FileChooser extends FloatingDialog{ System.out.println("\n\n\n\n\n\n"); int i = 0; - for(FileHandle file : history){ + for(Fi file : history){ i++; if(index == i){ System.out.println("[[" + file.toString() + "]]"); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 815a5b6516..a1dfe4622a 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -101,7 +101,7 @@ public class LoadDialog extends FloatingDialog{ }); }else{ try{ - FileHandle file = Core.files.local("save-" + slot.getName() + "." + saveExtension); + Fi file = Core.files.local("save-" + slot.getName() + "." + saveExtension); slot.exportFile(file); platform.shareFile(file); }catch(Exception e){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java index f18c7733cf..b3003cbb0b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -46,7 +46,7 @@ public class ModsDialog extends FloatingDialog{ ui.loadfrag.hide(); }else{ try{ - FileHandle file = tmpDirectory.child(text.replace("/", "") + ".zip"); + Fi file = tmpDirectory.child(text.replace("/", "") + ".zip"); Streams.copyStream(result.getResultAsStream(), file.write(false)); mods.importMod(file); file.delete(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 28e83c63c8..26cd33ec93 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -95,7 +95,7 @@ public class SettingsMenuDialog extends SettingsDialog{ Core.settings.putAll(map); Core.settings.save(); - for(FileHandle file : dataDirectory.list()){ + for(Fi file : dataDirectory.list()){ file.deleteDirectory(); } @@ -106,7 +106,7 @@ public class SettingsMenuDialog extends SettingsDialog{ t.addButton("$data.export", style, () -> { if(ios){ - FileHandle file = Core.files.local("mindustry-data-export.zip"); + Fi file = Core.files.local("mindustry-data-export.zip"); try{ data.exportData(file); }catch(Exception e){ diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 1a4b30d37a..80ae8a386e 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -77,8 +77,8 @@ public class DesktopLauncher extends ClientLauncher{ if(useSteam){ //delete leftover dlls - FileHandle file = new FileHandle("."); - for(FileHandle other : file.parent().list()){ + Fi file = new Fi("."); + for(Fi other : file.parent().list()){ if(other.name().contains("steam") && (other.extension().equals("dll") || other.extension().equals("so") || other.extension().equals("dylib"))){ other.delete(); } @@ -202,7 +202,7 @@ public class DesktopLauncher extends ClientLauncher{ } @Override - public Array getWorkshopContent(Class type){ + public Array getWorkshopContent(Class type){ return !steam ? super.getWorkshopContent(type) : SVars.workshop.getWorkshopFiles(type); } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index 8f12e22ca9..480830e1e3 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -21,7 +21,7 @@ import static io.anuke.mindustry.Vars.*; public class SWorkshop implements SteamUGCCallback{ public final SteamUGC ugc = new SteamUGC(this); - private ObjectMap, Array> workshopFiles = new ObjectMap<>(); + private ObjectMap, Array> workshopFiles = new ObjectMap<>(); private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); private Array> itemHandlers = new Array<>(); private ObjectMap updatedHandlers = new ObjectMap<>(); @@ -32,9 +32,9 @@ public class SWorkshop implements SteamUGCCallback{ ItemInstallInfo info = new ItemInstallInfo(); ugc.getSubscribedItems(ids); - Array folders = Array.with(ids).map(f -> { + Array folders = Array.with(ids).map(f -> { ugc.getItemInstallInfo(f, info); - return new FileHandle(info.getFolder()); + return new Fi(info.getFolder()); }).select(f -> f != null && f.list().length > 0); workshopFiles.put(Map.class, folders.select(f -> f.list().length == 1 && f.list()[0].extension().equals(mapExtension)).map(f -> f.list()[0])); @@ -50,7 +50,7 @@ public class SWorkshop implements SteamUGCCallback{ }); } - public Array getWorkshopFiles(Class type){ + public Array getWorkshopFiles(Class type){ return workshopFiles.getOr(type, () -> new Array<>(0)); } diff --git a/gradle.properties b/gradle.properties index 0b7dba8455..58fa94334c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=60d97c3e52131d2d8be45a1d2f1bfe19c2e343a2 +archash=a2aebbf5ee64ebf4626962ca5e2288b1e051d311 diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 50b1732892..9ecbb6c75d 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -38,7 +38,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ return new IOSApplication(new ClientLauncher(){ @Override - public void showFileChooser(boolean open, String extension, Cons cons){ + public void showFileChooser(boolean open, String extension, Cons cons){ UIDocumentBrowserViewController cont = new UIDocumentBrowserViewController((NSArray)null); @@ -64,8 +64,8 @@ public class IOSLauncher extends IOSApplication.Delegate{ try{ coord.coordinateReadingItem(url, NSFileCoordinatorReadingOptions.ForUploading, result -> { - FileHandle src = Core.files.absolute(result.getAbsoluteURL().getPath()); - FileHandle dst = Core.files.absolute(getDocumentsDirectory()).child(src.name()); + Fi src = Core.files.absolute(result.getAbsoluteURL().getPath()); + Fi dst = Core.files.absolute(getDocumentsDirectory()).child(src.name()); src.copyTo(dst); Core.app.post(() -> { @@ -116,10 +116,10 @@ public class IOSLauncher extends IOSApplication.Delegate{ } @Override - public void shareFile(FileHandle file){ + public void shareFile(Fi file){ try{ Log.info("Attempting to share file " + file); - FileHandle to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); + Fi to = Core.files.absolute(getDocumentsDirectory()).child(file.name()); file.copyTo(to); NSURL url = new NSURL(to.file()); @@ -196,7 +196,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ void openURL(NSURL url){ Core.app.post(() -> Core.app.post(() -> { - FileHandle file = Core.files.absolute(getDocumentsDirectory()).child(url.getLastPathComponent()); + Fi file = Core.files.absolute(getDocumentsDirectory()).child(url.getLastPathComponent()); Core.files.absolute(url.getPath()).copyTo(file); if(file.extension().equalsIgnoreCase(saveExtension)){ //open save diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index f24ede5009..42eb87cbee 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -46,9 +46,9 @@ public class ServerControl implements ApplicationListener{ protected static DateTimeFormatter dateTime = DateTimeFormatter.ofPattern("MM-dd-yyyy | HH:mm:ss"); private final CommandHandler handler = new CommandHandler(""); - private final FileHandle logFolder = Core.settings.getDataDirectory().child("logs/"); + private final Fi logFolder = Core.settings.getDataDirectory().child("logs/"); - private FileHandle currentLogFile; + private Fi currentLogFile; private boolean inExtraRound; private Task lastTask; private Gamemode lastMode = Gamemode.survival; @@ -746,7 +746,7 @@ public class ServerControl implements ApplicationListener{ return; } - FileHandle file = saveDirectory.child(arg[0] + "." + saveExtension); + Fi file = saveDirectory.child(arg[0] + "." + saveExtension); if(!SaveIO.isSaveValid(file)){ err("No (valid) save data found for slot."); @@ -772,7 +772,7 @@ public class ServerControl implements ApplicationListener{ return; } - FileHandle file = saveDirectory.child(arg[0] + "." + saveExtension); + Fi file = saveDirectory.child(arg[0] + "." + saveExtension); Core.app.post(() -> { SaveIO.save(file); @@ -782,7 +782,7 @@ public class ServerControl implements ApplicationListener{ handler.register("saves", "List all saves in the save directory.", arg -> { info("Save files: "); - for(FileHandle file : saveDirectory.list()){ + for(Fi file : saveDirectory.list()){ if(file.extension().equals(saveExtension)){ info("| &ly{0}", file.nameWithoutExtension()); } diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index d9eeabc963..9c0e87179f 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -43,11 +43,11 @@ public class ServerLauncher implements ApplicationListener{ loadLocales = false; headless = true; - FileHandle plugins = Core.settings.getDataDirectory().child("plugins"); + Fi plugins = Core.settings.getDataDirectory().child("plugins"); if(plugins.isDirectory() && plugins.list().length > 0 && !plugins.sibling("mods").exists()){ Log.warn("[IMPORTANT NOTICE] &lrPlugins have been detected.&ly Automatically moving all contents of the plugin folder into the 'mods' folder. The original folder will not be removed; please do so manually."); plugins.sibling("mods").mkdirs(); - for(FileHandle file : plugins.list()){ + for(Fi file : plugins.list()){ file.copyTo(plugins.sibling("mods")); } } diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 5a33c507c9..75c7932c55 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -62,7 +62,7 @@ public class ScriptStubGenerator{ ObjectSet used = ObjectSet.with(); StringBuilder result = new StringBuilder("//Generated class. Do not modify.\n"); - result.append("\n").append(new FileHandle("core/assets/scripts/base.js").readString()).append("\n"); + result.append("\n").append(new Fi("core/assets/scripts/base.js").readString()).append("\n"); for(Class type : classes){ if(used.contains(type.getPackage().getName()) || nopackage.contains(s -> type.getName().startsWith(s))) continue; result.append("importPackage(Packages.").append(type.getPackage().getName()).append(")\n"); @@ -71,8 +71,8 @@ public class ScriptStubGenerator{ //Log.info(result); - new FileHandle("core/assets/scripts/global.js").writeString(result.toString()); - new FileHandle("core/src/io/anuke/mindustry/mod/ClassAccess.java").writeString(fileTemplate + new Fi("core/assets/scripts/global.js").writeString(result.toString()); + new Fi("core/src/io/anuke/mindustry/mod/ClassAccess.java").writeString(fileTemplate .replace("$ALLOWED_CLASSES$", classes.toString(", ", type -> type.getName() + ".class")) .replace("$ALLOWED_CLASS_NAMES$", classes.toString(", ", type -> "\"" + type.getName() + "\""))); } diff --git a/tools/src/io/anuke/mindustry/tools/SquareMarcher.java b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java index c795637e25..de5f142df5 100644 --- a/tools/src/io/anuke/mindustry/tools/SquareMarcher.java +++ b/tools/src/io/anuke/mindustry/tools/SquareMarcher.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.tools; import io.anuke.arc.Core; -import io.anuke.arc.files.FileHandle; +import io.anuke.arc.files.Fi; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.Pixmap; import io.anuke.arc.graphics.g2d.Draw; @@ -19,7 +19,7 @@ public class SquareMarcher{ this.buffer = new FrameBuffer(resolution, resolution); } - void render(Pixmap pixmap, FileHandle file){ + void render(Pixmap pixmap, Fi file){ boolean[][] grid = new boolean[pixmap.getWidth()][pixmap.getHeight()]; for(int x = 0; x < pixmap.getWidth(); x++){ diff --git a/tools/src/io/anuke/mindustry/tools/Upscaler.java b/tools/src/io/anuke/mindustry/tools/Upscaler.java index 5101552ddb..6ba497ff98 100644 --- a/tools/src/io/anuke/mindustry/tools/Upscaler.java +++ b/tools/src/io/anuke/mindustry/tools/Upscaler.java @@ -24,17 +24,17 @@ public class Upscaler{ Core.batch = new SpriteBatch(); Core.atlas = new TextureAtlas(); Core.atlas.addRegion("white", Pixmaps.blankTextureRegion()); - FileHandle file = Core.files.local(""); + Fi file = Core.files.local(""); Log.info("Upscaling icons..."); Time.mark(); - FileHandle[] list = file.list(); + Fi[] list = file.list(); for(IconSize size : IconSize.values()){ String suffix = size == IconSize.def ? "" : "-" + size.name(); SquareMarcher marcher = new SquareMarcher(size.size); - for(FileHandle img : list){ + for(Fi img : list){ if(img.extension().equals("png")){ marcher.render(new Pixmap(img), img.sibling(img.nameWithoutExtension() + suffix + ".png")); } From e9ed0512f72ca270a61c94c6b69c615c09c15bd9 Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 21:12:41 -0500 Subject: [PATCH 097/107] Removed `Path` API usage --- core/src/io/anuke/mindustry/core/Version.java | 38 +++---- .../anuke/mindustry/tools/BundleLauncher.java | 100 ++++++++---------- .../io/anuke/mindustry/tools/Generators.java | 28 ++--- .../io/anuke/mindustry/tools/ImagePacker.java | 36 +++---- 4 files changed, 87 insertions(+), 115 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Version.java b/core/src/io/anuke/mindustry/core/Version.java index c2b3c515e4..8cc169d28c 100644 --- a/core/src/io/anuke/mindustry/core/Version.java +++ b/core/src/io/anuke/mindustry/core/Version.java @@ -7,8 +7,6 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.arc.util.io.*; -import java.io.*; - public class Version{ /** Build type. 'official' for official releases; 'custom' or 'bleeding edge' are also used. */ public static String type; @@ -26,29 +24,25 @@ public class Version{ public static void init(){ if(!enabled) return; - try{ - Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.Internal); + Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.Internal); - ObjectMap map = new ObjectMap<>(); - PropertiesUtils.load(map, file.reader()); + ObjectMap map = new ObjectMap<>(); + PropertiesUtils.load(map, file.reader()); - type = map.get("type"); - number = Integer.parseInt(map.get("number", "4")); - modifier = map.get("modifier"); - if(map.get("build").contains(".")){ - String[] split = map.get("build").split("\\."); - try{ - build = Integer.parseInt(split[0]); - revision = Integer.parseInt(split[1]); - }catch(Throwable e){ - e.printStackTrace(); - build = -1; - } - }else{ - build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; + type = map.get("type"); + number = Integer.parseInt(map.get("number", "4")); + modifier = map.get("modifier"); + if(map.get("build").contains(".")){ + String[] split = map.get("build").split("\\."); + try{ + build = Integer.parseInt(split[0]); + revision = Integer.parseInt(split[1]); + }catch(Throwable e){ + e.printStackTrace(); + build = -1; } - }catch(IOException e){ - throw new RuntimeException(e); + }else{ + build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; } } } diff --git a/tools/src/io/anuke/mindustry/tools/BundleLauncher.java b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java index 7d99eadac2..30624ea663 100644 --- a/tools/src/io/anuke/mindustry/tools/BundleLauncher.java +++ b/tools/src/io/anuke/mindustry/tools/BundleLauncher.java @@ -1,14 +1,12 @@ package io.anuke.mindustry.tools; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.OrderedMap; -import io.anuke.arc.func.Func2; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.Strings; -import io.anuke.arc.util.io.PropertiesUtils; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +import io.anuke.arc.func.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; import java.io.*; -import java.nio.file.*; public class BundleLauncher{ @@ -17,58 +15,52 @@ public class BundleLauncher{ OrderedMap base = new OrderedMap<>(); PropertiesUtils.load(base, new InputStreamReader(new FileInputStream(file))); Array removals = new Array<>(); + Fi.get("").walk(child -> { + if(child.name().equals("bundle.properties") || child.isDirectory() || child.toString().contains("output")) + return; - Files.walk(Paths.get("")).forEach(child -> { - try{ - if(child.getFileName().toString().equals("bundle.properties") || Files.isDirectory(child) || child.toString().contains("output")) - return; + Log.info("Parsing bundle: {0}", child); - Log.info("Parsing bundle: {0}", child); + OrderedMap other = new OrderedMap<>(); + PropertiesUtils.load(other, child.reader(2048, "UTF-8")); + removals.clear(); - OrderedMap other = new OrderedMap<>(); - PropertiesUtils.load(other, Files.newBufferedReader(child, Strings.utf8)); - removals.clear(); - - for(String key : other.orderedKeys()){ - if(!base.containsKey(key)){ - removals.add(key); - Log.info("&lr- Removing unused key '{0}'...", key); - } + for(String key : other.orderedKeys()){ + if(!base.containsKey(key)){ + removals.add(key); + Log.info("&lr- Removing unused key '{0}'...", key); } - Log.info("&lr{0} keys removed.", removals.size); - for(String s : removals){ - other.remove(s); - } - - int added = 0; - - for(String key : base.orderedKeys()){ - if(!other.containsKey(key) || other.get(key).trim().isEmpty()){ - other.put(key, base.get(key)); - added++; - Log.info("&lc- Adding missing key '{0}'...", key); - } - } - - Func2 processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n"; - - Path output = child.resolveSibling("output/" + child.getFileName()); - - Log.info("&lc{0} keys added.", added); - Log.info("Writing bundle to {0}", output); - StringBuilder result = new StringBuilder(); - - //add everything ordered - for(String key : base.orderedKeys()){ - result.append(processor.get(key, other.get(key))); - other.remove(key); - } - - Files.write(child, result.toString().getBytes(Strings.utf8)); - - }catch(IOException e){ - throw new RuntimeException(e); } + Log.info("&lr{0} keys removed.", removals.size); + for(String s : removals){ + other.remove(s); + } + + int added = 0; + + for(String key : base.orderedKeys()){ + if(!other.containsKey(key) || other.get(key).trim().isEmpty()){ + other.put(key, base.get(key)); + added++; + Log.info("&lc- Adding missing key '{0}'...", key); + } + } + + Func2 processor = (key, value) -> (key + " = " + value).replace("\\", "\\\\").replace("\n", "\\n") + "\n"; + + Fi output = child.sibling("output/" + child.name()); + + Log.info("&lc{0} keys added.", added); + Log.info("Writing bundle to {0}", output); + StringBuilder result = new StringBuilder(); + + //add everything ordered + for(String key : base.orderedKeys()){ + result.append(processor.get(key, other.get(key))); + other.remove(key); + } + + child.writeString(result.toString()); }); } diff --git a/tools/src/io/anuke/mindustry/tools/Generators.java b/tools/src/io/anuke/mindustry/tools/Generators.java index 91887f0383..e1ad420f50 100644 --- a/tools/src/io/anuke/mindustry/tools/Generators.java +++ b/tools/src/io/anuke/mindustry/tools/Generators.java @@ -1,21 +1,19 @@ package io.anuke.mindustry.tools; import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; import io.anuke.arc.util.noise.*; -import io.anuke.mindustry.tools.ImagePacker.*; import io.anuke.mindustry.ctype.*; +import io.anuke.mindustry.tools.ImagePacker.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; -import java.io.*; -import java.nio.file.*; - import static io.anuke.mindustry.Vars.*; public class Generators{ @@ -73,17 +71,13 @@ public class Generators{ for(Block block : content.blocks()){ TextureRegion[] regions = block.getGeneratedIcons(); - try{ - if(block instanceof Floor){ - block.load(); - for(TextureRegion region : block.variantRegions()){ - GenRegion gen = (GenRegion)region; - if(gen.path == null) continue; - Files.copy(gen.path, Paths.get("../editor/editor-" + gen.path.getFileName())); - } + if(block instanceof Floor){ + block.load(); + for(TextureRegion region : block.variantRegions()){ + GenRegion gen = (GenRegion)region; + if(gen.path == null) continue; + gen.path.copyTo(Fi.get("../editor/editor-" + gen.path.name())); } - }catch(IOException e){ - throw new RuntimeException(e); } if(regions.length == 0){ @@ -120,11 +114,7 @@ public class Generators{ } } - try{ - Files.delete(region.path); - }catch(IOException e){ - e.printStackTrace(); - } + region.path.delete(); out.save(block.name); } diff --git a/tools/src/io/anuke/mindustry/tools/ImagePacker.java b/tools/src/io/anuke/mindustry/tools/ImagePacker.java index b5a3787382..226155a245 100644 --- a/tools/src/io/anuke/mindustry/tools/ImagePacker.java +++ b/tools/src/io/anuke/mindustry/tools/ImagePacker.java @@ -1,24 +1,24 @@ package io.anuke.mindustry.tools; -import io.anuke.arc.Core; -import io.anuke.arc.collection.ObjectMap; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.g2d.TextureAtlas.AtlasRegion; +import io.anuke.arc.graphics.g2d.TextureAtlas.*; import io.anuke.arc.util.*; import io.anuke.arc.util.Log.*; import io.anuke.mindustry.*; -import io.anuke.mindustry.core.ContentLoader; +import io.anuke.mindustry.core.*; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.IOException; -import java.nio.file.*; +import javax.imageio.*; +import java.awt.image.*; +import java.io.*; public class ImagePacker{ static ObjectMap regionCache = new ObjectMap<>(); static ObjectMap imageCache = new ObjectMap<>(); - public static void main(String[] args) throws IOException{ + public static void main(String[] args){ Vars.headless = true; Log.setLogger(new NoopLogHandler()); @@ -26,14 +26,11 @@ public class ImagePacker{ Vars.content.createBaseContent(); Log.setLogger(new DefaultLogHandler()); - Files.walk(Paths.get("../../../assets-raw/sprites_out")).forEach(path -> { + Fi.get("../../../assets-raw/sprites_out").walk(path -> { + String fname = path.nameWithoutExtension(); + try{ - if(Files.isDirectory(path)) return; - - String fname = path.getFileName().toString(); - fname = fname.substring(0, fname.length() - 4); - - BufferedImage image = ImageIO.read(path.toFile()); + BufferedImage image = ImageIO.read(path.file()); GenRegion region = new GenRegion(fname, path){ @Override @@ -59,9 +56,8 @@ public class ImagePacker{ regionCache.put(fname, region); imageCache.put(region, image); - }catch(IOException e){ - e.printStackTrace(); + throw new RuntimeException(e); } }); @@ -134,9 +130,9 @@ public class ImagePacker{ static class GenRegion extends AtlasRegion{ String name; boolean invalid; - Path path; + Fi path; - GenRegion(String name, Path path){ + GenRegion(String name, Fi path){ this.name = name; this.path = path; } From 3d8e5bd36a732c5d797d56aa5d94ca41c87a839f Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 21:31:55 -0500 Subject: [PATCH 098/107] Added new Cyrillic font --- core/assets-raw/fonts/RussoOne-Regular.ttf | Bin 0 -> 37292 bytes core/assets/fonts/font.ttf | Bin 8469812 -> 8477164 bytes gradle.properties | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 core/assets-raw/fonts/RussoOne-Regular.ttf diff --git a/core/assets-raw/fonts/RussoOne-Regular.ttf b/core/assets-raw/fonts/RussoOne-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c0236b05472622371adfc803866d65a8f0dced49 GIT binary patch literal 37292 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 Cv84w9 literal 0 HcmV?d00001 diff --git a/core/assets/fonts/font.ttf b/core/assets/fonts/font.ttf index 953347f6b2889154b77f26d0d6901e6766521dbd..0b014d131fdd75358135c49f5680737e9061ad3c 100644 GIT binary patch delta 421269 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�CbXC~ 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

rLQFc_cGU@$)Qfx-Cn1qS0Y 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

A268zE7)|LHK8|L0&Z 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 =e4b+r_TLce7}MC)($L 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 z

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 E0Q2Qe8UO$Q delta 404780 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 diff --git a/gradle.properties b/gradle.properties index 58fa94334c..33b995cbd5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=a2aebbf5ee64ebf4626962ca5e2288b1e051d311 +archash=bd8531104e5b316e257469cb1687a702b3ab0777 From 3cefc085bdbdce47fa5c1a1df235538dafcf601d Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 15 Dec 2019 22:11:07 -0500 Subject: [PATCH 099/107] Tentative RU bundle changes --- core/assets/bundles/bundle_ru.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index d57bfa8174..7192b6b09a 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -93,7 +93,7 @@ mods.alphainfo = Имейте в виду, что модификации нах mods.alpha = [accent](Альфа) mods = Модификации mods.none = [LIGHT_GRAY]Модификации не найдены! -mods.guide = Руководство по созданию модификаций +mods.guide = Руководство по модам mods.report = Доложить об ошибке mods.openfolder = Открыть папку с модификациями mod.enabled = [lightgray]Включён @@ -107,7 +107,7 @@ mod.enable = Вкл. mod.requiresrestart = Теперь игра закроется, чтобы применить изменения в модификациях. mod.reloadrequired = [scarlet]Необходим перезапуск mod.import = Импортировать модификацию -mod.import.github = Импортировать модификацию с GitHub +mod.import.github = Импортировать мод с GitHub mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Этот мод будет удалён. mod.author = [LIGHT_GRAY]Автор:[] {0} From 487607e1d697130d9e8953a6fa9ecab0be8207c1 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 16 Dec 2019 00:08:14 -0500 Subject: [PATCH 100/107] Removed references to GWT completely --- .gitignore | 9 --------- gradle.properties | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 8e8a4c2689..c362483e39 100644 --- a/.gitignore +++ b/.gitignore @@ -55,15 +55,6 @@ crash-report-* ## Robovm /ios/robovm-build/ -## GWT -/html/war/ -/html/gwt-unitCache/ -.apt_generated/ -.gwt/ -gwt-unitCache/ -www-test/ -.gwt-tmp/ - ## Android Studio and Intellij and Android in general /android/libs/armeabi/ /android/libs/armeabi-v7a/ diff --git a/gradle.properties b/gradle.properties index 33b995cbd5..5bdf91ca48 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=bd8531104e5b316e257469cb1687a702b3ab0777 +archash=2303ab81bb76a973db8885f3ba14b6515782a1a4 From d47f86cc2194cf360d4a4dba78d160b5bc041c84 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 16 Dec 2019 10:12:39 -0500 Subject: [PATCH 101/107] Cleanup --- core/src/io/anuke/mindustry/core/Version.java | 2 +- desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java | 2 +- gradle.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/core/Version.java b/core/src/io/anuke/mindustry/core/Version.java index 8cc169d28c..a6ff7ea6a9 100644 --- a/core/src/io/anuke/mindustry/core/Version.java +++ b/core/src/io/anuke/mindustry/core/Version.java @@ -24,7 +24,7 @@ public class Version{ public static void init(){ if(!enabled) return; - Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.Internal); + Fi file = OS.isAndroid || OS.isIos ? Core.files.internal("version.properties") : new Fi("version.properties", FileType.internal); ObjectMap map = new ObjectMap<>(); PropertiesUtils.load(map, file.reader()); diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 80ae8a386e..b1b76c171a 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -50,7 +50,7 @@ public class DesktopLauncher extends ClientLauncher{ stencil = 0; width = 900; height = 700; - setWindowIcon(FileType.Internal, "icons/icon_64.png"); + setWindowIcon(FileType.internal, "icons/icon_64.png"); }}); }catch(Throwable e){ handleCrash(e); diff --git a/gradle.properties b/gradle.properties index 5bdf91ca48..6f45e11d25 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=2303ab81bb76a973db8885f3ba14b6515782a1a4 +archash=ad4891d17c0739b297df182b17391f8a3e546cb6 From 6971a76c8ef093aa7a4b4a2ed5cc04946406b451 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 16 Dec 2019 12:50:18 -0500 Subject: [PATCH 102/107] =?UTF-8?q?=D0=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/assets/fonts/font.ttf | Bin 8477164 -> 8477164 bytes gradle.properties | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core/assets/fonts/font.ttf b/core/assets/fonts/font.ttf index 0b014d131fdd75358135c49f5680737e9061ad3c..7a323554549d97153856cd083446eb2634c3f3e1 100644 GIT binary patch delta 789 zcmaE}xs?TkMHmCMYxDA0Sy>q;u(Gm(S^o-HSy>qv7?>Hj78OeTlF{ z`x0Tv_9enn?MsBE+m{H-v@a2sZC@fR*S zR&8G*tk%9nSiOCTutxh5Va@g>!dmT1gtgn32Y}z5%z6gBJ9_`MA*N5iEu#s65+u1CBi}NON4{lmk5WnFA)xHUm_gVzC<{@ zeTi^H`x4>E_9enm?MsBC+m{H(v@a2kZC@fB*SG_9enq?MsBK+m{H}v@a2^ bZC@f>*S<7(@%%Pl737&;FfcGMocokM2SneJnX|Y#fU!M*5rmoA0~ndx0~lGh2Qaeg z-r|yD3}ITqpv=IaI{p4_R>|oLZnKIi_T=TUva&KxU}a?mv;GyZva&KTFfcQ4F~~8- zF;`8$cAM3iv1hx~9ac{k_6p`I1_OrZ=>l(A^|#M_z*@z^xM;h`Q&vtE#ueM;Ub4Pr zW~|uG^Op4|JEQD&wy&(gjEq;dM}1>m%*yy{`@i3;noJx*Ofn3XAV(Y&VpG~4_>WbC znepHBDn_=IjI7&LnArLS7=@;95n_AK$lAU{n5}(@FnjwFVUG4C!kq0(gt^+62y?eD z5$0)MBFx*qM3}FAi788eTlGm`x0S^ z_9eoS?MsBE+Ls7Rw=WTvXEHeESk%h4v-FitS5;mD-mGE4MEZR%u@% ztlGXrSgn1DuzLFvVU6}B!kX<%gtgk22y3@55!Pv6BCOlKL|CtViLieA5@Cb(CBla7 zON5Qumk1lTFA+9rUm|SUzC_rpeTlGn`x0S`_9eoW?MsBM+Ls7hw=WU4XEHeftt&hxR4Hj_pf?o!XZOJGUDceESmNg!U!EiS0{-liHUEC$}#V zPHA5voZ7xbIIVq&aC-X^;f(er!kO($gtOY02xqr15zc8}BAna4L^!W~iEw`V65)dO zCBlX6ON5Ksmk1ZPFA*+jUm{%EzC^gJeTi^+`x4=b_9eoV?MsBK+Ls7dw=WT{XDceftvOhV4s)8(rO)W#%jf02jUyWB>pF diff --git a/gradle.properties b/gradle.properties index 6f45e11d25..289d7dd104 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=ad4891d17c0739b297df182b17391f8a3e546cb6 +archash=678dca4153074fd4eea29e217e8d8cb1fc56a98f From 5ce66b0dbb79f886d8c76608ca3c6a526caebf69 Mon Sep 17 00:00:00 2001 From: TsjipTsjip Date: Mon, 16 Dec 2019 19:55:10 +0100 Subject: [PATCH 103/107] 'arilleryPlastic' -> 'artilleryPlastic' --- core/src/io/anuke/mindustry/content/Blocks.java | 2 +- core/src/io/anuke/mindustry/content/Bullets.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 10769bd53d..f248dbab58 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -1542,7 +1542,7 @@ public class Blocks implements ContentList{ Items.silicon, Bullets.artilleryHoming, Items.pyratite, Bullets.artilleryIncendiary, Items.blastCompound, Bullets.artilleryExplosive, - Items.plastanium, Bullets.arilleryPlastic + Items.plastanium, Bullets.artilleryPlastic ); size = 3; shots = 4; diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index 75b6b763f3..b3e23d966b 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -18,7 +18,7 @@ public class Bullets implements ContentList{ public static BulletType //artillery - artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artilleryIncendiary, artilleryExplosive, artilleryUnit, + artilleryDense, artilleryPlastic, artilleryPlasticFrag, artilleryHoming, artilleryIncendiary, artilleryExplosive, artilleryUnit, //flak flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, flakGlass, glassFrag, @@ -65,7 +65,7 @@ public class Bullets implements ContentList{ despawnEffect = Fx.none; }}; - arilleryPlastic = new ArtilleryBulletType(3.4f, 0, "shell"){{ + artilleryPlastic = new ArtilleryBulletType(3.4f, 0, "shell"){{ hitEffect = Fx.plasticExplosion; knockback = 1f; lifetime = 55f; From 4ffe2333219bb40af4a5eb856959cdcd4086be99 Mon Sep 17 00:00:00 2001 From: Anuken Date: Mon, 16 Dec 2019 18:37:11 -0500 Subject: [PATCH 104/107] Added repair point range display --- .../mindustry/world/blocks/units/RepairPoint.java | 15 ++++++++++++++- gradle.properties | 2 +- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java index a6bfb1ffeb..11b8fd89e6 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/RepairPoint.java @@ -14,7 +14,9 @@ import io.anuke.mindustry.entities.type.Unit; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.Block; import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockFlag; +import io.anuke.mindustry.world.meta.*; + +import static io.anuke.mindustry.Vars.tilesize; public class RepairPoint extends Block{ private static Rectangle rect = new Rectangle(); @@ -48,6 +50,12 @@ public class RepairPoint extends Block{ laserEnd = Core.atlas.find("laser-end"); } + @Override + public void setStats(){ + super.setStats(); + stats.add(BlockStat.range, repairRadius / tilesize, StatUnit.blocks); + } + @Override public void init(){ consumes.powerCond(powerUse, entity -> ((RepairPointEntity)entity).target != null); @@ -59,6 +67,11 @@ public class RepairPoint extends Block{ Drawf.dashCircle(tile.drawx(), tile.drawy(), repairRadius, Pal.accent); } + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + Drawf.dashCircle(x * tilesize + offset(), y * tilesize + offset(), repairRadius, Pal.accent); + } + @Override public void draw(Tile tile){ Draw.rect(baseRegion, tile.drawx(), tile.drawy()); diff --git a/gradle.properties b/gradle.properties index 289d7dd104..fabfd9b669 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=678dca4153074fd4eea29e217e8d8cb1fc56a98f +archash=2db5436d41081362f15d1cf2175293a521d16e6f From 26881fbdb925a1c0483a763a0da75648dee14c52 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 17 Dec 2019 10:58:43 -0500 Subject: [PATCH 105/107] Added server mod error check --- core/src/io/anuke/mindustry/ctype/Content.java | 5 +++-- .../src/io/anuke/mindustry/mod/ContentParser.java | 1 + gradle.properties | 2 +- .../io/anuke/mindustry/server/ServerLauncher.java | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/core/src/io/anuke/mindustry/ctype/Content.java b/core/src/io/anuke/mindustry/ctype/Content.java index 2cd7725970..09a304817d 100644 --- a/core/src/io/anuke/mindustry/ctype/Content.java +++ b/core/src/io/anuke/mindustry/ctype/Content.java @@ -54,9 +54,10 @@ public abstract class Content implements Comparable{ /** The mod that loaded this piece of content. */ public @Nullable LoadedMod mod; /** File that this content was loaded from. */ - public @Nullable - Fi sourceFile; + public @Nullable Fi sourceFile; /** The error that occurred during loading, if applicable. Null if no error occurred. */ public @Nullable String error; + /** Base throwable that caused the error. */ + public @Nullable Throwable baseError; } } diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index af3d432640..826fada015 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -437,6 +437,7 @@ public class ContentParser{ content.minfo.mod = mod; content.minfo.sourceFile = file; content.minfo.error = makeError(error, file); + content.minfo.baseError = error; if(mod != null){ mod.erroredContent.add(content); } diff --git a/gradle.properties b/gradle.properties index fabfd9b669..f236014127 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=2db5436d41081362f15d1cf2175293a521d16e6f +archash=96b64c172da9fed6b23440372fd6c7a081b6ca2e diff --git a/server/src/io/anuke/mindustry/server/ServerLauncher.java b/server/src/io/anuke/mindustry/server/ServerLauncher.java index 9c0e87179f..1210d81606 100644 --- a/server/src/io/anuke/mindustry/server/ServerLauncher.java +++ b/server/src/io/anuke/mindustry/server/ServerLauncher.java @@ -7,8 +7,10 @@ import io.anuke.arc.files.*; import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.ctype.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.mod.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.*; @@ -58,6 +60,19 @@ public class ServerLauncher implements ApplicationListener{ mods.loadScripts(); content.createModContent(); content.init(); + if(mods.hasContentErrors()){ + Log.err("Error occurred loading mod content:"); + for(LoadedMod mod : mods.list()){ + if(mod.hasContentErrors()){ + Log.err("| &ly[{0}]", mod.name); + for(Content cont : mod.erroredContent){ + Log.err("| | &y{0}: &c{1}", cont.minfo.sourceFile.name(), Strings.getSimpleMessage(cont.minfo.baseError).replace("\n", " ")); + } + } + } + Log.err("The server will now exit."); + System.exit(1); + } Core.app.addListener(logic = new Logic()); Core.app.addListener(netServer = new NetServer()); From f504dd2b5ad54065d27102b780c9c0844f9d95d0 Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 17 Dec 2019 17:10:29 -0500 Subject: [PATCH 106/107] Minor tweaks --- core/src/io/anuke/mindustry/mod/ClassAccess.java | 2 +- gradle.properties | 2 +- tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/io/anuke/mindustry/mod/ClassAccess.java b/core/src/io/anuke/mindustry/mod/ClassAccess.java index 9926c6d162..916831a62b 100644 --- a/core/src/io/anuke/mindustry/mod/ClassAccess.java +++ b/core/src/io/anuke/mindustry/mod/ClassAccess.java @@ -3,5 +3,5 @@ package io.anuke.mindustry.mod; import io.anuke.arc.collection.*; //obviously autogenerated, do not touch public class ClassAccess{ - public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.Pixmap", "io.anuke.arc.graphics.Texture", "io.anuke.arc.graphics.TextureData", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.Scene$TouchFocus", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.Content$ModContentInfo", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.ContentType", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.HoverUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$ServerLoadEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ErrorContent", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); + public static final ObjectSet allowedClassNames = ObjectSet.with("io.anuke.arc.Core", "io.anuke.arc.collection.Array", "io.anuke.arc.collection.Array$ArrayIterable", "io.anuke.arc.collection.ArrayMap", "io.anuke.arc.collection.ArrayMap$Entries", "io.anuke.arc.collection.ArrayMap$Keys", "io.anuke.arc.collection.ArrayMap$Values", "io.anuke.arc.collection.AtomicQueue", "io.anuke.arc.collection.BinaryHeap", "io.anuke.arc.collection.BinaryHeap$Node", "io.anuke.arc.collection.Bits", "io.anuke.arc.collection.BooleanArray", "io.anuke.arc.collection.ByteArray", "io.anuke.arc.collection.CharArray", "io.anuke.arc.collection.ComparableTimSort", "io.anuke.arc.collection.DelayedRemovalArray", "io.anuke.arc.collection.EnumSet", "io.anuke.arc.collection.EnumSet$EnumSetIterator", "io.anuke.arc.collection.FloatArray", "io.anuke.arc.collection.GridBits", "io.anuke.arc.collection.GridMap", "io.anuke.arc.collection.IdentityMap", "io.anuke.arc.collection.IdentityMap$Entries", "io.anuke.arc.collection.IdentityMap$Entry", "io.anuke.arc.collection.IdentityMap$Keys", "io.anuke.arc.collection.IdentityMap$Values", "io.anuke.arc.collection.IntArray", "io.anuke.arc.collection.IntFloatMap", "io.anuke.arc.collection.IntFloatMap$Entries", "io.anuke.arc.collection.IntFloatMap$Entry", "io.anuke.arc.collection.IntFloatMap$Keys", "io.anuke.arc.collection.IntFloatMap$Values", "io.anuke.arc.collection.IntIntMap", "io.anuke.arc.collection.IntIntMap$Entries", "io.anuke.arc.collection.IntIntMap$Entry", "io.anuke.arc.collection.IntIntMap$Keys", "io.anuke.arc.collection.IntIntMap$Values", "io.anuke.arc.collection.IntMap", "io.anuke.arc.collection.IntMap$Entries", "io.anuke.arc.collection.IntMap$Entry", "io.anuke.arc.collection.IntMap$Keys", "io.anuke.arc.collection.IntMap$Values", "io.anuke.arc.collection.IntQueue", "io.anuke.arc.collection.IntSet", "io.anuke.arc.collection.IntSet$IntSetIterator", "io.anuke.arc.collection.LongArray", "io.anuke.arc.collection.LongMap", "io.anuke.arc.collection.LongMap$Entries", "io.anuke.arc.collection.LongMap$Entry", "io.anuke.arc.collection.LongMap$Keys", "io.anuke.arc.collection.LongMap$Values", "io.anuke.arc.collection.LongQueue", "io.anuke.arc.collection.ObjectFloatMap", "io.anuke.arc.collection.ObjectFloatMap$Entries", "io.anuke.arc.collection.ObjectFloatMap$Entry", "io.anuke.arc.collection.ObjectFloatMap$Keys", "io.anuke.arc.collection.ObjectFloatMap$Values", "io.anuke.arc.collection.ObjectIntMap", "io.anuke.arc.collection.ObjectIntMap$Entries", "io.anuke.arc.collection.ObjectIntMap$Entry", "io.anuke.arc.collection.ObjectIntMap$Keys", "io.anuke.arc.collection.ObjectIntMap$Values", "io.anuke.arc.collection.ObjectMap", "io.anuke.arc.collection.ObjectMap$Entries", "io.anuke.arc.collection.ObjectMap$Entry", "io.anuke.arc.collection.ObjectMap$Keys", "io.anuke.arc.collection.ObjectMap$Values", "io.anuke.arc.collection.ObjectSet", "io.anuke.arc.collection.ObjectSet$ObjectSetIterator", "io.anuke.arc.collection.OrderedMap", "io.anuke.arc.collection.OrderedMap$OrderedMapEntries", "io.anuke.arc.collection.OrderedMap$OrderedMapKeys", "io.anuke.arc.collection.OrderedMap$OrderedMapValues", "io.anuke.arc.collection.OrderedSet", "io.anuke.arc.collection.OrderedSet$OrderedSetIterator", "io.anuke.arc.collection.PooledLinkedList", "io.anuke.arc.collection.PooledLinkedList$Item", "io.anuke.arc.collection.Queue", "io.anuke.arc.collection.Queue$QueueIterable", "io.anuke.arc.collection.ShortArray", "io.anuke.arc.collection.SnapshotArray", "io.anuke.arc.collection.Sort", "io.anuke.arc.collection.SortedIntList", "io.anuke.arc.collection.SortedIntList$Iterator", "io.anuke.arc.collection.SortedIntList$Node", "io.anuke.arc.collection.StringMap", "io.anuke.arc.collection.TimSort", "io.anuke.arc.func.Boolc", "io.anuke.arc.func.Boolf", "io.anuke.arc.func.Boolf2", "io.anuke.arc.func.Boolp", "io.anuke.arc.func.Cons", "io.anuke.arc.func.Cons2", "io.anuke.arc.func.Floatc", "io.anuke.arc.func.Floatc2", "io.anuke.arc.func.Floatc4", "io.anuke.arc.func.Floatf", "io.anuke.arc.func.Floatp", "io.anuke.arc.func.Func", "io.anuke.arc.func.Func2", "io.anuke.arc.func.Func3", "io.anuke.arc.func.Intc", "io.anuke.arc.func.Intc2", "io.anuke.arc.func.Intc4", "io.anuke.arc.func.Intf", "io.anuke.arc.func.Intp", "io.anuke.arc.func.Prov", "io.anuke.arc.graphics.Color", "io.anuke.arc.graphics.Pixmap", "io.anuke.arc.graphics.Texture", "io.anuke.arc.graphics.TextureData", "io.anuke.arc.graphics.g2d.Draw", "io.anuke.arc.graphics.g2d.Fill", "io.anuke.arc.graphics.g2d.Lines", "io.anuke.arc.graphics.g2d.TextureAtlas", "io.anuke.arc.graphics.g2d.TextureAtlas$AtlasRegion", "io.anuke.arc.graphics.g2d.TextureRegion", "io.anuke.arc.math.Angles", "io.anuke.arc.math.Mathf", "io.anuke.arc.scene.Action", "io.anuke.arc.scene.Element", "io.anuke.arc.scene.Group", "io.anuke.arc.scene.Scene", "io.anuke.arc.scene.actions.Actions", "io.anuke.arc.scene.actions.AddAction", "io.anuke.arc.scene.actions.AddListenerAction", "io.anuke.arc.scene.actions.AfterAction", "io.anuke.arc.scene.actions.AlphaAction", "io.anuke.arc.scene.actions.ColorAction", "io.anuke.arc.scene.actions.DelayAction", "io.anuke.arc.scene.actions.DelegateAction", "io.anuke.arc.scene.actions.FloatAction", "io.anuke.arc.scene.actions.IntAction", "io.anuke.arc.scene.actions.LayoutAction", "io.anuke.arc.scene.actions.MoveByAction", "io.anuke.arc.scene.actions.MoveToAction", "io.anuke.arc.scene.actions.OriginAction", "io.anuke.arc.scene.actions.ParallelAction", "io.anuke.arc.scene.actions.RelativeTemporalAction", "io.anuke.arc.scene.actions.RemoveAction", "io.anuke.arc.scene.actions.RemoveActorAction", "io.anuke.arc.scene.actions.RemoveListenerAction", "io.anuke.arc.scene.actions.RepeatAction", "io.anuke.arc.scene.actions.RotateByAction", "io.anuke.arc.scene.actions.RotateToAction", "io.anuke.arc.scene.actions.RunnableAction", "io.anuke.arc.scene.actions.ScaleByAction", "io.anuke.arc.scene.actions.ScaleToAction", "io.anuke.arc.scene.actions.SequenceAction", "io.anuke.arc.scene.actions.SizeByAction", "io.anuke.arc.scene.actions.SizeToAction", "io.anuke.arc.scene.actions.TemporalAction", "io.anuke.arc.scene.actions.TimeScaleAction", "io.anuke.arc.scene.actions.TouchableAction", "io.anuke.arc.scene.actions.TranslateByAction", "io.anuke.arc.scene.actions.VisibleAction", "io.anuke.arc.scene.event.ChangeListener", "io.anuke.arc.scene.event.ChangeListener$ChangeEvent", "io.anuke.arc.scene.event.ClickListener", "io.anuke.arc.scene.event.DragListener", "io.anuke.arc.scene.event.DragScrollListener", "io.anuke.arc.scene.event.ElementGestureListener", "io.anuke.arc.scene.event.EventListener", "io.anuke.arc.scene.event.FocusListener", "io.anuke.arc.scene.event.FocusListener$FocusEvent", "io.anuke.arc.scene.event.FocusListener$FocusEvent$Type", "io.anuke.arc.scene.event.HandCursorListener", "io.anuke.arc.scene.event.IbeamCursorListener", "io.anuke.arc.scene.event.InputEvent", "io.anuke.arc.scene.event.InputEvent$Type", "io.anuke.arc.scene.event.InputListener", "io.anuke.arc.scene.event.SceneEvent", "io.anuke.arc.scene.event.Touchable", "io.anuke.arc.scene.event.VisibilityEvent", "io.anuke.arc.scene.event.VisibilityListener", "io.anuke.arc.scene.style.BaseDrawable", "io.anuke.arc.scene.style.Drawable", "io.anuke.arc.scene.style.NinePatchDrawable", "io.anuke.arc.scene.style.ScaledNinePatchDrawable", "io.anuke.arc.scene.style.Style", "io.anuke.arc.scene.style.TextureRegionDrawable", "io.anuke.arc.scene.style.TiledDrawable", "io.anuke.arc.scene.style.TransformDrawable", "io.anuke.arc.scene.ui.Button", "io.anuke.arc.scene.ui.Button$ButtonStyle", "io.anuke.arc.scene.ui.ButtonGroup", "io.anuke.arc.scene.ui.CheckBox", "io.anuke.arc.scene.ui.CheckBox$CheckBoxStyle", "io.anuke.arc.scene.ui.ColorImage", "io.anuke.arc.scene.ui.Dialog", "io.anuke.arc.scene.ui.Dialog$DialogStyle", "io.anuke.arc.scene.ui.Image", "io.anuke.arc.scene.ui.ImageButton", "io.anuke.arc.scene.ui.ImageButton$ImageButtonStyle", "io.anuke.arc.scene.ui.KeybindDialog", "io.anuke.arc.scene.ui.KeybindDialog$KeybindDialogStyle", "io.anuke.arc.scene.ui.Label", "io.anuke.arc.scene.ui.Label$LabelStyle", "io.anuke.arc.scene.ui.ProgressBar", "io.anuke.arc.scene.ui.ProgressBar$ProgressBarStyle", "io.anuke.arc.scene.ui.ScrollPane", "io.anuke.arc.scene.ui.ScrollPane$ScrollPaneStyle", "io.anuke.arc.scene.ui.SettingsDialog", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$CheckSetting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$Setting", "io.anuke.arc.scene.ui.SettingsDialog$SettingsTable$SliderSetting", "io.anuke.arc.scene.ui.SettingsDialog$StringProcessor", "io.anuke.arc.scene.ui.Slider", "io.anuke.arc.scene.ui.Slider$SliderStyle", "io.anuke.arc.scene.ui.TextArea", "io.anuke.arc.scene.ui.TextArea$TextAreaListener", "io.anuke.arc.scene.ui.TextButton", "io.anuke.arc.scene.ui.TextButton$TextButtonStyle", "io.anuke.arc.scene.ui.TextField", "io.anuke.arc.scene.ui.TextField$DefaultOnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$OnscreenKeyboard", "io.anuke.arc.scene.ui.TextField$TextFieldClickListener", "io.anuke.arc.scene.ui.TextField$TextFieldFilter", "io.anuke.arc.scene.ui.TextField$TextFieldListener", "io.anuke.arc.scene.ui.TextField$TextFieldStyle", "io.anuke.arc.scene.ui.TextField$TextFieldValidator", "io.anuke.arc.scene.ui.Tooltip", "io.anuke.arc.scene.ui.Tooltip$Tooltips", "io.anuke.arc.scene.ui.Touchpad", "io.anuke.arc.scene.ui.Touchpad$TouchpadStyle", "io.anuke.arc.scene.ui.TreeElement", "io.anuke.arc.scene.ui.TreeElement$Node", "io.anuke.arc.scene.ui.TreeElement$TreeStyle", "io.anuke.arc.scene.ui.layout.Cell", "io.anuke.arc.scene.ui.layout.Collapser", "io.anuke.arc.scene.ui.layout.HorizontalGroup", "io.anuke.arc.scene.ui.layout.Scl", "io.anuke.arc.scene.ui.layout.Stack", "io.anuke.arc.scene.ui.layout.Table", "io.anuke.arc.scene.ui.layout.Table$DrawRect", "io.anuke.arc.scene.ui.layout.VerticalGroup", "io.anuke.arc.scene.ui.layout.WidgetGroup", "io.anuke.arc.scene.utils.ArraySelection", "io.anuke.arc.scene.utils.Cullable", "io.anuke.arc.scene.utils.Disableable", "io.anuke.arc.scene.utils.DragAndDrop", "io.anuke.arc.scene.utils.DragAndDrop$Payload", "io.anuke.arc.scene.utils.DragAndDrop$Source", "io.anuke.arc.scene.utils.DragAndDrop$Target", "io.anuke.arc.scene.utils.Elements", "io.anuke.arc.scene.utils.Layout", "io.anuke.arc.scene.utils.Selection", "io.anuke.arc.util.I18NBundle", "io.anuke.arc.util.Time", "io.anuke.mindustry.Vars", "io.anuke.mindustry.ai.BlockIndexer", "io.anuke.mindustry.ai.Pathfinder", "io.anuke.mindustry.ai.Pathfinder$PathData", "io.anuke.mindustry.ai.Pathfinder$PathTarget", "io.anuke.mindustry.ai.Pathfinder$PathTileStruct", "io.anuke.mindustry.ai.WaveSpawner", "io.anuke.mindustry.content.Blocks", "io.anuke.mindustry.content.Bullets", "io.anuke.mindustry.content.Fx", "io.anuke.mindustry.content.Items", "io.anuke.mindustry.content.Liquids", "io.anuke.mindustry.content.Loadouts", "io.anuke.mindustry.content.Mechs", "io.anuke.mindustry.content.StatusEffects", "io.anuke.mindustry.content.TechTree", "io.anuke.mindustry.content.TechTree$TechNode", "io.anuke.mindustry.content.TypeIDs", "io.anuke.mindustry.content.UnitTypes", "io.anuke.mindustry.content.Zones", "io.anuke.mindustry.core.ContentLoader", "io.anuke.mindustry.core.Control", "io.anuke.mindustry.core.FileTree", "io.anuke.mindustry.core.GameState", "io.anuke.mindustry.core.GameState$State", "io.anuke.mindustry.core.Logic", "io.anuke.mindustry.core.Platform", "io.anuke.mindustry.core.Renderer", "io.anuke.mindustry.core.UI", "io.anuke.mindustry.core.Version", "io.anuke.mindustry.core.World", "io.anuke.mindustry.core.World$Raycaster", "io.anuke.mindustry.ctype.Content", "io.anuke.mindustry.ctype.Content$ModContentInfo", "io.anuke.mindustry.ctype.ContentList", "io.anuke.mindustry.ctype.ContentType", "io.anuke.mindustry.ctype.MappableContent", "io.anuke.mindustry.ctype.UnlockableContent", "io.anuke.mindustry.editor.DrawOperation", "io.anuke.mindustry.editor.DrawOperation$OpType", "io.anuke.mindustry.editor.DrawOperation$TileOpStruct", "io.anuke.mindustry.editor.EditorTile", "io.anuke.mindustry.editor.EditorTool", "io.anuke.mindustry.editor.MapEditor", "io.anuke.mindustry.editor.MapEditor$Context", "io.anuke.mindustry.editor.MapEditorDialog", "io.anuke.mindustry.editor.MapGenerateDialog", "io.anuke.mindustry.editor.MapInfoDialog", "io.anuke.mindustry.editor.MapLoadDialog", "io.anuke.mindustry.editor.MapRenderer", "io.anuke.mindustry.editor.MapResizeDialog", "io.anuke.mindustry.editor.MapSaveDialog", "io.anuke.mindustry.editor.MapView", "io.anuke.mindustry.editor.OperationStack", "io.anuke.mindustry.editor.WaveInfoDialog", "io.anuke.mindustry.entities.Damage", "io.anuke.mindustry.entities.Damage$PropCellStruct", "io.anuke.mindustry.entities.Effects", "io.anuke.mindustry.entities.Effects$Effect", "io.anuke.mindustry.entities.Effects$EffectContainer", "io.anuke.mindustry.entities.Effects$EffectProvider", "io.anuke.mindustry.entities.Effects$EffectRenderer", "io.anuke.mindustry.entities.Effects$ScreenshakeProvider", "io.anuke.mindustry.entities.Entities", "io.anuke.mindustry.entities.EntityCollisions", "io.anuke.mindustry.entities.EntityGroup", "io.anuke.mindustry.entities.Predict", "io.anuke.mindustry.entities.TargetPriority", "io.anuke.mindustry.entities.Units", "io.anuke.mindustry.entities.bullet.ArtilleryBulletType", "io.anuke.mindustry.entities.bullet.BasicBulletType", "io.anuke.mindustry.entities.bullet.BombBulletType", "io.anuke.mindustry.entities.bullet.BulletType", "io.anuke.mindustry.entities.bullet.FlakBulletType", "io.anuke.mindustry.entities.bullet.HealBulletType", "io.anuke.mindustry.entities.bullet.LiquidBulletType", "io.anuke.mindustry.entities.bullet.MassDriverBolt", "io.anuke.mindustry.entities.bullet.MissileBulletType", "io.anuke.mindustry.entities.effect.Decal", "io.anuke.mindustry.entities.effect.Fire", "io.anuke.mindustry.entities.effect.GroundEffectEntity", "io.anuke.mindustry.entities.effect.GroundEffectEntity$GroundEffect", "io.anuke.mindustry.entities.effect.ItemTransfer", "io.anuke.mindustry.entities.effect.Lightning", "io.anuke.mindustry.entities.effect.Puddle", "io.anuke.mindustry.entities.effect.RubbleDecal", "io.anuke.mindustry.entities.effect.ScorchDecal", "io.anuke.mindustry.entities.traits.AbsorbTrait", "io.anuke.mindustry.entities.traits.BelowLiquidTrait", "io.anuke.mindustry.entities.traits.BuilderMinerTrait", "io.anuke.mindustry.entities.traits.BuilderTrait", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildDataStatic", "io.anuke.mindustry.entities.traits.BuilderTrait$BuildRequest", "io.anuke.mindustry.entities.traits.DamageTrait", "io.anuke.mindustry.entities.traits.DrawTrait", "io.anuke.mindustry.entities.traits.Entity", "io.anuke.mindustry.entities.traits.HealthTrait", "io.anuke.mindustry.entities.traits.KillerTrait", "io.anuke.mindustry.entities.traits.MinerTrait", "io.anuke.mindustry.entities.traits.MoveTrait", "io.anuke.mindustry.entities.traits.SaveTrait", "io.anuke.mindustry.entities.traits.Saveable", "io.anuke.mindustry.entities.traits.ScaleTrait", "io.anuke.mindustry.entities.traits.ShooterTrait", "io.anuke.mindustry.entities.traits.SolidTrait", "io.anuke.mindustry.entities.traits.SpawnerTrait", "io.anuke.mindustry.entities.traits.SyncTrait", "io.anuke.mindustry.entities.traits.TargetTrait", "io.anuke.mindustry.entities.traits.TeamTrait", "io.anuke.mindustry.entities.traits.TimeTrait", "io.anuke.mindustry.entities.traits.TypeTrait", "io.anuke.mindustry.entities.traits.VelocityTrait", "io.anuke.mindustry.entities.type.BaseEntity", "io.anuke.mindustry.entities.type.BaseUnit", "io.anuke.mindustry.entities.type.Bullet", "io.anuke.mindustry.entities.type.DestructibleEntity", "io.anuke.mindustry.entities.type.EffectEntity", "io.anuke.mindustry.entities.type.Player", "io.anuke.mindustry.entities.type.SolidEntity", "io.anuke.mindustry.entities.type.TileEntity", "io.anuke.mindustry.entities.type.TimedEntity", "io.anuke.mindustry.entities.type.Unit", "io.anuke.mindustry.entities.type.base.BaseDrone", "io.anuke.mindustry.entities.type.base.BuilderDrone", "io.anuke.mindustry.entities.type.base.FlyingUnit", "io.anuke.mindustry.entities.type.base.GroundUnit", "io.anuke.mindustry.entities.type.base.HoverUnit", "io.anuke.mindustry.entities.type.base.MinerDrone", "io.anuke.mindustry.entities.type.base.RepairDrone", "io.anuke.mindustry.entities.units.StateMachine", "io.anuke.mindustry.entities.units.Statuses", "io.anuke.mindustry.entities.units.Statuses$StatusEntry", "io.anuke.mindustry.entities.units.UnitCommand", "io.anuke.mindustry.entities.units.UnitDrops", "io.anuke.mindustry.entities.units.UnitState", "io.anuke.mindustry.game.DefaultWaves", "io.anuke.mindustry.game.Difficulty", "io.anuke.mindustry.game.EventType", "io.anuke.mindustry.game.EventType$BlockBuildBeginEvent", "io.anuke.mindustry.game.EventType$BlockBuildEndEvent", "io.anuke.mindustry.game.EventType$BlockDestroyEvent", "io.anuke.mindustry.game.EventType$BlockInfoEvent", "io.anuke.mindustry.game.EventType$BuildSelectEvent", "io.anuke.mindustry.game.EventType$ClientLoadEvent", "io.anuke.mindustry.game.EventType$CommandIssueEvent", "io.anuke.mindustry.game.EventType$ContentReloadEvent", "io.anuke.mindustry.game.EventType$CoreItemDeliverEvent", "io.anuke.mindustry.game.EventType$DepositEvent", "io.anuke.mindustry.game.EventType$DisposeEvent", "io.anuke.mindustry.game.EventType$GameOverEvent", "io.anuke.mindustry.game.EventType$LaunchEvent", "io.anuke.mindustry.game.EventType$LaunchItemEvent", "io.anuke.mindustry.game.EventType$LineConfirmEvent", "io.anuke.mindustry.game.EventType$LoseEvent", "io.anuke.mindustry.game.EventType$MapMakeEvent", "io.anuke.mindustry.game.EventType$MapPublishEvent", "io.anuke.mindustry.game.EventType$MechChangeEvent", "io.anuke.mindustry.game.EventType$PlayEvent", "io.anuke.mindustry.game.EventType$PlayerBanEvent", "io.anuke.mindustry.game.EventType$PlayerChatEvent", "io.anuke.mindustry.game.EventType$PlayerConnect", "io.anuke.mindustry.game.EventType$PlayerIpBanEvent", "io.anuke.mindustry.game.EventType$PlayerIpUnbanEvent", "io.anuke.mindustry.game.EventType$PlayerJoin", "io.anuke.mindustry.game.EventType$PlayerLeave", "io.anuke.mindustry.game.EventType$PlayerUnbanEvent", "io.anuke.mindustry.game.EventType$ResearchEvent", "io.anuke.mindustry.game.EventType$ResetEvent", "io.anuke.mindustry.game.EventType$ResizeEvent", "io.anuke.mindustry.game.EventType$ServerLoadEvent", "io.anuke.mindustry.game.EventType$StateChangeEvent", "io.anuke.mindustry.game.EventType$TapConfigEvent", "io.anuke.mindustry.game.EventType$TapEvent", "io.anuke.mindustry.game.EventType$TileChangeEvent", "io.anuke.mindustry.game.EventType$Trigger", "io.anuke.mindustry.game.EventType$TurretAmmoDeliverEvent", "io.anuke.mindustry.game.EventType$UnitCreateEvent", "io.anuke.mindustry.game.EventType$UnitDestroyEvent", "io.anuke.mindustry.game.EventType$UnlockEvent", "io.anuke.mindustry.game.EventType$WaveEvent", "io.anuke.mindustry.game.EventType$WinEvent", "io.anuke.mindustry.game.EventType$WithdrawEvent", "io.anuke.mindustry.game.EventType$WorldLoadEvent", "io.anuke.mindustry.game.EventType$ZoneConfigureCompleteEvent", "io.anuke.mindustry.game.EventType$ZoneRequireCompleteEvent", "io.anuke.mindustry.game.Gamemode", "io.anuke.mindustry.game.GlobalData", "io.anuke.mindustry.game.LoopControl", "io.anuke.mindustry.game.MusicControl", "io.anuke.mindustry.game.Objective", "io.anuke.mindustry.game.Objectives", "io.anuke.mindustry.game.Objectives$Launched", "io.anuke.mindustry.game.Objectives$Unlock", "io.anuke.mindustry.game.Objectives$Wave", "io.anuke.mindustry.game.Objectives$ZoneObjective", "io.anuke.mindustry.game.Objectives$ZoneWave", "io.anuke.mindustry.game.Rules", "io.anuke.mindustry.game.Saves", "io.anuke.mindustry.game.Saves$SaveSlot", "io.anuke.mindustry.game.Schematic", "io.anuke.mindustry.game.Schematic$Stile", "io.anuke.mindustry.game.Schematics", "io.anuke.mindustry.game.SoundLoop", "io.anuke.mindustry.game.SpawnGroup", "io.anuke.mindustry.game.Stats", "io.anuke.mindustry.game.Stats$Rank", "io.anuke.mindustry.game.Stats$RankResult", "io.anuke.mindustry.game.Team", "io.anuke.mindustry.game.Teams", "io.anuke.mindustry.game.Teams$BrokenBlock", "io.anuke.mindustry.game.Teams$TeamData", "io.anuke.mindustry.game.Tutorial", "io.anuke.mindustry.game.Tutorial$TutorialStage", "io.anuke.mindustry.gen.BufferItem", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Call", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.Icon", "io.anuke.mindustry.gen.MethodHash", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.Musics", "io.anuke.mindustry.gen.PathTile", "io.anuke.mindustry.gen.PropCell", "io.anuke.mindustry.gen.RemoteReadClient", "io.anuke.mindustry.gen.RemoteReadServer", "io.anuke.mindustry.gen.Serialization", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Sounds", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.Tex", "io.anuke.mindustry.gen.TileOp", "io.anuke.mindustry.graphics.BlockRenderer", "io.anuke.mindustry.graphics.Bloom", "io.anuke.mindustry.graphics.CacheLayer", "io.anuke.mindustry.graphics.Drawf", "io.anuke.mindustry.graphics.FloorRenderer", "io.anuke.mindustry.graphics.IndexedRenderer", "io.anuke.mindustry.graphics.Layer", "io.anuke.mindustry.graphics.LightRenderer", "io.anuke.mindustry.graphics.MenuRenderer", "io.anuke.mindustry.graphics.MinimapRenderer", "io.anuke.mindustry.graphics.MultiPacker", "io.anuke.mindustry.graphics.MultiPacker$PageType", "io.anuke.mindustry.graphics.OverlayRenderer", "io.anuke.mindustry.graphics.Pal", "io.anuke.mindustry.graphics.Pixelator", "io.anuke.mindustry.graphics.Shaders", "io.anuke.mindustry.input.Binding", "io.anuke.mindustry.input.DesktopInput", "io.anuke.mindustry.input.InputHandler", "io.anuke.mindustry.input.InputHandler$PlaceLine", "io.anuke.mindustry.input.MobileInput", "io.anuke.mindustry.input.PlaceMode", "io.anuke.mindustry.input.Placement", "io.anuke.mindustry.input.Placement$DistanceHeuristic", "io.anuke.mindustry.input.Placement$NormalizeDrawResult", "io.anuke.mindustry.input.Placement$NormalizeResult", "io.anuke.mindustry.input.Placement$TileHueristic", "io.anuke.mindustry.maps.Map", "io.anuke.mindustry.maps.Maps", "io.anuke.mindustry.maps.Maps$MapProvider", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.Maps$ShuffleMode", "io.anuke.mindustry.maps.filters.BlendFilter", "io.anuke.mindustry.maps.filters.ClearFilter", "io.anuke.mindustry.maps.filters.DistortFilter", "io.anuke.mindustry.maps.filters.FilterOption", "io.anuke.mindustry.maps.filters.FilterOption$BlockOption", "io.anuke.mindustry.maps.filters.FilterOption$SliderOption", "io.anuke.mindustry.maps.filters.GenerateFilter", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput", "io.anuke.mindustry.maps.filters.GenerateFilter$GenerateInput$TileProvider", "io.anuke.mindustry.maps.filters.MedianFilter", "io.anuke.mindustry.maps.filters.MirrorFilter", "io.anuke.mindustry.maps.filters.NoiseFilter", "io.anuke.mindustry.maps.filters.OreFilter", "io.anuke.mindustry.maps.filters.OreMedianFilter", "io.anuke.mindustry.maps.filters.RiverNoiseFilter", "io.anuke.mindustry.maps.filters.ScatterFilter", "io.anuke.mindustry.maps.filters.TerrainFilter", "io.anuke.mindustry.maps.generators.BasicGenerator", "io.anuke.mindustry.maps.generators.BasicGenerator$DistanceHeuristic", "io.anuke.mindustry.maps.generators.BasicGenerator$TileHueristic", "io.anuke.mindustry.maps.generators.Generator", "io.anuke.mindustry.maps.generators.MapGenerator", "io.anuke.mindustry.maps.generators.MapGenerator$Decoration", "io.anuke.mindustry.maps.generators.RandomGenerator", "io.anuke.mindustry.maps.zonegen.DesertWastesGenerator", "io.anuke.mindustry.maps.zonegen.OvergrowthGenerator", "io.anuke.mindustry.type.Category", "io.anuke.mindustry.type.ErrorContent", "io.anuke.mindustry.type.Item", "io.anuke.mindustry.type.ItemStack", "io.anuke.mindustry.type.ItemType", "io.anuke.mindustry.type.Liquid", "io.anuke.mindustry.type.LiquidStack", "io.anuke.mindustry.type.Mech", "io.anuke.mindustry.type.Publishable", "io.anuke.mindustry.type.StatusEffect", "io.anuke.mindustry.type.StatusEffect$TransitionHandler", "io.anuke.mindustry.type.TypeID", "io.anuke.mindustry.type.UnitType", "io.anuke.mindustry.type.Weapon", "io.anuke.mindustry.type.WeatherEvent", "io.anuke.mindustry.type.Zone", "io.anuke.mindustry.ui.Bar", "io.anuke.mindustry.ui.BorderImage", "io.anuke.mindustry.ui.Cicon", "io.anuke.mindustry.ui.ContentDisplay", "io.anuke.mindustry.ui.Fonts", "io.anuke.mindustry.ui.GridImage", "io.anuke.mindustry.ui.IconSize", "io.anuke.mindustry.ui.IntFormat", "io.anuke.mindustry.ui.ItemDisplay", "io.anuke.mindustry.ui.ItemImage", "io.anuke.mindustry.ui.ItemsDisplay", "io.anuke.mindustry.ui.Links", "io.anuke.mindustry.ui.Links$LinkEntry", "io.anuke.mindustry.ui.LiquidDisplay", "io.anuke.mindustry.ui.Minimap", "io.anuke.mindustry.ui.MobileButton", "io.anuke.mindustry.ui.MultiReqImage", "io.anuke.mindustry.ui.ReqImage", "io.anuke.mindustry.ui.Styles", "io.anuke.mindustry.ui.dialogs.AboutDialog", "io.anuke.mindustry.ui.dialogs.AdminsDialog", "io.anuke.mindustry.ui.dialogs.BansDialog", "io.anuke.mindustry.ui.dialogs.ColorPicker", "io.anuke.mindustry.ui.dialogs.ContentInfoDialog", "io.anuke.mindustry.ui.dialogs.ControlsDialog", "io.anuke.mindustry.ui.dialogs.CustomGameDialog", "io.anuke.mindustry.ui.dialogs.CustomRulesDialog", "io.anuke.mindustry.ui.dialogs.DatabaseDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog", "io.anuke.mindustry.ui.dialogs.DeployDialog$View", "io.anuke.mindustry.ui.dialogs.DeployDialog$ZoneNode", "io.anuke.mindustry.ui.dialogs.DiscordDialog", "io.anuke.mindustry.ui.dialogs.FileChooser", "io.anuke.mindustry.ui.dialogs.FileChooser$FileHistory", "io.anuke.mindustry.ui.dialogs.FloatingDialog", "io.anuke.mindustry.ui.dialogs.GameOverDialog", "io.anuke.mindustry.ui.dialogs.HostDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog", "io.anuke.mindustry.ui.dialogs.JoinDialog$Server", "io.anuke.mindustry.ui.dialogs.LanguageDialog", "io.anuke.mindustry.ui.dialogs.LoadDialog", "io.anuke.mindustry.ui.dialogs.LoadoutDialog", "io.anuke.mindustry.ui.dialogs.MapPlayDialog", "io.anuke.mindustry.ui.dialogs.MapsDialog", "io.anuke.mindustry.ui.dialogs.MinimapDialog", "io.anuke.mindustry.ui.dialogs.ModsDialog", "io.anuke.mindustry.ui.dialogs.PaletteDialog", "io.anuke.mindustry.ui.dialogs.PausedDialog", "io.anuke.mindustry.ui.dialogs.SaveDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicImage", "io.anuke.mindustry.ui.dialogs.SchematicsDialog$SchematicInfoDialog", "io.anuke.mindustry.ui.dialogs.SettingsMenuDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$LayoutNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$TechTreeNode", "io.anuke.mindustry.ui.dialogs.TechTreeDialog$View", "io.anuke.mindustry.ui.dialogs.TraceDialog", "io.anuke.mindustry.ui.dialogs.ZoneInfoDialog", "io.anuke.mindustry.ui.fragments.BlockConfigFragment", "io.anuke.mindustry.ui.fragments.BlockInventoryFragment", "io.anuke.mindustry.ui.fragments.ChatFragment", "io.anuke.mindustry.ui.fragments.FadeInFragment", "io.anuke.mindustry.ui.fragments.Fragment", "io.anuke.mindustry.ui.fragments.HudFragment", "io.anuke.mindustry.ui.fragments.LoadingFragment", "io.anuke.mindustry.ui.fragments.MenuFragment", "io.anuke.mindustry.ui.fragments.OverlayFragment", "io.anuke.mindustry.ui.fragments.PlacementFragment", "io.anuke.mindustry.ui.fragments.PlayerListFragment", "io.anuke.mindustry.ui.fragments.ScriptConsoleFragment", "io.anuke.mindustry.ui.layout.BranchTreeLayout", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeAlignment", "io.anuke.mindustry.ui.layout.BranchTreeLayout$TreeLocation", "io.anuke.mindustry.ui.layout.RadialTreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout", "io.anuke.mindustry.ui.layout.TreeLayout$TreeNode", "io.anuke.mindustry.world.Block", "io.anuke.mindustry.world.BlockStorage", "io.anuke.mindustry.world.Build", "io.anuke.mindustry.world.CachedTile", "io.anuke.mindustry.world.DirectionalItemBuffer", "io.anuke.mindustry.world.DirectionalItemBuffer$BufferItemStruct", "io.anuke.mindustry.world.Edges", "io.anuke.mindustry.world.ItemBuffer", "io.anuke.mindustry.world.LegacyColorMapper", "io.anuke.mindustry.world.LegacyColorMapper$LegacyBlock", "io.anuke.mindustry.world.Pos", "io.anuke.mindustry.world.StaticTree", "io.anuke.mindustry.world.Tile", "io.anuke.mindustry.world.WorldContext", "io.anuke.mindustry.world.blocks.Attributes", "io.anuke.mindustry.world.blocks.Autotiler", "io.anuke.mindustry.world.blocks.Autotiler$AutotilerHolder", "io.anuke.mindustry.world.blocks.BlockPart", "io.anuke.mindustry.world.blocks.BuildBlock", "io.anuke.mindustry.world.blocks.BuildBlock$BuildEntity", "io.anuke.mindustry.world.blocks.DoubleOverlayFloor", "io.anuke.mindustry.world.blocks.Floor", "io.anuke.mindustry.world.blocks.ItemSelection", "io.anuke.mindustry.world.blocks.LiquidBlock", "io.anuke.mindustry.world.blocks.OreBlock", "io.anuke.mindustry.world.blocks.OverlayFloor", "io.anuke.mindustry.world.blocks.PowerBlock", "io.anuke.mindustry.world.blocks.RespawnBlock", "io.anuke.mindustry.world.blocks.Rock", "io.anuke.mindustry.world.blocks.StaticWall", "io.anuke.mindustry.world.blocks.TreeBlock", "io.anuke.mindustry.world.blocks.defense.DeflectorWall", "io.anuke.mindustry.world.blocks.defense.DeflectorWall$DeflectorEntity", "io.anuke.mindustry.world.blocks.defense.Door", "io.anuke.mindustry.world.blocks.defense.Door$DoorEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ForceEntity", "io.anuke.mindustry.world.blocks.defense.ForceProjector$ShieldEntity", "io.anuke.mindustry.world.blocks.defense.MendProjector", "io.anuke.mindustry.world.blocks.defense.MendProjector$MendEntity", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector", "io.anuke.mindustry.world.blocks.defense.OverdriveProjector$OverdriveEntity", "io.anuke.mindustry.world.blocks.defense.ShockMine", "io.anuke.mindustry.world.blocks.defense.SurgeWall", "io.anuke.mindustry.world.blocks.defense.Wall", "io.anuke.mindustry.world.blocks.defense.turrets.ArtilleryTurret", "io.anuke.mindustry.world.blocks.defense.turrets.BurstTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ChargeTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.CooledTurret", "io.anuke.mindustry.world.blocks.defense.turrets.DoubleTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemEntry", "io.anuke.mindustry.world.blocks.defense.turrets.ItemTurret$ItemTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret", "io.anuke.mindustry.world.blocks.defense.turrets.LaserTurret$LaserTurretEntity", "io.anuke.mindustry.world.blocks.defense.turrets.LiquidTurret", "io.anuke.mindustry.world.blocks.defense.turrets.PowerTurret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$AmmoEntry", "io.anuke.mindustry.world.blocks.defense.turrets.Turret$TurretEntity", "io.anuke.mindustry.world.blocks.distribution.ArmoredConveyor", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge", "io.anuke.mindustry.world.blocks.distribution.BufferedItemBridge$BufferedItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ConveyorEntity", "io.anuke.mindustry.world.blocks.distribution.Conveyor$ItemPos", "io.anuke.mindustry.world.blocks.distribution.ExtendingItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge", "io.anuke.mindustry.world.blocks.distribution.ItemBridge$ItemBridgeEntity", "io.anuke.mindustry.world.blocks.distribution.Junction", "io.anuke.mindustry.world.blocks.distribution.Junction$JunctionEntity", "io.anuke.mindustry.world.blocks.distribution.MassDriver", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverBulletData", "io.anuke.mindustry.world.blocks.distribution.MassDriver$DriverState", "io.anuke.mindustry.world.blocks.distribution.MassDriver$MassDriverEntity", "io.anuke.mindustry.world.blocks.distribution.OverflowGate", "io.anuke.mindustry.world.blocks.distribution.OverflowGate$OverflowGateEntity", "io.anuke.mindustry.world.blocks.distribution.Router", "io.anuke.mindustry.world.blocks.distribution.Router$RouterEntity", "io.anuke.mindustry.world.blocks.distribution.Sorter", "io.anuke.mindustry.world.blocks.distribution.Sorter$SorterEntity", "io.anuke.mindustry.world.blocks.liquid.ArmoredConduit", "io.anuke.mindustry.world.blocks.liquid.Conduit", "io.anuke.mindustry.world.blocks.liquid.Conduit$ConduitEntity", "io.anuke.mindustry.world.blocks.liquid.LiquidBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidExtendingBridge", "io.anuke.mindustry.world.blocks.liquid.LiquidJunction", "io.anuke.mindustry.world.blocks.liquid.LiquidOverflowGate", "io.anuke.mindustry.world.blocks.liquid.LiquidRouter", "io.anuke.mindustry.world.blocks.liquid.LiquidTank", "io.anuke.mindustry.world.blocks.logic.LogicBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock", "io.anuke.mindustry.world.blocks.logic.MessageBlock$MessageBlockEntity", "io.anuke.mindustry.world.blocks.power.Battery", "io.anuke.mindustry.world.blocks.power.BurnerGenerator", "io.anuke.mindustry.world.blocks.power.ConditionalConsumePower", "io.anuke.mindustry.world.blocks.power.DecayGenerator", "io.anuke.mindustry.world.blocks.power.ImpactReactor", "io.anuke.mindustry.world.blocks.power.ImpactReactor$FusionReactorEntity", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator", "io.anuke.mindustry.world.blocks.power.ItemLiquidGenerator$ItemLiquidGeneratorEntity", "io.anuke.mindustry.world.blocks.power.LightBlock", "io.anuke.mindustry.world.blocks.power.LightBlock$LightEntity", "io.anuke.mindustry.world.blocks.power.NuclearReactor", "io.anuke.mindustry.world.blocks.power.NuclearReactor$NuclearReactorEntity", "io.anuke.mindustry.world.blocks.power.PowerDiode", "io.anuke.mindustry.world.blocks.power.PowerDistributor", "io.anuke.mindustry.world.blocks.power.PowerGenerator", "io.anuke.mindustry.world.blocks.power.PowerGenerator$GeneratorEntity", "io.anuke.mindustry.world.blocks.power.PowerGraph", "io.anuke.mindustry.world.blocks.power.PowerNode", "io.anuke.mindustry.world.blocks.power.SingleTypeGenerator", "io.anuke.mindustry.world.blocks.power.SolarGenerator", "io.anuke.mindustry.world.blocks.power.ThermalGenerator", "io.anuke.mindustry.world.blocks.production.Cultivator", "io.anuke.mindustry.world.blocks.production.Cultivator$CultivatorEntity", "io.anuke.mindustry.world.blocks.production.Drill", "io.anuke.mindustry.world.blocks.production.Drill$DrillEntity", "io.anuke.mindustry.world.blocks.production.Fracker", "io.anuke.mindustry.world.blocks.production.Fracker$FrackerEntity", "io.anuke.mindustry.world.blocks.production.GenericCrafter", "io.anuke.mindustry.world.blocks.production.GenericCrafter$GenericCrafterEntity", "io.anuke.mindustry.world.blocks.production.GenericSmelter", "io.anuke.mindustry.world.blocks.production.Incinerator", "io.anuke.mindustry.world.blocks.production.Incinerator$IncineratorEntity", "io.anuke.mindustry.world.blocks.production.LiquidConverter", "io.anuke.mindustry.world.blocks.production.Pump", "io.anuke.mindustry.world.blocks.production.Separator", "io.anuke.mindustry.world.blocks.production.SolidPump", "io.anuke.mindustry.world.blocks.production.SolidPump$SolidPumpEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemSource", "io.anuke.mindustry.world.blocks.sandbox.ItemSource$ItemSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.ItemVoid", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource", "io.anuke.mindustry.world.blocks.sandbox.LiquidSource$LiquidSourceEntity", "io.anuke.mindustry.world.blocks.sandbox.PowerSource", "io.anuke.mindustry.world.blocks.sandbox.PowerVoid", "io.anuke.mindustry.world.blocks.storage.CoreBlock", "io.anuke.mindustry.world.blocks.storage.CoreBlock$CoreEntity", "io.anuke.mindustry.world.blocks.storage.LaunchPad", "io.anuke.mindustry.world.blocks.storage.StorageBlock", "io.anuke.mindustry.world.blocks.storage.StorageBlock$StorageBlockEntity", "io.anuke.mindustry.world.blocks.storage.Unloader", "io.anuke.mindustry.world.blocks.storage.Unloader$UnloaderEntity", "io.anuke.mindustry.world.blocks.storage.Vault", "io.anuke.mindustry.world.blocks.units.CommandCenter", "io.anuke.mindustry.world.blocks.units.CommandCenter$CommandCenterEntity", "io.anuke.mindustry.world.blocks.units.MechPad", "io.anuke.mindustry.world.blocks.units.MechPad$MechFactoryEntity", "io.anuke.mindustry.world.blocks.units.RallyPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint", "io.anuke.mindustry.world.blocks.units.RepairPoint$RepairPointEntity", "io.anuke.mindustry.world.blocks.units.UnitFactory", "io.anuke.mindustry.world.blocks.units.UnitFactory$UnitFactoryEntity", "io.anuke.mindustry.world.consumers.Consume", "io.anuke.mindustry.world.consumers.ConsumeItemFilter", "io.anuke.mindustry.world.consumers.ConsumeItems", "io.anuke.mindustry.world.consumers.ConsumeLiquid", "io.anuke.mindustry.world.consumers.ConsumeLiquidBase", "io.anuke.mindustry.world.consumers.ConsumeLiquidFilter", "io.anuke.mindustry.world.consumers.ConsumePower", "io.anuke.mindustry.world.consumers.ConsumeType", "io.anuke.mindustry.world.consumers.Consumers", "io.anuke.mindustry.world.meta.Attribute", "io.anuke.mindustry.world.meta.BlockBars", "io.anuke.mindustry.world.meta.BlockFlag", "io.anuke.mindustry.world.meta.BlockGroup", "io.anuke.mindustry.world.meta.BlockStat", "io.anuke.mindustry.world.meta.BlockStats", "io.anuke.mindustry.world.meta.BuildVisibility", "io.anuke.mindustry.world.meta.PowerType", "io.anuke.mindustry.world.meta.Producers", "io.anuke.mindustry.world.meta.StatCategory", "io.anuke.mindustry.world.meta.StatUnit", "io.anuke.mindustry.world.meta.StatValue", "io.anuke.mindustry.world.meta.values.AmmoListValue", "io.anuke.mindustry.world.meta.values.BooleanValue", "io.anuke.mindustry.world.meta.values.BoosterListValue", "io.anuke.mindustry.world.meta.values.ItemFilterValue", "io.anuke.mindustry.world.meta.values.ItemListValue", "io.anuke.mindustry.world.meta.values.LiquidFilterValue", "io.anuke.mindustry.world.meta.values.LiquidValue", "io.anuke.mindustry.world.meta.values.NumberValue", "io.anuke.mindustry.world.meta.values.StringValue", "io.anuke.mindustry.world.modules.BlockModule", "io.anuke.mindustry.world.modules.ConsumeModule", "io.anuke.mindustry.world.modules.ItemModule", "io.anuke.mindustry.world.modules.ItemModule$ItemCalculator", "io.anuke.mindustry.world.modules.ItemModule$ItemConsumer", "io.anuke.mindustry.world.modules.LiquidModule", "io.anuke.mindustry.world.modules.LiquidModule$LiquidCalculator", "io.anuke.mindustry.world.modules.LiquidModule$LiquidConsumer", "io.anuke.mindustry.world.modules.PowerModule", "io.anuke.mindustry.world.producers.Produce", "io.anuke.mindustry.world.producers.ProduceItem", "java.io.PrintStream", "java.lang.Object", "java.lang.Runnable", "java.lang.String", "java.lang.System"); } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f236014127..be68e4ab8e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=96b64c172da9fed6b23440372fd6c7a081b6ca2e +archash=977a110607c508b1f4a5656ad292497fa21f4726 diff --git a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java index 75c7932c55..c2110eb4e1 100644 --- a/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/io/anuke/mindustry/tools/ScriptStubGenerator.java @@ -25,7 +25,8 @@ public class ScriptStubGenerator{ Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); Array nameBlacklist = Array.with("ClientLauncher", "NetClient", "NetServer", "ClassAccess"); Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, - AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class); + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, + Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class); Array nopackage = Array.with("java.lang", "java"); String fileTemplate = "package io.anuke.mindustry.mod;\n" + @@ -33,7 +34,6 @@ public class ScriptStubGenerator{ "import io.anuke.arc.collection.*;\n" + "//obviously autogenerated, do not touch\n" + "public class ClassAccess{\n" + - //"\tstatic final Array> allowedClasses = Array.with($ALLOWED_CLASSES$);\n" + "\tpublic static final ObjectSet allowedClassNames = ObjectSet.with($ALLOWED_CLASS_NAMES$);\n" + "}"; From 1c816be5ce6f25f92994773419db8ecb5224f70d Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 17 Dec 2019 18:15:24 -0500 Subject: [PATCH 107/107] Fixed crash occuring with block overload --- .../io/anuke/mindustry/ui/fragments/PlacementFragment.java | 2 +- fastlane/metadata/android/en-US/changelogs/101.1.txt | 7 +++++++ fastlane/metadata/android/en-US/changelogs/29558.txt | 7 +++++++ gradle.properties | 2 +- 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/101.1.txt create mode 100644 fastlane/metadata/android/en-US/changelogs/29558.txt diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 54ebe7b814..2a843fd5b9 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -262,7 +262,7 @@ public class PlacementFragment extends Fragment{ if(!mobile && Core.settings.getBool("blockselectkeys")){ Array blocks = getByCategory(currentCategory); for(int i = 0; i < blocks.size; i++){ - if(blocks.get(i) == lastDisplay){ + if(blocks.get(i) == lastDisplay && (i + 1) / 10 - 1 < blockSelect.length){ keyCombo = Core.bundle.format("placement.blockselectkeys", Core.keybinds.get(blockSelect[currentCategory.ordinal()]).key.toString()) + (i < 10 ? "" : Core.keybinds.get(blockSelect[(i + 1) / 10 - 1]).key.toString() + ",") + Core.keybinds.get(blockSelect[i % 10]).key.toString() + "]"; diff --git a/fastlane/metadata/android/en-US/changelogs/101.1.txt b/fastlane/metadata/android/en-US/changelogs/101.1.txt new file mode 100644 index 0000000000..0f00ca0c5c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/101.1.txt @@ -0,0 +1,7 @@ +- Added safer mod loading system - errors should no longer crash, but display a log +- Added new Cyrllic font +- Added range display and stats for repair point +- Whitelisted some more classes for scripting +- Fixed scripting not working on some devices [Android] +- Fixed power node desync +- Fixed some blocks not showing up in drill mining list diff --git a/fastlane/metadata/android/en-US/changelogs/29558.txt b/fastlane/metadata/android/en-US/changelogs/29558.txt new file mode 100644 index 0000000000..0f00ca0c5c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29558.txt @@ -0,0 +1,7 @@ +- Added safer mod loading system - errors should no longer crash, but display a log +- Added new Cyrllic font +- Added range display and stats for repair point +- Whitelisted some more classes for scripting +- Fixed scripting not working on some devices [Android] +- Fixed power node desync +- Fixed some blocks not showing up in drill mining list diff --git a/gradle.properties b/gradle.properties index be68e4ab8e..29c1e50fad 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=977a110607c508b1f4a5656ad292497fa21f4726 +archash=88c1a9afe2f5be4dd06e47ac8afe070247b3da29