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 zcmV+(2jTdMP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U-|aw&N-c{AU$!2}mG@OGCbr#A+8xo=@w%MOtnYna6xo!FybH#+_`j4Xkx+wHjMd$;3c>lBZ6ECXH1#YFMJ@!4V~MW4GFpi=4SFQoP@7P%sDjkbuF~!%{m_@OPIM6Ml!(}I6mIy-0<#wa5SfeIgx@1>S-gGHNLP6 zWloR!m|L(I za$vv)azcS@WR66@F@c|gl{3P=f&mgE+_6gb&IOQ@Sm%aKq&1d>w`Qal5Frps1T_#4 z$nsu%fZh^9s2FkLMI=a+Bw0#u!3PN;#GrYqL>GOO7-Ebm=2((TK1m8Grj&9jnX^M0 z6O%)ZIpv&7!KB3(_$nA*&``O$>Z{aHV@);J(hxq)H))~8mRfG5b9Wsn!1T~#Pd)cC zXdsk^A2Py-BaJ-DM669W{gfGIoN4A+uB`2>9$7mx_h;5ziFKYbr>OF$t1nA3sKLU7}|`bRwP6z zInFj~oS3cR;X{%+)mNz|&Y1{Zi9@X(Qw=163XWNaWGrO1*x?|gIU08l53wT>Xf7vI zM(0$Jv)?p4+nIL_&vxcr!?T@v*YIp-KE>u@XFkQ|VrM?Z<{$lPSdeX~dg0o_aCRhL zs-2#>b~|c9#&&af!$?DFDm~AMM1oX`yaxv0MS!K&vKX*i4>0j zm^%dU4N`#nd!>2PaM&q!TW=PSt6(EN24u(f*tz#5e5v0h)l*JI*eC?%1qS-xKoS0O zX})XlSW2T&$ZQMdic_YHrnT03jCt#R+KVVicX6p_5F?FfSRyK=$#{u_{&^}(NH0tC zw*g-*ua2(j+r+n|2O}_63jnXxV}3xduN*xSAHEP&nJ@d` zXxHW*mHLr^;;Ax^0GxGWK2qve9qr;fN$*aUcRl8y$~_kGU++K#;^Q6baIdLb*ClDC_6GB_8eaGM=y4z_urg`1@=cBTXqQ0k>vMT0K z`=DYz_OMsXU&p;VTS`@pgZrM%|EUDk*$J(Wr~m)~hG|1XP)S2WAaHVTW@&6?004NL zeUUv#!%!53PgA8L6$cB7IAmy@EQpE-E?R{mR0y>~s}3eF{SlfpBq=VAf@{ISpT(+! zi?gl{u7V)=1LET9r060g-j@_w#CYNHKF+)6@ZNoZP%ksh>KFwy-8R$7gqY2(h@n@6 z5I{es5tEr^%t}%UzV&ray;OH`p5@>7XZ5Igivad z#3LqMkob}7ipOu9i!KX1Gh$}abHov1vDn5+8?%zB5l;|DRZXXSA?vZqd5g1FuCnGm z`3u8&eR+xNw1$wx0u~`bgn}wIP=<{-?K&wI(sZ8i@ejIwiChY~Ho(X+j|w!%t{?ml ze$Un_jE{Lq;RMk6;y52MAhZiKYL4@L>^O}RAovVi=`DYy4orQLUTbO5BcOL1xVUa< z${ujJ0}MPFvMIY#kd{y=0Pkn?O*x?N7U*8}=GHvN=>w3VS*31(gF|4rNZD&X@9t`! z+rK@{`TYQ-t8%+fsC_m7000JJOGiWi`2eE;$6{GMc>n+a32;bRa{vG?BLDy{BLR4& zKXw2B00(qQO+^Re2Lu!zI%p(i3IG5AL`g(JR9M69(7_1+FbD)eFTGi{#hDroeI&5^ z7939D*RhwZ!_3@#zFt-7#3um-3KS^NIkZ_6=;KhaC{Un4fdVDB3nShJF-$p3HUIzs M07*qoM6N<$g3qN;9smFU 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 zcmV+y1?c*TP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=EFvfCgGhTmC5mtaWr^`GIxR}6M}*9a}BSCKdn!J=3LvHXo(5*bOPqJzc7tOZr$Mp z1T-&Ab?ZyvY>wBmzzUe@mN{dA<)~+fs`S`fvN_A40j}|aOxCXekO;XIlOX|tBatX2 zI*i$fpkoG~f|;{Kt{^}flsjh0Q6vFQ=9L@o7;RrxKFv5@074~+0S!JKz={#)5WcsJ zEmVSvMpaE}n$@)=Nik_k$dUdnrg- zVnM6|{{lnhDm7NEsanm|YiZa%EjDebSD;B`2naoO>$!U`g9f(Jh(kvjHuCUM zCidEt8K=%PZRY8-+^JnupQ*i)`!zMXsPP81{OmyuX0uxeTE~elW+29qK-?AqY-nE0 zj!ZG~BDa_w&JskFF-u)=IxS)#7zeRVy0d$b`zf~ob$^!|zatkGx_?0~EOZ~p{mAVN zwO;mdD;v=I3ZW@ZNWtd^O>)6+{Vn}j8~!%HXQ0nOpMgFD{V#!VUV8Wrtk%^MS87s# z0004nX+uL$Nkc;*aB^>EX>4Tx0C=2zkv&MmP!xqvQ>7{u2Rle{2w0sgh>AFB6^c+H z)C#RSn7s5yXws0RxHt-~1qXi?s}3&Cx;nTDg5VE`i>s5Oi%UeS#x0tjJ9W|lE4Nh$c&*FAMo-Nkv9f8U?gtL7~R z1VrK)W|%hdI`Pz|ZE)TvjTnMuzPM~KB@8!K(h zN~T6UNgPu(o$`gO$13M7&RV(3n)l={4CnRbC9cyNL=p>Fgai=^s@OmoHsZAFq*zGP zdBVpZb^Q{#6mo5Vkz*beXpmh$_#gb9tyP#9_maX1p!3CXK8AtNF3_ks&iAq7G){ov zGjOH1{FOQ|{YiSQrNxebzHQ**x}_<5z~v4w@MOrQ>`FmeLZJY>pV2qvfc{&cXVsfq z^BkuSK!#?Ox&aOjfsrC*ulc;Yt9@?&_B7}B11h9)iggia+yDRo24YJ`L;y+vO8`@4 zt(o`$000SaNLh0L04^f{04^f|c%?sf00007bV*G`2jdAI0S*S2@MGNo001vZL_t(Y z$L-Dm4FE6*12B%a`ImHTK+-DcOY&>6uH^&;1qB5K1qB5K1qB5!2M4mU0sg74yK(>k N002ovPDHLkV1f!1P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1b9S8_e;i!OrIAy!o7r zU9oHhE$(gzq5jX`gZ{$7UYNXS3@HSI!zZ6O<0hKz*sL{vUAKq4e`jC)#J4XPE(hzj z$I$PA*2p73{q8TXe$u+S%$42pMW>v&E>iqF?O-MF z(_92s70fxf`QD3Nb_#YnbD2994(Iyyc*UlNTmWp1sB8%~e~`r@e?v@w~R zSBwH7cI=qS!q?Jf%<-7SIxr{;=7<-}rfeyS*oU^<;@KG?4E1K4FIL;001%Q__{r#;A^QRbtdMX+m+YMjASd#yjTp6SEDLXLEH5BJFi{lLU;=?G z@5Kkqw+IPk5+`0nf~Z7El7kCANC-j0T&J=+^(q=vHEPlvUG!06h#F%|F(*zA%a~9K zNmEQI<&2`)XXMHlpW!H6T=7LpC|Y7kC0EF&`YJV4t+A$>8#mXm1W*f2TWqQ2ZabvZ zeU~1(_SjR;16mty_#q<<9dV?Q@2uH<+P<)MWbSv??9Li5qUJb#um-p4Erp%SiA>JG z7<&uGbus`!^W@A#>pf5ACTAwGBj<$CrA%^~os5A&-!03qckUj{z2%L7?p5CSj5(Ur z{U6NHr0$8ipS+#0*790z-6CktLSTv&(qZ}y2J`Fs^(WimOIQlg37)Re?bBm+Tu_-Q>W<#kxN8<=HWgB9e%;`Pn_*`k7 zv@B{hLmM@Q+~&{fDv?cEMR12oH%mvyAKBq@9$uEk&dD}lG&+{zFqXRKZ=>-|Ly{`} zq1qp!T?t<;9UZ^h3CI&L8!ihKnpGDtr?3F)3CuYxFP6T5<%Y`q&E?h60hk>Y>}UQ9 zm?ul00&^4$U02MxrO%;x6%1Wh%(R$1$68q%t6gy!2H%-19>`$>1KpZ;Lfeq*Aqo;ja17QtR>gLT5o88$LFM&vO zI>fz8`MxM!srp+{x>EJGqI9L|Z$;@FfS*UuA6A``$#o3u^*g4}=u&mG(J;`7KuzQ@ z(^~?4{{nWX2Xt9u7XttQ0fuQqLr_UWLm+T+Z)Rz1WdHzpoPCi!NW)MRg-=tZA{7S< zia2Cwoh*oo2rgQMB2);qLaPoYFZ~gkG$bi5j)H5!!JoydgNw7S4z7YA_ygkN>ZIr* zCEk}5TEuwa@jlMG=kVTrfKV?p&FUBhG~G7S$%L5At%#vlgb+YKrV*2wWz0%a3cmGq zPrX!kah~Ph_hU6A;Z>x##3oQp0C zJTqcu(sRTSVzJo9N*lA1sS!^QM^#Oyd?D+x%6W^kR<5$$HZD!~zx} zL4<-THc*C*IPE$q7SeQ{@bM42eu-QPxi-MaF^>u~$gUs!4}QF#|6PjcBwK6MaC`RAk`xi8 zjb)~r4h8fER7?j11Ox;G1O)U2WTpcG0=iQNhffAkt{<+$00000NkvXXu0mjf4;(4W 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 zcmV+x1?l>UP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U=D|k{lrnMfaS-M?exna2&=6-@wQBhonZg9pPc& zMMEWnk`&@UpxpTOb-FJ|q#?SXmST?4BZV9?7c`Q;(p8fWySzHLcl2s^e0#w#32M2z zah&l5c71$c;n?e|-B~++(s6WN+#Jf9nbGJc$m2-(veW6i%vYntr{$byHqOhW^?LQ* z4+b&1!k@6?AtZj6e9a_?Lb4Rpt7OS*AZ!Is*k$}tKeu{0e=Oj=^`@V1$1V>!+@|7NicbpEsnDdc>qZSB1|DpvnHv;ewj{=x+lCTWrpe|&rb_~q z266&3-(#UYZ(j3ZvV@sCVI&irf$?j0?}k6kFOKG1+nmU!ODAj##KmiWA&f@jb^(A*z{yiR^_9(zkRXYuMVG#toe{WyR`m|GDH2?+Q|q7=y+ zvk^hZ1U?0kvjnanKbq z%zUB{c#&Jod}eVX%7{`IoKA}v2!=tdlkV&uNR}qKlMxUs7lhtj8+nEzVlG%9{7&FAV4P!esn z(|N+jA9ei_xfF73fRSS!6=;xMKlmT~o~>1w826IG383@EaXyBD&@RxZInMX7<1|iy z;4^TgxBQhlF#Sn-t)<0|fWB?u;<}|Nd%)!mFz{r^rtC^VT0)@!yr0oG<$(TMpl8*a zTk{;J4?u=ymAU~A4uO#(Wv}_XyQ_U}|MoQJ_X8@Va*A~kXxsn*00v@9M??Th080Q< zWv!X`00009a7bBm001r{001r{0eGc9b^rhX2XskIMF-;v9sv#!6eH#u0000jNkl+|T2m~Nqx9cBCOUxe>pp#4;dUZ@75C{YUfj}S-2n2$E7Q?Xu9@af?jsO4v M07*qoM6N<$f*~JCc>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();