From 002a0523713683791ee83ac09a3e3550af3df84f Mon Sep 17 00:00:00 2001 From: Anuken Date: Sun, 29 Sep 2019 21:41:32 -0400 Subject: [PATCH] Fixed #748 / Better mod loading --- .../ui/scroll-knob-horizontal-black.9.png | Bin 1822 -> 0 bytes .../ui/scroll-knob-horizontal-black.png | Bin 0 -> 1303 bytes .../ui/scroll-knob-vertical-black.9.png | Bin 1757 -> 0 bytes .../sprites/ui/scroll-knob-vertical-black.png | Bin 0 -> 1302 bytes core/assets/bundles/bundle.properties | 2 +- core/assets/sprites/sprites.atlas | 2 - .../io/anuke/mindustry/content/UnitTypes.java | 30 ++++----- .../mindustry/editor/MapEditorDialog.java | 8 --- .../anuke/mindustry/editor/MapInfoDialog.java | 19 ++++-- .../io/anuke/mindustry/mod/ContentParser.java | 60 +++++++++++------- core/src/io/anuke/mindustry/net/Packets.java | 3 + .../src/io/anuke/mindustry/type/UnitType.java | 16 +++-- core/src/io/anuke/mindustry/ui/Minimap.java | 4 +- .../ui/dialogs/CustomRulesDialog.java | 2 + 14 files changed, 85 insertions(+), 61 deletions(-) delete mode 100644 core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png create mode 100644 core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png delete mode 100644 core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png create mode 100644 core/assets-raw/sprites/ui/scroll-knob-vertical-black.png diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png deleted file mode 100644 index 7a3bac9b10a73a1826553e22b36d52d9c6665721..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1822 zcmeAS@N?(olHy`uVBq!ia0y~yV9;Vl3H-em*Z)>++g<-#vKOy@+%@Oin)kKwPu`vQc+Ic+?vuLFX}oG8*(h z|8ev5sXM%VXD_BkKWw>t&#x$}{QAqE8APTow`JA(EHt7FQK&CS`!yQVZ}t5kI0$s-Omla~9ns`ZANWkoD{eo#=g zIC=Z6N!@dH>IUt(XJRS!;c_ffIPV!tlh38PTb`Y@l2`Mdu~XR1=%A#9-MwdbKD?_f zFj?MaIkAcJRi^R`(|sFwQvK#jusUVDn{n#U^fO^MJ}*6DWuU?Rtc6!B+FU&Jg;;dn z$2V&vc)pfh=03X5n!#m8^ahEdgad3vPK`M!eJ%$K8|ODoH9oYjiBU-T&PK0q=U699 zj(FbYyTo)_>-MxI;sS~SUM!{p0w+Gj)im4_a#|r#_{deoV~R?oSHVGcPQ@b&Dp$FP z*G`d0>d|}_G0EG`lS^~ilp?K}o1LYECp-69KAq!zaLG~eA6gRe7Xo(fdbRpWK(ept z^-BVFXU#Jg9-S7Ix3suiR`bA@3(5Yr-;FX9rnJc$9qLf-wK?Uo#@GDs6v?zXna?8E zt$DjfF4Efgd-}DE^j`5mE4_OW&c!|A;!9q-OffcSyTf;Eu~9=q+S4;?pXN=qe0nCW z?3iWZnxH9j{7y+od})qQi`}`~@cSfl=92xVrR|f?X_VR@oD=x!-HhrdZ#lE~t|@sf z=D5l!p^N9G!v4&;Y^4&42`5$dZsra=KS$zL&(bgz7fs7^X4!LQtbO#*d6MPT@Re%k zW^%-KIWgeo(Mj2MSPFZ(fclGugYlM~hOH%GMHggKUjNHBK?X_}YXSYS7pPb~UKAX+vU|+?V|!!fSEhi5%`{ zUBSzGmTkRO)l>Pp?pC*kM|t7ObOGhwj0h#Ir6(&ooBvg6d3)%4f8Nd*ue-i)-K*P2 zwl85<5=i)5dVj7#FPqwu^|xwPo#AcdW>|kUxz1tzdKp_``F#Q*GxdKz$hiJYZtAaz zjgM9u^)t*VO|}bq6)yYsk+tW0ziH*R&la4r75f9-~C)#=( z4iIVe4_>My%Ff+ok&-c2r=yEQFRE23gk!7IYCbjnzk;(&R5bPanz9cboPTsxbNA+T zeCwJNelS0J^lHfqCDnV=MWT*WJp5>PZuj#K_i7sg^o`HHl3+EtYj*i$%Z#&YI~Inw z2sqd;6P!FV^^8{#*S@c%{(D2p3+Fw(|2_Tdipp+A#)%belFNMe_}T2tl%DgwQ+bWb z>LbsOD67Rz_%ZQy*YW&0-FnJOM3I9m4f~P?xDWRYZPB^JXP7f zIc(jgXSP4N4_DS!cD~-yHsJ`9n4)7#la^UPTd&1iD^0OWCG$RfH?7#`b zelC*}>*W9N*PXwn)ze?;`HSFn?r$3}9K=I)>g(*iUY-lu=@wOsIC>_yzyXV+|wzhs`UFmh>L zL$hFdh=n4LvL&MHGC6;yM%c)B=-L>zv5;UFi20SAkt z{@%!~M`ud$)v9dxEhgjl@cPE-YYv~eQ?oBF^yLwCMpiBnjSH4rB1K+24%ny>u)v{_ bNp(B7@;x>~A4?yQOBg&|{an^LB{Ts5&!tcv diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png new file mode 100644 index 0000000000000000000000000000000000000000..b5056d235aeb71dacfe2dc07071905f9fd624a46 GIT binary patch literal 1303 zcmeAS@N?(olHy`uVBq!ia0y~yV9;P-V36QoV_;zDXxV>&fr05pRY*ihP-3}4K~a8M zW=^U?No7H*LTW{38UsVct+!L7H{Dj?X}cfkIz7RYW8u?+xi9&4{rQ)mZs~dX+?P)m z+L<>RI!$}<-+=S+?dy{J7ECxMvM9=L-law%TPty!Cy#Z~z1{D8kNsihcK(~gcE&c( z3#V@SKK`V?;q_zI?&*8&ZZ~hOUS@p3w18Vf+xYRq_{n>iIOmt``gQPUjmFEvMeDN7 zzNKEO;@kUev18A=4t1Fdj*}bT*Q5!Zaf;!(Rhs_sDM$1{(e1JISM={JtyW&}yZUcm zS>*}mKI03ykuP1BpZ5C|w}0)W;{pX7NZz|6fu3NXJ_K9I^_b%N+ z`-6g$+-|N{4LQ8DVq2`Nsr=K71=luSk?QN}6L$XSInhdVmPy&|6^UIF*`=eNu^pYR z+r6>)cEF=mCO4T*l$=~}$-yt-+3%Q)=U=DtpENQmZ&DX-YW!HtyS~kSt$*XQnA>wQ zIyt|TFg@G4-=Nnu@9slZ788Bn(%0S(bNa4tI>0sKx@Ng6BTt`= zetBom!@!RqQf0A#+;0}GkrdWpOm)GkUb~lGR4q4w!lg^NkM{r zqu;L0)f0YeZf7X1pDw*$SzK&ay`!E^iTsJbC*JaIjr&%pEq&n^*FsG{kAu(IeTxp} z|JD5)DgDpvK>C974)YuBnE&cG7Q|Kk;9GO;s!(`VPy+)4V{4|fbAYF_Gc1iWFjUN` zooMTEI6$P;KX|E@D7&>sAxFeqosKSxEYYq2#VcHEt!C``;+}D7!jc^pT%~^{ z>7CnUwS%ka0e?sL>dA|`r&PoTWe7fQJ^tI`{k+4~-x;0uo-tXS%yXgSwvW1SlG%2p zwz!ME8cZCC9%<7IwLLX|T)S>t8g%z)<+S?y^RKRcrpw0S@<=jmhS^7}k5`uE7Tig?#xGRyfL z+R~=(V&vm%oT!w#{^y?Et84TAe=~Xhomp#1QCF#8#vKL*2DT(`cNYdP25*Mo)U`8z zFfcH17I;J!Gcf2WgD_*oQu{In1_t&LPhVH|$DDGEd~DM{B;RFVV9@t;aSZV|{`MRr zFM|OGvq9hXpVLcn94=|S@cxv&aotlERwSU$&c10AbcNZ}*Ffe$!`njxgN@xNA D3S3aY literal 0 HcmV?d00001 diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png deleted file mode 100644 index 17d9dcf726776c4f66655c6a12a61ca40f563ca2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1757 zcmeAS@N?(olHy`uVBq!ia0y~yV31;9V9?@VV_;xdYv7&Cz`)X06%tVrlvu7%P?VpR znUkteQdy9ykXn(M#=uZtyJy5htFL5{O@h%JJpN!{CxY*CzJog!2$J?fp)kH-5Fx_uY7Z$E7(@PO;L_uaVE zyNL;mbMjhQ=XCWyh`Tvhm-La*Y*R&@IPMv+!W19zCU%bDSm7Q(8P_JQX z-r7!SzX`0r9<7wxVmNblcn_0e*_#=s4qd;LcIM-ZBUT0)+|N41&n(N)?7Gpu?arf{ zl8QWE(`M_3-JZuFuyES~$=3%OIInf`Uenkd#Vw=!byV7er7udXR45ToJ-RR7tcw}+;$!uj)!BGZ?gKT zB^6?tbx9`nOJGumRI-nux*y-^83A0L!9JQ#dlubHe{xD<{zHwJn2)Yr8c|7}s^KS= z|I#uIS-WxBENS!W8(0FkeWP<$KFzaUa;0{<+^%mog3mKYN$34gROXQ_Tr%P8Ncf-}V)PRfh3oSOvP*Wa-*%4imP6XBWjt~dGEtiOp54EyYOZH`@B z-gw;Nm&peS_xnl3-HXp})YO}v=DgC@{V|7es&vwX2Z*%#2QO6;W#{g)NXeM1)6vDD7uBj1!m-t9HJ_UPU%^=>Dw=wIP1y$z&Of@U zxqI_EzI9CsKbRjqdbQ+*lIp$bB2h;w9)7etxBK~rd$kP#`o?EpNwAvSHM@MWWyaaH z9Sg%-1RU&_2~M7wdd4e=Yv0#W|GgpQh4Y@?|DOJJMP)Z5v;a0Zar=r&{=(>gliae8_U)=OYVwLxnBeCRu%-Yu{M(3M>5JiFv78zm(6X zc2Zn+=0)WN<1_n=8KbLh*2~7YG94X5H diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.png new file mode 100644 index 0000000000000000000000000000000000000000..1d1f180358965961be714cedde79165d71cb3830 GIT binary patch literal 1302 zcmeAS@N?(olHy`uVBq!ia0y~yV31&7V9?-TV_;x-!fO@Ez`%5~DkP#LD6w3jpeR2r zGbdG{q_QAYA+;hije()!*4wF`lVlWmT))pbaKFT=>{9>N+gi5nE;aLK&R3ol{(j=Tud{8>TCTe~b!&f7M|$A)rEkR8 zoGvN+-rSK>A(DIBQdvE|hIwn>(y-^+Rx>5K{JE~Iys%{BYd2m+Ho2S?Go?l1x2YVP zdAm(0Y}v_Y4$Himrm__=8Q)J{XqzARIdN0VOzT7y;W>>Tv&-JM*`L+#dlqwh&WYvT z>N(s;j%L>@_PFLvm0)Et>0h?%t7>`ZKU>`mOliAP{UQ=Rek}@|Dp&1omj3aTfr-qC zl)n}YE;FJ9c{n+Kcq|e*DZN?H@i>be>%`40>l7SbO|f3|L_vsA{o^d@`x0+AuBn+> zxR;^DON3cUM)m*~<9C5`(TBve{9Kz?xtaRT+UnA&nALOf(XQoPovgv#Y14F~JtsL` z5}CYoN|Dyg%@3r4rzdZlQ*>@=!X+WD8qpqogOGJW&R3;YUkxeN<-NVUb(yYN_R6PW zR^=~uFvaxWt$MX{x+8ORX3IilKIzOSfok7wO_5x7&LVf&%=DeXi;HvOSL~hq+tk$R zN=0+j<2R1HX`5$rM_upKOH(-3=x|4jF()JLOwA&Jiiy!@YSIdoPIUx{&++S);AnGP zGx^;cxhHj}&N|+`|MZyr#A5Ed`xTyx?NTqYFZ$gOrT=@^RNjoaP8nU&K?Q#ncxwGv zyML+u>bv)?ew2K9`Qq}$<%|Cx6?}L4%|7PC_pgdPN}E;4z`)p=>FgZf>Ff+k*oeIMXrH^Sq#Y$I&Ed?c6h7%iL@{Wr9uTerjEF zTdSxz)#LahA{`9Jg4hR%@qKIstWg3m__?b;eI=v`Q0dG7nh$0mLa4~z?zZvQjY z%HXeO)!L;;`x^G;K6tcisb=+or+fw3v3CWWi(~*{V_>1py8grbY)4)l@Hbcq5bCHQW3?1_lNOPgg&e IbxsLQ03jbqc>n+a literal 0 HcmV?d00001 diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index df7f7dc469..fbd1ab4b42 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -627,7 +627,7 @@ keybind.chat.name = Chat keybind.player_list.name = Player list keybind.console.name = Console keybind.rotate.name = Rotate -keybind.rotateplaced.name = Rotate Placed (Hold) +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Toggle menus keybind.chat_history_prev.name = Chat history prev keybind.chat_history_next.name = Chat history next diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 06acf2f5d6..d35f68030d 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -15031,7 +15031,6 @@ scroll-knob-horizontal-black rotate: false xy: 1937, 749 size: 40, 24 - split: 11, 10, 10, 10 orig: 40, 24 offset: 0, 0 index: -1 @@ -15039,7 +15038,6 @@ scroll-knob-vertical-black rotate: false xy: 1832, 429 size: 24, 40 - split: 10, 10, 6, 10 orig: 24, 40 offset: 0, 0 index: -1 diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 8d005ca4c3..9d164438cb 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.class, Draug::new){{ + draug = new UnitType("draug", Draug::new){{ flying = true; drag = 0.01f; speed = 0.3f; @@ -32,7 +32,7 @@ public class UnitTypes implements ContentList{ }}; }}; - spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ + spirit = new UnitType("spirit", Spirit::new){{ flying = true; drag = 0.01f; speed = 0.4f; @@ -53,7 +53,7 @@ public class UnitTypes implements ContentList{ }}; }}; - phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ + phantom = new UnitType("phantom", Phantom::new){{ flying = true; drag = 0.01f; mass = 2f; @@ -77,7 +77,7 @@ public class UnitTypes implements ContentList{ }}; }}; - dagger = new UnitType("dagger", Dagger.class, Dagger::new){{ + dagger = new UnitType("dagger", Dagger::new){{ maxVelocity = 1.1f; speed = 0.2f; drag = 0.4f; @@ -93,7 +93,7 @@ public class UnitTypes implements ContentList{ }}; }}; - crawler = new UnitType("crawler", Crawler.class, Crawler::new){{ + crawler = new UnitType("crawler", Crawler::new){{ maxVelocity = 1.27f; speed = 0.285f; drag = 0.4f; @@ -124,7 +124,7 @@ public class UnitTypes implements ContentList{ }}; }}; - titan = new UnitType("titan", Titan.class, Titan::new){{ + titan = new UnitType("titan", Titan::new){{ maxVelocity = 0.8f; speed = 0.22f; drag = 0.4f; @@ -146,7 +146,7 @@ public class UnitTypes implements ContentList{ }}; }}; - fortress = new UnitType("fortress", Fortress.class, Fortress::new){{ + fortress = new UnitType("fortress", Fortress::new){{ maxVelocity = 0.78f; speed = 0.15f; drag = 0.4f; @@ -168,7 +168,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eruptor = new UnitType("eruptor", Eruptor.class, Eruptor::new){{ + eruptor = new UnitType("eruptor", Eruptor::new){{ maxVelocity = 0.81f; speed = 0.16f; drag = 0.4f; @@ -190,7 +190,7 @@ public class UnitTypes implements ContentList{ }}; }}; - chaosArray = new UnitType("chaos-array", Dagger.class, Dagger::new){{ + chaosArray = new UnitType("chaos-array", Dagger::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -214,7 +214,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eradicator = new UnitType("eradicator", Dagger.class, Dagger::new){{ + eradicator = new UnitType("eradicator", Dagger::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -239,7 +239,7 @@ public class UnitTypes implements ContentList{ }}; }}; - wraith = new UnitType("wraith", Wraith.class, Wraith::new){{ + wraith = new UnitType("wraith", Wraith::new){{ speed = 0.3f; maxVelocity = 1.9f; drag = 0.01f; @@ -258,7 +258,7 @@ public class UnitTypes implements ContentList{ }}; }}; - ghoul = new UnitType("ghoul", Ghoul.class, Ghoul::new){{ + ghoul = new UnitType("ghoul", Ghoul::new){{ health = 220; speed = 0.2f; maxVelocity = 1.4f; @@ -282,7 +282,7 @@ public class UnitTypes implements ContentList{ }}; }}; - revenant = new UnitType("revenant", Revenant.class, Revenant::new){{ + revenant = new UnitType("revenant", Revenant::new){{ health = 1000; mass = 5f; hitsize = 20f; @@ -313,7 +313,7 @@ public class UnitTypes implements ContentList{ }}; }}; - lich = new UnitType("lich", Revenant.class, Revenant::new){{ + lich = new UnitType("lich", Revenant::new){{ health = 6000; mass = 20f; hitsize = 40f; @@ -346,7 +346,7 @@ public class UnitTypes implements ContentList{ }}; }}; - reaper = new UnitType("reaper", Revenant.class, Revenant::new){{ + reaper = new UnitType("reaper", Revenant::new){{ health = 11000; mass = 30f; hitsize = 56f; diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index 8554a5abdf..c9b04ad256 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -215,14 +215,6 @@ public class MapEditorDialog extends Dialog implements Disposable{ return; } - Vector2 v = pane.stageToLocalCoordinates(Core.input.mouse()); - - if(v.x >= 0 && v.y >= 0 && v.x <= pane.getWidth() && v.y <= pane.getHeight()){ - Core.scene.setScrollFocus(pane); - }else{ - Core.scene.setScrollFocus(null); - } - if(Core.scene != null && Core.scene.getKeyboardFocus() == this){ doInput(); } diff --git a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java index 084258120a..b2b942250b 100644 --- a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java @@ -59,18 +59,25 @@ public class MapInfoDialog extends FloatingDialog{ t.row(); t.add("$editor.rules").padRight(8).left(); - t.addButton("$edit", () -> ruleInfo.show(Vars.state.rules, () -> Vars.state.rules = new Rules())).left().width(200f); + t.addButton("$edit", () -> { + ruleInfo.show(Vars.state.rules, () -> Vars.state.rules = new Rules()); + hide(); + }).left().width(200f); t.row(); t.add("$editor.waves").padRight(8).left(); - t.addButton("$edit", waveInfo::show).left().width(200f); + t.addButton("$edit", () -> { + waveInfo.show(); + hide(); + }).left().width(200f); t.row(); t.add("$editor.generation").padRight(8).left(); - t.addButton("$edit", - () -> generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), - filters -> editor.getTags().put("genfilters", JsonIO.write(filters))) - ).left().width(200f); + t.addButton("$edit", () -> { + generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), + filters -> editor.getTags().put("genfilters", JsonIO.write(filters))); + hide(); + }).left().width(200f); name.change(); description.change(); diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java index 8beb9cd900..87f094e481 100644 --- a/core/src/io/anuke/mindustry/mod/ContentParser.java +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -43,11 +43,9 @@ public class ContentParser{ private ObjectMap> parsers = ObjectMap.of( ContentType.block, (TypeParser)(mod, name, value) -> { - String clas = value.getString("type"); - Class type = resolve("io.anuke.mindustry.world." + clas, "io.anuke.mindustry.world.blocks." + clas, "io.anuke.mindustry.world.blocks.defense" + clas); + Class type = resolve(value.getString("type"), "io.anuke.mindustry.world", "io.anuke.mindustry.world.blocks", "io.anuke.mindustry.world.blocks.defense"); Block block = type.getDeclaredConstructor(String.class).newInstance(mod + "-" + name); - value.remove("type"); - readFields(block, value); + readFields(block, value, true); //make block visible if(block.buildRequirements != null){ @@ -57,29 +55,25 @@ public class ContentParser{ return block; }, ContentType.unit, (TypeParser)(mod, name, value) -> { - String clas = value.getString("type"); - Class type = resolve("io.anuke.mindustry.entities.type.base." + clas); - java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); - UnitType unit = new UnitType(mod + "-" + name, type, () -> { - try{ - return cons.newInstance(); - }catch(Exception e){ - throw new RuntimeException(e); - } - }); - value.remove("type"); - readFields(unit, value); + Class type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base"); + UnitType unit = new UnitType(mod + "-" + name, supply(type)); + readFields(unit, value, true); return unit; }, - ContentType.item, parser(Item::new), - ContentType.liquid, parser(Liquid::new), - ContentType.mech, parser(Mech::new) + ContentType.item, parser(ContentType.item, Item::new), + ContentType.liquid, parser(ContentType.liquid, Liquid::new), + ContentType.mech, parser(ContentType.mech, Mech::new) ); - private TypeParser parser(Function constructor){ + private TypeParser parser(ContentType type, Function constructor){ return (mod, name, value) -> { - T item = constructor.get(mod + "-" + name); + T item; + if(Vars.content.getByName(type, name) != null){ + item = (T)Vars.content.getByName(type, name); + }else{ + item = constructor.get(mod + "-" + name); + } readFields(item, value); return item; }; @@ -122,6 +116,21 @@ public class ContentParser{ return c; } + private Supplier supply(Class type){ + try{ + java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + return () -> { + try{ + return cons.newInstance(); + }catch(Exception e){ + throw new RuntimeException(e); + } + }; + }catch(Exception e){ + throw new RuntimeException(e); + } + } + private Object field(Class type, JsonValue value){ return field(type, value.asString()); } @@ -165,6 +174,11 @@ public class ContentParser{ }); } + private void readFields(Object object, JsonValue jsonMap, boolean stripType){ + if(stripType) jsonMap.remove("type"); + readFields(object, jsonMap); + } + private void readFields(Object object, JsonValue jsonMap){ Class type = object.getClass(); ObjectMap fields = parser.getFields(type); @@ -198,10 +212,10 @@ public class ContentParser{ } /** Tries to resolve a class from a list of potential class names. */ - private Class resolve(String... potentials) throws Exception{ + private Class resolve(String base, String... potentials) throws Exception{ for(String type : potentials){ try{ - return (Class)Class.forName(type); + return (Class)Class.forName(type + '.' + base); }catch(Exception ignored){ } } diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 117c9348c4..e7e92a9a2b 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -65,6 +65,7 @@ public class Packets{ public static class ConnectPacket implements Packet{ public int version; public String versionType; + public String mods; public String name, uuid, usid; public boolean mobile; public int color; @@ -73,6 +74,7 @@ public class Packets{ public void write(ByteBuffer buffer){ buffer.putInt(Version.build); TypeIO.writeString(buffer, versionType); + TypeIO.writeString(buffer, mods); TypeIO.writeString(buffer, name); TypeIO.writeString(buffer, usid); buffer.put(mobile ? (byte)1 : 0); @@ -86,6 +88,7 @@ public class Packets{ versionType = TypeIO.readString(buffer); name = TypeIO.readString(buffer); usid = TypeIO.readString(buffer); + mods = TypeIO.readString(buffer); mobile = buffer.get() == 1; color = buffer.getInt(); byte[] idbytes = new byte[8]; diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index 74c51c5547..6a91aeadb7 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -14,9 +14,8 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ - public final @NonNull - TypeID typeID; - public final @NonNull Supplier constructor; + public @NonNull TypeID typeID; + public @NonNull Supplier constructor; public float health = 60; public float hitsize = 7f; @@ -43,8 +42,17 @@ public class UnitType extends UnlockableContent{ public TextureRegion iconRegion, legRegion, baseRegion, region; - public UnitType(String name, Class type, Supplier mainConstructor){ + public UnitType(String name, Supplier mainConstructor){ + this(name); + create(mainConstructor); + } + + public UnitType(String name){ super(name); + this.description = Core.bundle.getOrNull("unit." + name + ".description"); + } + + public void create(Supplier mainConstructor){ this.constructor = mainConstructor; this.description = Core.bundle.getOrNull("unit." + name + ".description"); this.typeID = new TypeID(name, mainConstructor); diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index 16acc67a57..d4cba3bc33 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -91,8 +91,8 @@ public class Minimap extends Table{ Element e = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); if(e != null && e.isDescendantOf(this)){ - Core.scene.setScrollFocus(this); - }else if(Core.scene.getScrollFocus() == this){ + requestScroll(); + }else if(hasScroll()){ Core.scene.setScrollFocus(null); } }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index 58cf4cb4eb..10f418c1de 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java @@ -42,6 +42,8 @@ public class CustomRulesDialog extends FloatingDialog{ main.addButton("$settings.reset", () -> { rules = resetter.get(); setup(); + requestKeyboard(); + requestScroll(); }).size(300f, 50f); main.left().defaults().fillX().left().pad(5); main.row();