From 31f552fe2db54c2dbfe536fc9d18428925727ed1 Mon Sep 17 00:00:00 2001 From: Arcaratus Date: Sat, 18 Apr 2015 19:49:09 -0400 Subject: [PATCH] Random stuffs Updated commands Added in a ritual hologram --Alex's code Added a Total Stones tooltip to the ritual diviner Gave the Alchemy Relay a null bounding box Added localizations to the blocks that didn't have any --- .../2.1/taskArtifacts/cache.properties | 1 + .../2.1/taskArtifacts/cache.properties.lock | Bin 0 -> 17 bytes .../.gradle/2.1/taskArtifacts/fileHashes.bin | Bin 0 -> 18734 bytes .../2.1/taskArtifacts/fileSnapshots.bin | Bin 0 -> 19299 bytes .../2.1/taskArtifacts/outputFileStates.bin | Bin 0 -> 18632 bytes .../2.1/taskArtifacts/taskArtifacts.bin | Bin 0 -> 19330 bytes gradle/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 51017 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + gradle/gradlew | 164 +++++++ gradle/gradlew.bat | 90 ++++ .../api/aspects/IEssentiaContainerItem.java | 1 - .../AlchemicalWizardry.java | 28 +- .../alchemicalWizardry/ModBlocks.java | 8 +- .../api/soulNetwork/SoulNetworkHandler.java | 2 +- .../api/spell/APISpellHelper.java | 17 + .../client/ClientEventHandler.java | 14 +- .../client/ClientProxy.java | 4 +- .../client/KeyBindings.java | 10 +- .../client/nei/NEIBindingRitualHandler.java | 9 +- .../client/renderer/Helper.java | 17 + .../client/renderer/Render.scala | 70 +++ .../client/renderer/RitualDivinerRender.scala | 54 +++ .../client/renderer/Vector3.scala | 24 + .../common/AlchemicalWizardryEventHooks.java | 162 +++++-- .../alchemicalWizardry/common/ItemType.java | 87 ++++ .../achievements/AchievementTrigger.java | 6 + .../achievements/AchievementsRegistry.java | 17 + .../achievements/ICraftAchievement.java | 2 +- .../achievements/IPickupAchievement.java | 2 +- .../common/block/BlockEnchantmentGlyph.java | 75 ++- .../common/block/BlockOrientable.java | 114 ----- .../common/block/BlockReagentConduit.java | 7 + .../common/block/BlockStabilityGlyph.java | 73 +++ .../bloodAltarUpgrade/UpgradedAltars.java | 2 +- .../common/commands/CommandBind.java | 17 +- .../common/commands/CommandSN.java | 22 +- .../common/commands/CommandUnbind.java | 8 +- .../common/items/BoundAxe.java | 46 +- .../common/items/BoundPickaxe.java | 71 ++- .../common/items/BoundShovel.java | 46 +- .../common/items/DaggerOfSacrifice.java | 2 - .../items/ItemEnchantmentGlyphBlock.java | 42 ++ .../common/items/ItemRitualDiviner.java | 25 +- .../common/items/ItemStabilityGlyphBlock.java | 38 ++ .../common/items/armour/BoundArmour.java | 30 +- .../common/items/armour/OmegaArmour.java | 106 ++++- .../common/items/armour/OmegaArmourEarth.java | 35 +- .../common/items/armour/OmegaArmourFire.java | 83 +++- .../common/items/armour/OmegaArmourWater.java | 38 +- .../common/items/armour/OmegaArmourWind.java | 13 +- .../items/energy/ItemTankSegmenter.java | 2 +- .../items/sigil/ItemBloodLightSigil.java | 3 +- .../items/sigil/SigilOfTheFastMiner.java | 2 +- .../common/omega/IEnchantmentGlyph.java | 4 +- .../common/omega/IStabilityGlyph.java | 8 + .../common/omega/OmegaParadigm.java | 18 +- .../common/omega/OmegaParadigmEarth.java | 53 ++- .../common/omega/OmegaParadigmFire.java | 35 +- .../common/omega/OmegaParadigmWater.java | 10 +- .../common/omega/OmegaParadigmWind.java | 11 +- .../common/omega/OmegaStructureHandler.java | 19 +- .../omega/OmegaStructureParameters.java | 4 +- .../renderer/block/RenderWritingTable.java | 4 +- .../renderer/block/TEAltarRenderer.java | 9 +- .../rituals/RitualEffectAutoAlchemy.java | 4 +- .../common/rituals/RitualEffectCrafting.java | 448 ++++++++++++++++++ .../rituals/RitualEffectLifeConduit.java | 27 +- .../rituals/RitualEffectOmegaStalling.java | 5 +- .../common/rituals/RitualEffectOmegaTest.java | 201 ++++++-- .../common/rituals/RitualEffectSoulBound.java | 6 +- .../rituals/RitualEffectWellOfSuffering.java | 25 +- .../spell/complex/effect/SpellHelper.java | 94 +++- .../common/tileEntity/TEAltar.java | 11 +- .../common/tileEntity/TEInventory.java | 230 ++++----- .../common/tileEntity/TEPedestal.java | 9 +- .../common/tileEntity/TEPlinth.java | 20 +- .../common/tileEntity/TESocket.java | 9 +- .../common/tileEntity/TETeleposer.java | 25 +- .../common/tileEntity/TEWritingTable.java | 5 - .../assets/alchemicalwizardry/lang/en_US.lang | 14 +- .../assets/alchemicalwizardry/lang/fr_FR.lang | 192 +++++--- .../textures/blocks/GlyphEnchantability.png | Bin 0 -> 667 bytes .../textures/blocks/GlyphEnchantmentLevel.png | Bin 0 -> 699 bytes .../textures/blocks/GlyphStability1.png | Bin 0 -> 572 bytes .../textures/gui/HPBar1.png | Bin 513 -> 737 bytes .../textures/items/guide.png | Bin 0 -> 154 bytes .../textures/items/ritual_dismantler.png | Bin 0 -> 505 bytes 87 files changed, 2513 insertions(+), 682 deletions(-) create mode 100644 gradle/.gradle/2.1/taskArtifacts/cache.properties create mode 100644 gradle/.gradle/2.1/taskArtifacts/cache.properties.lock create mode 100644 gradle/.gradle/2.1/taskArtifacts/fileHashes.bin create mode 100644 gradle/.gradle/2.1/taskArtifacts/fileSnapshots.bin create mode 100644 gradle/.gradle/2.1/taskArtifacts/outputFileStates.bin create mode 100644 gradle/.gradle/2.1/taskArtifacts/taskArtifacts.bin create mode 100644 gradle/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/gradle/wrapper/gradle-wrapper.properties create mode 100644 gradle/gradlew create mode 100644 gradle/gradlew.bat create mode 100644 src/main/java/WayofTime/alchemicalWizardry/client/renderer/Helper.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/client/renderer/Render.scala create mode 100644 src/main/java/WayofTime/alchemicalWizardry/client/renderer/RitualDivinerRender.scala create mode 100644 src/main/java/WayofTime/alchemicalWizardry/client/renderer/Vector3.scala create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/ItemType.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementsRegistry.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/block/BlockStabilityGlyph.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/items/ItemEnchantmentGlyphBlock.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/items/ItemStabilityGlyphBlock.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/omega/IStabilityGlyph.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrafting.java create mode 100644 src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphEnchantability.png create mode 100644 src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphEnchantmentLevel.png create mode 100644 src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphStability1.png create mode 100644 src/main/resources/assets/alchemicalwizardry/textures/items/guide.png create mode 100644 src/main/resources/assets/alchemicalwizardry/textures/items/ritual_dismantler.png diff --git a/gradle/.gradle/2.1/taskArtifacts/cache.properties b/gradle/.gradle/2.1/taskArtifacts/cache.properties new file mode 100644 index 00000000..18d2fcb2 --- /dev/null +++ b/gradle/.gradle/2.1/taskArtifacts/cache.properties @@ -0,0 +1 @@ +#Sat Jan 03 10:20:50 EST 2015 diff --git a/gradle/.gradle/2.1/taskArtifacts/cache.properties.lock b/gradle/.gradle/2.1/taskArtifacts/cache.properties.lock new file mode 100644 index 0000000000000000000000000000000000000000..29e44d007e2754f544fd35ff60e14aac24e9d8df GIT binary patch literal 17 UcmZQxydk7W{#si+0|ZC_05W$34*&oF literal 0 HcmV?d00001 diff --git a/gradle/.gradle/2.1/taskArtifacts/fileHashes.bin b/gradle/.gradle/2.1/taskArtifacts/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..a2a5c9e7e49e8303aab76c29c376c893b8b36d84 GIT binary patch literal 18734 zcmeI(Pbh<79Ki9%GPQ-aTwMK0IH}dBiObY12PsFTrB+VVB7~5CNgQaU>@Zn5nKDk} z#9Dh(yBH-J%4MaM)Y^gf+1|I-u5S81_59xF`MuB6?|nYk_k9(o5cQTHt%;K6kH)hl zQ-%m2fB*srAbsOgi@2<5J?-LO~009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0;rF9M29-QA}42H7n>mtpldQJtM_nLPKJde4NYaECop+UNhV zep%{k!&6n*)~-$(Ww(mG)9|BXE7+8AZjahho9b@_g?)CpUTql}W^V5e%F1<)JRdDz z+>Fn?o_K?`=7_c}FP95p8k2E9mWz~^3r!5w9NJeLJ*~<2%kC@nAqwR}a=j3B4>IOo G%&uP&6p8l$ literal 0 HcmV?d00001 diff --git a/gradle/.gradle/2.1/taskArtifacts/fileSnapshots.bin b/gradle/.gradle/2.1/taskArtifacts/fileSnapshots.bin new file mode 100644 index 0000000000000000000000000000000000000000..67532665326170cdc01f01e0d78c12f65de06301 GIT binary patch literal 19299 zcmeI(KWGzC9Ki9rqz;BCaqA{1NEeF`tYCu0HejSkwa`I0p_k-1lg3{1?n3Yn4u%e; zm4XynkRntRvZw*AlR*S6#UMCT?a)fwbgM%*U7~l*1+vFGJ z5lQL{{B?`eRA%2T?=}tTB7gt_2q1s}0tg_000IagfB*srAb2q1s}0tg_000IagfB*srAbIVj-N7l-3C+_)W*KMcD9p(P>%CM;kQ@JSOs!*+* zsYHx;?v^%YnaZW470tzzzO-Q^uBdu4uINHdq&2t6%ihO>BiCoXtbCALnx{LaT5@e_ z?0DgmHT|=txs<$6GZ{^|uXx%Wc4vfPN3Eo0%5%53-p54o?2oo2N~uDwUHjvk?c0vE z$m=~OJV4xIrH+>YG`ud?-oUvV>rWpn peoWonEb0qKeQ(-k?+sW{&-k;?{@pvLvaj{Sy(MScEk3z??;oMGWn};W literal 0 HcmV?d00001 diff --git a/gradle/.gradle/2.1/taskArtifacts/outputFileStates.bin b/gradle/.gradle/2.1/taskArtifacts/outputFileStates.bin new file mode 100644 index 0000000000000000000000000000000000000000..4409058c08b6c09b4924fece6203d57160fb8493 GIT binary patch literal 18632 zcmeI%KT85(0LSr%Q$daf-CV+@7a)ky90e9ZsW>zU;tOyvBOEl;Ed-a~0>Lpb1bqX7 zlOP>I(4WOcBw7M-bg}N~?g4LhlkWr1-Shl@cL&dBJ@ZJ2P~g`YVr>|M@nUVu5&;Ad zKmY**5I_I{1Q0*~0R#|0009ILKmY**wnV^8TL;nY!-V#=|HbsfS21sdi0oKfZ`D_f ze$JW``IFYmG~TxCjsc0+4} literal 0 HcmV?d00001 diff --git a/gradle/.gradle/2.1/taskArtifacts/taskArtifacts.bin b/gradle/.gradle/2.1/taskArtifacts/taskArtifacts.bin new file mode 100644 index 0000000000000000000000000000000000000000..4917db123f156d23c1aa0591441ec867957ad657 GIT binary patch literal 19330 zcmeI%F-ROi6b9fq%{4(qf`yQjHX=7?5=bE-px)sXilQ8`SUBePhPyHA?lLob7c4BT zM6}V)N~}b?bWzYE7_JZmNhdbxQrHVR>+Zr@2muKR;UActnVp^4ec!xp+XX`UdvD`H zQf2Gw>2+#|E(9O|0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY>&i9ow-0(l+<)BmpH zzH@bvU2eAs8SXN}%&`4(zN340J9?%xll)0Y+VK8|zMYe39#;rJ00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1pWnq z_FF6wtV;OfU8*?)n_jN!{})P&MfR0AzMcZ?~%_lsngCCUBH zNes*|-3S*Ysr7=8&yw^kuqLApbL+I|28-!QUz6U6+0nveu~MEZ&Q?m(Q^i##?S^Rb zzw`F>G(cH8Vf>oBZ)okSk$m1{R#VtqC0S`$^63>SA0<@o4Sk)f3YRVk|AA>p6z$m^ TpY8p6l|=p6e5kf|{(bKbXCFyC literal 0 HcmV?d00001 diff --git a/gradle/gradle/wrapper/gradle-wrapper.jar b/gradle/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..3d0dee6e8edfecc92e04653ec780de06f7b34f8b GIT binary patch literal 51017 zcmagFW0YvkvL#x!ZQHhOSMAzm+qP}nwr$(CZEF|a?mnmQ>+kmI_j0UUBY(sinUNzh zaz?~l3evzJPyhfB5C9U!6ruos8_@rF{cVtcyR4{+Ag!dF7(Fn6!aoFoir6Um{|c!5 z?I{1dpsb*rq?o9(3Z1OjqwLhAj5ICXJghV=)y&jvqY}ds^WO2p6z!PgwCpssBn=?c zMTk+#QIQ5^8#-ypQIWyeKr_}k=7Yn%1K@v~@b4V|wK9;uV_OH)|6@`AyA1TdWlSCP zjjW9SKSh!MDeCH=Z)a!h@PB+_7GPvj_*ZoKZzulGpNQDH+F04@8<8;58CvN(I(kRR zLJcq=1n-)$YEZk-2SBfeMi0U| z)8cynw_T3ae2PK)YXEkCw^-!=M@MCMM<-)z1qa)|o8@F~?D%)&<}T>$WM*vRWNxVM zWb5#+O(<5jwnY*|@Ij*p9i2ZY*Q-w6Sn*Ifj?Zb% zO!6((wJHqf@549F0<8d%WW49Qnwnvrooa0Kg zXAU;L-eIZ_-XuG)gR#PH8;tWh0nOPk4&xpM4iTZXf($9{Ko48(E)*u*y%WwQa^bad z`0QsyXW)igCq&azw(M`l=((JSZ+5P2>!e(ufF#K`S4@`3)0^Tij7x!}qW$ zAp!hKleD*h`w2MHhPBS9&|-%V?-UvehR1mIy=#Z*(5os3Sa~YvN61a`!DH50$OmKY zEnjE@970>l7hh0>-b6jzD-0uVLh?<_%8g5mNLA(BRwXqqDKbFGW&!h#NsGnmy-j_J zgKYVf`g=|nhta$8DJ;e8G@%$hIQSZQh%XUYIA!ICVXaS8qgoNjN{cX40PdZ!T}myIMlQ>sUv6WBQc2ftALOL8+~Jmd;#m9`Vrp-rZA-bKz8;NDQ`#npVWprORSSPX zE%cq;F1<=t2TN2dAiUBjUiJ&3)lJ+LAcU}D4cr;hw@aYD2EEzDS)>Jp=nK8OFLh$ zJz3rM`2zn_Q;>3xZLPm2O!4mtqy5jCivLfSrRr$xAYp55EMseH>1_8erK6QK<*@`& zzQy9TSDuxsD4JU=G(j}iHLg_`hbAk+RUil;<&AL#(USQzDd5@+Qd zRH7aW>>O{OcI|OInVP!g=l20pAE*dWoEmp4*rUvm45Nh5(-G5p3r7&EBiL^bhy&<(f0%$v~W1+4PJeP=3{9y*(iC9&*#sfU;tsuh9ZqB zlF7Vfw+!8y#tub8_vSDjq{677{B&X1!%c?`5t*>B)L3SvLR;nQ6ziVRwk|!!V`=NW zTymSRm&>DiMdLMbsI&9*6U4*)NM2FMo*A!A9vQ~ zEfr!mUBf`L6W+iJU@wq!7>aQ->bW#Rv;Cpyf%_E}VV;0GjA1^IxGnCBa>)KkK$y-U zoREkzFTuP342`a*s~JZzu1C!g15Tof??=f)f;+&1*PJM?Vf4f@=$(2-fAbaK5iAg2 z2G$c4m>S0=Jn#ngJ8d>Y3wok^6hPd((Fok;$W1}U8;Gm@52i_xuEYG%Y+#w#Q< zL>5>qmvjlt1n>GDGW! z%_RX%Fa5w1KmzX1vNnt;MOATLfL$iA&8}bn9zyPu9y{5h5zMrsPpZ~V`w9QFg2mIq z)wkr@c1ZgWToIn$#KI2pp07NH8K%=%y0wrUO*MJG^IjfyUg%RD*ibY!P>?+{5#;^7 zq@tNi@aDOK6QU{Ik{Qb(<8Ls?1K}uPUQNVIO|QSrB!;10`@4y$m}#YU%h@xyA&TOG z32#6Sv$IY)fQMfSlfEyZ&i>vAm(s#Rt=R}gZ<4|w>bm~dY}6PAdJqNOSXy7CPZ!Cd zaTk&PqLgUrUj2x%)=;I7R>D1&PHKFgvQHP`p{z`U?#=rRC6(`sWNa)y~ z`}nBXc+;Fz%HW`qKNQ<2uPMOmlU{;1W-cx~M z1K;-DP$tdxu`|H($NE#M1O;f7C~(5IcZP3Ks${1e=uqnTz%EboQQ|>>_lSejH}{Ot z@29KqeZfpKmtmSgRi}?^w6R}h3sLCcm0WO%f85OKQ`N$Iwks4{Jz%kE^>7nku}tT= z2 z|9Q8)K!l0s3K)$OXWktOYztD8IY8iTp8o};TZp@x2fTYg;nTPHv>L8!wvXoCI{qiH zi+}u2WEc0*mvBy*13XZZS76RdV*og#ux@O^h}4W)PATvc4QHvzgj?7f8yVbUQ(@)74dImHhNrH;}?xZ2Y;Vhe3AL@^rg!S z*oYpqvh1YAf;JkMT=JT}N1)ropk2CRd zGr?=t<{(hW?eI4WWeRZCoNMM7w%pG+zIC*!IY|k8AHW%aMjvRoY(8(9g$iiY;v$Y+ zz4LahX4IJWV)|UI^>bG)nlgXZEb})2rRF3Wk#RW-12vc6bCe*fclTKPz*Y74!A%{m z-M;UDuVR9s4GYjr*B5@3v(sF#e&aUB(Nmo-vL-bTG)L%K>u=e3;3g}mbd~*RQd{8O zM%*HrqE>nH>r^4h;T>ca(PZ&7ed*6N=XN?pQWvONE774&DD=a2n_b_qW0Qwoi(MWa z_g{uUJt`0|@b9pGE#*UDp{P(ODHo8zQ~5Xle6nyH8z6&cGk0POqW(yO{^&s}HDQWT za;3S`-VYC@rp*H9kC~z0IYqe#d}rJPhbhWM6IdrP6UV7%8P|VCkE74i?Gp&-gAs$$ z>0cU0soeqM%wXxeVDjF;(2)zvJUz)V^$6cwx;N5D>trKHpB_-B#SU|;XBRAwd_Xv$ zQ$S7bh{z^8t4CBOz_Cm;)_}yQD>EH+qRyyL3cWMftJL zG#Yf7EL4z^3WfkO{|NI#wSuCWlPZQMQJ@LvkhM(=He$D8YeGfMeG~f{fQcFW#m5;q zh|xDQ=K4eN?8=@$9l2rRanpV3Jo}#QID57G^ZAbM_x1LBkS?msO;{LNj3sNREP|c& zjr1`I4At;~fzB0~icB?2?LH+$Eegb5tOinYM#@1hFs7Vf#?lRYap6h`dZ&LFO>3Yt zp^KcJo4okel7WF(QfZJTNF~Qo5Xv02Bw`W@NVvqfLmZVwyrUH5EoQS(s6T{p5eYf? zD#~sKiy6~lW8|tRKAj0iIcHKPH6>timfzAlUlWonaO3n&16W1o6W#Pq^r}3rp<(m&F07qouxYH5`wsrK&6=5 z;uy+CQiL_wznOkgoIDggf#@`&MfCS0YCVPHeG%rM)UcU}24%!j)jrwcz;BnE?W?dP z^}Vkgi4i@Hav?Q!o95K<^hu&~r5&T5JU!{)K*e7iA(qmc&+W%f#!E&jrd4^xRrO;* z#)uY(a}KC}*3}5L0F=z*m~^(ySjG+=BoWe&6#;Z7IcUy#9~=1|br+oC=XTlyGQUGK z?amC{o(*c&OH=Bg<&={4E8^&GWxnr(_P8SEDOsx!48t$Z= z2OXo1!{ET(CADxtwGsiRsn^nUL-q}Pi}*LH4FpGt_~z_!@hjdWMn~K750G(l1Acpj z%sS)rp;PrN*(*Er46IW1%-_@YEZ+0_DA-Gn#=c1kI$gu3`!Bup0(B!v!=X2Bo#W7< zt7mQ0!~u(w)#`0Vls&LY!}>BAo)$A>#)xkBNO(6ot=3OSj9NZT(mS($iqA!WcG_?3D#nUA&UdY2`ZzQnlnko`)h87V#8DG7$E7=z2d}f8 zNpgNE#p&$hT*Je(Ru7JD<~c|}RGX0Xgk_h?NO-^f%Ke}}RRqjp_sd)lgMwpc&`lKP zncbxu>m{Rb;ETW6ryNn;zlh}vdgvtIk;b}9+pLdOp{FDWu&KF35QT3xtK#v47kv0u z7g~H0W{DMzy!!(3o&6$x8;6LZ7tAg>-4n6ZMZA2g-45hCOU#VB9p?=qPsx*~&rjaC z++;(kkEdfponLuH$joiBb`N?9-yv$@6AKLx)E#@p*hJathir$AKfZ;2k36F>_@hUF zLQ!xD_YwruLzIK9B5Z-keN)g)Ui2bWovq>(Wyd_T`{z}0)|&-6-uuiH=*w+hQ<&p# z`apq5FinX29Im7d85?1Q>>@O5i%#klF$NE4VfGop!yHvKE9>z{i>PAt{GN=z#m0VX zdqi++Sh`Jq8l2Oi%j2AD@*sll7jJFS|$R3J* zF;YH2PQKO-_JDl{&oo}>4ON(9;6Ur(bw#mD%C|NdT7AJIyVFo7KGxB7U=#KS{GTq< z=8|9#3mgEz9u5G2>_59q1$`$oK}SbpYlHuCl*wv;3^&zKzmwKdD$A@dN@9&9?Gs&` zuSiO?C#5=3kVY+e4@e>tqnheu!d1nyX^lOaAfwoW0kN&Rpg~9ez+zgtn6E*7j^Tr5 z5mUNcQCj`!|MjYq>pA1v^SDj?^@sm;7sw9lC&3P-n3p3`6%xxvg2gi>lnEXck;@jl zOC9+>3j~sMhtb_cRR3`?p5TDYcK1MEdnhC*@GU4v{=wJu-U}rc>E0YNx8JnzEh}jD z5W4G)Xx1k34T-;(W*dYgt7CE(loVLFf9*zM!b&}b>$J!Lt2UD3n}1rct0p$ev~3f<5yxv zjT~pP@p6`O$|TjO=^b=L`TfQ&%z7nO{!K2+l+p%ta*r{UrDa8Wj^foa<3xo}3K=L@ zoEhBo{7b4zXL@Y0NL+1c7rC*gHZ^C-KnptfF5^XbE8@s z8IuM{>rT@k3yjp@lN!;FAhoZHswOf+wwvekj&KfOGCFRfmuS5jsKk(dkK2qU4-Nvw z-RDk(#cwIe>^Z3lW9YNTC>rNsMpjSa?A>?v_0UvyD>SpsW_v)OVt2F9)vJ$)juT~+ z`Yi+%P339~_T{UN>Wh>~CkaMfb#^9g;#sK0-s3R3oh+Ln0p%;z<0-H;$Z? z`Y>{1FA!y?R9BCbd*m)ELriL?N=?NmZjJV`3?`omHvYlc@c5=E-8&1E-lTi#oG+|e zD2~S+(HTA;;)7NulRJ{+o1$bs$>K|^yfmGj{F*f)AM(T3H{k8B&mm4k-=ur;&)*|t zI*Iq_pQ-|>o<&0Y3x^t%rJEMvioG*ng>Hd}zd&(d6axHmMsBJKH#J1J?@et->?VfW zY}W2ok!-XUS8=#+Bu#_7SHlo9wgz{NwnkH;dYOq|IkikJW0UU5c8KiXrekkPguiTx z%F>DO#@@iu%}{pl`g`MmX<<3~<^x>)%S_!dzJf#bY3f+nTi^2_ zxUqY>5;MpoZ3?5b*kzEi{NTZiJggg32m8Gb@_!bmx<(QmcQdJz4$rqSx0|uW+9%y$ z8Iv%MQZVdSA|hmO2Er{5v&@Um#3M-@c4qQL=n$-!&W`8S(luG5H9tF?A+Pf2L4kBt zR!eIeCjqX8F7YOR@7xTABDe3g5s~g!N_)>JPN+rpS_jm!t(p%uEJuhRM488dTt#d9 z(d=<}JKz@2cDgtnDrSMJCaYOX%zq5TJTrWiH7@W-c`lime|CaH!)_6=OB*6=aX}%-Qn`crC3qd2O3?#HnDbH5vvPib>WQSJ$2^5d9L)3 z=P=TM#gpph%>F2m#OJgomQ!t5LL4Uwvj&wW43=XNp$lmupug9e!Fsk3(5}o0QnyER z*L$-#g_@Na_`+tR4{Wx8XIL4^w%k~i*;6zG2S$$H*tr&k)J%JD@rKQ%<*9(x<4fWY zrZ8g+aMe$iYu^j3DtAUtHi>KWKaMHVZk#R2@(4D%a8)i+U-Kv?68@1aAdvBSA(C%| z_`PsBLw*SMg1#kj~W8n4}BRohIrp=Y+uQm_|+m z%%a<;Y{N$E{6zd#7TFWs3*}WLpU4VbO^xc=7NK0&?TRR8U9#a>DZ%0v-o75C7(FuX z7}7S=aeuh8?h!<%)n$|KA;zyUJ693itBdg!QnhCLel1C(tjMyA9l z#NY%ze{^ZKDKi|htx7)0%jN)oj?&PAg$5Sq>V(CC-{Q z3VG0DuTOpK^p?7wl{N-xM-+lvzn}O< zJVsY1@$5{1$Q6gZot+iAxtYgalk5dovCTFaM~ji>{d|e@Vw3D58E-<195y+xkG03H zx$uvziM%=E$l2(t_apA@XYXr|ZSTWisxD~(?dLs#=(&8+dkM>K!il`}{AYU9H;;t# zQ;E>-3xeV`*&njUAH2MuxNm;ck6ME2QuaU<*&o{JABjic-+y%D4}O52 zgwxwA7$~Oz=^*RCk*{DEOkN}p;Ts10mFSN128;zSir9gx3QkcQ>b1nE1G^%qQEF7$ zq*{J~o3pQin4{OKwXsQfiUw$Fq3Ag0ZbRJ~Lp?v=-s0i&I5pVnUCs6T=iCbe6AzM$ zcf#Z9Rp9VcXU}sPXc%-DPPIf0J>iw0cAF5HTSES+Lz6xS?1`pCV4Wp1C_yvU;5XA) z#9d55i$2FSrL{H@Yvls_Sh#fX5^I!qCQtP6A}Z08!H&emnBEN(wtQM2SEn-1nt#P+ z?Dlj}k|zso3Sy&0;fhc^>pcOCd%R^u3h9n5Z@s@B?(VUY4NdRrHc>Iv;4~w7+E?)s zYK1dbNBNVUsBu+ig87i0^R!VKMY6b2kTu*;k0Amhr_o_@=`FTk($QR&CccGtlg3n{ zoMM7)Vj!P*$uxL{Fg(1I_k+E{^WdJUV+;VM2L(+)zFe#&vX`8~w%W00uTobWVrZ3p6dIMQC$^}-BZmNbZ zq;Eq89D0|~?Frp}J-99~rHYv}C|zW&F*DA6Y<9a$Q;GLC6RzT6DOyTxf^7H%pkK)%G?*0aqT!LZyqt1-p%C1e z_9Db&Atrt7EC4oD7!E5nl2Z+N zl@DZo(mbSr8< zBojHoLOyKpOnil_Xw9CW9cz)vS*AM53p*bdaWb>VjUDdhEK=I~$lI4|b&*14Wm6z* z2xj;W02037UG{6qTwyQaY_7VxxG=$@)gqm1c@Lf!8nq~A&@Na_*KZJ2z4Xvl7PNEs zwwah&ck@+Wp2WjcTMJcQi<#k00(4?`{2t43e_Nc9z%I0^->@_}-Git@R%eMr)FF|n5LRQK$@)S?fliJ9n5_gG$xz~} zX$xwKL^ADq%lCC9iLzsDdW0x$9%*eM)lF+5qqZ~5`WtrUl=y&-->LY6@6reH@R5OW z4myRas6Hykv3Iyo{3Q>EpFtD&$FYPfwb^ubpyN{#S@|b6-S?i(BdamOk6mHZky^-D z;9y0&pK!Wx6kF0Y8xX}KCB^cgch5&gT<*m1xvtMyWm-h#j<}OhnbaGCSCc(7U^~u& z)J^^v%eBR}?%SfZmT+frbmYotbUrTP^c)fx##Amk-@!@8!KyfjdL(}inb{2b`Hw|9 z9@Dg3#5r5C)RpU@O=RO6XP`OEvlemN_Eh)%%Z)At6cN8Zs-PE@+?T^jW~B4Y*SU+Q zBwmaYc*88_&yc<`1?{)njz3~KB-)_@o-H7m^#Qb*2#^Lswadvx3M6h_c` z0ZCGy>iJ7?08}Oh06os!iEn-}(%Kh`C<1j?iitJ$eVEWhpx8Lcb4SAj7o{2{_LWz} zgQ|$-<7RS>Zo{<0Ym`Kn72S38c?}QS*h#aE90*mBod*TjPfEdIqV47{8I9)z7-|UO zvn=IL72?Ovg}OTDQ~0|7vz5y%#OX`tsq1`%UATAcM!TniUPy{wnMS!%P2~U;f^;WA z%C$o5@|fKWQy&>%TQ2LwELt8D)`dcpT@q%FrAz7*L3Jz_YhSE2o{jhF_(WYlT7=p3 zdPptD_mHi}0sd-{Ptnm0)WT3#e#U@YP*=6?2 z`JLf6+5@eUXc6ZTw7VvHnL|#6PU*!geY`31h8R^T+1QedW!ZAPX|6Os^{h)qG3VG` zAsma~{=k^{DefQ>Z$P#icCqY>s1k!T%hpzdz|MY4 zYFWrR(lYJBg@keSD{4igo5rY4(Hu~}k2zU_vJew0cd~0{d;^q2z<^8f-Zh@U5EW5~w$h!5{rMv=77& zkeStalMV@fsArpih1?+tt<7xJChlr8fF+Ucges4lDde;*}4!A?x0BOpT zU7(Rm`uNugB2{q>Dr_{fMFe>Ig_E!!REsD#s>~6hor#nBuv+IFjS;l6=1J^_8D-5> z`lHO!7jpAM$EA9S?7HQYiR#BD*gq|WnWeaoO^;01x<%UYq8qsJ*R6C4t3cQ15A+K< zIBnI^h?m!qPM|w^8*xhRozTGwdR93%91ianuEG;M&hWY=%XF(cFq2#QKX#kgO`Nf> z-^E?^YVPD8)Cyf8IVF=zhflMLx?FN{3bY%PX+BsdOl45;4d?eKKNvnIcrmF9znZiO&)k@P*zxhGm{2GSe^qIaj^Z4{pLe``OQ6rt$dSl9>T<8I%@neKM1 z{K_rJ%*3^7uGxgLqm45yZ5{bT^3F4x^D2?2cPSwk7R>-bh=U4J6k%2-hQmUDlz|9Z z{k8)ILZ01pJlG}FE7J>9KZ%H)D{SRvXM*gVQ^P@YJCR|DuJu$${D7{fKtA_wW0wHY z)+SMiXjI*)rG=Yx#7Z_k*|+?JR8&hHg&A)2W6&H!XymL!Ag{iUQT;0*ZwTjxvOY<`l;V zai%5U3nBOZFl_BNh-$!k zST_v%la$`5u>(TM z9F|j-!p>uX46egS&`aSeimam-6G|5P%=;-sC!ie~r`T+T}!n=c} z7F3?pDP8KfVu1u%9GPMk%rX>b6f=EgyA(z)EcuTA^GP*i76F=8lZ% z5gFED2@E@VjH#HK+7T(0PrDEWZX&>G(t2D(`03}#sU23z&}>pLw9Wb73o#vB4OaB> zTk}4Q?$yaQr6DElr|W|xo2{&iV^Vv?Yx7YmGSisj+9sSv9zv+@6-IP7W^&FdlNaRR znyMbzm_-O^AWP;=afc=|QVpD^DtT)AL|cIY1T~ay;H@A|T5()}QsrX(a0^H-sAg-4 zcOw2VQ9yz4f@w%Es9sRgf@n_U9%ophTNR>DK!;}RQo2_FGph0yHs6l7%SnnMMW6=g<#X|6q-K7WEp?Zd0 zRjwWZDme#Nn69eyfJ{uMvT~rXN^qCTuh^hBI%&?7Ake(Q&~K~2SPLoS%#*CGxkq_H zz`+{=5kY6~c|%_U{rZ32o6e%MfT;zKnx~&tshpH4v^=)a$tJ0r73!i?e~*kcR1>WZ zYqXZ6dGMs@&SugQE~@+eNSkBy`kVYseIvx>BY$wiO=q zG}Ba3AMZ6z<&@ulatqf&tmZ9t+V5Oo(kfNAA?H+01U5*5mg38|WWRQCS<_aMB4lv97Nts56(|{`- zg+$J?%Wk?IV5l*G*?yXy6UGPVhMRInmjWcy4Q4zN*d_Uc7;rTx9JLVf2S+%lEt2JR zAIv-1ZTuIq&4FwK7ImD9vu(Uh773B$4jKKEyu#Qvqv+Foms7;bP+jje#O>9@z zOH`z_!Rzc9t~s);LxsE6J@~`fCuEP`>*{I2-DIzCb^-N%uLg-%z>VS4r@flL3luaI za?v&gVwd2h{RD3*m#lsuh-<)@n|=BPV>l((s?5}-{U(F$}MmWySZ>f|lk-LCh zmxHZ$_?eo=x6;lE6VW;6f*ivOHE{5SDN)Xmt?`M3H(dR&M&uz@YVcP_x zH|G|*U+K0z=Vaf#T}{u6v=;6{cROEq*nM~19*!Fv* zLppW@niN35xsZ<#EITSKyst@ zlpDNRqQnc=D2#Gb-kF(jwEaf!e#bwwGw|Vy()SQZ^P8-1zKMbC zs?>Fr(z9|ctTr1r*_zpnro?~a4iXCwb`uvGLK%E@Hf?K|s!hr|l~_%V$yWWUtJ|DH zwW2k(U2YK7?vH>1)Xr4u=7W@OeTBW1h=z-PQp;6ofVIWy=1Hr*AjxQ*>atl6(NU-y zYOXcIUZ2@t;IpoxSGHzrU}@MXW|@-v9f|JALM5C3tR;r+3UOLG zy(MQT)SuzAm~oa>*CeBMyJcuj(!kZ)?$|1<+{CiU;AmvAX0E|vmYUPz2@_dpeywaL zYFUihPbFVe>ROvar-Y#z)G-Z%tGQ%*^wfW_)MgV6)d?~!W4T_PVLZ06iL%CHi9%E8 zoYS{Ym33mv;1JTS*iY);qDJhE1K&cWKv6aBy4A^Eeah=3^itG+R?WvLo_a*fTl?E1 zR#6Ws23>RvZBoHb>Jsahpj<0=Yt)lu9hAwuRO+ENUw8@(MbJI%$nHXO6!F5AfpK~a z>Lp&b)M7@pX^T0G7A|1sf|X{glpLpoRnBHfK!?n4b?=oWrokQ&YfefQ(AKbc!{YM| z6-i|G4~Hp5S5I$@U6Unpr_EUK{yjNSG%7PoZ!Svg72L7#ZPn^uxSFqm2_Hr9MveZa z+9l?Te6;*|;o=#j6ybq{(-{Oruz*} zcM^=I*vcN|Sg1{&Y{QcShur2eUB^{I(maL^>CD${J*n?I{UY>}SXikkXe00{p9uU& z!TcuW*+vtUYcZ87Q3jC_)oUdO>ln)Vg=GVMbg2CO^5ry#)D3jid6jRNc)#u)w#p7p z3u*!k)EmiFKZPiKC_^ur#rQq6Dvp>)&^!lCeK{C3=H@D~#YDU(KzL>?T&8muNhg_HP%t!zzjBileKRTdFCD zpO(lEj#P6AaxOlgf1~d7Hbq6U;iZuDINIH*&;%VVB>mpLsTz6OF%R2Q0MA#vXXoJq z7c(wZy&Hpk3~p_nW}+WrE=I#!byN|pK$|^Fd2y3&u3z@dDW{zvr{u&I~)!$&3IzdVZt>%Ceh7>IJ^zm;aAxrdZT|v zFR0y@=J+W;(0y~o_))yqEwA!kLmf$^`W_Xah^Sbicto+nVmXvs&EtGA`n2%Qt!#-~ zT{N%>0Ru6a!EvFfQT~#Q+YqOC{aC2WcfyB#cbVn+t~9CHufLwPOt$Y)9tJgS?=DEu zR#IyFRUHrs>{0$RV;9Namd*zHY+IqLQr5$U-m1oj5>%0Y;gEb_TxtocvaA3>RD(un z>_b!CiA{R#LVU|42K^oEc@U546*&}6pD`~vxuxt8v8*UV#ak{dN|)pr6I-5j{qko4 zyW*3{hAO^vYf3WFAF#YxmS_mVd`4Pc@S(^?vesC^Ziwx)pljb8^fj$j&2X+!xu4Ug zd^<5Cd7+l_qPZTQjZ%@3-_(2(gEM}uJjP-yRT-@0Y)#blCZ`i?#N@URcGWm zx##&@EB0+=TC3FSQZ;Pcc=9%Ft953IdNti0*-=L#d$!+k{GO)F5jF(3%J>iqk*nT1 z&Bchp{9K?q0~>vO2mA#L8Xt`Zvj4>eW2_-|aMR*6T<%8EX@*z31>r2guj+;roaU`| zZpJ{52py66Qk?z+kw1t-NY>(WaT0ifhS<>^xPLY`ZiST(bns^N##vIha_fzmWDVb8 z)MO4-Tx-|2HP5fIPj0erZichFnYX%CZ+6mWb}od?bkH4m_&1-sWO;P)G6W|FU*`@Q zkCF%HpWC5J$9%OB1}ta>+|7pGVeUXVV9^s!h)C*EbkPgpFCiX1v;tv|dXtdo`lr{z zI_t*!&w+^Sm{WvC>8^Ivqz+M>?aP9rxhW+OC8?w7|FA}DKwvK)EX zr8{b!UH}By(WK=H4=K=Q3lhiEv-&xiIbIp6xoWvo!O9)N(m4*wRJ0Luq5V0u_7W`k2kMoO%;SX<-^FMXU=^)?A@kUvx%#C*cXXC>#?wHH8Z==0yg`Mw-h}f>1$_Ra8f5Doni$qwJ7R zO)8Lq58;-mrJFk!#`(=LqghK0?Q+>U>+^vszW{@VrG=F(7!ChgU>Orie*1hc|a_)T*OPwa}Vw@L%RsTzN9qZ^aI~NtOc? z^4Fj?zF&B!iU)4gOJu8&iu-KkbMKCtFP z&y>c>{_FR(f5XxL5u5*4J=+a=6!jZ? zQpdd;j2PQWunv`B512+m2+2ywzzWT_BC+I`N2%-LiCG4l z`C=!DwK2Pm&}@b8rsoS__XDzuJ_%q9hg}D_c>yKmWXF6mpwF8 z%{wp7E&(`tl{+HTV~2JedbK+wdYy~mYKIplRQgeBlrAOF=B?V1%ALF6^p$T=JyfB!mtq=n(-bp983%<&CRL98XC3n2n|M{c&e{x{zW zy0&pkNmBN!NufDXo&f;OjQBq61l}-hO_DmoPwdHGv$l+aK|v2Xh@BL)UR+vLJmUV;hf|1rq?|oyZcKXMl<3a z-+Iv)Nft*pSdBy(O_Y>P-cv}W8p8P_pP`VN7fm@aSvi$T7@pbtqq?tuATyg!{ytH( zX2OjY6^p7v%&vbhV)M#RLT}F6{2{%lENnrL!>FYhFNBk<(T6$2a>7}R3n?Z9ia_M} zi`Ly)J=Pfo!e;*X0yT6Kc;1&~d*`L_kZ;SdVH+Xvw?ypKGxJ_TFO+!|< zVcfXNlM|Ni5p;fbg|m7GvqeGsIyzi3k&UrZeSV`d5!Tp7O1hnUbZ6=xO*ho3uA_uT zzCd1>azpV4{WG~=@l2uOGV4mcOabY|7V5iZAOEd1#8;C3TQlMXe{0OcnN~Z?3aw1T z=}7W3wcVR9SuGzzD2z0MVlhZOiMl`tIpU70Knb~`te|@)L5t;C$StY}S&hZ!h@G;1 z4n?s#yjV$P7SW$9O2-nAN6o0r;MRk4;_htB5QTDF?**1a_CnKiT$n94d~)}sz_b9S|cR8W8IQ^j*= z1@*@cjmVRSl7yBHW8TMRltra=CT43?mm+^5<^IUB!Ec`-jQkyQ!M2><7T(Gsvuc!}q0FkK1rHdAloI>Q&6UgD zOhH=H_4WGRgNjTH7d5rH=ynka+RjRwqe(l2M|RbUVALh=kxGl)jI4dloAKp{plauy ze6n5!Mb!7Edaw%vQDoPOxKXL28pDIO7|{uWZUU__Tav8s;@I#I;XpmgrOWibIJr0M(MS7h=*fI915}hu+&^SM#_LxU zztA_s7{&Sb1YC6lgA}pOPipjD2J^L0K|U9Mv{UpHZq*#`{F$R-sQB z)pm|1M`fzF+TCFv(s70Qu-`KiKS!I~E7DSiP9e5H9Mza22HlyZpF8Wp$9H?(D@c0V zpwrNt)`Bpj&$juQ8r5S8mqR@o^k6jXAy(}{SaZ>Ez-J2HY7^T)>`ZK}rmJkWI2Iu0*i9Rdo-FgM@DLzw+cmx~tk(Xu` z-%fJ!L-}`FGLt*RS06wd2ms>Em{{Aob#C|S$GU0^tE`hm6{pWSjt;vgAY=R39-pmNEY2DLh%s%F-? zFHEzp)x|N#fzb~)erVwc-~?lk6G11+pBtGRRH%xI;tWA#Rr8a{%zEb_y{wOqz5;8j zO;ZsEvx&Yq-?xT70vA>pajG)qo~4dULvNd`HfEy2 zGS)OPDYc^)06|Z6Ld%sJVsSJm&ZU<$S5R)ak=h)3AgN{#OegNB3qx_QJtAaZt9OQ6 zOc&y;c_m^%Z$@*Hsc~S8>Zz@I!M>q!UkMc>J(i=NLm^C?kwKNiW?3roUH!u^dFkoa zhWXuRI0OCvkA(P_U-G|bE8oT-RU}p9FCIn$hRASojSBM0hG6pk#!7#3Kn)8a5Rk?u zXR$1Or#GUkp8^F#aebPXomWpj zuI^V8c)xVtV7f82vVu6z_e}WMc-HSh;d=q_U_s@=1$nu#eeuBD98yGMo^QyXVruun z*)Z9>*M)$N1;*h<;`8g_MgQP&YT`j{vqP)ECG-RifI?(tkq1N>VPF@uVB8yq4v>AI zKkgyJ;lXV~Y*s?a-j)>u_TQM}W!>zk<7FX{dTOrNG%cR>tjZaNjb3h&@_+>+uSnRxcgnB(}v1uw8WA-3)U7WYd&&Qx_qC+sfkyz z(`#i499@YU0$r)o=VF;!kOvCPdSI=_0B463xFVaJJ!U!xs&w6XQ7_BhnnD{wd{emU zby@h*HK%cD4`&ul%NY>=hAb(wf@ikxS<{l`-zJAw?&6@J9Ppj$7dGYxrnM)0n}A zb;6sO4n?frK_sV#Nwz41tS9I5V8!Ld)x#=4H1}LdRETQ0)GibI00@nYJS$0KD#5fk ziwZm^w;7V$ny+z5u@3vV6DP&pW-}#HvjZ(@RfEIUy6(d3DUr(Nk!PZZ2Q8lLC&K`Q zCWYikiAa)<@PUFq6|l^xLlqv;r;rO@g!Ra&AhIx&uo4IIHknR7Fdw_jMXt`mDILiw zZ&00i-OXPOk@}2#-q8s8Y{tiA3xy9FrVvw9e>+c_MnA586=~PFy|VC-=?ZwBt(f{= zUg~Mz9OW9cCG>7olW-k~`^$|>CFi$Bn=fv`PEhbx9SuZ%z0n++l_}=)gmvsRncs}K z(#6Se^b^icA4!Jdo+iqTj=emBmDmnH-hVeVcwim_O$dIS)nrw$O_#usTr2!xZ*YJn zY_NbP$$e#T6Hp#SPnbq=ql;?-ev;Reu>5)aq*!h;7;*ChvnLzeX($ebAnE*@Hi8JF zD|*s1ZJbcB(+>O9LzQwc322_6Tryw4@CNBk5IY|~xQ?JyEtT&D3?+`Qc1(E~m2WVw zt?mQMd%%r6bx1U^SdjOxbxGgE+!(3&mnjjIK_pr))OTS){-!w5f%MsQEDD2c_GielU>G!?O zhFsi%+;CiC<=Z`0`mJrSz22e3km4>$&2nMF>xe|QLPhT#xy=6gO!LKTl6ru_tJ)ZE zGUt=`o;7UwX98>>0N}rsaTtGn{R1|1UZlcS5AfrM3eb-q?EkZd@gIF|#8S3~`c^{b z-(~}I1LyzK(4MHEDT(z>;gj$%fiA2SIPROwSaVJ7`)qr0htY$YGNlhPHFi^DoeAeq@ve9) zL40pIMLQ}JO|jGopCVLof7dB=FrDX=OWQ`#Uf6OIEMarp2;C@XGqk(?#-8$z2jG!Ee33e_^N>3+dp`!9 z!S0g!#=VS+WFryXLV;1Llv1N=)wbbS88xD#BHLy>BFTs8VtpG?Ma9x)zHJlqwclCXuJAdDjiIPa24*DE0I(vmm~pc+*a=`=A%?NZeqnlh zq4}JXc)C-e_)?2?+j1$5mS7z3$2Qyt-3OHQ78kg<9uMtqtK${N6ZKu!QC92M>(mC^ zkH{T7&Q}6L^!_~TBq!K0%v(;{?YwY*SQKF#R4W{k4q`CTOM7QG^758~-MVO2tr>&? zWt{B3qrz7x%&w9>$rjQOy0dR-2-E+IZ38R!tlIp!EjsxI2B&&E9aCg~SJPpuT;aAX z*w)fby3du_OSSKb`CB_Uqx8wy3vm-1NT>8E*d2n*=@wH@vLl5oI)hZ@*L^KJ3)_t} zOb*;T2pU^SEGHY?tgGqpTD-Rs<##f99A~PJKe>MiGd(JjrIJ&Cbdg$4I!jGrvqc@v z6D}&tarU~LFCAIAJDFb*4~K1}GGme~^uJGNt~9SFNA548O-UY~@i(W5D&irtrNPOs z(O>JZ)B3&_$sX5qziROp412S_OunC@0+(6l7&J>C)ih|+(t@9aIuz)Mu`r$J?Ks&# zXrqMo7<137aUFF@5=q8pQiab?#wjAqn2CQhF4s%vAZ;eI)Qos3tRrgb+bdp)`yJb; zweYj2%c3pmTI9$?aY5GJ1>3N-#L~nM!YWq3Gan*ri(Rt!1ZZ4Wh>}EiJ=*#6QVj_z{ScOy)7ohv8>*Beh zO1^vKzR?)S9Fk+YI_0s%JzF_SCh&rVP%_qGP-1-IYFlkd8Ru!4hxp2+2#SbRv%FjH z2<@EuDlL~fL9R)Vtx9+3y&-;>J&>r~d^eH7SVRYXHf)bN41 z%*c0ZYzL0=(`;M&eWY7Gg9!MRC)gWM>3yYJ*KWL9*IsZy8t7`r7F4I3Mx{SAd<~RR zP1$~^d&_>Q8&d_QLQ>5OSA}$)o2D&N_Ks7r{jZ+quC{o2!+a>7grtIDfo@5swDn z6r(C_f&*C@Y~bh0h*cXbRB(Xv$}xnP+t2rT910lCC=Y&Vc!`2^8Ix<)XxBCpdWY=W z&bWk=_VLURueX+7fR(9x?;>n!y}B2o3&6L#b9hAF^>x$(U&~kVE!Oy8Gpw+4#Efi? zn1;3yN85YFQN??@Y5zRxrcChbSp$cL-VlLO?Md$nC}wvN+zfl9U)B-2rl*s8JFY?- zqPWhY~~7IIu!BBix(99 zaqlo4V`#OkyhonWEqm2^TMo6A91|m z`wEj=QWC{vKmzyB%gKb^C?CWCti@uYISB@4g`Oy5N3fX*j5UUcwXX1x6So#WH3o5T zrZ@|3r1QW6q|0CciW8Y2PRQy~V*x5h-jJYurGE%xj3}V(UagI{>Avw@=w_v>zAD4* zpysg`T)QC;%K44(ZYVGIl7@>2<+A6;pQnP$9mvN4!Ka)7L6m#gEx|84kQgmd-C46T zl|oJ%FSqzB#9o$)YaW&7M9oqHotuY&UyYLET)>A4ug9O#pv7%N8 z#(}UDQ}8L1V=w}<1?(PD#R+&PUyyo1t|X|%dgW4!X0-!ax3&+JvHtyy483eNf7cYH z+@o|6^dkP*GhPhNrAfLnxUoH#g^B(tSW z(O*SDDt=C+>?xChySYxJ*l@*67FyD#4Y^K5Jlx}cjla7B{IFPB-rjwgpt&W%XOHz} z+fyESi@bh|!@X_$Yw*>cLWNvYeC}gd9(2jRnN|eo@b;-gT`00ossGj)yiuPNxOa|R z6ot5=htR&>f%(mxDjMxHb_kzi18=reg4HjY^Ysrm)3za5gZ%e-EBpQWi=_ImHb|O( zw?WeUFLbKiH)(*@?tjBY6(=WTDJH~~#l)q@#>c2f#;5ia9w(+0!DVQ^IiPa%%yoK{U~Fh?Zs+v3pTQ&BY14-fzv-SxdEC96;8&t~(TRP(i_*xD1o=Y6y!Y_U$ZiG-5Bq2-9G!^9?-ntjaB zvP$XuC0j^HD@4;4mrhMw;yWH6AlTjCsFZ&_|Mw&RZ@Mnr_vgRpy8muYHMBDS4;1cS zU;jOPpTzymfl~Y?1Ty^huk#!H<;yj66126p{$}b(ncEnD^PpV5F|q&U&`ng*{$|1= z^8i6bP&I{GS8h$i9ppQ$@umuhfzOx;lp)Oa4;f=DS?eW33+Dgo-O8h5p6SQij$zzX z|1Fo)aIb%~$>Dj`>Ug-h!T0OeC#YR05fH@r@iGg1Pc#6|RN|9>I|q(C4hW8Lu-m|c zmb!81;cYRr#>SOh@Ivs}O}u{fgz%V!D}*?k*V<{8Mz8W4M9Ik1rEl*1b&w%v@2OL( zxvO^lBCeSJO5Np?N79nKk@FVUk${7|$#Tp1L*rNW)iJ41qDr|I3F`(f5%f^&V5+lC zs`i-Ucr$XI+8EPv`y)oPF$Z3-SOf|7Y+X~Rf0g*GCG7$a^>EY^4a2s-zNJq0c+VCX z19InaLLx>5MbH_CUlX~x5xtIgt-Eep7u$60kX`u+XBJ6_f7Q93Icwf1m=hjlTy zWTkvo-kXRDQTq#2Yz$gx7P179S&)K#;PNK;&D9(vl@Y%?M8%vBQHc`zkqjk;ZRTc8 zce|`?V4k9zZ%9JbgT;H=u@0TsRGFM$7(!~YeE zjJn1#Mc*NK{QdfeGxD#<{aXmi={tNQRsTyY42tCc3(YM2W!9(x<#Ny#YAHA+hYT#- zgVgU*LSqgn{$NMT?HhuqsMTi2d&h@ovU&F51~?2K0xl>Ncx+|Uv~69PQZp>QCZT<4 zIYDNQv*t{66-U2yEP$bUcG|tMkU(G(SXi4_QbCOpA+WG}F>mR$6f&c_g$@j8*`j$nx z|NFB0@6Rf2?&xT4V=8O+SJBGvVEXNncQXF>b$p_>?3^C*(AN}eTjiNi4t^IST0$qj zVW_V!sXrZq40Dg3zbafsD$9oAEb10r$IT$t2fmJ29??xN+;#|KRxynumgHa(=>>=E zH`r>a;n(NqD@;xx3JSx%a=(0NJTu8cIVECBlBqDogb)MP01N2AsxyqF5W^7t{c?P^ z-P+6rOmaJCz~fKw4IQS|y<^xut(Cg+fwBpzBAs=HsNFQ>a(j6SEP)Oq9v9`ORCpRM!?SioMnf;&fuRY}{7wbBIBH>G zOETlPa{lS$`?&NGNU}&{k4`zmxV0eD>Iyf9iEkW68sDBL&}izIF0WURXAN56^2qhKGt!Yykx{{RFG6#86EC>G}APDe0F zq$q#I%jaXLepxaq)A-}&&tR!17kVjNLw28h!(hi2!7{dMZN+4LlR6%{$kRrH>LRFQ zf{h6b^H<*i0#$Q0nE+xC0uBOB48jXua{>?2+w&i}UOQyHZw0}_*haXdQ?BTGSGjd? z?Bb^RT^us8z_M{_B1`6xAk&3E%J!k0g}PYWAomr1S?!X;MEf(bpV^y90!|8s%VOZC ze)-wq00otDCR|y!$l}soV6obb{2(JqEPx+DqsR5N1%((SNpXm5669k$K)3z57ll37 zf}DfO&GS<}dg`-THu3Tt%HX^_WX?+vFBwo;pU`)mV60}V2B_wv$w-Gyd3n8NOlPmq z2_#-eSbd5~lm!Sw$c&xD4B-WdN+0+ZO{G_Omg!!I^6_t(!(Xetqe7Z7_Im{cd>=eK z|1T@xU!kw~t=!m{eyuF^SNE zFo;?NB1%|r=k51MuPxmK?Ou?)yLRGB_2 zBFT-|7j4eH;DzvTZ?v3v9Rh@R!6hj0q0NuY3N6b9Rh~Kv{!*?y%$uh%RZk&~M1sO4 zboivRx0ivqw!rnT9~i-p#(fCn%jbwixdXC*6uA9p-OF7HWqBe zaU}5li~wb8s|*8n+;yXkcQo6hZ8^H2_e&ReaOb??%l7htNq?J&X&+70*!P*YDOAv) z_PNnDqT@dPfk;DNbHMD;e-1XoGBKDg=D#riQ3%&q8mJ}UVg@Bc%R^|#&rduMmH{-*AK6Pb_{kvX!#s8o-O3L0l4r#$SDX zKWqJM1L^kj<`r}sdIAx0nNfdDctbd#o8!p8n8*J$_m?bQDVjWj$A^+Vf=f&=aF8U2 z39xcDluP;mQ4y#UvU%a*n6HRnSgzzpGyBF% z!(lA#=UkR}|B-L-p_zRReQSmx-%}(0pLQTgoA03z|JsKBm4W>25Z+L;bVEKs@%dvE zuTBaS9Q4Car8w=kks};H#B>8eUP16rEUCzbRee_}P&THu)D__K0SV2E4V`IL70+7m zRS!Q2M1hWZotnId#XQ-sNB385@7JyDN*+@am-_ULnlQe%qx8GXtMx9&x5>+audH7H zKe;v&Ye8JAa!3gBkqi-~FbLEl#cyxjb*yx-b+n3P#nIsm1$q%MmbOcvL0lQ`gXp`| z{OESZq@0?icK`IQc@ldm4|;gf)tuIu_;?SXZ? z%k{=QKeOZU;qRg2CR`h0IM?((L;NChcPEd`zJ1cih}kxkdb@*s2YixzCMkDU>a8Zu zfS0Q%uv9zrwZu9M4U7+5Ne;@jt~Nh)kri;n-as(Bs6UTgM9_>NyI)l6HM^)C9AswN zG);N+nQ(DxCr$qq^0T#?fBST-=9ODW8zEg3RqsZrzaBlTaNM3nHQ6q_#Ty9}onTsF zeUaLO)mclj;5jMLJEYORlH~w1Y>~Im{={m)m%+foW|Xvt1uEM0^)1jOx&id*(!l<* zWM{rX`}431M5=R+9;R7xTfp1?)>tIB zSLn4OB?*1rD&Pr#v40a$%{AU!I;BgQV`g1v-M6=5Uvq`A{UUZg#ik9g{q(MHp=MnP z!V<$h*2^BSeEBKu;_*yWOMzxu<&PCkxrmc%%;C7Ej>eWGSatq)V=7kBXJ59gYk6a##$-u|TswKQsh0t&JjQybE5~3IB65@X!PVr|O4F<>CUT zv&H%>&O(FM!ouae@`TbH#+JZ`J@4KV4rj&CaNX9nIO`P!i0mGQU*<+pSq#ZWJ_f6^ zfa83DbrhC8Pt~UWiiH)z0u7=J6??!IWeW%!l^d!cN94{9wwI9uA0l$Vo$)9!EEk-aAO0?g&Vqp`PQ_bcq(w1q+e3e3|2> zE~6K^ohQW4ob8zN0KOf8=&O%g`D@1Zk103d9^nqk8Xtmzs)X3kGuDS?p!~M7ZI<_- zqWS!)7jNoYv?k-=h%3z&La2}D3ut1hr_n70_BxqAMv=?KfzCXp? zJtXWzUpG2sKvWHCQmz?kkCUtxD?E~mi5Nd1-5hobZ*_1mp+?M4itn2Mqv<{y4x&IJ zc)FFkqV3U6);pL%8KVtY(IXpTUxVLsT?|P}PIwbh)@u+V;qT23=uM+gW4)-22TBgF z*9Ae-H%+a*1$`9khj(vYc8bEST6xX*jXr*xr0ZxOGMXC1hdrr8KRuE_llYW9Jxl}sUt1EURJ7~qZLg3C0W3a8NP;waA z4OC6ueECjpYNiI@qiW*S4>HwOcV>vrma>5-`oy`+%5FLcxfS4(_bLWG754PL&06hv zn_uR*oeg=MJa5L1zt*Z;{9lsC2`Q+J(4BkR}^d<9#&1 z+vc}&4Fjt^D8%h=3gHf|q$4_e+*8EBB8lnZ zhk3m*hyHC12xjM~w+F8-yT@uFF6oA;9A9GMU9Uz)AC~B-#y38>VaKWZK-tx$S9T{i z;F!fZfQDRx#7zP!!O2~iWA-eOH9kyX+TlhK!I!b~hs3(T%@1IaVplp2vvQAMX%?Jtz(h$VUgogw=hP||^PH?@wS_+4u) z#N_KNH?S{+D+TJ$OOB3+^g%BL5M`n?;I-0q#IObpwWY0`O4_VI_9px(csC7~Hz$nhrQ7fe&DS|Ksiw=v6_HF>_By1fN*v=*Hd)qY>* zT){&Ew_pFL(y=X3YbU;Qwzcmno$dd ziw}*EVStK8pGt6Jh%rHZqA}~zpS=UO6QSEJX7GF-LzuP3>R2POBj`EBbHp*#`qa_z ztIFpCRIWQZlKIf+{#F(4kc4^|zLwk&VhmA7LM=9S_YGM`Ty5{#8A2EW3sHy3$r?Rr z$C{DY;l&%Y)(Gzu+8d>B)-^o}Xyc^=#^{x$U=(XH`rgLi8;J;K$rKi#Z07U&aZ3AQ;|nuUdmcBMzO{z8Ob6ux3B>)vKh ztj=9{CZ-SM&RVZ?+4LX{2!s;svs0})6|(yR=@p>SaTTVsGQo9H{>G0BB@Oec-x<6i*8#u)0r!`?5-vdmafv^C^|^twe^SaH zzh@4|HB^mf5ZD9UKyiuQlC{wiTui!@EDk^wJa>882yq8^t%ff~0HZOGPiF%6#I#}4 zhsd|ygU5WtS8PLwuitTG8AN&&9~)KcffrTQ)%IPpUah)&b-Qrx5pIuOJP-J)4g|pHbsZbMm`ODN@uW zte`az#uG+K@YTt`@|UU&9P9q4X18y!K(_O}LTtYC=)Z=@{X=d3TV?Za%}&|I^8b=W zcPfu5eAn?jJR`*Vj6cEQZ-PR}N8rJCatT8T3k#KzHG=B&mWUPij*WuTq!M(mb+yD$ zVkpske808_mwKbH*xG73cv2w|1W4?64mU5?o-(?;FDLdtu9~lY?AvSdL+?Ry($Dah zXVAy@?ho`N_?wRl*|UUOLOZPNW#JBB3%(<`j*J^pP^EeC(agK@*buq(dz6Yw=_;_E1n1F zEqhwTi2=!;A2r?0`m`LRMt>w{&?ML)retjyA8&f==r}}4h&S^nuw|~~)EFuTpH-f& zZN~lfWXv>gmJK(=o82_eu~~~`(Agt$_`cS6VlZGs@4i0eW3F*`*|e=|;GvMxNukg$ z!Vu8_m>XNn2-lpxO3nKyHRM3rjiU6JAsg=qw;@)#$1fG&PY&0I7OBnIB}L6|8K8ff zn(LuoKwkSXKZl=WEo$_-!-^KJ&%9y56r2VFAV@}sdS&BDt9zsp^!O1q*a)ytOT{3B z*9-fq7W^9-CRbUZVfbmDId1RjGwwbP=kMQy z>Hbnop9qX^z(L+3Y;XR&k0`~*QsszxKTLo8BB3?&9ZQ+#EF%sWd zYV;%|?CtsiJjI`ER{fMbmLk1^zPueXLd(5xRc| z7vI+qX&n_Xp+FA2`KOp~fw*9faILbaQmmHx;p|)I2UN#>%o+U{35*3lc%NrznKX-i3;-Es0VX~>_o}8qI%%VNbDDp z;Uq=G2R#vu%J+|x)RU%Jd_+6T4=JN<_KTQJ)dYqTbeNTk4J;8K7ysat+Q2MO9~NP2 zvPJZfxeLf&7#NE)WuAbM;I6{gV6x0Rq>`p%Iul{oGs;hox@)@jh=~PnD5_6OG$pA9 zjZ|2q&r5`!nRM0t%v=^@18+0aOq{K_q?TY`2Vbp=Xw9ocg{DbnyI(J9Y$!+zvfr2| z-59n(oI&_@&Bh}tocxGn5UpPT5yZkxiG{~#giIsHkd;wNLS^>U=s@bO?64RwX`+41 zVzh8KZ#?<%0nn1GQXHzoVA-WUJ@3szGpwl2jgb_P^|ov32AZahLB$!bT2YxN(3#H| zQ3kXYg9{{YsFq(Mv@(#V$$o4h(kI6uob1*(b>McA`E4mJ`Zj0Ds0hfO>OgkKhedo@ zwBU7Ciq+WYFra6mDPTLLjR8+)_67q64EAkBzS5K0$9i2mHA2f@bNhXP-BZp744WVcX#apTd(AC z{>FOwEtdIR((n^oPj}fFb_YP4qg9U5khHHZ>OO-ci0;2{2`qd>xd^rBjI#trxdqqO z6&v{YiSL*edH5TOV(Y0w#akTgKyVOo4X}b*`tQQR#_2+#tA3jIo#+4hd=1-NjoovE zGw`}B_(E=*j=(*vOIHgHJK!#4(C83~fTjtK-M&iw;7&bESG7xd4uuq@2X2{_!6vyi zOhBnpp0MYuR;9?yNw!eoxD1@&1h}ZR{OuS)p76GwqfBtOJb|tjmBB$wRjv#jy zl-}hvpg8-+{K%_`3~c*z8V5&!{M1OcPVXv{Q{9R7UWLw+Be{AltzjSa(!OIs{n+v| z&hE-(m$6ma1SwmDYcKf;jQjeR8wcw2xHUyk1TwW9+ko6e%ecql@M*}X&)DZ z-x#?1S=9)K>Yv(!99m@Vhjy`l1n59UtKA_6>>^x_v;Z@PKArWV%AI-2=tmVqk>QA?MrIs-FrEeU_W?G@etfPmdh#_TzH* z4^!7CP)BgC<0RjtFmHd3qz)q$2u#|{rDApyy}1o~{r-qdV5 zIFYS;8qGT9xub|fkae^)-C7_Tn1HO2FIJVvRCOcL;l(f10xCj=b)9 zCC;*_wtdq5XHJx1r8QOjt@alEcT?*Be2@A6BPk{-X#ZtO<*8S%cafHENZWOdq!6L7 zLDnTEH2aC{4;jn-%qkvyF>In@LPqkH|EEAUi1!)jH9y>y6#xOs+y!?sv;8P*jK}r! z{o@0A8(!DTsOF?^peQ6R#5(xARB1MY!KlpB8nhYV30Sa;BJsO@flFZPPDUtoz-0YE zKHbv%YOlbuYa~#A=W%3MZNokje1ma)x_Z4)L4b`gi`buhXhJQ7zr>vmk)JJ&pXll?dzipH&mb1^Rf_(l^1bU(smL~z@aPz)Y`H58W56Xj~utq?aT<}ibs@MLOJG?y# zC{2DL<_jXs>4J95UX|&Qb+p?qxWj2-UYs$L(MRJ&^~t3PTS+{6Y0r~`3{44D zdD=h%jTlTGfAzeG`vt5d7;v3o?IXqXCw2JNNbaRUwYBz)8=KF{Tb|Ymi!sscGby*h=^(N>eu@1uULD_ za-0hN^?nrd3)Bw!&%*Eiy6_kaaQ#*w^#tV#vrv!pa7azT^|cC@U3d1(l3tXUv~U&_ zI7gw{1r0h^Byu~F9|`&F?%nKitMnxdIN7^vkppX zzNN6KK7=(oa4=n^8x8DgOZ4t!&KqMd;bSjl?oGLyB7Ymtg~oGiqp-|y-pfyBZKm?ugS-+e z_>OK^oV8jTy)GO{k;Y9~Po@jZzHyP_Ng?CTs-#h7=OgiUEmky=R)NNLtK_0_miqOU z{t-Q6kd(|EVfY= zN35!q^cj{bZ?K26Kt8M-&nKNPzU|ZKR)gx)2e$z00FrJl#|4v%w0g6wrhaRgrdB)z z@iRAc+t_L8IMS$7L_So`X#Ax|e?e_gTsZRO`WJ&<`$*@W%4o0~Tom288)q-U0XAnZ zC{^co3ip-f(&-jc23==R3;ugAYZi@-qXn-|{5^I}vp~eiFH|729ci9* ztbRHo=r&MQ=|kLm0?~s5dIo@!`XvM7gakzT>$x<_u&p}MhxJDcggK--j$+{?*yH^& zA$7CyK;OwyZL8%Q;`-yMO2{#J1kU*)Md080uAU`?_o)AS>S+&G zYF9^%-4|^-2F)Ixjvz|3ghw10_1B-6JYRGZhCl}H(O*AE!@M$*5I#}dYRS-vLW=j- zes@PAu|tTRFk}#l7E_#Qb;b{2RY)uBI&H^i*hh(HIvLpB%Zg2g)b|%`_IItkgu=5B zd;+{}#Wn#Z7W3iPKfD)zEE6ykcW7*HX&Gu|cSRwOoTo=edIrXb0BgsMh6L^_V(?tE zHfZf;VYRr@CbQ!wD>ay-;cm6uJ*~ss|EUk!g8m}H41QK6A!;WZg2f>CN1Slx_=qAaBwYjJGUR= ztllG-ERT|Bg^110PDW1R{sdmsBvVA1l6%x?(AYqHDkoM5E4^{k}YaVS);(G?s+>*dM%R?QbH=pj-7!iuG+ zkm*MM&YykOH7Wvx$s0(m9PTM%x)I{JtiGZ^Zl5-{)cyf*c^}lN7pVgh$Dc|K*NdCp zRi&=^U4n4mop8)G+xc$e)p@iT@B?z-j#oAm+k~Dq%St~xV{;~5K``>c=bqGVpq96K z$0CnoGBQ{&g4x?rZIgkuciV`MggZ6vr$guHOoIqX7|;afH)$vknv%^g27J~<=V;pH zMX+FhGzi>DAmv<&O0lq{O<+y_Z)i*V?(F! zw|@_||J%X)4;y1dTW1j;(u_BHJsv>K~7_nmeCQS#e^ftS!KoBF zPCcHCIVM?>dR`|#N8^ks}s}F=H(X|)88sJAs7zhws2+TbJ zfM%GiSi2+-{@MMtJ&>ICtmpM8ig87aB?SeFB$(oPG}(GI$>aKXRBgKjzm*UeK71gC$8%;lxM3*yyXnm z%ZrdT`$moq$4i;L!>{>VxA#1IqntBoOn05YWYZqcv=i3-@C|9*6RWm{+DcBiZaecZ zv^)>XrK$9*r0$goWSUpz1D{IPF^4gZ??DgbY8%vP^`x8(GKMm>nuwh^5GxeqxKz*4 zD$adV2c(XME3MDPj6zpCf_!`XEX4+%I0!X4%7&#y5;c7-(C;?*Dc0QdBBD5zcTe{- z*hw}D2SKV4vGR|$GbZ`kE0L~c>l;zt=>2*r+i%+hTpRt;^)4C4*d7)nFtZePV2ads z31b5!P0%ccj`uAFU4v}4{+h-zqTr1O3kEBZn8W3ZNSvkkHr~F+aIgZfG@Trb@Uvra z!~kBl(L6YM*ed6|OmVIVY8bq*Q`Kv_eLEv_=~H~!UCx(7Y+soD+-wMObdnfw9J2K4 z1v+@H)tAWrNvXG+6@Q9q1nwYWS)x8B`c{lOm7`RI^2a85aH<3Qcy1Y2dV8p5gt5-N zG}pW|TZDYP-<69#`0~YHAaV7HXmpc)5s2#R1D!QOs9gIu*kWM@Lht_6F$sF*iR9w| zP`$tiyajjYE`skw2?B5EY`whfBRYc7mp<9l4y9ZFS?rNRXe%or{`gV)jZpf(OL+f^ z)_+TQ>JVN^3$0&W;|``awD5!gpz4GXMkKz7_*TK8;c-7ed%#1J_en8Q#sgC!;Dab7 zDm9YJP(aRf3Y)6PAsE6NovRm{Rxg}uy{o65bgZ{LFD%c_NI!lZZKjS((ULw6#duC; zeA`95&c3{k_9tSpxnzVKpC|Aya=wzMvJdXiUfz}S|A3ra-Pg+Sa^}v#l4ho*uuRU0 zCoks5`|&^4$rgQJT4I9Tatyc0bUy%aZ1Y(QwWgL}bp^f8(J9+B2tlyyNX+z+VxmM*IV^;MI zU=-SELx!bO*@3V?gW4VmXC{$~TG^aCV|`$T0C@s~# zWAxCMYaLlzzQHD%OU;TpbX73?);tf#dvUBXrrX7$_&qrMjcnwV{8OP-d; z0j4eZ^+29#yiBE6*gY$#TfCZS{bcejY9^f_Q@5rt;&Zd)4~8J=R`|trm+yf=Gn_u`|Kb%(U{ z|JT`9KvlJMZA-UwH%fPxDBU65Al=>F-QC^Y-Cfe%0@5Xjl*E60ulH5a_kMT$dyGBK zVGP#uthM$&E9RW*nLG(gbGfJuLdaM`N&SUUHr;3Z)m0{x9}nnqsNYqt7>D(h0oF)5 zMj$gM3|k6w?P=mS${@n9FQ!$*3raO=%(oBxsp0CrP}Y|gsW+JS`N4^2$uGZ8)0bCd zz$pq=HJdvrX4XfN5kRL83tsG|Ih8!ah~rVWu=gfez%UO<9x7*JQj6khS$M#t&oPr{ z@ewG|KC3UTZ(KyGDo%c}K_S#2zfq_M(_%>O7|!w{YN7o0lX*!WJvy=`Fx-q|daAz7K` z^dVJrlPZ4Yz}bn}s@dQQWM0!ciaArkxs>M4_`|)WwaxhT6 zAc}iEcq_2KVakl?kk%C3)Ho~Qq)u&n?m9P7Y(UAy!dcwRDI2xD1DB8+9jnZ2x}@b~ zGt3PR?3F4kIwJ^iZsj~gAZQL$K`B@gwN};xr_aiw!H5^Y*@j3NtZ!>WW9n*s%RUkP z91SRphYD$NZ_bdo>O<&JR9{aIZJR9JZnp0tIH^Aam+bOl5M)CQbdW`FHG;D^)tYvn ztcY$zu##tk!glbCFps}dNjFr~OwH;6xakqo3-yH=1A!Q;o3?KAkm@L>W~_Mms`6aW z%o5*0?o>Y91GYhZD@kJvrWZB7{+8{KrCxK>S||F+@g_X;pVHEECPW6&nu<2;-#3=0 zvtFEiY#wW&MicaT+DEztVOFa)I%r=e^IA9K6a*GMAxL{j#`^4P3{$c#Q&a-i)lHuCM6_+=&dg{aB4S4=A zA?qkrqh7`M7HDDVisOFt=r;KJ;5?=)^1A6K>N_wWi|u7kJ>n6hyytz<%6j1IW11-0 zoUpGu9e^ulTg6AHa8W$AId$Sv4B`l1Fh(-T8V>~o69w=&Xz>59K@@d?DWpbLI#75q)F=G?WG4?d!K({r3yLvZ|^id=0%>}F!y z_PFg2c2*46;@7b3S<0gC#7jz6BF z?yPZ!M4yZeQYQDg%#2UcJ}%br1@H(yF2tLyj7W^x z%3cONHC+SODn4JY*-aVvoQm+hV##RY!NA|pVzSNQ1~R+z>_z0f9wHlmR%@mYYGp?p0T z7CQ}TY@qcv?CG{)>XZ>tIQO)5Pw9YA;uV-NtZ2i*1Rp;>K<2O)-IklH_d#ApCj}k6 za1g;#=db8394$Ha>a-hgQorhV$(GP7_wa^;ttWigBFe z7Ray>TvoinapV=*Wkm*-k=ZuIQTrPAoMu}{R|^HBFdHwmKOr`~^c8GcE*ol6f7AK_ zeT^GN-`K=_U)E`h&5XI9PagLuihcQZ=LFRkhVnx{A0eR5WBu%|r8Kz+mO{8T=`T9s zB1NiR>JwV_7IE0luacVS(c&6o%M%8%d&6lMqX!9vn_xgGA(W3Z8iM?L8k^KpvBho8 zB-pZ4<*KLZR`3WX)3UmWX(;X(Sxx5~5~IfSwROLcFuGtUKBN}FQRA3Z*^jKQ!^9~B zM<_OzU0#*)O#W-u91?D>4;?i=O+vh|Z(g;Fwt)FA%a|4Z zxjCq;>Z`fgCPJ#OX!^W9uS|qjMsYYkr$LVL#Lr|E?%XYuvLM}nUh_2Xy(PP6qvN0) zI2MYJT7)#jzA&Yn1RS>1xZv1M()J3G@HZlUv@cOjGWgi3+eSWjCc@oK3-m=h+Yorc zz3o1HQ)vD<{#Rn%52yr;p#Gj;-p@w|nI~}}n6}ReD+0@eS=Eq8zSrt6{|sLFNp>h1 zccy#~GU2c|RD2;TPI}wm{+J-l#LA8j|D9aGR3+lIu|P^0753uD;juu78ryuqb=dF+ z5)X9X{92_T%N1i0KomVtGhG(*3$#U9*se%1-36d1G#ymxqDDr%!=_ek#4gtX2W)Q6;+(}?F+(Q{&61*kqQpJpeK zsB@xh(N;s!wPL2-Y~Ms_fAQ=wMplA4?yc5<_D)-y5xWr@@+qH`TN8T`js*XS8kBj` z+7;bf6*o=Pfbv1d4DY$e{;CMPc7WRjf*Yny{e)96g_44MsNm&9VZoH?y=dz!W~sN4 z0*`YdUe}%0g}`COhey5(GAG}n-Dfvs_@=G*auYLBIVr>G#8UXE3}2?m+nDm(GlG+c zDH;>{Sz@my+0?9B2`%u$3^)cYL}+_2?2_MZmB8LO@6Gt!ISwkaRRxgX=6bs)ue=m1 zV8YpPp;KGoE5OZ#%7ne)epMHcKYPvhfS3H-n~NYZ3sT?D6->-|@4~o4LK!qTiMPbB z7Qx+#R@OwUa!-wlLOw)NwpJs954xT(}^rFFcOV z1gQSNv-RSge-Hk6`B4@aDv}f)s+3S6@Ol^%-Ue3~i!8Oe=s=Azx?^-SK>>T$akxQ{uNX6pW1x#Cv+~@oZ(+A>Wcg5`g6f3n{vRl zNaT_3iA=G3#d<(fdPf?UB*VR1&zz>ro8LE@FpBKb!1mPd2&hZ%JymfJPv;pI+PAPBe-_h{Z#8 z%Uw)N^^m?M!wwuOs$>Bg0f46;DbLAyM9uj2mD|F^x6cdWF*DY+pf*lo=*=;^Q$44_@vZsr|s^XBV`=3v8Prz z*IIPC4noK1&MU1NBvTY5qOEZ$`le^%3WPPxDPnXewvD9;=^&HMp2Brk?#WotjauUP zvp$Pj$qaN{R-Z0{gm}HW{dH=wTDX0gyD#O366dKV$*519#3l0p^=+~lShnBVI>5Yh5jobUSkQ(8gNRd!PUVOqE zGQzCrP_5uvT0~|!!qe))vP0Eh31+Q)*E$F~-TmoqpKYA0`c7yfFyT+DmQF8w_FC8g zwe=WGIb2iS(#%g@HHNKit6$))^S=3@xF>YSai6#joPg4b%iZ@W-V;?F>|J~$oc5{E zzS*a_%CE;4X3h{BH$V~)3tT~q>qNC3B?_fpr9ucN?!|=I*{%!AZ$A{A>BgZ60fm`) zem$LZ!BB+>Hx~Eih(p_R%W(IMgg+m-;JZbPCg>fXiXij~*g0Q~yi_>ntwG--r5Jr_ zG{$c-ax-0<`Ua$M$>knLhb4k_>eZT%%E7t!(af6;ZW#8xJNIVTF{Z;du@TJ|9ve&Y zdTzDMHFQ~+l3FrbDYk*$sBE88Smg$_=83rABew%Sl`=o0sd;H8fG14k65d;$v#^xinr$Xl=s-SFj=RbufvBmwQ!5pAS%l``>b!_ zKMjI7Y}g2q>`~ro=G0|9@Od5~-iCoxA6JGNy0x~pZ(hqt)in%q?(;0kOMgsL-I5(V zurZE$`=*WswVoa7gUKtw<2DpQzZW9y)XW_K$26osF9R+Y3fISpUTdRE7odgttLbPG zaxRymns#0+NBO`ZYj?9c6nR=8?Az6NTF@c7AyMZw zQvIi=C){7b9S`6dc3?ilr4CX;639L*v*VUb1RL~ruMJoq936z(ObR`|fUUar*ms}_ z;c60S{<^u|a+1p0n)Vp+@S!>}po;P6%fLlmp~@(N1e>4z#akSu6E1O$aYi|XL^i=8 z1G4klVnXm>U*nI1t``rv_P3DA)EMl+&6euOU1NML*oyV$wFx=u;g`_0E)yqU5#yO{ zGB;Kb$Da>unU_rHUSl4+*JcQ~Q166HxIaI(GpxAUnS?WZ1AmJ>xdz(&1t-_xzRTlD z=&~mK>!}=o6_p&|i)Q>cR#YB+z>)sHA`xuaB;IRSwa1R`tEN~pgn;RxJ zD?5;0+7)t$AK5mjmEOSwceb3_LE!AgwYn=|kZ5)gekZ)%tA>)C>L_n|3FmS4tCe;3 z-8Gx#jE?sEXK(w1!BMBNsuTA~MHJ~v2*aG zHf}HJuiCvQRjV~Mv0FFrBeWSgOZ~vo^U=2Yt9Tq?+kq-5t#Hq+eT{xdLF-PmUgPF` zlj?SNl(VilgsNl+p~tS?yO043;DM{$<{hVcB|E1Qy%=M>P@E7<5<-&AL-IrIn2w4? zY#?-=*;Nco)t*nEoKFM7EBp6CS7aw7+8>YbiTsIZn~NHWoaXZOe_|c zNS9twn(PqjtM!QU@td{g)B7TlD@AYzm)Uq6T0D_Hd2qT?+>OMTq3uf4*fg*k3Py1p zJt&|04U3TG`_8B``lW3~+K~4z0$N?wM{@9!gNgmO`EMCd>vlUnJEyKKXvs44+o7_a zEA>nGH|cyK=sB{g&(J!%UgcqBb5g|2Z)GZRX(X7bDM%;6-E&-|w5k2b;U{7$?Yq`CQ=f z2P@1?3>-`(`T;KrE}xKXf+C0_jqI@pML{<6=Um9h;B%J3ek2CugN}X9M>tXxN$+2S zxP@4jxku(Ibla5WAt>Lu=5GBl!?r^J%bVd~qmtFa4^ zg6-K#QozDS%^P8j=WfGKbb?`tF=Z#_d1QLA8+JSirxcphKZ*vt^Qi#O!M}Rv|9aj3 zau|FM#E?Cf{1$*b4PPHyr#_rOmh3IRM6E}@NgCLXh5P~t85aBz?pP__)FEZHZ!hN> z^dXL)V6qqDQ&y-$J|*um=(Wx68mG+(*Y4Q+(>HJ2feJSl3Cc5LNp$j~c$EEZ$mOOI z1M;*8;o$U)il?aZEfv$%rz|ylK>XRRQed0vxE`WZpF5F+I@+azgqngrDEM%QS! z*f$Q-sUC67r;wY`zckk1qtl%?RV+Piu=jn8KV{>!KR;Mm+-#@bB1?jFIQHaOe+$Q{ zN9MZS++D%`3KH~K#Uy>bHu<#$TX!*Mz5Hht>Jt{-5Y`oVUrn|!QlO-KNX-SF<&BJa zr;yuFG_iZ%eBO#J6UV`4{`2TlPOmeHlLd~Zy_w{V&@iFVyXaxhoYg^jvYKnTKdGEW zAAE(DuyFqBuHIU^Ju%=y@m?%2TnmH48Y5~aDx3;dTcgO(u~Y|>5*B$iFXMDslJA-$ z{hj;(oH%`DaQI>3)Th`iYw`owen8+Ur%N^-!~4`XjLsth?B+Qsxckp}PXf9)Ial;B z4sDw9t}ce1TBujRCyyO6Nl}gRi+0Ah{9oNS!rsqeNW}JwXh=#X&E*bCtI z>p~1A`i>V-Vt85~VDjC0mtPBt`uoHh)Z!4{qsBb4_>Y;oa&9mYm{e)?@tw|uInv#r zWT&H*S<@Qf@tlH3WB`+LzT*oX75V@dE!3TrwB4lB`@H!>vUf__3sS}jI^0q2p3r2k z3-c_`#;9(ym3=M2&E_N{gG7mvDf;&ms=c|*(HN^ITxtSXtVVuOw=loD8yrbC<=z33 zDPqAqd&c?uu>QAP%fIn>mMN$@V9BFAJcku$NZRqvVkRjQfkg#|E2}r6W)hvAc{e0b z6l6qc?+KNJqHn1m$p7ebTE6X~c?e^sCZ?EikNfc4F2jpJw=z$;dsFRl(csj=<7=wh z^;U(Z2ZSZq8)3G9WukcE)IQv`QsKrBDdJM1(SnS#NiHbNQW2$regu}Y8-#Z5c-AY3 zPkEs5_289UzE-Y%q@1lz1e=8GkHWq4MAonmx%noSNItAMi`oeBVcElU(UZ1zZ3;sr zJ8s09Bq9VlD6!}9+QzPHNYIz*`t)k!82aQI3~}1ZVd%puui_d^Wyu#(@}=b^RAtNb za%7}0h*(=p_aI)%je_>1lQmJsp~AQ=S13*bWk-1pRS&Y1udU)6g1k||q2s?ee;89gY5j%bn1o>p z4MqYQ!@OmJjU)uO1xbRzxLzT=f_#?$V{a;hA~P8jm4t|MHl8{8c5<^!MRKtodn9n% z!iAwtuWdjP6ES}k9A4-GZ2tjb7&fktoS8uqern9#m_2@K&%xP7(_C4yZI7*3d}BwP zGmjY&${CygNsd3>xwY;M4M>R!v_gYHhG*m$J?78 z>fIWOv`)pAIF~hoqf~_s%<0{R9_Vgf%h6{nBp8BHOL1p3`Fii)sr2e#p7J3^B}j8i z_fu&~S5ap7Dqiv%GF+bV^D7I2HAC_VqOK3qbyajyW3m{-Mp}8E>dsgVrkrAq+4fPs z@OI+xDxgqBxx}VBo;#TkP0CXdm_5D>(ob|(ugkK=cHbM5%*_BC=-e8ZRa}!T)luT# zS8Js0>8UL#`AFmcNE%pv*d2K^P;a8S+|&2KR8%=pvMDFKNr-S#`V4b)Q_;LpwVN)p zu9z&YtsD+_mia@x%nA=;7sz;n%QA z7l({K{fXi;K8Z_5vVGfeQg)0JVs!nz$3FH?5s>{BTy>`tRFYh)64yH!KKHyJ@FYcF zIJ*h*J5S4UJU=%+g9N69lYBFMVBjRhajI3WS1Y=taX>5R*3nh7m1fbIvWi%UTn%?U zrww;Kug!#tjj`}BZ}JSdE(X*#xP2FqC<3R;c3K75ixGM)=vs1`={tt1|Pc)Guydiy%!)6kzsnf1A6&_KOG}f3;Bi!Rq_X- zA>>(vPWV}(CK%GZgS{dHOGvx6KEAfTu=orT@C8S?Mf6PFWY9V_!zZ!33G^RDg>OrKxSzqY!a`6&zR zw@8hcv{uwsz}!p#n4777AGm&ti~RY(Lzt}Uf7Ctd8>o+o^3+gx$k4N>hl9~u-$J)p-)+OIQ%L?ij#0RH>&Bbq!E5!a+N_OAec=sG)N$D`{b z&^ts*a^1IYr2zp;yzsYl8QI(Z!6_nCxsjgf{nS(>R;uo&g^iRQS0Af$H`{|DppjhO zn_4OI3P^~+RT~S0t^O!U?wb?~oW+9I*TVU2VXAl~+!3cHY^p5>VS+BF_-*Z4RZ<0Tu z$uO|}MZRV7or1cI855V5svM1xrG+fkTe?Kr)C7J!Nd*2>E-%~UR4(+^PL<@@L(1?; zW6Kd)y4W`n(cv+ra6=DbQq}=YS=z>v*kDD)tJcPMO_8`5Eu9D6x>Iz%T3{dr#)>!r z$6`ZRw^6f}xHZruk|pISB&>1p+;p6dRgSYD{SxdM+KqmA|q-GEfcj z%2MDNJAy{P!s-@rDxYNFnq+eFw1raX)@gpVD#;vs#@{1LZg~0F@8qwiDkYlvpb!BY|u zmPpdYn7u54Tt+a~o;%+WGS4w|aE>rr6Y=X&PQ?VpIw9E$LG~B5fDF6k+B3WOJ#~>K znAX&&9fa<=_8>>RdEzVG*XOt`B`W$?1P;H zW}dAR#>58>%lN*dV<2ggx;Zp53Dk%C1+pGOG6*H;UU%1EKl{F1IfTSFjn}*gSHGEt2a&@wo&ZE{;k2F0! zMV5|@uI1gCrpP9)%&?ph^kC9Fw5}j=?&}e#g^@&Ye5Tm?&Za<`>}$6*R!LI< ztTYW)^+x*3uwFZRwcS7hr_#l*_j}!(uh;Sw>{YY%&6Up`8MyY8i!xvM)rQw7P0$B2 za+vGL^<{?>Q^mfc9ATdD*Jaa0z6; zHH`2#tlk}@L?jYrF%v)a!91cQ5_HF(l;WW-j6bJ>4;v-u)2HXHg556kKN85if5}YL z>jaep^cngF36(LwgZpM;BZQ}1zAA)tZX;-eq5N(721P$`Iu~rMw7?c)Ha|0Wyc^#U zE(63{hdffo8K*lg83^Gc@bb&5oFWnM`am|-gDGlz+Ym2v(D`NNtw!!Sg6)@Xnq!oR z93wd86caFM52MQ_X3c z*3RzLA$BL%7_KdDDpKl8S(tLTtaX?I)2_Q%@{JCR@|f92-&$b+>>>>`7-R zwe@l(-;v|7lnUPy518&z`%NFTn^4M{MY$Ai!*_Pc)V#>lDaVVYdS@&+*vyrhax2NA z0}9VAm3mD+LJst~oJ0KDzkHKuI|qR9M_0g(;9n`p@#^VYSnCNIS=-pk+G&69|G##> zeF|o>fV3O#=GB%~HHN})arFzrKHM6RJSE%+Fo=;zL1wWm3k?!V)3dtsi>AdMS#Po) zyT@vM;)^a-4Q}%ubKYc6+c@Yzl2mqC^lkJ44<%f`lll1DE%T$^ZS;L|;M-Vh7Pg3IR^HuFy zCdioG7|5{wvy>N$RVqwCQ$D}MJU$4N#3IAzZV8-rLi6XDCR-@h+r?jOHnMabqx%@X zs#I$jQ;{~b0`didSzbO&wD_HBv-FUyN`7mR!!^ls_t|2|eU7`y21eXhK_8#5fF2;0XqXrg zMlFs(-Zl*iW$J`FXD$v_zJx;=_$#O3u-VEl#s~4Y!YJc>;1s&3qxy{t zlGCHHiZ06%5U@L7K4%&jN0yQ4UVH}+3leb+Z=IJ+Y%7w%H4S)CQ)O!Mqp3ctJFanR z6e-j_cUYv{y#EZYx3D$;;U50FqgNuemy+lr6MC966wD{Pb$Sp!qwwUv}xb#u&En$`|e=fhX!^;92#(8bPY?$(KQ?ZK3;BgXC#YFxOuWd)xQ zYO9AY!jP)ux-jc=_d3PAMIP^Ry9NP)nF_ohohrYXk%BztqvShGJqPwuh&&pni!imx#Tz6W^cEL;C(+@g;3$2z9tzv$;z`YwC5~i9pPU^94|GJ}4~pv+`%y$2O9tVka4O2{Gc^tFRE<9J14JB8M;Ze{ zydIcFfkwJ786vM;CGJ_H@9=*eLt>tBCVdN|z5|TW?7xrEvQ9R(dS?H|rjQmrBHF`^ z;y=DnVpdl_XFMyg!pw`z-|L4SiH0si`*z^!kJ43 zcx&RTh`}x#*0D0DHX$5*6iQ5zy``y@o}JPeFw3=IxSWP6&lw@K2qxQ*SA+;L!PQTi zXRw7r?3-9+iGq=VnX&b>p)K5o8ig_e38*4$1tkKU>)9i{o$9OW-IZL($Zage-?8e^ zRDy~rP{CcxDLD>h2Y=~^)#nG3%X}sPoGX-x)BAQn5yfi@NYt#{(7n2>AD@Yx=h)b> ztZuRru58+-#}J_WVlb1GZH~ZpH^5x9te#0D=!G&9-C)iFKRtmI?VFp;5R%u|5Z8bmm)WAO52(>p zI{sBEAetj}dELYP0od}{fFRZ~3&X-#w(%CGJ=F{~6J(NN`bGAn7jVp_DfC;JgBx>DmbJw$Bdnm0UEBli`% zF{>n$GHolg2o&=amBA(?rB^C%O{Ewa$t~Pkflcsx@|MOlOw*l6n2%Zn6@%?*^W#%C z&>!UnIoWF`UV6SQq4no5JT$}3$UrWBM3$&@>GH#BJmqS;4ogamHz$LKQTCSiKxVmA zm4I<^I?6H35?D~p=Q=rA_YA+?Js}`!RdPS~E$bUyC5t!palr^Nw9Kcq)I;=E-sqqN zxmTjQfOLd%Sg=+)7mQrH2in4>1UG%quZGL=UP{$7+|wuj zg1a-XN|!?aUJxm|vv&#W#0$d`7hd~A02!ZVxX}Dja@FXmnLelNdonL7!@*IJO|kg? z+_I#P=O`H$%o$ASnMeg(VOtHB33{01uZy($YT0xAzf$4X@DqMT|Mj&JtcSef0<1QM zq5f!p{Qb51k6Y<~EH(~hrr#nwNUB2S0*Qk4a%$^kQrChZRyvZ))5wr12~28c^ffTNX^Z{Sy8JV;@>nG}l|UV`C?w5c$) zmj;6+PQ=lpB~iKURfHxbp1XBoOSO!TCm7 zPl$5ghBNxMSSYOzte46deITaW$RI@wMMYvbLkdtj9+Z1(%m=;_Paz}{dg6B~-LQC! zw(NR7TJI;L43?VnEldVtxebWpe8n2y+*|ol_2X+-A7VrpT)|-d5liiPRVIEIl z>iJZ(R2-jpgpIshorM!t6s`T~qZ{w`iJE|XNGD4+M@)?}Ab(D%V3BBmv0>=z7RCl~ zX8fcW)|(kNqRi)Gw#1MzD&?Q?$h-crVE)ixAYV)Yzy(hS1Ac=Rzhg)E& zYsv$)Yp>gzhm23BJW9`_@(Bm+CmU-Ztdf?GyIOFdV}uXZ6#qLq-_a% z>Ys#EV3G0A^@H+XZ9Y-q!ONM`5dsYI0)QJIaDP|f2b?zl|5o6yWnlS}0{`|ey8A%D zC?J3g(vXnPgaIZ#0P%m7=K;gR_Y2|KG0(TJ5(08O)FP6CfWz{?76Z;@A^#>FBnP-r zzWwL-E7$AWcJaT(BzPo61O;T}Xe0!mB77?VnCkv>0j9g}7s9i9o@BuHZ<0j+R06PX z`l&?w_Y&VF^Z%(JKsNNJg8RP~{GI{fH)ca`UHu%uzs>^g7vGD2`>6H80W83Nl27^@ z;P13Wf2*B8tx<&PMK~Iu^_GB^^Zx?)txx_5@aeJ+u)uS4;<2+e1nAEi>HH8^e#*Fe zq-0YJU|I&;M87aP0_yMwMv=eU@YgQ$DIRE%^Qs!4uF`NGWa{&!PC0yRCqPN1JoS>V9@)u?)cCDNT6t~WeGTp2(WeN8yVOEB&-2) z?tiYkv>UF`HlRx|0d=SQyW)V)TCZV%w!j~{<>~Vj1|)1S{a+O~KP2eE0>p+`0jl}! z+|u7yt=B#3AJKowqxR<-U$1TjeFEU65diG`e**$OYrRx)|A+}VwP&kkYWioi)lTuC zUO@Zf0AtCoT^j^&ApD{IycQO=-?CL$e#=x3u#^7CQStPtbqNp*^8vcG4(+c@1Ao`G z)+-Sp&-@4I?@vv@QBTM2zoO$$QNz1qKM?^?{Q#&Ge?$JK`Gf$&%pXwydXK+jf2;JL zJK|~j)W4x?y+Q>4i2J=;|JR7|G-=)sylwG6;{EdI|5pmVr@iqsBij#_6Ujfa{PQ63 zG||itIDLixPI%wP%s)+=G0Kos1HRdVGw^D$g|9`G;*;f9#zD+&X ziodk-oAS%k!cTLr{9U}(i&W{i!hgH=e_CQcF_=Duf0|F@2Yj{4Z}30Ce%}z%|Nb_9 z>$j(wD}JD+tNshrf5>C;wEj;s1pHvi)c6-nKL_^!T4(ulzJRAxPX*e4P=#v!6V?Ba zYkvy=RB8MNJdw^n!GC`e|D-$qlYvDd_8>pSd@9lO1Jl{zpD@2akiVe+`r{{u+*6jPT0lQo9Gre*`48If z%0N#spDG^wz})uy9rNGoA3WuGdJ6vsPm}j=JiiYf|LRQsQ_iPnsef=9`2F9Ue;%%$ z#=-u;d`$SiF<<^375lW(PlFDB5PSygK7N|@zs&%@cht|L)Sp}MH00|C!CcyJ1b@#G z|HfGRv?WhNG=308WdBC=+w1yIKewlD?;pr>_yb>|`d{GxZ?oak{(5Tr_(613_uqx#|FVR<6$1lo+`jFv=$`cec2$=3 H-~Rf4?cF@p literal 0 HcmV?d00001 diff --git a/gradle/gradle/wrapper/gradle-wrapper.properties b/gradle/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..1cfebde6 --- /dev/null +++ b/gradle/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Jan 03 10:20:50 EST 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-bin.zip diff --git a/gradle/gradlew b/gradle/gradlew new file mode 100644 index 00000000..91a7e269 --- /dev/null +++ b/gradle/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradle/gradlew.bat b/gradle/gradlew.bat new file mode 100644 index 00000000..8a0b282a --- /dev/null +++ b/gradle/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/api/java/thaumcraft/api/aspects/IEssentiaContainerItem.java b/src/api/java/thaumcraft/api/aspects/IEssentiaContainerItem.java index 6a82c0e6..f92a7de4 100644 --- a/src/api/java/thaumcraft/api/aspects/IEssentiaContainerItem.java +++ b/src/api/java/thaumcraft/api/aspects/IEssentiaContainerItem.java @@ -1,7 +1,6 @@ package thaumcraft.api.aspects; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; /** * diff --git a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index c5b7b13d..003b7ee0 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -139,6 +139,7 @@ import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAnimalGrowth; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAutoAlchemy; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectBiomeChanger; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectContainment; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectCrafting; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectCrushing; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectDemonPortal; import WayofTime.alchemicalWizardry.common.rituals.RitualEffectEllipsoid; @@ -284,7 +285,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.EntityRegistry; import cpw.mods.fml.common.registry.GameRegistry; -@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v1.3.1", guiFactory = "WayofTime.alchemicalWizardry.client.gui.ConfigGuiFactory") +@Mod(modid = "AWWayofTime", name = "AlchemicalWizardry", version = "v1.3.2", guiFactory = "WayofTime.alchemicalWizardry.client.gui.ConfigGuiFactory") public class AlchemicalWizardry { @@ -643,6 +644,8 @@ public class AlchemicalWizardry ItemStack simpleCatalystStack = new ItemStack(ModItems.simpleCatalyst); ItemStack duskRitualDivinerStack = new ItemStack(ModItems.itemRitualDiviner); ((ItemRitualDiviner) duskRitualDivinerStack.getItem()).setMaxRuneDisplacement(duskRitualDivinerStack, 1); + ItemStack dawnRitualDivinerStack = new ItemStack(ModItems.itemRitualDiviner); + ((ItemRitualDiviner) dawnRitualDivinerStack.getItem()).setMaxRuneDisplacement(dawnRitualDivinerStack, 2); waterSigilStackCrafted.setItemDamage(waterSigilStackCrafted.getMaxDamage()); lavaSigilStackCrafted.setItemDamage(lavaSigilStackCrafted.getMaxDamage()); voidSigilStackCrafted.setItemDamage(voidSigilStackCrafted.getMaxDamage()); @@ -731,6 +734,7 @@ public class AlchemicalWizardry customPotionAmphibian = (new PotionAmphibian(customPotionAmphibianID, false, 0).setIconIndex(0, 0).setPotionName("Amphibian")); ItemStack masterBloodOrbStack = new ItemStack(ModItems.masterBloodOrb); + ItemStack transcendentBloodOrbStack = new ItemStack(ModItems.transcendentBloodOrb); // ModBlocks.blockLifeEssence.setUnlocalizedName("lifeEssenceBlock"); FluidContainerRegistry.registerFluidContainer(lifeEssenceFluid, new ItemStack(ModItems.bucketLife), FluidContainerRegistry.EMPTY_BUCKET); @@ -1071,6 +1075,11 @@ public class AlchemicalWizardry GameRegistry.addRecipe(new ItemStack(ModItems.outputRoutingFocus, 1, 3), "sgs", "geg", "sgs", 'e', enderShardStack, 's', stickStack, 'g', obsidianStack); GameRegistry.addRecipe(new ItemStack(ModItems.outputRoutingFocus, 1, 4), "sgs", "geg", "sgs", 'e', enderShardStack, 's', stickStack, 'g', stringStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockStabilityGlyph), "1s1", "grg", "bob", 'o', transcendentBloodOrbStack, 'r', bloodRuneStack, '1', crepitousStack, 'g', etherealSlateStack, 'b', praesidiumStack, 's', magicalesStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockEnchantmentGlyph, 1, 0), "1s1", "grg", "bob", 'o', transcendentBloodOrbStack, 'r', bloodRuneStack, 'g', etherealSlateStack, 'b', magicalesStack, '1', offensaStack, 's', lifeShardStack); + GameRegistry.addRecipe(new ItemStack(ModBlocks.blockEnchantmentGlyph, 1, 1), "1s1", "grg", "bob", 'o', transcendentBloodOrbStack, 'r', bloodRuneStack, 'g', etherealSlateStack, 'b', magicalesStack, '1', virtusStack, 's', soulShardStack); + + GameRegistry.addRecipe(dawnRitualDivinerStack, " d ", "srs", " d ", 'd', new ItemStack(ModItems.dawnScribeTool), 's', etherealSlateStack, 'r', duskRitualDivinerStack); AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.flint, 2, 0), 1, new ItemStack[]{new ItemStack(Blocks.gravel), new ItemStack(Items.flint)}, 1); AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.grass), 2, new ItemStack[]{new ItemStack(Blocks.dirt), new ItemStack(Items.dye, 1, 15), new ItemStack(Items.wheat_seeds), new ItemStack(Items.wheat_seeds)}, 1); @@ -1086,6 +1095,12 @@ public class AlchemicalWizardry AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.soul_sand, 3, 0), 3, new ItemStack[]{new ItemStack(Blocks.sand), new ItemStack(Blocks.sand), new ItemStack(Blocks.sand), waterBucketStack, weakBloodShardStack}, 3); AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.mycelium, 1, 0), 5, new ItemStack[]{new ItemStack(Blocks.grass), new ItemStack(Blocks.brown_mushroom), new ItemStack(Blocks.red_mushroom)}, 2); AlchemyRecipeRegistry.registerRecipe(new ItemStack(Blocks.ice), 2, new ItemStack[]{waterBucketStack, new ItemStack(Items.snowball)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.potionitem, 1, 0), 1, new ItemStack[]{new ItemStack(Items.glass_bottle), new ItemStack(Blocks.cactus)}, 1); + AlchemyRecipeRegistry.registerRecipe(waterBucketStack, 1, new ItemStack[]{emptyBucketStack, new ItemStack(Blocks.cactus)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.glass_bottle, 3), 1, new ItemStack[]{glassStack, glassStack, glassStack}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.ghast_tear, 2), 100, new ItemStack[]{ghastTearStack, concentratedCatalystStack, weakBloodShardStack, new ItemStack(Blocks.soul_sand), new ItemStack(Blocks.soul_sand)}, 5); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.coal, 5), 1, new ItemStack[]{new ItemStack(Items.coal, 1, 1), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.coal, 1, 1), new ItemStack(Items.coal, 1, 1)}, 1); + AlchemyRecipeRegistry.registerRecipe(new ItemStack(Items.clay_ball, 4), 5, new ItemStack[]{new ItemStack(Blocks.sand), waterBucketStack}, 2); } @EventHandler @@ -1115,7 +1130,7 @@ public class AlchemicalWizardry Item itemThaumBoots = GameRegistry.findItem("Thaumcraft", "ItemBootsThaumium"); AspectList aspectList = new AspectList(); - aspectList.add(Aspect.ARMOR, 5).add(Aspect.MAGIC, 5); +// aspectList.add(Aspect.ARMOR, 5).add(Aspect.MAGIC, 5); ThaumcraftApi.registerObjectTag(new ItemStack(ModItems.sanguineHelmet), aspectList); ThaumcraftApi.registerObjectTag(new ItemStack(ModItems.sanguineRobe), aspectList); @@ -1336,6 +1351,7 @@ public class AlchemicalWizardry AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.alchemyFlask), new ItemStack(Items.glass_bottle), 2, 2000, 5, 5, false); AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.reinforcedSlate), new ItemStack(ModItems.blankSlate), 2, 2000, 5, 5, false); AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.bucketLife), new ItemStack(Items.bucket), 1, 1000, 5, 0, false); + AltarRecipeRegistry.registerAltarRecipe(new ItemStack(ModItems.dawnScribeTool), new ItemStack(Blocks.glowstone), 6, 20000, 50, 35, false); } public static void initRituals() @@ -1371,9 +1387,11 @@ public class AlchemicalWizardry Rituals.registerRitual("AW029VeilOfEvil", 1, 150000, new RitualEffectVeilOfEvil(), "Veil of Evil", new AlchemyCircleRenderer(new ResourceLocation("alchemicalwizardry:textures/models/SimpleTransCircle.png"), 0, 0, 0, 255, 0, 0.501, 0.501, 0, 1.5, false)); Rituals.registerRitual("AW030FullStomach", 1, 100000, new RitualEffectFullStomach(), "Requiem of the Satiated Stomach", new AlchemyCircleRenderer(new ResourceLocation("alchemicalwizardry:textures/models/SimpleTransCircle.png"), 0, 0, 0, 255, 0, 0.501, 0.501, 0, 1.5, false)); Rituals.registerRitual("AW031Convocation",isDemonRitualCreativeOnly ? 10 : 2, 15000000, new RitualEffectDemonPortal(), "Convocation of the Damned", new AlchemyCircleRenderer(new ResourceLocation("alchemicalwizardry:textures/models/TransCircleDemon.png"), 220, 22, 22, 255, 0, 0.501, 0.501, 0, 5, false)); - Rituals.registerRitual("AW032", 1, 100, new RitualEffectOmegaTest(), "Symmetry of the Omega"); - Rituals.registerRitual("AW033", 2, 100, new RitualEffectOmegaStalling(), "Omega Stalling"); -// Rituals.registerRitual("AW034", 2, 100, new RitualEffectAlphaPact(), "Alpha Pact"); + Rituals.registerRitual("AW032Symmetry", 2, 15000000, new RitualEffectOmegaTest(), "Symmetry of the Omega"); + Rituals.registerRitual("AW033Stalling", 2, 15000000, new RitualEffectOmegaStalling(), "Duet of the Fused Souls"); + + Rituals.registerRitual("AW034Crafting", 1, 15000, new RitualEffectCrafting(), "Rhythm of the Beating Anvil"); + Rituals.registerRitual("AW035", 1, 10000, new RitualEffectItemRouting(), "Orchestra of the Phantom Hands"); //Rituals.registerRitual(1,100,new RitualEffectApiaryOverclock(),"Apiary Overclock")); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/ModBlocks.java b/src/main/java/WayofTime/alchemicalWizardry/ModBlocks.java index 35ff732d..f451d5ad 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/ModBlocks.java +++ b/src/main/java/WayofTime/alchemicalWizardry/ModBlocks.java @@ -22,6 +22,7 @@ import WayofTime.alchemicalWizardry.common.block.BlockSpellEffect; import WayofTime.alchemicalWizardry.common.block.BlockSpellEnhancement; import WayofTime.alchemicalWizardry.common.block.BlockSpellModifier; import WayofTime.alchemicalWizardry.common.block.BlockSpellParadigm; +import WayofTime.alchemicalWizardry.common.block.BlockStabilityGlyph; import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; import WayofTime.alchemicalWizardry.common.block.BlockWritingTable; import WayofTime.alchemicalWizardry.common.block.BloodRune; @@ -41,10 +42,12 @@ import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.BlockDemonChe import WayofTime.alchemicalWizardry.common.items.ItemBlockCrystalBelljar; import WayofTime.alchemicalWizardry.common.items.ItemBloodRuneBlock; import WayofTime.alchemicalWizardry.common.items.ItemCrystalBlock; +import WayofTime.alchemicalWizardry.common.items.ItemEnchantmentGlyphBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellEffectBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellEnhancementBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellModifierBlock; import WayofTime.alchemicalWizardry.common.items.ItemSpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.items.ItemStabilityGlyphBlock; import cpw.mods.fml.common.registry.GameRegistry; /** @@ -94,6 +97,7 @@ public class ModBlocks public static Block blockCrystal; public static Block blockMimic; public static Block blockEnchantmentGlyph; + public static Block blockStabilityGlyph; public static void init() @@ -136,6 +140,7 @@ public class ModBlocks blockLifeEssence = new LifeEssenceBlock(); blockEnchantmentGlyph = new BlockEnchantmentGlyph(); + blockStabilityGlyph = new BlockStabilityGlyph(); } public static void registerBlocksInPre() @@ -179,7 +184,8 @@ public class ModBlocks GameRegistry.registerBlock(ModBlocks.blockDemonChest, "blockDemonChest"); GameRegistry.registerBlock(ModBlocks.blockCrystal, ItemCrystalBlock.class, "blockCrystal"); GameRegistry.registerBlock(ModBlocks.blockMimic, "blockMimic"); - GameRegistry.registerBlock(ModBlocks.blockEnchantmentGlyph, "blockEnchantmentGlyph"); + GameRegistry.registerBlock(ModBlocks.blockEnchantmentGlyph, ItemEnchantmentGlyphBlock.class, "blockEnchantmentGlyph"); + GameRegistry.registerBlock(ModBlocks.blockStabilityGlyph, ItemStabilityGlyphBlock.class, "blockStabilityGlyph"); } public static void registerBlocksInInit() diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java b/src/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java index 973d293a..a2060b4f 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/soulNetwork/SoulNetworkHandler.java @@ -417,7 +417,7 @@ public class SoulNetworkHandler public static String getUsername(EntityPlayer player) { - return player.getDisplayName(); + return player.getCommandSenderName(); } public static EntityPlayer getPlayerForUsername(String str) diff --git a/src/main/java/WayofTime/alchemicalWizardry/api/spell/APISpellHelper.java b/src/main/java/WayofTime/alchemicalWizardry/api/spell/APISpellHelper.java index bab2963e..19a324c9 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/api/spell/APISpellHelper.java +++ b/src/main/java/WayofTime/alchemicalWizardry/api/spell/APISpellHelper.java @@ -164,6 +164,23 @@ public class APISpellHelper data.setFloat("BM:MaxAddedHP", maxHP); } + public static int getPlayerReagentRegenCooldownTag(EntityPlayer player) + { + NBTTagCompound data = APISpellHelper.getPersistentDataTag(player); + if(data.hasKey("BM:ReagentRegenCooldown")) + { + return data.getInteger("BM:ReagentRegenCooldown"); + } + + return 0; + } + + public static void setPlayerReagentRegenCooldownTag(EntityPlayer player, int amount) + { + NBTTagCompound data = APISpellHelper.getPersistentDataTag(player); + data.setInteger("BM:ReagentRegenCooldown", amount); + } + public static MovingObjectPosition raytraceFromEntity(World world, Entity player, boolean par3, double range) { float f = 1.0F; diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/ClientEventHandler.java b/src/main/java/WayofTime/alchemicalWizardry/client/ClientEventHandler.java index a3e0a531..23984f27 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/client/ClientEventHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/client/ClientEventHandler.java @@ -7,8 +7,6 @@ import net.minecraftforge.client.event.sound.SoundEvent; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModBlocks; import WayofTime.alchemicalWizardry.client.renderer.RenderHelper; -import WayofTime.alchemicalWizardry.common.ClientToServerPacketHandler; -import WayofTime.alchemicalWizardry.common.MessageKeyPressed; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.eventhandler.Event.Result; import cpw.mods.fml.common.eventhandler.SubscribeEvent; @@ -23,12 +21,12 @@ public class ClientEventHandler @SubscribeEvent public void onKeyInput(InputEvent.KeyInputEvent event) { - if(KeyBindings.omegaTest.isPressed()) - { - System.out.println("ping"); -// NewPacketHandler.INSTANCE.sendToServer(NewPacketHandler.getKeyboardPressPacket((byte)2)); - ClientToServerPacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(MessageKeyPressed.Key.OMEGA_ACTIVE)); - } +// if(KeyBindings.omegaTest.isPressed()) +// { +// System.out.println("ping"); +//// NewPacketHandler.INSTANCE.sendToServer(NewPacketHandler.getKeyboardPressPacket((byte)2)); +// ClientToServerPacketHandler.INSTANCE.sendToServer(new MessageKeyPressed(MessageKeyPressed.Key.OMEGA_ACTIVE)); +// } } @SubscribeEvent diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java b/src/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java index c7129aeb..ead88598 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java +++ b/src/main/java/WayofTime/alchemicalWizardry/client/ClientProxy.java @@ -1,5 +1,6 @@ package WayofTime.alchemicalWizardry.client; +import WayofTime.alchemicalWizardry.client.renderer.RitualDivinerRender; import net.minecraft.item.ItemBlock; import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; @@ -110,7 +111,7 @@ public class ClientProxy extends CommonProxy public void registerPostSideObjects() { BUEntries entries = new BUEntries(); - entries.postInit(); +// entries.postInit(); } @Override @@ -146,6 +147,7 @@ public class ClientProxy extends CommonProxy RenderingRegistry.registerEntityRenderingHandler(EntityMinorDemonGruntGuardianEarth.class, new RenderMinorDemonGruntGuardian(new ModelMinorDemonGruntGuardian(), 0.5F)); RenderingRegistry.registerEntityRenderingHandler(EntityMinorDemonGruntGuardianWind.class, new RenderMinorDemonGruntGuardian(new ModelMinorDemonGruntGuardian(), 0.5F)); + MinecraftForge.EVENT_BUS.register(new RitualDivinerRender()); ClientRegistry.bindTileEntitySpecialRenderer(TEAltar.class, new TEAltarRenderer()); ClientRegistry.bindTileEntitySpecialRenderer(TEPedestal.class, new RenderPedestal()); diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/KeyBindings.java b/src/main/java/WayofTime/alchemicalWizardry/client/KeyBindings.java index 26943f9b..b616b662 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/client/KeyBindings.java +++ b/src/main/java/WayofTime/alchemicalWizardry/client/KeyBindings.java @@ -2,18 +2,14 @@ package WayofTime.alchemicalWizardry.client; import net.minecraft.client.settings.KeyBinding; -import org.lwjgl.input.Keyboard; - -import cpw.mods.fml.client.registry.ClientRegistry; - public class KeyBindings { public static KeyBinding omegaTest; public static void init() { - omegaTest = new KeyBinding("key.ping", Keyboard.KEY_O, "key.categories.alchemicalwizardry"); - - ClientRegistry.registerKeyBinding(omegaTest); +// omegaTest = new KeyBinding("key.ping", Keyboard.KEY_O, "key.categories.alchemicalwizardry"); +// +// ClientRegistry.registerKeyBinding(omegaTest); } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBindingRitualHandler.java b/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBindingRitualHandler.java index 7ef876aa..21f2fba8 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBindingRitualHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBindingRitualHandler.java @@ -20,8 +20,7 @@ public class NEIBindingRitualHandler extends TemplateRecipeHandler { public class CachedBindingRecipe extends CachedRecipe { - PositionedStack input; - PositionedStack output; + PositionedStack input, output; public CachedBindingRecipe(BindingRecipe recipe) { @@ -45,7 +44,7 @@ public class NEIBindingRitualHandler extends TemplateRecipeHandler @Override public void loadCraftingRecipes(String outputId, Object... results) { - if (outputId.equals("alchemicalwizardry.binding") && getClass() == NEIBindingRitualHandler.class) + if (outputId.equals("alchemicalwizardry.bindingritual") && getClass() == NEIBindingRitualHandler.class) { for (BindingRecipe recipe : BindingRegistry.bindingRecipes) { @@ -94,13 +93,13 @@ public class NEIBindingRitualHandler extends TemplateRecipeHandler @Override public String getOverlayIdentifier() { - return "bindingritual"; + return "alchemicalwizardry.bindingritual"; } @Override public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(90, 32, 22, 16), "alchemicalwizardry.bindingritual")); + transferRects.add(new RecipeTransferRect(new Rectangle(68, 20, 22, 16), "alchemicalwizardry.bindingritual")); } @Override diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Helper.java b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Helper.java new file mode 100644 index 00000000..1d3bcada --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Helper.java @@ -0,0 +1,17 @@ +package WayofTime.alchemicalWizardry.client.renderer; + +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.rituals.Rituals; + +public class Helper +{ + public static RitualEffect getEffectFromString(String name) + { + Rituals ritual = Rituals.ritualMap.get(name); + + if (ritual == null) + return null; + + return ritual.effect; + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Render.scala b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Render.scala new file mode 100644 index 00000000..aac68267 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Render.scala @@ -0,0 +1,70 @@ +package WayofTime.alchemicalWizardry.client.renderer + +import net.minecraft.block.Block +import net.minecraft.client.renderer.Tessellator +import net.minecraft.world.World + +object Render { + + def drawFakeBlock(v:Vector3, b:Block, meta:Int, min:(Double, Double, Double), w: World): Unit = { + + val (minX, minY, minZ) = min + val (maxX, maxY, maxZ) = (minX + 1, minY + 1, minZ + 1) + + val tessellator = Tessellator.instance + + tessellator.startDrawingQuads() +// tessellator.setBrightness(b.getMixedBrightnessForBlock(w, v.x, v.y, v.z)) + tessellator.setColorRGBA(255, 255, 255, 26) + + var tex: (Float, Float, Float, Float) = null + + def textureMinU = tex._1 + def textureMaxU = tex._2 + def textureMinV = tex._3 + def textureMaxV = tex._4 + + tex = g(b, meta, 0) + tessellator.addVertexWithUV(minX, minY, minZ, textureMinU, textureMinV) + tessellator.addVertexWithUV(maxX, minY, minZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(maxX, minY, maxZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(minX, minY, maxZ, textureMinU, textureMaxV) + + tex = g(b, meta, 1) + tessellator.addVertexWithUV(minX, maxY, maxZ, textureMinU, textureMaxV) + tessellator.addVertexWithUV(maxX, maxY, maxZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(maxX, maxY, minZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(minX, maxY, minZ, textureMinU, textureMinV) + + tex = g(b, meta, 2) + tessellator.addVertexWithUV(maxX, minY, minZ, textureMinU, textureMaxV) + tessellator.addVertexWithUV(minX, minY, minZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(minX, maxY, minZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(maxX, maxY, minZ, textureMinU, textureMinV) + + tex = g(b, meta, 3) + tessellator.addVertexWithUV(minX, minY, maxZ, textureMinU, textureMaxV) + tessellator.addVertexWithUV(maxX, minY, maxZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(maxX, maxY, maxZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(minX, maxY, maxZ, textureMinU, textureMinV) + + tex = g(b, meta, 4) + tessellator.addVertexWithUV(minX, minY, minZ, textureMinU, textureMaxV) + tessellator.addVertexWithUV(minX, minY, maxZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(minX, maxY, maxZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(minX, maxY, minZ, textureMinU, textureMinV) + + tex = g(b, meta, 5) + tessellator.addVertexWithUV(maxX, minY, maxZ, textureMinU, textureMaxV) + tessellator.addVertexWithUV(maxX, minY, minZ, textureMaxU, textureMaxV) + tessellator.addVertexWithUV(maxX, maxY, minZ, textureMaxU, textureMinV) + tessellator.addVertexWithUV(maxX, maxY, maxZ, textureMinU, textureMinV) + + tessellator.draw + } + + def g(b: Block, m: Int, s: Int): (Float, Float, Float, Float) = { + val i = b.getIcon(s, m) + (i.getMinU, i.getMaxU, i.getMinV, i.getMaxV) + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/renderer/RitualDivinerRender.scala b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/RitualDivinerRender.scala new file mode 100644 index 00000000..300bb7ed --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/RitualDivinerRender.scala @@ -0,0 +1,54 @@ +package WayofTime.alchemicalWizardry.client.renderer + +import WayofTime.alchemicalWizardry.ModBlocks +import WayofTime.alchemicalWizardry.api.rituals.{RitualComponent, IMasterRitualStone} +import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import net.minecraft.client.Minecraft +import net.minecraft.client.entity.EntityClientPlayerMP +import net.minecraft.tileentity.TileEntity +import net.minecraft.util.MovingObjectPosition +import net.minecraft.world.World +import net.minecraftforge.client.event.RenderWorldLastEvent + +import scala.collection.JavaConversions + +class RitualDivinerRender { + + @SubscribeEvent + def render(e: RenderWorldLastEvent) + { + val mc: Minecraft = Minecraft.getMinecraft + val p: EntityClientPlayerMP = mc.thePlayer + val w: World = p.worldObj + + if (mc.objectMouseOver == null || mc.objectMouseOver.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) + return + + val te: TileEntity = w.getTileEntity(mc.objectMouseOver.blockX, mc.objectMouseOver.blockY, mc.objectMouseOver.blockZ) + + if (!te.isInstanceOf[IMasterRitualStone]) + return + + val v3 = new Vector3(mc.objectMouseOver.blockX, mc.objectMouseOver.blockY, mc.objectMouseOver.blockZ) + val (px, py, pz) = (p.lastTickPosX + (p.posX - p.lastTickPosX) * e.partialTicks, p.lastTickPosY + (p.posY - p.lastTickPosY) * e.partialTicks, p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * e.partialTicks) + + if (p.inventory.getCurrentItem != null && p.inventory.getCurrentItem.getItem.isInstanceOf[ItemRitualDiviner]) { + val d = p.inventory.getCurrentItem.getItem.asInstanceOf[ItemRitualDiviner] + val dir = d.getDirection(p.inventory.getCurrentItem) + + val r = Helper.getEffectFromString(d.getCurrentRitual(p.inventory.getCurrentItem)) + if (r == null) + return + + for (x <- JavaConversions.asScalaBuffer[RitualComponent](r.getRitualComponentList)) + { + val v: Vector3 = v3 + (x.getX(dir), x.getY, x.getZ(dir)) + val min = (v.x - px, v.y - py, v.z - pz) + + if (!w.getBlock(v.x, v.y, v.z).isOpaqueCube) + Render.drawFakeBlock(v, ModBlocks.ritualStone, x.getStoneType, min, w) + } + } + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Vector3.scala b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Vector3.scala new file mode 100644 index 00000000..8648f4bf --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/client/renderer/Vector3.scala @@ -0,0 +1,24 @@ +package WayofTime.alchemicalWizardry.client.renderer + +class Vector3 (val x: Int, val y: Int, val z: Int) { + + def +(w: (Int,Int,Int)): Vector3 = new Vector3(x + w._1, y+ w._2, z + w._3) + + override def toString = s"V3(${x}},${y}},${z}})" + + def canEqual(other: Any): Boolean = other.isInstanceOf[Vector3] + + override def equals(other: Any): Boolean = other match { + case that: Vector3 => + (that canEqual this) && + x == that.x && + y == that.y && + z == that.z + case _ => false + } + + override def hashCode(): Int = { + val state = Seq(x, y, z) + state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b) + } +} \ No newline at end of file diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java b/src/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java index 20e77f78..3d809346 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/AlchemicalWizardryEventHooks.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -67,6 +68,8 @@ public class AlchemicalWizardryEventHooks public static Map> respawnMap = new HashMap(); public static Map> forceSpawnMap = new HashMap(); + + public static Random rand = new Random(); @SubscribeEvent public void onEntityInteractEvent(EntityInteractEvent event) @@ -106,12 +109,20 @@ public class AlchemicalWizardryEventHooks { EntityPlayer player = (EntityPlayer)event.entityLiving; + if(APISpellHelper.getCurrentAdditionalMaxHP(player) > 0) + { + APISpellHelper.setPlayerReagentRegenCooldownTag(player, 20 * 20); + } + float prevHp = APISpellHelper.getCurrentAdditionalHP((EntityPlayer)event.entityLiving); if(prevHp > 0) { + double originalDamage = event.ammount; + double initialReagentHp = prevHp; + float recalculatedAmount = ArmorProperties.ApplyArmor(player, player.inventory.armorInventory, event.source, event.ammount); if (recalculatedAmount <= 0) return; - recalculatedAmount = SpellHelper.applyPotionDamageCalculations(player, event.source, recalculatedAmount); + recalculatedAmount = SpellHelper.applyPotionDamageCalculations(player, event.source, recalculatedAmount); //Recalculated damage float ratio = recalculatedAmount / event.ammount; @@ -121,37 +132,43 @@ public class AlchemicalWizardryEventHooks if(prevHp > recalculatedAmount) { - float hp = (prevHp - recalculatedAmount); - - if(hp > 0) - { - event.ammount = 0; - }else - { - event.ammount -= hp / ratio; - Reagent reagent = APISpellHelper.getPlayerReagentType(player); - OmegaParadigm paradigm = OmegaRegistry.getParadigmForReagent(reagent); - if(paradigm != null) - { - ItemStack chestStack = player.inventory.armorInventory[2]; + float hp = (prevHp - recalculatedAmount); //New HP - this is obviously > 0... - if(chestStack != null && chestStack.getItem() instanceof OmegaArmour) +// event.setCanceled(true); + event.ammount = 0; + Reagent reagent = APISpellHelper.getPlayerReagentType(player); + OmegaParadigm paradigm = OmegaRegistry.getParadigmForReagent(reagent); + if(paradigm != null) + { + ItemStack chestStack = player.inventory.armorInventory[2]; + + if(chestStack != null && chestStack.getItem() instanceof OmegaArmour) + { + if(((OmegaArmour)chestStack.getItem()).paradigm == paradigm) { - if(((OmegaArmour)chestStack.getItem()).paradigm == paradigm) - { - paradigm.onHPBarDepleted(player, chestStack); - } + paradigm.onHPBarDepleted(player, chestStack); } } } - - APISpellHelper.setCurrentAdditionalHP((EntityPlayer)event.entityLiving, Math.max(0, hp)); - System.out.println("HP: " + hp); - APISpellHelper.setCurrentAdditionalHP(player, Math.max(0, hp)); - NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(Math.max(0, hp), APISpellHelper.getCurrentAdditionalMaxHP(player)), (EntityPlayerMP)player); + APISpellHelper.setCurrentAdditionalHP(player, hp); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(hp, APISpellHelper.getCurrentAdditionalMaxHP(player)), (EntityPlayerMP)player); - } +// if(event.ammount <= 0.3) +// { +// event.ammount++; +// } + }else + { + APISpellHelper.setCurrentAdditionalHP(player, 0); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(0, APISpellHelper.getCurrentAdditionalMaxHP(player)), (EntityPlayerMP)player); + + event.ammount -= prevHp / ratio; + if(event.ammount < 0) + { + event.ammount = 0; + } + } } } } @@ -169,44 +186,85 @@ public class AlchemicalWizardryEventHooks if(reagentAmount > 0 && OmegaRegistry.hasParadigm(reagent)) { + int cooldown = APISpellHelper.getPlayerReagentRegenCooldownTag(player); + boolean canHealHPBar = true; + if(cooldown > 0) + { + float extra = 0; + if(player.isPotionActive(AlchemicalWizardry.customPotionSoulHarden)) + { + extra += 0.25f * (1 + player.getActivePotionEffect(AlchemicalWizardry.customPotionSoulHarden).getAmplifier()); + } + + if(player.isPotionActive(AlchemicalWizardry.customPotionSoulFray)) + { + extra -= 0.25f * (1 + player.getActivePotionEffect(AlchemicalWizardry.customPotionSoulFray).getAmplifier()); + } + + int deduction = - 1 - (extra >= 0 ? (rand.nextFloat() < extra ? 1 : 0) : (rand.nextFloat() < -extra/2 ? -1 : 0)); + + APISpellHelper.setPlayerReagentRegenCooldownTag(player, Math.max(cooldown + deduction, 0)); + canHealHPBar = false; + } + OmegaParadigm parad = OmegaRegistry.getParadigmForReagent(reagent); ReagentRegenConfiguration config = parad.getRegenConfig(player); if(parad.isPlayerWearingFullSet(player)) { - if(event.entityLiving.worldObj.getWorldTime() % config.tickRate == 0) + if(canHealHPBar) { - boolean hasHealthChanged = false; - int maxHealth = parad.getMaxAdditionalHealth(); + int tickRate = config.tickRate; - float health = APISpellHelper.getCurrentAdditionalHP(player); - - if(health > maxHealth) + if(player.isPotionActive(Potion.regeneration)) { - health = maxHealth; - hasHealthChanged = true; - }else if(health < maxHealth) - { - float addedAmount = Math.min(Math.min((reagentAmount / config.costPerPoint), config.healPerTick), maxHealth - health); - float drain = addedAmount * config.costPerPoint; - - reagentAmount -= drain; - hasReagentChanged = true; - - health += addedAmount; - - hasHealthChanged = true; + int i = player.getActivePotionEffect(Potion.regeneration).getAmplifier(); + double factor = Math.pow(1.5, i+1); + tickRate = Math.max((int)(tickRate / factor), 1); } - if(player instanceof EntityPlayerMP) + if(event.entityLiving.worldObj.getWorldTime() % tickRate == 0) { - if(hasHealthChanged) + boolean hasHealthChanged = false; + int maxHealth = parad.getMaxAdditionalHealth(); + + float health = APISpellHelper.getCurrentAdditionalHP(player); + + if(health > maxHealth) { - APISpellHelper.setCurrentAdditionalHP(player, health); - NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(health, maxHealth), (EntityPlayerMP)player); + health = maxHealth; + hasHealthChanged = true; + }else if(health < maxHealth) + { + float addedAmount = Math.min(Math.min((reagentAmount / config.costPerPoint), config.healPerTick), maxHealth - health); + float drain = addedAmount * config.costPerPoint; + + reagentAmount -= drain; + hasReagentChanged = true; + + health += addedAmount; + + hasHealthChanged = true; + } + + if(player instanceof EntityPlayerMP) + { + if(hasHealthChanged) + { + APISpellHelper.setCurrentAdditionalHP(player, health); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(health, maxHealth), (EntityPlayerMP)player); + } } } } + + }else + { + reagentAmount = 0; + APISpellHelper.setPlayerMaxReagentAmount(player, 0); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getReagentBarPacket(null, 0, 0), (EntityPlayerMP)player); + APISpellHelper.setCurrentAdditionalHP(player, 0); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(0, 0), (EntityPlayerMP)player); } //Consumes the amount float costPerTick = parad.getCostPerTickOfUse(player); @@ -229,14 +287,22 @@ public class AlchemicalWizardryEventHooks if(reagentAmount <= 0) { + boolean hasRevertedArmour = false; ItemStack[] armourInventory = player.inventory.armorInventory; for(ItemStack stack : armourInventory) { if(stack != null && stack.getItem() instanceof OmegaArmour) { ((OmegaArmour)stack.getItem()).revertArmour(player, stack); + hasRevertedArmour = true; } } + + if(hasRevertedArmour) + { + APISpellHelper.setCurrentAdditionalHP(player, 0); + NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getAddedHPPacket(0, 0), (EntityPlayerMP)player); + } } if(player instanceof EntityPlayerMP) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/ItemType.java b/src/main/java/WayofTime/alchemicalWizardry/common/ItemType.java new file mode 100644 index 00000000..912742c4 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/ItemType.java @@ -0,0 +1,87 @@ +package WayofTime.alchemicalWizardry.common; + +import java.util.Objects; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Represents an item together with metadata and NBT tag. + * + * @author ljfa-ag + */ +public class ItemType +{ + public final Item item; + public final int meta; + public final NBTTagCompound nbtTag; + + public ItemType(Item item, int meta, NBTTagCompound nbtTag) + { + this.item = Objects.requireNonNull(item); + this.meta = meta; + this.nbtTag = nbtTag; + } + + public ItemType(Item item, int meta) + { + this(item, meta, null); + } + + public ItemType(Item item) + { + this(item, 0, null); + } + + public ItemType(Block block, int meta, NBTTagCompound nbtTag) + { + this(Item.getItemFromBlock(block), meta, nbtTag); + } + + public ItemType(Block block, int meta) + { + this(block, meta, null); + } + + public ItemType(Block block) + { + this(block, 0, null); + } + + public ItemStack createStack(int count) + { + ItemStack result = new ItemStack(item, count, meta); + result.stackTagCompound = nbtTag; + return result; + } + + @Override + public boolean equals(Object obj) + { + if (this == obj) + return true; + if (obj == null || getClass() != obj.getClass()) + return false; + ItemType other = (ItemType) obj; + return item == other.item && meta == other.meta && Objects.equals(nbtTag, other.nbtTag); + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + item.hashCode(); + result = prime * result + meta; + result = prime * result + ((nbtTag == null) ? 0 : nbtTag.hashCode()); + return result; + } + + public static ItemType fromStack(ItemStack stack) + { + return new ItemType(stack.getItem(), stack.getItemDamage(), stack.stackTagCompound); + } + +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementTrigger.java b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementTrigger.java index 8e5ad2c0..836660fa 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementTrigger.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementTrigger.java @@ -2,6 +2,7 @@ package WayofTime.alchemicalWizardry.common.achievements; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.stats.Achievement; @@ -12,6 +13,11 @@ public class AchievementTrigger { ItemStack stack = event.pickedUp.getEntityItem(); + for (Item item : AchievementsRegistry.list) + { + + } + if (stack != null && stack.getItem() instanceof IPickupAchievement) { Achievement achievement = ((IPickupAchievement) stack.getItem()).getAchievementOnPickup(stack, event.player, event.pickedUp); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementsRegistry.java b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementsRegistry.java new file mode 100644 index 00000000..e07683fc --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/AchievementsRegistry.java @@ -0,0 +1,17 @@ +package WayofTime.alchemicalWizardry.common.achievements; + +import WayofTime.alchemicalWizardry.ModItems; +import net.minecraft.item.Item; + +import java.util.ArrayList; +import java.util.List; + +public class AchievementsRegistry +{ + public static List list = new ArrayList(); + + public void addItemsToList() + { + list.add(ModItems.sacrificialDagger); + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/ICraftAchievement.java b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/ICraftAchievement.java index 7e941c8d..47006462 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/ICraftAchievement.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/ICraftAchievement.java @@ -7,5 +7,5 @@ import net.minecraft.stats.Achievement; public interface ICraftAchievement { - public Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix); + Achievement getAchievementOnCraft(ItemStack stack, EntityPlayer player, IInventory matrix); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/IPickupAchievement.java b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/IPickupAchievement.java index 10b3fda3..3d2a7351 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/achievements/IPickupAchievement.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/achievements/IPickupAchievement.java @@ -7,5 +7,5 @@ import net.minecraft.stats.Achievement; public interface IPickupAchievement { - public Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item); + Achievement getAchievementOnPickup(ItemStack stack, EntityPlayer player, EntityItem item); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockEnchantmentGlyph.java b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockEnchantmentGlyph.java index b0b02ab5..561b7a29 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockEnchantmentGlyph.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockEnchantmentGlyph.java @@ -1,8 +1,14 @@ package WayofTime.alchemicalWizardry.common.block; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.omega.IEnchantmentGlyph; @@ -11,13 +17,16 @@ import cpw.mods.fml.relauncher.SideOnly; public class BlockEnchantmentGlyph extends Block implements IEnchantmentGlyph { + public IIcon enchantability; + public IIcon enchantmentLevel; + public BlockEnchantmentGlyph() { super(Material.iron); setHardness(2.0F); setResistance(5.0F); setCreativeTab(AlchemicalWizardry.tabBloodMagic); - this.setBlockName("enchantmentGlypg"); + this.setBlockName("enchantmentGlyph"); } @Override @@ -25,17 +34,75 @@ public class BlockEnchantmentGlyph extends Block implements IEnchantmentGlyph public void registerBlockIcons(IIconRegister iconRegister) { this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:LargeBloodStoneBrick"); + this.enchantability = iconRegister.registerIcon("AlchemicalWizardry:GlyphEnchantability"); + this.enchantmentLevel = iconRegister.registerIcon("AlchemicalWizardry:GlyphEnchantmentLevel"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (meta) + { + case 0: + return enchantability; + case 1: + return enchantmentLevel; + default: + return this.blockIcon; + } } @Override - public int getSubtractedStabilityForFaceCount(World world, int x, int y, int z, int meta, int faceCount) + public int getAdditionalStabilityForFaceCount(World world, int x, int y, int z, int meta, int faceCount) { - return faceCount * 20; + switch(meta) + { + case 0: + return -faceCount * 10; + case 1: + return -faceCount * 20; + default: + return -faceCount * 20; + } } @Override public int getEnchantability(World world, int x, int y, int z, int meta) { - return 1; + switch(meta) + { + case 0: + return 1; + default: + return 0; + } } + + @Override + public int getEnchantmentLevel(World world, int x, int y, int z, int meta) + { + switch(meta) + { + case 1: + return 1; + default: + return 0; + } + } + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + for(int i=0; i<2; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } + + @Override + public int damageDropped(int metadata) + { + return metadata; + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java index 5350fa63..16ac3581 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockOrientable.java @@ -83,123 +83,9 @@ public class BlockOrientable extends BlockContainer return true; } - public int getTextureIndexForSideAndOrientation(int side, ForgeDirection input, ForgeDirection output) - { - if (ForgeDirection.getOrientation(side) == input) - { - return 0; - } - if (ForgeDirection.getOrientation(side) == output) - { - return 1; - } - if (ForgeDirection.getOrientation(side) == output.getOpposite()) - { - return 6; - } - - switch (side) - { - case 0: //BOTTOM - switch (output) - { - case NORTH: - return 2; //UP - case SOUTH: - return 3; //DOWN - case EAST: - return 4; //LEFT - case WEST: - return 5; //RIGHT - default: - break; - } - break; - case 1: //TOP - switch (output) - { - case NORTH: - return 2; //UP - case SOUTH: - return 3; //DOWN - case EAST: - return 5; - case WEST: - return 4; - default: - break; - } - break; - case 2: //NORTH - switch (output) - { - case DOWN: - return 3; - case UP: - return 2; - case EAST: - return 4; - case WEST: - return 5; - default: - break; - } - break; - case 3: //SOUTH - switch (output) - { - case DOWN: - return 3; - case UP: - return 2; - case EAST: - return 5; - case WEST: - return 4; - default: - break; - } - break; - case 4: //WEST - switch (output) - { - case DOWN: - return 3; - case UP: - return 2; - case NORTH: - return 5; - case SOUTH: - return 4; - default: - break; - } - break; - case 5: //EAST - switch (output) - { - case DOWN: - return 3; - case UP: - return 2; - case NORTH: - return 4; - case SOUTH: - return 5; - default: - break; - } - break; - } - - return 0; - } - @Override public int damageDropped(int metadata) { return metadata; } - - } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockReagentConduit.java b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockReagentConduit.java index fb5ffeec..16c151f3 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockReagentConduit.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockReagentConduit.java @@ -9,6 +9,7 @@ import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; public class BlockReagentConduit extends BlockContainer @@ -64,4 +65,10 @@ public class BlockReagentConduit extends BlockContainer { return -1; } + + @Override + public AxisAlignedBB getCollisionBoundingBoxFromPool(World p_149668_1_, int p_149668_2_, int p_149668_3_, int p_149668_4_) + { + return null; + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockStabilityGlyph.java b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockStabilityGlyph.java new file mode 100644 index 00000000..dd7b8048 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/block/BlockStabilityGlyph.java @@ -0,0 +1,73 @@ +package WayofTime.alchemicalWizardry.common.block; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.common.omega.IStabilityGlyph; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class BlockStabilityGlyph extends Block implements IStabilityGlyph +{ + public IIcon stability1; + + public BlockStabilityGlyph() + { + super(Material.iron); + setHardness(2.0F); + setResistance(5.0F); + setCreativeTab(AlchemicalWizardry.tabBloodMagic); + this.setBlockName("stabilityGlyph"); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) + { + this.blockIcon = iconRegister.registerIcon("AlchemicalWizardry:LargeBloodStoneBrick"); + this.stability1 = iconRegister.registerIcon("AlchemicalWizardry:GlyphStability1"); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta) + { + switch (meta) + { + case 0: + return stability1; + default: + return this.blockIcon; + } + } + + @Override + public int getAdditionalStabilityForFaceCount(World world, int x, int y, int z, int meta, int faceCount) + { + switch(meta) + { + case 0: + return faceCount * 2; + default: + return faceCount; + } + } + + + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item par1, CreativeTabs par2CreativeTabs, List par3List) + { + for(int i=0; i<1; i++) + { + par3List.add(new ItemStack(par1, 1, i)); + } + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java b/src/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java index f36c0b3c..23d0845b 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/bloodAltarUpgrade/UpgradedAltars.java @@ -303,7 +303,7 @@ public class UpgradedAltars fifthTierAltar.addAll(fourthTierAltar); fifthTierAltar.add(new AltarComponent(-8, -3, 8, Blocks.beacon, 0, false, false)); fifthTierAltar.add(new AltarComponent(-8, -3, -8, Blocks.beacon, 0, false, false)); - fifthTierAltar.add(new AltarComponent(8, -3, 8, Blocks.beacon, 0, false, false)); + fifthTierAltar.add(new AltarComponent(8, -3, -8, Blocks.beacon, 0, false, false)); fifthTierAltar.add(new AltarComponent(8, -3, 8, Blocks.beacon, 0, false, false)); for (int i = -6; i <= 6; i++) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandBind.java b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandBind.java index 6a2c5a1f..c97515a8 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandBind.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandBind.java @@ -1,16 +1,15 @@ package WayofTime.alchemicalWizardry.common.commands; -import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; -import WayofTime.alchemicalWizardry.common.items.EnergyItems; +import java.util.List; + import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; - -import java.util.List; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; public class CommandBind extends CommandBase { @@ -39,7 +38,7 @@ public class CommandBind extends CommandBase if (targetPlayer == null) { - throw new CommandException("commands.bind.failed.noPlayer", new Object[0]); + throw new CommandException("commands.bind.failed.noPlayer"); } if (item != null && item.getItem() instanceof IBindable) @@ -47,16 +46,16 @@ public class CommandBind extends CommandBase if (EnergyItems.getOwnerName(item).isEmpty()) { EnergyItems.checkAndSetItemOwner(item, targetPlayer); - func_152373_a(iCommandSender, this, "commands.bind.success", new Object[0]); + func_152373_a(iCommandSender, this, "commands.bind.success"); } else { - throw new CommandException("commands.bind.failed.alreadyBound", new Object[0]); + throw new CommandException("commands.bind.failed.alreadyBound"); } } else if (!(item.getItem() instanceof IBindable)) { - throw new CommandException("commands.bind.failed.notBindable", new Object[0]); + throw new CommandException("commands.bind.failed.notBindable"); } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandSN.java b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandSN.java index ac89f1bf..72fa59d7 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandSN.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandSN.java @@ -1,11 +1,13 @@ package WayofTime.alchemicalWizardry.common.commands; +import WayofTime.alchemicalWizardry.api.soulNetwork.LifeEssenceNetwork; import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; +import net.minecraft.world.World; import java.util.List; @@ -40,7 +42,7 @@ public class CommandSN extends CommandBase int amount = parseIntBounded(icommandsender, astring[2], Integer.MIN_VALUE, Integer.MAX_VALUE); SoulNetworkHandler.addCurrentEssenceToMaximum(owner, amount, Integer.MAX_VALUE); - func_152373_a(icommandsender, this, "commands.soulnetwork.add.success", new Object[] {amount, owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.add.success", amount, owner); } else if ("subtract".equalsIgnoreCase(astring[1])) { @@ -50,42 +52,42 @@ public class CommandSN extends CommandBase { int lp = SoulNetworkHandler.getCurrentEssence(owner); SoulNetworkHandler.syphonFromNetwork(owner, lp); - func_152373_a(icommandsender, this, "commands.soulnetwork.subtract.success", new Object[] {SoulNetworkHandler.getCurrentEssence(owner), owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.subtract.success", SoulNetworkHandler.getCurrentEssence(owner), owner); } else { SoulNetworkHandler.syphonFromNetwork(owner, amount); - func_152373_a(icommandsender, this, "commands.soulnetwork.subtract.success", new Object[] {amount, owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.subtract.success", amount, owner); } } else if ("fill".equalsIgnoreCase(astring[1])) { int amount = Integer.MAX_VALUE - SoulNetworkHandler.getCurrentEssence(owner); SoulNetworkHandler.addCurrentEssenceToMaximum(owner, amount, Integer.MAX_VALUE); - func_152373_a(icommandsender, this, "commands.soulnetwork.fill.success", new Object[] {owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.fill.success", owner); } else if ("empty".equalsIgnoreCase(astring[1])) { SoulNetworkHandler.syphonFromNetwork(owner, SoulNetworkHandler.getCurrentEssence(owner)); - func_152373_a(icommandsender, this, "commands.soulnetwork.empty.success", new Object[] {owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.empty.success", owner); } else if ("get".equalsIgnoreCase(astring[1])) { int amount = SoulNetworkHandler.getCurrentEssence(owner); - func_152373_a(icommandsender, this, "commands.soulnetwork.get.success", new Object[] {amount, owner}); + func_152373_a(icommandsender, this, "commands.soulnetwork.get.success", amount, owner); } else { - throw new CommandException("commands.soulnetwork.notACommand", new Object[0]); + throw new CommandException("commands.soulnetwork.notACommand"); } } else if (astring.length == 0) { - throw new CommandException("commands.soulnetwork.noPlayer", new Object[0]); + throw new CommandException("commands.soulnetwork.noPlayer"); } else if (astring.length == 1) { - throw new CommandException("commands.soulnetwork.noCommand", new Object[0]); + throw new CommandException("commands.soulnetwork.noCommand"); } } @@ -97,7 +99,7 @@ public class CommandSN extends CommandBase } else if (astring.length == 2) { - return getListOfStringsMatchingLastWord(astring, new String[] {"add", "subtract", "fill", "empty"}); + return getListOfStringsMatchingLastWord(astring, "add", "subtract", "fill", "empty"); } return null; diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandUnbind.java b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandUnbind.java index 26a2cd71..3a1cc09a 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandUnbind.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/commands/CommandUnbind.java @@ -36,17 +36,17 @@ public class CommandUnbind extends CommandBase { if (!EnergyItems.getOwnerName(item).isEmpty()) { - item.getTagCompound().setString("ownerName", ""); - func_152373_a(iCommandSender, this, "commands.unbind.success", new Object[0]); + item.getTagCompound().removeTag("ownerName"); + func_152373_a(iCommandSender, this, "commands.unbind.success"); } else { - throw new CommandException("commands.unbind.failed.notBindable", new Object[0]); + throw new CommandException("commands.unbind.failed.notBindable"); } } else if (!(item.getItem() instanceof IBindable)) { - throw new CommandException("commands.unbind.failed.notBindable", new Object[0]); + throw new CommandException("commands.unbind.failed.notBindable"); } } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java index c4077953..77596f93 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundAxe.java @@ -1,17 +1,14 @@ package WayofTime.alchemicalWizardry.common.items; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.block.BlockLeavesBase; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; @@ -21,9 +18,15 @@ import net.minecraft.util.StatCollector; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.ItemType; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import java.util.ArrayList; -import java.util.List; +import com.google.common.collect.HashMultiset; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BoundAxe extends ItemAxe implements IBindable { @@ -112,6 +115,11 @@ public class BoundAxe extends ItemAxe implements IBindable par1ItemStack.getTagCompound().setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); return par1ItemStack; } + + if (par2World.isRemote) + { + return par1ItemStack; + } if (!getActivated(par1ItemStack) || SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { @@ -135,6 +143,8 @@ public class BoundAxe extends ItemAxe implements IBindable boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(par3EntityPlayer); int fortuneLvl = EnchantmentHelper.getFortuneModifier(par3EntityPlayer); + HashMultiset dropMultiset = HashMultiset.create(); + for (int i = -5; i <= 5; i++) { for (int j = 0; j <= 10; j++) @@ -152,27 +162,18 @@ public class BoundAxe extends ItemAxe implements IBindable { if (silkTouch && block.canSilkHarvest(par2World, par3EntityPlayer, posX + i, posY + j, posZ + k, meta)) { - ItemStack droppedItem = new ItemStack(block, 1, meta); - - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); - } + dropMultiset.add(new ItemType(block, meta)); } else { ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); if (itemDropList != null) { - for (ItemStack item : itemDropList) - { - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); - } - } + for (ItemStack stack : itemDropList) + dropMultiset.add(ItemType.fromStack(stack), stack.stackSize); } } + par2World.setBlockToAir(posX + i, posY + j, posZ + k); } } @@ -180,7 +181,8 @@ public class BoundAxe extends ItemAxe implements IBindable } } - + BoundPickaxe.dropMultisetStacks(dropMultiset, par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ); + return par1ItemStack; } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java index 9b7c7f93..300ab966 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundPickaxe.java @@ -1,10 +1,8 @@ package WayofTime.alchemicalWizardry.common.items; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.EnchantmentHelper; @@ -20,9 +18,16 @@ import net.minecraft.util.StatCollector; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.ItemType; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import java.util.ArrayList; -import java.util.List; +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Multiset; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BoundPickaxe extends ItemPickaxe implements IBindable { @@ -114,6 +119,11 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable par1ItemStack.getTagCompound().setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); return par1ItemStack; } + + if (par2World.isRemote) + { + return par1ItemStack; + } if (!getActivated(par1ItemStack) || SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { @@ -124,11 +134,6 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable { return par1ItemStack; } - - if (par2World.isRemote) - { - return par1ItemStack; - } if(!EnergyItems.syphonBatteries(par1ItemStack, par3EntityPlayer, 10000)) { @@ -142,6 +147,8 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(par3EntityPlayer); int fortuneLvl = EnchantmentHelper.getFortuneModifier(par3EntityPlayer); + HashMultiset dropMultiset = HashMultiset.create(); + for (int i = -5; i <= 5; i++) { for (int j = -5; j <= 5; j++) @@ -159,25 +166,15 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable { if (silkTouch && block.canSilkHarvest(par2World, par3EntityPlayer, posX + i, posY + j, posZ + k, meta)) { - ItemStack droppedItem = new ItemStack(block, 1, meta); - - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); - } + dropMultiset.add(new ItemType(block, meta)); } else { ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); if (itemDropList != null) { - for (ItemStack item : itemDropList) - { - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); - } - } + for (ItemStack stack : itemDropList) + dropMultiset.add(ItemType.fromStack(stack), stack.stackSize); } } @@ -187,9 +184,31 @@ public class BoundPickaxe extends ItemPickaxe implements IBindable } } } - + + dropMultisetStacks(dropMultiset, par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ); + return par1ItemStack; } + + public static void dropMultisetStacks(Multiset dropMultiset, World world, double x, double y, double z) + { + for (Multiset.Entry entry : dropMultiset.entrySet()) + { + int count = entry.getCount(); + ItemType type = entry.getElement(); + int maxStackSize = type.item.getItemStackLimit(type.createStack(1)); + + //Drop in groups of maximum size + while (count >= maxStackSize) + { + world.spawnEntityInWorld(new EntityItem(world, x, y, z, type.createStack(maxStackSize))); + count -= maxStackSize; + } + //Drop remainder + if (count > 0) + world.spawnEntityInWorld(new EntityItem(world, x, y, z, type.createStack(count))); + } + } @Override public void onUpdate(ItemStack par1ItemStack, World par2World, Entity par3Entity, int par4, boolean par5) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java index 82969790..1364d64e 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/BoundShovel.java @@ -1,13 +1,8 @@ package WayofTime.alchemicalWizardry.common.items; -import WayofTime.alchemicalWizardry.AlchemicalWizardry; -import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; +import java.util.ArrayList; +import java.util.List; -import com.google.common.collect.Multimap; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.EnchantmentHelper; @@ -15,7 +10,6 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemStack; @@ -25,9 +19,16 @@ import net.minecraft.util.StatCollector; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.items.interfaces.IBindable; +import WayofTime.alchemicalWizardry.common.ItemType; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; -import java.util.ArrayList; -import java.util.List; +import com.google.common.collect.HashMultiset; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class BoundShovel extends ItemSpade implements IBindable { @@ -118,6 +119,11 @@ public class BoundShovel extends ItemSpade implements IBindable par1ItemStack.getTagCompound().setInteger("worldTimeDelay", (int) (par2World.getWorldTime() - 1) % 200); return par1ItemStack; } + + if (par2World.isRemote) + { + return par1ItemStack; + } if (!getActivated(par1ItemStack) || SpellHelper.isFakePlayer(par2World, par3EntityPlayer)) { @@ -141,6 +147,8 @@ public class BoundShovel extends ItemSpade implements IBindable boolean silkTouch = EnchantmentHelper.getSilkTouchModifier(par3EntityPlayer); int fortuneLvl = EnchantmentHelper.getFortuneModifier(par3EntityPlayer); + HashMultiset dropMultiset = HashMultiset.create(); + for (int i = -5; i <= 5; i++) { for (int j = 0; j <= 10; j++) @@ -158,25 +166,15 @@ public class BoundShovel extends ItemSpade implements IBindable { if (silkTouch && block.canSilkHarvest(par2World, par3EntityPlayer, posX + i, posY + j, posZ + k, meta)) { - ItemStack droppedItem = new ItemStack(block, 1, meta); - - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, droppedItem)); - } + dropMultiset.add(new ItemType(block, meta)); } else { ArrayList itemDropList = block.getDrops(par2World, posX + i, posY + j, posZ + k, meta, fortuneLvl); if (itemDropList != null) { - for (ItemStack item : itemDropList) - { - if (!par2World.isRemote) - { - par2World.spawnEntityInWorld(new EntityItem(par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ, item)); - } - } + for (ItemStack stack : itemDropList) + dropMultiset.add(ItemType.fromStack(stack), stack.stackSize); } } @@ -186,6 +184,8 @@ public class BoundShovel extends ItemSpade implements IBindable } } } + + BoundPickaxe.dropMultisetStacks(dropMultiset, par2World, posX, posY + par3EntityPlayer.getEyeHeight(), posZ); return par1ItemStack; } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java index f4b38f3d..c5a8cb5f 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/DaggerOfSacrifice.java @@ -8,8 +8,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; -import net.minecraft.entity.boss.EntityDragon; -import net.minecraft.entity.boss.EntityWither; import net.minecraft.entity.boss.IBossDisplayData; import net.minecraft.entity.monster.EntityEnderman; import net.minecraft.entity.monster.EntitySlime; diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemEnchantmentGlyphBlock.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemEnchantmentGlyphBlock.java new file mode 100644 index 00000000..a50bc6c3 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemEnchantmentGlyphBlock.java @@ -0,0 +1,42 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemEnchantmentGlyphBlock extends ItemBlock +{ + public ItemEnchantmentGlyphBlock(Block block) + { + super(block); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack itemstack) + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + name = "enchantability"; + break; + + case 1: + name = "enchantmentLevel"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + @Override + public int getMetadata(int par1) + { + return par1; + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java index 3b00b926..073eeeb0 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemRitualDiviner.java @@ -21,7 +21,6 @@ import org.lwjgl.input.Keyboard; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.ModBlocks; -import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.api.items.interfaces.IRitualDiviner; import WayofTime.alchemicalWizardry.api.rituals.IRitualStone; import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; @@ -59,7 +58,11 @@ public class ItemRitualDiviner extends EnergyItems implements IRitualDiviner if (this.getMaxRuneDisplacement(par1ItemStack) == 1) { par3List.add(StatCollector.translateToLocal("tooltip.ritualdiviner.canplace")); - } else + }else if (this.getMaxRuneDisplacement(par1ItemStack) >= 2) + { + par3List.add(StatCollector.translateToLocal("tooltip.ritualdiviner.canplacedawn")); + + }else { par3List.add(StatCollector.translateToLocal("tooltip.ritualdiviner.cannotplace")); } @@ -124,13 +127,16 @@ public class ItemRitualDiviner extends EnergyItems implements IRitualDiviner } } - par3List.add(StatCollector.translateToLocal("tooltip.ritualdiviner.blankstones") + " " + blankStones); + int totalStones = blankStones + airStones + waterStones + fireStones + earthStones + duskStones + dawnStones; + + par3List.add(EnumChatFormatting.WHITE + StatCollector.translateToLocal("tooltip.ritualdiviner.blankstones") + " " + blankStones); par3List.add(EnumChatFormatting.AQUA + StatCollector.translateToLocal("tooltip.ritualdiviner.airstones") + " " + airStones); par3List.add(EnumChatFormatting.BLUE + StatCollector.translateToLocal("tooltip.ritualdiviner.waterstones") + " " + waterStones); par3List.add(EnumChatFormatting.RED + StatCollector.translateToLocal("tooltip.ritualdiviner.firestones") + " " + fireStones); par3List.add(EnumChatFormatting.DARK_GREEN + StatCollector.translateToLocal("tooltip.ritualdiviner.earthstones") + " " + earthStones); - par3List.add(EnumChatFormatting.BOLD + StatCollector.translateToLocal("tooltip.ritualdiviner.duskstones") + " " + duskStones); + par3List.add(EnumChatFormatting.DARK_PURPLE + StatCollector.translateToLocal("tooltip.ritualdiviner.duskstones") + " " + duskStones); par3List.add(EnumChatFormatting.GOLD + StatCollector.translateToLocal("tooltip.ritualdiviner.dawnstones") + " " + dawnStones); + par3List.add(EnumChatFormatting.UNDERLINE + StatCollector.translateToLocal("tooltip.ritualdiviner.totalStones") + " " + totalStones); } }else { @@ -358,10 +364,15 @@ public class ItemRitualDiviner extends EnergyItems implements IRitualDiviner @SideOnly(Side.CLIENT) public void getSubItems(Item id, CreativeTabs creativeTab, List list) { - list.add(new ItemStack(ModItems.itemRitualDiviner)); - ItemStack duskRitualDivinerStack = new ItemStack(ModItems.itemRitualDiviner); - ((ItemRitualDiviner) duskRitualDivinerStack.getItem()).setMaxRuneDisplacement(duskRitualDivinerStack, 1); + list.add(new ItemStack(id)); + + ItemStack duskRitualDivinerStack = new ItemStack(id); + this.setMaxRuneDisplacement(duskRitualDivinerStack, 1); list.add(duskRitualDivinerStack); + + ItemStack dawnRitualDivinerStack = new ItemStack(id); + this.setMaxRuneDisplacement(dawnRitualDivinerStack, 2); + list.add(dawnRitualDivinerStack); } @Override diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemStabilityGlyphBlock.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemStabilityGlyphBlock.java new file mode 100644 index 00000000..209de15c --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/ItemStabilityGlyphBlock.java @@ -0,0 +1,38 @@ +package WayofTime.alchemicalWizardry.common.items; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +public class ItemStabilityGlyphBlock extends ItemBlock +{ + public ItemStabilityGlyphBlock(Block block) + { + super(block); + setHasSubtypes(true); + } + + @Override + public String getUnlocalizedName(ItemStack itemstack) + { + String name = ""; + + switch (itemstack.getItemDamage()) + { + case 0: + name = "stability1"; + break; + + default: + name = "broken"; + } + + return getUnlocalizedName() + "." + name; + } + + @Override + public int getMetadata(int par1) + { + return par1; + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/BoundArmour.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/BoundArmour.java index 56018258..7b0ec6b0 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/BoundArmour.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/BoundArmour.java @@ -168,6 +168,21 @@ public class BoundArmour extends ItemArmor implements IAlchemyGoggles, ISpecialA return false; } + public boolean isAffectedBySoulHarden() + { + return true; + } + + public double getBaseArmourReduction() + { + return 0.9; + } + + public double getArmourPenetrationReduction() + { + return 0.9; + } + @Override public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot) { @@ -188,7 +203,7 @@ public class BoundArmour extends ItemArmor implements IAlchemyGoggles, ISpecialA h = player.getActivePotionEffect(AlchemicalWizardry.customPotionSoulHarden).getAmplifier() + 1; } - armourReduction = 1 - 0.1 * Math.pow(1.0/3.0, Math.max(0, h - f)) - 0.1 * Math.max(0, f-h); + armourReduction = isAffectedBySoulHarden() ? 1 - (1 - this.getBaseArmourReduction()) * Math.pow(1.0/3.0, Math.max(0, h - f)) - 0.1 * Math.max(0, f-h) : getBaseArmourReduction(); damageAmount *= (armourReduction); @@ -224,7 +239,7 @@ public class BoundArmour extends ItemArmor implements IAlchemyGoggles, ISpecialA { if (source.isUnblockable()) { - return new ArmorProperties(-1, damageAmount * 0.9d, maxAbsorption); + return new ArmorProperties(-1, damageAmount * getArmourPenetrationReduction(), maxAbsorption); } return new ArmorProperties(-1, damageAmount, maxAbsorption); @@ -373,7 +388,14 @@ public class BoundArmour extends ItemArmor implements IAlchemyGoggles, ISpecialA this.setIsInvisible(itemStack, player.isPotionActive(Potion.invisibility.id)); - if (itemStack.getItemDamage() > 0) + this.repairArmour(world, player, itemStack); + + return; + } + + public void repairArmour(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.getItemDamage() > 0) { EnergyItems.checkAndSetItemOwner(itemStack, player); @@ -385,8 +407,6 @@ public class BoundArmour extends ItemArmor implements IAlchemyGoggles, ISpecialA } } } - - return; } public void tickInternalInventory(ItemStack par1ItemStack, World par2World, EntityPlayer par3Entity, int par4, boolean par5) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmour.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmour.java index 813d7e77..139387b4 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmour.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmour.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.items.armour; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -23,6 +24,8 @@ import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import WayofTime.alchemicalWizardry.api.alchemy.energy.Reagent; import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; +import WayofTime.alchemicalWizardry.api.spell.APISpellHelper; +import WayofTime.alchemicalWizardry.common.items.EnergyItems; import WayofTime.alchemicalWizardry.common.omega.OmegaParadigm; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -36,6 +39,10 @@ public abstract class OmegaArmour extends BoundArmour protected boolean storeYLevel = false; protected boolean storeSeesSky = false; + protected List illegalEnchantmentList = new LinkedList(); + + public float reagentDrainPerDamage = 0.1f; + public OmegaArmour(int armorType) { super(armorType); @@ -56,31 +63,52 @@ public abstract class OmegaArmour extends BoundArmour this.reagent = reagent; } + @Override + public boolean isAffectedBySoulHarden() + { + return false; + } + + @Override + public double getBaseArmourReduction() + { + return 0.9; + } + + @Override + public double getArmourPenetrationReduction() + { + return 0.5; + } + @Override public void onArmorTick(World world, EntityPlayer player, ItemStack itemStack) { super.onArmorTick(world, player, itemStack); - if(this.storeBiomeID()) + if(world.getWorldTime() % 50 == 0) { - int xCoord = (int) Math.floor(player.posX); - int zCoord = (int) Math.floor(player.posZ); - - BiomeGenBase biome = world.getBiomeGenForCoords(xCoord, zCoord); - if(biome != null) + if(this.storeBiomeID()) { - this.setBiomeIDStored(itemStack, biome.biomeID); + int xCoord = (int) Math.floor(player.posX); + int zCoord = (int) Math.floor(player.posZ); + + BiomeGenBase biome = world.getBiomeGenForCoords(xCoord, zCoord); + if(biome != null) + { + this.setBiomeIDStored(itemStack, biome.biomeID); + } + } + + if(this.storeDimensionID()) + { + this.setDimensionIDStored(itemStack, world.provider.dimensionId); + } + + if(this.storeYLevel()) + { + this.setYLevelStored(itemStack, (int) Math.floor(player.posY)); } - } - - if(this.storeDimensionID()) - { - this.setDimensionIDStored(itemStack, world.provider.dimensionId); - } - - if(this.storeYLevel()) - { - this.setYLevelStored(itemStack, (int) Math.floor(player.posY)); } if(this.armorType == 1) @@ -94,13 +122,34 @@ public abstract class OmegaArmour extends BoundArmour } } + @Override + public void repairArmour(World world, EntityPlayer player, ItemStack itemStack) + { + if (itemStack.getItemDamage() > 0) + { + if (!player.capabilities.isCreativeMode) + { + if(EnergyItems.syphonBatteries(itemStack, player, itemStack.getItemDamage() * 75)) + { + Reagent reagent = APISpellHelper.getPlayerReagentType(player); + float reagentAmount = APISpellHelper.getPlayerCurrentReagentAmount(player); + + reagentAmount -= itemStack.getItemDamage() * reagentDrainPerDamage; + APISpellHelper.setPlayerCurrentReagentAmount(player, Math.max(0, reagentAmount)); + + itemStack.setItemDamage(0); + } + } + } + } + public void revertArmour(EntityPlayer player, ItemStack itemStack) { ItemStack stack = this.getContainedArmourStack(itemStack); player.inventory.armorInventory[3-this.armorType] = stack; } - public ItemStack getSubstituteStack(ItemStack boundStack, int stability, int affinity, int enchantability, Random rand) + public ItemStack getSubstituteStack(ItemStack boundStack, int stability, int affinity, int enchantability, int enchantmentLevel, Random rand) { ItemStack omegaStack = new ItemStack(this); if(boundStack != null && boundStack.hasTagCompound()) @@ -110,13 +159,18 @@ public abstract class OmegaArmour extends BoundArmour } this.setContainedArmourStack(omegaStack, boundStack); SoulNetworkHandler.checkAndSetItemOwner(omegaStack, SoulNetworkHandler.getOwnerName(boundStack)); - this.setItemEnchantability(omegaStack, 70); + this.setItemEnchantability(omegaStack, Math.min(enchantability, 70)); + + EnchantmentHelper.setEnchantments(new HashMap(), omegaStack); List enchantList = new ArrayList(); - for(int i=0; i<100; i++) + int adjustedEnchantLevel = Math.min(enchantmentLevel, 30); + int additionalPasses = enchantmentLevel - adjustedEnchantLevel; + + for(int i=0; i<1+additionalPasses; i++) { - List lst = EnchantmentHelper.buildEnchantmentList(rand, omegaStack, 30); + List lst = EnchantmentHelper.buildEnchantmentList(rand, omegaStack, adjustedEnchantLevel); if(lst != null) { enchantList.addAll(lst); @@ -144,9 +198,17 @@ public abstract class OmegaArmour extends BoundArmour } } + for(Enchantment ench : this.illegalEnchantmentList) + { + if(map.containsKey(ench)) + { + map.remove(ench); + } + } + List newEnchantList = new ArrayList(); - for(Entry> entry : map.entrySet()) //Assume enchant # 0 is level 1 enchant + for(Entry> entry : map.entrySet()) { Enchantment ench = entry.getKey(); Map numMap = entry.getValue(); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourEarth.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourEarth.java index d858ca18..de5cc181 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourEarth.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourEarth.java @@ -28,6 +28,7 @@ public class OmegaArmourEarth extends OmegaArmour public OmegaArmourEarth(int armorType) { super(armorType); + this.storeYLevel = true; } @Override @@ -89,10 +90,14 @@ public class OmegaArmourEarth extends OmegaArmour } @Override - public Multimap getItemAttributeModifiers() + public Multimap getAttributeModifiers(ItemStack stack) { Multimap map = HashMultimap.create(); - map.put(SharedMonsterAttributes.knockbackResistance.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(179618 /** Random number **/, armorType), "Armor modifier" + armorType, getKnockbackResist(), 0)); + int yLevel = this.getYLevelStored(stack); + map.put(SharedMonsterAttributes.knockbackResistance.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(179618 /** Random number **/, armorType), "Knockback modifier" + armorType, getKnockbackResist(), 0)); + map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(80532 /** Random number **/, armorType), "Health modifier" + armorType, getDefaultArmourBoost()*getHealthBoostModifierForLevel(yLevel), 1)); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85112 /** Random number **/, armorType), "Damage modifier" + armorType, getDefaultArmourBoost()*getDamageModifierForLevel(yLevel), 2)); + return map; } @@ -100,4 +105,30 @@ public class OmegaArmourEarth extends OmegaArmour { return 0.25f; } + + public float getDefaultArmourBoost() + { + switch(this.armorType) + { + case 0: + return 2.5f; + case 1: + return 4; + case 2: + return 3.5f; + case 3: + return 2; + } + return 0.25f; + } + + public float getHealthBoostModifierForLevel(int yLevel) + { + return 0.05f * (yLevel <= 50 ? 1.5f : yLevel >= 100 ? -0.5f : 0.5f); + } + + public float getDamageModifierForLevel(int yLevel) + { + return 0.03f * (yLevel <= 50 ? 1.5f : yLevel >= 100 ? -0.5f : 0.5f); + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourFire.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourFire.java index 644ca704..0d060d57 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourFire.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourFire.java @@ -1,10 +1,19 @@ package WayofTime.alchemicalWizardry.common.items.armour; +import java.util.UUID; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + import net.minecraft.client.model.ModelBiped; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.enchantment.Enchantment; import net.minecraft.entity.Entity; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import net.minecraft.world.biome.BiomeGenBase; import WayofTime.alchemicalWizardry.ModItems; import WayofTime.alchemicalWizardry.common.renderer.model.ModelOmegaFire; import cpw.mods.fml.relauncher.Side; @@ -20,7 +29,8 @@ public class OmegaArmourFire extends OmegaArmour public OmegaArmourFire(int armorType) { super(armorType); -// this.storeYLevel = true; + this.storeBiomeID = true; + this.illegalEnchantmentList.add(Enchantment.fireProtection); } @Override @@ -81,17 +91,21 @@ public class OmegaArmourFire extends OmegaArmour return this.itemIcon; } -// @Override -// public Multimap getAttributeModifiers(ItemStack stack) -// { -// Multimap map = HashMultimap.create(); -// -//// map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85212 /** Random number **/, armorType), "Armor modifier" + armorType, getDefaultHealthBoost()*getHealthBoostModifierForLevel(yLevel), 0)); -// -// return map; -// } + @Override + public Multimap getAttributeModifiers(ItemStack stack) + { + Multimap map = HashMultimap.create(); + int biomeID = this.getBiomeIDStored(stack); + BiomeGenBase biome = BiomeGenBase.getBiome(biomeID); + if(biome != null) + { + map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(895132 /** Random number **/, armorType), "Health modifier" + armorType, getDefaultArmourBoost()*getHealthBoostModifierForBiome(biome), 1)); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(196312 /** Random number **/, armorType), "Damage modifier" + armorType, getDefaultArmourBoost()*getDamageModifierForBiome(biome), 1)); + } + return map; + } - public float getDefaultHealthBoost() + public float getDefaultArmourBoost() { switch(this.armorType) { @@ -107,8 +121,47 @@ public class OmegaArmourFire extends OmegaArmour return 0.25f; } -// public float getHealthBoostModifierForLevel(int yLevel) -// { -// return (float)Math.sqrt(((float)yLevel)/64f) * 1.5f - 1; -// } + public float getHealthBoostModifierForBiome(BiomeGenBase biome) + { + float modifier = 0.05f; + + if(biome.isEqualTo(BiomeGenBase.hell)) + { + return modifier * 2.0f; + } + + if(biome.isEqualTo(BiomeGenBase.ocean)) + { + return modifier * -0.5f; + } + + if(biome.temperature >= 1) + { + return modifier * 1.5f; + } + + return modifier * 0.5f; + } + + public float getDamageModifierForBiome(BiomeGenBase biome) + { + float modifier = 0.03f; + + if(biome.isEqualTo(BiomeGenBase.hell)) + { + return modifier * 2.0f; + } + + if(biome.isEqualTo(BiomeGenBase.ocean)) + { + return modifier * -0.5f; + } + + if(biome.temperature >= 1) + { + return modifier * 1.5f; + } + + return modifier * 0.5f; + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWater.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWater.java index 1532cf70..11e0e127 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWater.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWater.java @@ -97,12 +97,13 @@ public class OmegaArmourWater extends OmegaArmour BiomeGenBase biome = BiomeGenBase.getBiome(biomeID); if(biome != null) { - map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85312 /** Random number **/, armorType), "Armor modifier" + armorType, getDefaultHealthBoost()*getHealthBoostModifierForBiome(biome), 0)); + map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85312 /** Random number **/, armorType), "Health modifier" + armorType, getDefaultArmourBoost()*getHealthBoostModifierForBiome(biome), 2)); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85432 /** Random number **/, armorType), "Damage modifier" + armorType, getDefaultArmourBoost()*getDamageModifierForBiome(biome), 2)); } return map; } - public float getDefaultHealthBoost() + public float getDefaultArmourBoost() { switch(this.armorType) { @@ -120,21 +121,44 @@ public class OmegaArmourWater extends OmegaArmour public float getHealthBoostModifierForBiome(BiomeGenBase biome) { + float modifier = 0.05f; if(biome.isEqualTo(BiomeGenBase.hell)) { - return -0.5f; + return modifier * -0.5f; } - if(biome.isEqualTo(BiomeGenBase.ocean)) + if(biome.isEqualTo(BiomeGenBase.ocean) || biome.isEqualTo(BiomeGenBase.river)) { - return 2.0f; + return modifier * 2.0f; } if(biome.isHighHumidity()) { - return 1.5f; + return modifier * 1.5f; } - return 0.5f; + return modifier * 0.5f; + } + + public float getDamageModifierForBiome(BiomeGenBase biome) + { + float modifier = 0.03f; + + if(biome.isEqualTo(BiomeGenBase.hell)) + { + return modifier * -0.5f; + } + + if(biome.isEqualTo(BiomeGenBase.ocean) || biome.isEqualTo(BiomeGenBase.river)) + { + return modifier * 2.0f; + } + + if(biome.isHighHumidity()) + { + return modifier * 1.5f; + } + + return modifier * 0.5f; } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWind.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWind.java index ad504314..40f090de 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWind.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/armour/OmegaArmourWind.java @@ -94,13 +94,13 @@ public class OmegaArmourWind extends OmegaArmour { Multimap map = HashMultimap.create(); int yLevel = this.getYLevelStored(stack); - - map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85212 /** Random number **/, armorType), "Armor modifier" + armorType, getDefaultHealthBoost()*getHealthBoostModifierForLevel(yLevel), 0)); + map.put(SharedMonsterAttributes.maxHealth.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(85212 /** Random number **/, armorType), "Health modifier" + armorType, getDefaultArmourBoost()*getHealthBoostModifierForLevel(yLevel), 1)); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(new UUID(86212 /** Random number **/, armorType), "Damage modifier" + armorType, getDefaultArmourBoost()*getDamageModifierForLevel(yLevel), 2)); return map; } - public float getDefaultHealthBoost() + public float getDefaultArmourBoost() { switch(this.armorType) { @@ -118,6 +118,11 @@ public class OmegaArmourWind extends OmegaArmour public float getHealthBoostModifierForLevel(int yLevel) { - return (float)Math.sqrt(((float)yLevel)/64f) * 1.5f - 1; + return 0.05f * ((((float)yLevel)/64f) * 1.5f - 1); + } + + public float getDamageModifierForLevel(int yLevel) + { + return 0.02f * ((((float)yLevel)/64f) * 1.5f - 1); } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/energy/ItemTankSegmenter.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/energy/ItemTankSegmenter.java index 08e0d294..2faf341b 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/energy/ItemTankSegmenter.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/energy/ItemTankSegmenter.java @@ -213,7 +213,7 @@ public class ItemTankSegmenter extends Item implements IReagentManipulator numberAssigned = 0; } - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("message.tanksegmenter.nowhas") + " " + numberAssigned + " " + "message.tanksegmenter.tankssetto" + " " + reagent.name)); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("message.tanksegmenter.nowhas") + " " + numberAssigned + " " + StatCollector.translateToLocal("message.tanksegmenter.tankssetto") + " " + reagent.name)); reagentHandler.setTanksTunedToReagent(reagent, numberAssigned); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java index 514f5a1e..af0f3754 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/ItemBloodLightSigil.java @@ -49,7 +49,6 @@ public class ItemBloodLightSigil extends EnergyItems implements IHolding @Override public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { - System.out.println("Being called"); if(!EnergyItems.checkAndSetItemOwner(par1ItemStack, par2EntityPlayer) || !EnergyItems.syphonBatteries(par1ItemStack, par2EntityPlayer, getEnergyUsed())) { return true; @@ -96,7 +95,7 @@ public class ItemBloodLightSigil extends EnergyItems implements IHolding @Override public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { - if (EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer) || par3EntityPlayer.isSneaking()) + if (!EnergyItems.checkAndSetItemOwner(par1ItemStack, par3EntityPlayer) || par3EntityPlayer.isSneaking()) { return par1ItemStack; } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java b/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java index 0887e900..7704bcda 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/items/sigil/SigilOfTheFastMiner.java @@ -56,7 +56,7 @@ public class SigilOfTheFastMiner extends EnergyItems implements ArmourUpgrade @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister iconRegister) { - this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:SigilOfTheFastMiner"); + this.itemIcon = iconRegister.registerIcon("AlchemicalWizardry:MiningSigil_deactivated"); this.activeIcon = iconRegister.registerIcon("AlchemicalWizardry:MiningSigil_activated"); this.passiveIcon = iconRegister.registerIcon("AlchemicalWizardry:MiningSigil_deactivated"); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/IEnchantmentGlyph.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/IEnchantmentGlyph.java index 113024f5..5c189f92 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/IEnchantmentGlyph.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/IEnchantmentGlyph.java @@ -2,8 +2,8 @@ package WayofTime.alchemicalWizardry.common.omega; import net.minecraft.world.World; -public interface IEnchantmentGlyph +public interface IEnchantmentGlyph extends IStabilityGlyph { - public int getSubtractedStabilityForFaceCount(World world, int x, int y, int z, int meta, int faceCount); public int getEnchantability(World world, int x, int y, int z, int meta); + public int getEnchantmentLevel(World world, int x, int y, int z, int meta); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/IStabilityGlyph.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/IStabilityGlyph.java new file mode 100644 index 00000000..50252a94 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/IStabilityGlyph.java @@ -0,0 +1,8 @@ +package WayofTime.alchemicalWizardry.common.omega; + +import net.minecraft.world.World; + +public interface IStabilityGlyph +{ + public int getAdditionalStabilityForFaceCount(World world, int x, int y, int z, int meta, int faceCount); +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigm.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigm.java index ee86b10e..c60b30d2 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigm.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigm.java @@ -35,10 +35,10 @@ public class OmegaParadigm this.leggings.setReagent(reagent); this.boots.setReagent(reagent); - this.config = new ReagentRegenConfiguration(20, 10, 1); + this.config = new ReagentRegenConfiguration(100, 1, 10); } - public boolean convertPlayerArmour(EntityPlayer player, int x, int y, int z, int stability, int affinity, int enchantability) + public boolean convertPlayerArmour(EntityPlayer player, int x, int y, int z, int stability, int affinity, int enchantability, int enchantmentLevel) { ItemStack[] armours = player.inventory.armorInventory; @@ -48,13 +48,13 @@ public class OmegaParadigm ItemStack bootsStack = armours[0]; if(helmetStack != null && helmetStack.getItem() == ModItems.boundHelmet && chestStack != null && chestStack.getItem() == ModItems.boundPlate && leggingsStack != null && leggingsStack.getItem() == ModItems.boundLeggings && bootsStack != null && bootsStack.getItem() == ModItems.boundBoots) - { + { long worldSeed = player.worldObj.getSeed(); - Random rand = new Random(worldSeed + stability * (affinity + 7) * 94 + 84321*x - 17423*y + 76*z - 1623451*enchantability); - ItemStack omegaHelmetStack = helmet.getSubstituteStack(helmetStack, stability, affinity, enchantability, rand); - ItemStack omegaChestStack = chestPiece.getSubstituteStack(chestStack, stability, affinity, enchantability, rand); - ItemStack omegaLeggingsStack = leggings.getSubstituteStack(leggingsStack, stability, affinity, enchantability, rand); - ItemStack omegaBootsStack = boots.getSubstituteStack(bootsStack, stability, affinity, enchantability, rand); + Random rand = new Random(worldSeed + stability * (affinity + 7) * 94 + 84321*x - 17423*y + 76*z - 1623451*enchantability + 2 * enchantmentLevel); + ItemStack omegaHelmetStack = helmet.getSubstituteStack(helmetStack, stability, affinity, enchantability, enchantmentLevel, rand); + ItemStack omegaChestStack = chestPiece.getSubstituteStack(chestStack, stability, affinity, enchantability, enchantmentLevel, rand); + ItemStack omegaLeggingsStack = leggings.getSubstituteStack(leggingsStack, stability, affinity, enchantability, enchantmentLevel, rand); + ItemStack omegaBootsStack = boots.getSubstituteStack(bootsStack, stability, affinity, enchantability, enchantmentLevel, rand); armours[3] = omegaHelmetStack; armours[2] = omegaChestStack; @@ -74,7 +74,7 @@ public class OmegaParadigm public int getMaxAdditionalHealth() { - return 50; + return 20; } public boolean setOmegaStalling(EntityPlayer player, int duration) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmEarth.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmEarth.java index e722bd91..65283945 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmEarth.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmEarth.java @@ -1,5 +1,13 @@ package WayofTime.alchemicalWizardry.common.omega; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; import WayofTime.alchemicalWizardry.common.items.armour.OmegaArmour; @@ -7,18 +15,45 @@ public class OmegaParadigmEarth extends OmegaParadigm { public OmegaParadigmEarth(OmegaArmour helmet, OmegaArmour chestPiece, OmegaArmour leggings, OmegaArmour boots) { - super(ReagentRegistry.terraeReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 10, 100)); + super(ReagentRegistry.terraeReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 1, 10)); } -// @Override -// public float getCostPerTickOfUse(EntityPlayer player) -// { -// if(player.isInWater()) + @Override + public float getCostPerTickOfUse(EntityPlayer player) + { +// if(player.isBurning()) // { // return 0.5f; -// }else -// { -// return 1; // } -// } + return 1; + } + + @Override + public void onUpdate(World world, EntityPlayer player, ItemStack stack) + { + if(world.getWorldTime() % 100 == 0 && !world.isRemote) + { + if(player.posY < 50 && player.getHealth() < player.getMaxHealth()) + { + player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, 0, true)); + } + } + + if(player.posY > 100) + { + player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionHeavyHeart.id, 200, 0, true)); + } + } + + @Override + public boolean getBlockEffectWhileInside(Entity entity, int x, int y, int z) + { + return true; + } + + @Override + public void onOmegaKeyPressed(EntityPlayer player, ItemStack stack) + { + + } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmFire.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmFire.java index b1efe91d..4802841f 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmFire.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmFire.java @@ -1,8 +1,11 @@ package WayofTime.alchemicalWizardry.common.omega; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; import WayofTime.alchemicalWizardry.common.items.armour.OmegaArmour; @@ -11,19 +14,47 @@ public class OmegaParadigmFire extends OmegaParadigm { public OmegaParadigmFire(OmegaArmour helmet, OmegaArmour chestPiece, OmegaArmour leggings, OmegaArmour boots) { - super(ReagentRegistry.incendiumReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 10, 100)); + super(ReagentRegistry.incendiumReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 1, 10)); } @Override public float getCostPerTickOfUse(EntityPlayer player) { + if(player.isBurning()) + { + return 0.5f; + } return 1; } @Override public void onUpdate(World world, EntityPlayer player, ItemStack stack) { - + if(world.getWorldTime() % 100 == 0 && !world.isRemote) + { + boolean isInLava = player.isInsideOfMaterial(Material.lava); + if(player.isBurning() && player.getHealth() < player.getMaxHealth()) + { + player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, isInLava ? 1 : 0, true)); + } + + if(player.isBurning()) + { + player.addPotionEffect(new PotionEffect(Potion.damageBoost.id, isInLava ? 400 : 200, isInLava ? 1 : 0, true)); + } + + if(player.isInWater()) + { + player.addPotionEffect(new PotionEffect(Potion.digSlowdown.id, 200, 2, true)); + player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 200, 2, true)); + player.addPotionEffect(new PotionEffect(Potion.weakness.id, 200, 1, true)); + } + } + + if(player.isBurning()) + { + player.addPotionEffect(new PotionEffect(Potion.fireResistance.id, 200, 0, true)); + } } @Override diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWater.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWater.java index 60e0a26c..941f82cd 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWater.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWater.java @@ -17,7 +17,7 @@ public class OmegaParadigmWater extends OmegaParadigm { public OmegaParadigmWater(OmegaArmour helmet, OmegaArmour chestPiece, OmegaArmour leggings, OmegaArmour boots) { - super(ReagentRegistry.aquasalusReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 10, 100)); + super(ReagentRegistry.aquasalusReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 1, 10)); } @Override @@ -37,6 +37,14 @@ public class OmegaParadigmWater extends OmegaParadigm { player.addPotionEffect(new PotionEffect(Potion.waterBreathing.id, 3, 0, true)); player.addPotionEffect(new PotionEffect(AlchemicalWizardry.customPotionAmphibian.id, 3, 0, true)); + + if(world.getWorldTime() % 100 == 0 && !world.isRemote) + { + if(player.isInWater() && player.getHealth() < player.getMaxHealth()) + { + player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, 0, true)); + } + } } @Override diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWind.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWind.java index f994b549..1276863c 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWind.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaParadigmWind.java @@ -3,6 +3,8 @@ package WayofTime.alchemicalWizardry.common.omega; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; import WayofTime.alchemicalWizardry.common.items.armour.OmegaArmour; @@ -11,7 +13,7 @@ public class OmegaParadigmWind extends OmegaParadigm { public OmegaParadigmWind(OmegaArmour helmet, OmegaArmour chestPiece, OmegaArmour leggings, OmegaArmour boots) { - super(ReagentRegistry.aetherReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 10, 100)); + super(ReagentRegistry.aetherReagent, helmet, chestPiece, leggings, boots, new ReagentRegenConfiguration(50, 1, 10)); } @Override @@ -29,7 +31,12 @@ public class OmegaParadigmWind extends OmegaParadigm @Override public void onUpdate(World world, EntityPlayer player, ItemStack stack) { - + if(world.getWorldTime() % 100 == 0 && !world.isRemote && player.posY > 128 && player.getHealth() < player.getMaxHealth()) + { + player.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, player.posY > 128 + 64 ? 1 : 0, true)); + } + + player.fallDistance = 0; } @Override diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureHandler.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureHandler.java index 7aa32d6b..7289c491 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureHandler.java @@ -7,7 +7,7 @@ import WayofTime.alchemicalWizardry.api.Int3; public class OmegaStructureHandler { - public static final OmegaStructureParameters emptyParam = new OmegaStructureParameters(0, 0); + public static final OmegaStructureParameters emptyParam = new OmegaStructureParameters(0, 0, 0); public static boolean isStructureIntact(World world, int x, int y, int z) { @@ -155,6 +155,7 @@ public class OmegaStructureHandler int tally = 0; int enchantability = 0; + int enchantmentLevel = 0; for (int i = 0; i < 2 * range + 1; i++) { @@ -198,23 +199,27 @@ public class OmegaStructureHandler { indTally++; } - + Block block = world.getBlock(x - range + i, y - range + j, z - range + k); - int meta = 0; + int meta = world.getBlockMetadata(x - range + i, y - range + j, z - range + k); + if(block instanceof IEnchantmentGlyph) { - tally -= ((IEnchantmentGlyph)block).getSubtractedStabilityForFaceCount(world, x-range+i, y-range+j, z-range+k, meta, indTally); + tally += ((IEnchantmentGlyph)block).getAdditionalStabilityForFaceCount(world, x-range+i, y-range+j, z-range+k, meta, indTally); enchantability += ((IEnchantmentGlyph)block).getEnchantability(world, x-range+i, y-range+j, z-range+k, meta); + enchantmentLevel += ((IEnchantmentGlyph)block).getEnchantmentLevel(world, x-range+i, y-range+j, z-range+k, meta); + }else if(block instanceof IStabilityGlyph) + { + tally += ((IStabilityGlyph)block).getAdditionalStabilityForFaceCount(world, x-range+i, y-range+j, z-range+k, meta, indTally); }else { tally += indTally; - } + } } } } - - return new OmegaStructureParameters(tally, enchantability); + return new OmegaStructureParameters(tally, enchantability, enchantmentLevel); } public static OmegaStructureParameters getStructureStabilityFactor(World world, int x, int y, int z, int expLim) diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureParameters.java b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureParameters.java index 2b42bd47..2ecd32c4 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureParameters.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/omega/OmegaStructureParameters.java @@ -4,10 +4,12 @@ public class OmegaStructureParameters { public final int stability; public final int enchantability; + public final int enchantmentLevel; - public OmegaStructureParameters(int stability, int enchantability) + public OmegaStructureParameters(int stability, int enchantability, int enchantmentLevel) { this.stability = stability; this.enchantability = enchantability; + this.enchantmentLevel = enchantmentLevel; } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java b/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java index 69920b1a..dec51680 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/RenderWritingTable.java @@ -3,6 +3,7 @@ package WayofTime.alchemicalWizardry.common.renderer.block; import WayofTime.alchemicalWizardry.common.renderer.model.ModelWritingTable; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.client.FMLClientHandler; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -13,6 +14,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.common.util.ForgeDirection; + import org.lwjgl.opengl.GL11; public class RenderWritingTable extends TileEntitySpecialRenderer @@ -57,7 +59,7 @@ public class RenderWritingTable extends TileEntitySpecialRenderer if (tileAltar.getStackInSlot(i) != null) { float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(i)); - float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + float rotationAngle = Minecraft.getMinecraft().gameSettings.fancyGraphics ? (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL) : 0; EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); ghostEntityItem.hoverStart = 0.0F; ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(i)); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java b/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java index 1a0dfc88..054e1201 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/renderer/block/TEAltarRenderer.java @@ -1,7 +1,6 @@ package WayofTime.alchemicalWizardry.common.renderer.block; -import WayofTime.alchemicalWizardry.common.renderer.model.ModelBloodAltar; -import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -10,8 +9,12 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; + import org.lwjgl.opengl.GL11; +import WayofTime.alchemicalWizardry.common.renderer.model.ModelBloodAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; + public class TEAltarRenderer extends TileEntitySpecialRenderer { private ModelBloodAltar modelBloodAltar = new ModelBloodAltar(); @@ -44,7 +47,7 @@ public class TEAltarRenderer extends TileEntitySpecialRenderer if (tileAltar.getStackInSlot(0) != null) { float scaleFactor = getGhostItemScaleFactor(tileAltar.getStackInSlot(0)); - float rotationAngle = (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL); + float rotationAngle = Minecraft.getMinecraft().gameSettings.fancyGraphics ? (float) (720.0 * (System.currentTimeMillis() & 0x3FFFL) / 0x3FFFL) : 0; EntityItem ghostEntityItem = new EntityItem(tileAltar.getWorldObj()); ghostEntityItem.hoverStart = 0.0F; ghostEntityItem.setEntityItemStack(tileAltar.getStackInSlot(0)); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java index 3c2a187a..9cfae056 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectAutoAlchemy.java @@ -44,13 +44,13 @@ public class RitualEffectAutoAlchemy extends RitualEffect int flag = 0; TileEntity topEntity = world.getTileEntity(x, y + 1, z); - if (!(topEntity instanceof IBloodAltar)) + if (!(topEntity instanceof IBloodAltar) || !(topEntity instanceof IBloodAltar)) { return; } IBloodAltar altar = (IBloodAltar) topEntity; - ItemStack targetStack = altar.getStackInSlot(0); + ItemStack targetStack = ((IInventory)altar).getStackInSlot(0); if (targetStack == null) { return; diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrafting.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrafting.java new file mode 100644 index 00000000..4e86f944 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectCrafting.java @@ -0,0 +1,448 @@ +package WayofTime.alchemicalWizardry.common.rituals; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; +import WayofTime.alchemicalWizardry.api.Int3; +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; +import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; +import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; +import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; +import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; + +public class RitualEffectCrafting extends RitualEffect +{ + public static final boolean isTesting = false; + public static final boolean limitToSingleStack = true; + public static final int potentiaDrain = 2; + public static final int virtusDrain = 2; + + @Override + public void performEffect(IMasterRitualStone ritualStone) + { +// long startTime = System.nanoTime(); + + String owner = ritualStone.getOwner(); + + int currentEssence = SoulNetworkHandler.getCurrentEssence(owner); + World world = ritualStone.getWorld(); + int x = ritualStone.getXCoord(); + int y = ritualStone.getYCoord(); + int z = ritualStone.getZCoord(); + + boolean hasPotentia = this.canDrainReagent(ritualStone, ReagentRegistry.potentiaReagent, potentiaDrain, false); + + if(world.getWorldTime() % (hasPotentia ? 1 : 4) != 0) + { + return; + } + + if (currentEssence < this.getCostPerRefresh()) + { + SoulNetworkHandler.causeNauseaToPlayer(owner); + } else + { + NBTTagCompound tag = ritualStone.getCustomRitualTag(); + + if(tag == null) + { + ritualStone.setCustomRitualTag(new NBTTagCompound()); + tag = ritualStone.getCustomRitualTag(); + } + + boolean lastFailed = tag.getBoolean("didLastCraftFail"); + + int slotDesignation = tag.getInteger("slotDesignation"); + if(lastFailed) + { + slotDesignation++; + tag.setInteger("slotDesignation", slotDesignation); + tag.setBoolean("didLastCraftFail", false); + } + int direction = ritualStone.getDirection(); + + boolean canContinue = false; + + ItemStack[] recipe = new ItemStack[9]; + InventoryCrafting inventory = new InventoryCrafting(new Container() + { + public boolean canInteractWith(EntityPlayer player) + { + return false; + } + }, 3, 3); + + for(int i=-1; i<=1; i++) + { + for(int j=-1; j<=1; j++) + { + int gridSpace = (i+1)*3 + (j+1); + + Int3 pos = this.getSlotPositionForDirection(gridSpace, direction); + TileEntity inv = world.getTileEntity(x + pos.xCoord, y + pos.yCoord, z + pos.zCoord); + if(inv instanceof IInventory) + { + if(((IInventory) inv).getSizeInventory() <= slotDesignation || !((IInventory) inv).isItemValidForSlot(slotDesignation, ((IInventory) inv).getStackInSlot(slotDesignation))) + { + continue; + }else + { + ItemStack invStack = ((IInventory) inv).getStackInSlot(slotDesignation); + if(invStack != null) + { + inventory.setInventorySlotContents(gridSpace, invStack); + recipe[gridSpace] = invStack; + canContinue = true; + } + } + } + } + } + + if(!canContinue) + { + tag.setInteger("slotDesignation", 0); + return; + } + + ItemStack returnStack = CraftingManager.getInstance().findMatchingRecipe(inventory, world); + + if (returnStack == null) + { + tag.setBoolean("didLastCraftFail", true); + return; + }else + { + boolean hasVirtus = this.canDrainReagent(ritualStone, ReagentRegistry.virtusReagent, virtusDrain, false); + boolean addOutputToInputs = hasVirtus; + + IInventory outputInv = null; + + List invList = new ArrayList(); + + TileEntity northEntity = world.getTileEntity(x, y-1, z - 2); + TileEntity southEntity = world.getTileEntity(x, y-1, z + 2); + TileEntity eastEntity = world.getTileEntity(x + 2, y-1, z); + TileEntity westEntity = world.getTileEntity(x - 2, y-1, z); + + switch(direction) + { + case 1: + if(southEntity instanceof IInventory) + { + outputInv = (IInventory)southEntity; + }else + { + return; + } + + if(northEntity instanceof IInventory) + { + invList.add((IInventory)northEntity); + } + if(eastEntity instanceof IInventory) + { + invList.add((IInventory)eastEntity); + } + if(westEntity instanceof IInventory) + { + invList.add((IInventory)westEntity); + } + + break; + + case 2: + if(westEntity instanceof IInventory) + { + outputInv = (IInventory)westEntity; + }else + { + return; + } + + if(northEntity instanceof IInventory) + { + invList.add((IInventory)northEntity); + } + if(eastEntity instanceof IInventory) + { + invList.add((IInventory)eastEntity); + } + if(southEntity instanceof IInventory) + { + invList.add((IInventory)southEntity); + } + + break; + + case 3: + if(northEntity instanceof IInventory) + { + outputInv = (IInventory)northEntity; + }else + { + return; + } + + if(eastEntity instanceof IInventory) + { + invList.add((IInventory)eastEntity); + } + if(southEntity instanceof IInventory) + { + invList.add((IInventory)southEntity); + } + if(westEntity instanceof IInventory) + { + invList.add((IInventory)westEntity); + } + + break; + + case 4: + if(eastEntity instanceof IInventory) + { + outputInv = (IInventory)eastEntity; + }else + { + return; + } + + if(northEntity instanceof IInventory) + { + invList.add((IInventory)northEntity); + } + if(southEntity instanceof IInventory) + { + invList.add((IInventory)southEntity); + } + if(westEntity instanceof IInventory) + { + invList.add((IInventory)westEntity); + } + + break; + } + + if (outputInv != null) + { + if(!(!limitToSingleStack ? SpellHelper.canInsertStackFullyIntoInventory(returnStack, outputInv, ForgeDirection.DOWN) : SpellHelper.canInsertStackFullyIntoInventory(returnStack, outputInv, ForgeDirection.DOWN, true, returnStack.getMaxStackSize()))) + { + tag.setBoolean("didLastCraftFail", true); + return; + } + + if(addOutputToInputs) + { + invList.add(outputInv); + } + + Map> syphonMap = new HashMap(); //Inventory, Slot, how much claimed + + for(int n = 0; n < recipe.length; n++) //Look for the correct items + { + ItemStack recipeStack = recipe[n]; + if(recipeStack == null) + { + continue; + } + + boolean isItemTaken = false; + + for(int i = 0; i < invList.size(); i++) + { + if(isItemTaken) + { + break; + } + IInventory inputInv = invList.get(i); + if(inputInv == null) + { + continue; + } + + for(int j = 0; j < inputInv.getSizeInventory(); j++) + { + if(!inputInv.isItemValidForSlot(j, recipeStack)) + { + continue; + } + + ItemStack invItem = inputInv.getStackInSlot(j); + if(invItem == null) + { + continue; + } + + if(this.areItemsEqualForCrafting(recipeStack, invItem)) + { + //TODO + inventory.setInventorySlotContents(n, invItem); +// ItemStack returnedStack = CraftingManager.getInstance().findMatchingRecipe(inventory, world); +// if(returnedStack == null || returnedStack.getItem() == null || returnedStack.getItem() != returnStack.getItem()) +// { +// continue; +// } + Map slotMap = syphonMap.get(i); + if(slotMap == null) + { + slotMap = new HashMap(); + syphonMap.put(i, slotMap); + } + + if(slotMap.containsKey(j)) + { + int syphoned = slotMap.get(j); + if(invItem.stackSize - syphoned > 0) + { + slotMap.put(j, syphoned + 1); + isItemTaken = true; + break; + } + }else + { + slotMap.put(j, 1); + isItemTaken = true; + break; + } + } + } + } + + if(!isItemTaken) + { + tag.setBoolean("didLastCraftFail", true); + return; + } + } + + /* The recipe is valid and the items have been found */ + + SpellHelper.insertStackIntoInventory(CraftingManager.getInstance().findMatchingRecipe(inventory, world), outputInv, ForgeDirection.DOWN); + + for(Entry> entry1 : syphonMap.entrySet()) + { + IInventory inputInv = invList.get(entry1.getKey()); + for(Entry entry2 : entry1.getValue().entrySet()) + { + ItemStack drainedStack = inputInv.getStackInSlot(entry2.getKey()); + Item item = drainedStack.getItem(); + if(item.hasContainerItem(drainedStack)) + { + inputInv.setInventorySlotContents(entry2.getKey(), item.getContainerItem(drainedStack)); + }else + { + drainedStack.stackSize -= entry2.getValue(); + if(drainedStack.stackSize <= 0) + { + inputInv.setInventorySlotContents(entry2.getKey(), null); + } + } + } + } + + if(addOutputToInputs && syphonMap.containsKey(invList.size())) + { + this.canDrainReagent(ritualStone, ReagentRegistry.virtusReagent, virtusDrain, true); + } + + SoulNetworkHandler.syphonFromNetwork(owner, this.getCostPerRefresh()); + + if(hasPotentia) + { + this.canDrainReagent(ritualStone, ReagentRegistry.potentiaReagent, potentiaDrain, true); + } + + world.markBlockForUpdate(x, y-1, z + 2); + world.markBlockForUpdate(x, y-1, z - 2); + world.markBlockForUpdate(x + 2, y-1, z); + world.markBlockForUpdate(x - 2, y-1, z); + +// long endTime = System.nanoTime(); +// +// long duration = (endTime - startTime); //divide by 1000000 to get milliseconds. +// System.out.println("(Total) method time in ms: " + (float)(duration)/1000000.0); + } + } + } + } + + @Override + public int getCostPerRefresh() + { + return 10; + } + + @Override + public List getRitualComponentList() + { + ArrayList autoCraftingRitual = new ArrayList(); + + this.addCornerRunes(autoCraftingRitual, 1, 1, RitualComponent.EARTH); + this.addParallelRunes(autoCraftingRitual, 1, 1, RitualComponent.EARTH); + autoCraftingRitual.add(new RitualComponent(0, 1, 0, RitualComponent.AIR)); + this.addOffsetRunes(autoCraftingRitual, 1, 2, -1, RitualComponent.FIRE); + this.addCornerRunes(autoCraftingRitual, 1, -1, RitualComponent.FIRE); + autoCraftingRitual.add(new RitualComponent(-1, -1, 0, RitualComponent.EARTH)); + autoCraftingRitual.add(new RitualComponent(1, -1, 0, RitualComponent.EARTH)); + autoCraftingRitual.add(new RitualComponent(0, -1, -1, RitualComponent.EARTH)); + autoCraftingRitual.add(new RitualComponent(0, -1, 0, RitualComponent.FIRE)); + autoCraftingRitual.add(new RitualComponent(0, -1, 1, RitualComponent.WATER)); + + return autoCraftingRitual; + } + + public boolean areItemsEqualForCrafting(ItemStack stack1, ItemStack stack2) + { + if (stack1 == null || stack2 == null) + { + return false; + } +// +// if (stack1.isItemStackDamageable() ^ stack2.isItemStackDamageable()) +// { +// return false; +// } + + return stack1.getItem() == stack2.getItem() && (stack1.getItem().getHasSubtypes() ? stack1.getItemDamage() == stack2.getItemDamage() : true); + } + + public boolean areItemStacksEqualWithWildcard(ItemStack recipeStack, ItemStack comparedStack) + { + return recipeStack.isItemEqual(comparedStack) || (recipeStack.getItemDamage() == OreDictionary.WILDCARD_VALUE && recipeStack.getItem() == comparedStack.getItem()); + } + + public Int3 getSlotPositionForDirection(int slot, int direction) + { + int x = slot % 3 - 1; + int z = slot / 3 - 1; + switch(direction) + { + case 1: //NORTH-facing + return new Int3(x, 2, z); + case 2: //EAST-facing + return new Int3(z, 2, -x); + case 3: //SOUTH-facing + return new Int3(-x, 2, -z); + case 4: //WEST-facing + return new Int3(-z, 2, x); + } + return new Int3(0,0,0); + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLifeConduit.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLifeConduit.java index cedfd89e..23f39955 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLifeConduit.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectLifeConduit.java @@ -1,19 +1,20 @@ package WayofTime.alchemicalWizardry.common.rituals; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidHandler; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; - -import java.util.ArrayList; -import java.util.List; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; public class RitualEffectLifeConduit extends RitualEffect { @@ -50,6 +51,12 @@ public class RitualEffectLifeConduit extends RitualEffect { return; } + + if(!(tileAltar instanceof IFluidHandler)) + { + return; + } + int d0 = 15; int vertRange = 20; @@ -69,10 +76,10 @@ public class RitualEffectLifeConduit extends RitualEffect return; } - int fillAmount = Math.min(currentEssence / 2, tileAltar.fill(ForgeDirection.UP, new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 10000), false)); + int fillAmount = Math.min(currentEssence / 2, ((IFluidHandler)tileAltar).fill(ForgeDirection.UP, new FluidStack(AlchemicalWizardry.lifeEssenceFluid, 10000), false)); { - tileAltar.fill(ForgeDirection.UP, new FluidStack(AlchemicalWizardry.lifeEssenceFluid, fillAmount), true); + ((IFluidHandler)tileAltar).fill(ForgeDirection.UP, new FluidStack(AlchemicalWizardry.lifeEssenceFluid, fillAmount), true); if (entityOwner.getHealth() > 2.0f && fillAmount != 0) { entityOwner.setHealth(2.0f); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaStalling.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaStalling.java index ff97dc0c..15abe3e3 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaStalling.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaStalling.java @@ -54,8 +54,9 @@ public class RitualEffectOmegaStalling extends RitualEffect OmegaParadigm parad = OmegaRegistry.getParadigmForReagent(reagent); if(parad != null) { + float costOffset = parad.getCostPerTickOfUse(player); parad.setOmegaStalling(player, 100); - SoulNetworkHandler.syphonFromNetwork(owner, getCostPerRefresh()); + SoulNetworkHandler.syphonFromNetwork(owner, (int)(getCostPerRefresh() * Math.min(costOffset, 1))); } } } @@ -86,7 +87,7 @@ public class RitualEffectOmegaStalling extends RitualEffect this.addParallelRunes(omegaRitual, 4, 4, RitualComponent.WATER); this.addParallelRunes(omegaRitual, 3, 5, RitualComponent.BLANK); this.addParallelRunes(omegaRitual, 2, 5, RitualComponent.FIRE); - this.addParallelRunes(omegaRitual, 1, 5, RitualComponent.DUSK); + this.addParallelRunes(omegaRitual, 1, 5, RitualComponent.DAWN); this.addOffsetRunes(omegaRitual, 5, 3, 1, RitualComponent.WATER); this.addOffsetRunes(omegaRitual, 6, 3, 1, RitualComponent.DUSK); this.addOffsetRunes(omegaRitual, 6, 4, 1, RitualComponent.FIRE); diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaTest.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaTest.java index 2dc7129a..2fe3fd4f 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaTest.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectOmegaTest.java @@ -1,14 +1,22 @@ package WayofTime.alchemicalWizardry.common.rituals; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import WayofTime.alchemicalWizardry.api.Int3; +import WayofTime.alchemicalWizardry.api.alchemy.energy.IReagentHandler; import WayofTime.alchemicalWizardry.api.alchemy.energy.Reagent; -import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentContainerInfo; +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentStack; import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; @@ -23,7 +31,9 @@ import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; public class RitualEffectOmegaTest extends RitualEffect { - public static final int tickDuration = 1 * 60 * 20; + public static final boolean isTesting = false; + public static final int drainTotal = 32 * 1000; + @Override public void performEffect(IMasterRitualStone ritualStone) { @@ -43,27 +53,112 @@ public class RitualEffectOmegaTest extends RitualEffect OmegaStructureParameters param = OmegaStructureHandler.getStructureStabilityFactor(world, x, y, z, 5, new Int3(0,1,0)); int stab = param.stability; int enchantability = param.enchantability; + int enchantmentLevel = param.enchantmentLevel; - System.out.println("Stability: " + stab); + if(stab <= 0) + { + return; + } + +// System.out.println("Stability: " + stab + ", Enchantability: " + enchantability + ", Enchantment Level: " + enchantmentLevel); double range = 0.5; List playerList = SpellHelper.getPlayersInRange(world, x + 0.5, y + 1.5, z + 0.5, range, range); + Reagent reagent = null; + + Map reagentMap = new HashMap(); + for(int i=0; i<4; i++) + { + Int3 jarLoc = this.getJarLocation(i); + TileEntity tile = world.getTileEntity(x + jarLoc.xCoord, y + jarLoc.yCoord, z + jarLoc.zCoord); + if(tile instanceof IReagentHandler) + { + IReagentHandler container = (IReagentHandler)tile; + ReagentContainerInfo[] containerInfoArray = container.getContainerInfo(ForgeDirection.UP); + if(containerInfoArray == null) + { + continue; + } + + for(ReagentContainerInfo containerInfo : containerInfoArray) + { + ReagentStack containedReagent = containerInfo.reagent; + if(containedReagent == null) + { + continue; + } + Reagent rea = containedReagent.reagent; + int amt = containedReagent.amount; + if(reagentMap.containsKey(rea)) + { + reagentMap.put(rea, reagentMap.get(rea) + amt); + }else + { + reagentMap.put(rea, amt); + } + } + } + } + + for(Entry entry : reagentMap.entrySet()) + { + if(entry.getValue() >= drainTotal) + { + reagent = entry.getKey(); + break; + } + } + + if(reagent == null) + { + return; + } + + int tickDuration = isTesting ? 20 * 30 : 15 * 20 * 60 + (int)((15 * 20 * 60) * Math.sqrt(stab / 700)); + + int affinity = 0; + for(EntityPlayer player : playerList) { - Reagent reagent = ReagentRegistry.aetherReagent; - - int affinity = 0; - OmegaParadigm waterParadigm = OmegaRegistry.getParadigmForReagent(reagent); - if(waterParadigm != null && waterParadigm.convertPlayerArmour(player, x, y, z, stab, affinity, enchantability)) + if(waterParadigm != null && waterParadigm.convertPlayerArmour(player, x, y, z, stab, affinity, enchantability, enchantmentLevel)) { APISpellHelper.setPlayerCurrentReagentAmount(player, tickDuration); APISpellHelper.setPlayerMaxReagentAmount(player, tickDuration); APISpellHelper.setPlayerReagentType(player, reagent); APISpellHelper.setCurrentAdditionalMaxHP(player, waterParadigm.getMaxAdditionalHealth()); NewPacketHandler.INSTANCE.sendTo(NewPacketHandler.getReagentBarPacket(reagent, APISpellHelper.getPlayerCurrentReagentAmount(player), APISpellHelper.getPlayerMaxReagentAmount(player)), (EntityPlayerMP)player); + + if(!isTesting) + { + int drainLeft = this.drainTotal; + for(int i = 0; i < 4; i++) + { + if(drainLeft <= 0) + { + break; + } + Int3 jarLoc = this.getJarLocation(i); + TileEntity tile = world.getTileEntity(x + jarLoc.xCoord, y + jarLoc.yCoord, z + jarLoc.zCoord); + if(tile instanceof IReagentHandler) + { + IReagentHandler container = (IReagentHandler)tile; + ReagentStack drained = container.drain(ForgeDirection.UP, new ReagentStack(reagent, drainLeft), true); + if(drained != null) + { + drainLeft -= drained.amount; + world.markBlockForUpdate(x + jarLoc.xCoord, y + jarLoc.yCoord, z + jarLoc.zCoord); + world.addWeatherEffect(new EntityLightningBolt(world, x + jarLoc.xCoord, y + jarLoc.yCoord, z + jarLoc.zCoord)); + } + } + } + + ritualStone.setActive(false); + } + + break; } } } @@ -77,24 +172,70 @@ public class RitualEffectOmegaTest extends RitualEffect @Override public List getRitualComponentList() { - ArrayList animalGrowthRitual = new ArrayList(); - animalGrowthRitual.add(new RitualComponent(0, 0, 2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(2, 0, 0, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(0, 0, -2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(-2, 0, 0, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(0, 0, 1, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(1, 0, 0, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(0, 0, -1, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(-1, 0, 0, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(1, 0, 2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(-1, 0, 2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(1, 0, -2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(-1, 0, -2, RitualComponent.WATER)); - animalGrowthRitual.add(new RitualComponent(2, 0, 1, RitualComponent.AIR)); - animalGrowthRitual.add(new RitualComponent(2, 0, -1, RitualComponent.AIR)); - animalGrowthRitual.add(new RitualComponent(-2, 0, 1, RitualComponent.AIR)); - animalGrowthRitual.add(new RitualComponent(-2, 0, -1, RitualComponent.AIR)); - return animalGrowthRitual; + ArrayList omegaRitual = new ArrayList(); + this.addCornerRunes(omegaRitual, 1, 0, RitualComponent.DUSK); + this.addCornerRunes(omegaRitual, 2, 0, RitualComponent.DUSK); + this.addCornerRunes(omegaRitual, 3, 0, RitualComponent.BLANK); + this.addCornerRunes(omegaRitual, 4, 0, RitualComponent.DUSK); + this.addCornerRunes(omegaRitual, 5, 0, RitualComponent.BLANK); + this.addParallelRunes(omegaRitual, 1, 0, RitualComponent.DAWN); + this.addParallelRunes(omegaRitual, 2, 0, RitualComponent.BLANK); + this.addParallelRunes(omegaRitual, 4, 0, RitualComponent.BLANK); + this.addParallelRunes(omegaRitual, 5, 0, RitualComponent.DAWN); + this.addOffsetRunes(omegaRitual, 1, 3, 0, RitualComponent.DUSK); + this.addOffsetRunes(omegaRitual, 1, 5, 0, RitualComponent.DUSK); + + for(int i=2; i<=4; i++) + { + omegaRitual.add(new RitualComponent(-5, 0, i, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(-5, 0, -i, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(5, 0, i, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(5, 0, -i, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(i, 0, -5, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(-i, 0, -5, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(i, 0, 5, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-i, 0, 5, RitualComponent.AIR)); + } + + for(int i=2; i<=3; i++) + { + omegaRitual.add(new RitualComponent(4, 0, i, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(4, 0, -i, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(-4, 0, i, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(-4, 0, -i, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(i, 0, 4, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(-i, 0, 4, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(i, 0, -4, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-i, 0, -4, RitualComponent.AIR)); + } + + omegaRitual.add(new RitualComponent(-2, 0, 1, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-2, 0, -1, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-4, 0, 1, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-4, 0, -1, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(2, 0, 1, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(2, 0, -1, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(4, 0, 1, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(4, 0, -1, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(1, 0, 2, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(-1, 0, 2, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(1, 0, 4, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(-1, 0, 4, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(1, 0, -2, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(-1, 0, -2, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(1, 0, -4, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(-1, 0, -4, RitualComponent.WATER)); + + omegaRitual.add(new RitualComponent(-3, 0, 2, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(-3, 0, -2, RitualComponent.FIRE)); + omegaRitual.add(new RitualComponent(3, 0, 2, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(3, 0, -2, RitualComponent.WATER)); + omegaRitual.add(new RitualComponent(-2, 0, -3, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(2, 0, -3, RitualComponent.AIR)); + omegaRitual.add(new RitualComponent(-2, 0, 3, RitualComponent.EARTH)); + omegaRitual.add(new RitualComponent(2, 0, 3, RitualComponent.EARTH)); + + return omegaRitual; } public Int3 getJarLocation(int i) @@ -102,13 +243,13 @@ public class RitualEffectOmegaTest extends RitualEffect switch(i) { case 0: - return new Int3(-3,1,0); + return new Int3(-3,0,0); case 1: - return new Int3(3,1,0); + return new Int3(3,0,0); case 2: - return new Int3(0,1,-3); + return new Int3(0,0,-3); case 3: - return new Int3(0,1,3); + return new Int3(0,0,3); default: return new Int3(0,0,0); } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java index 820b9d69..2b407074 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectSoulBound.java @@ -66,9 +66,13 @@ public class RitualEffectSoulBound extends RitualEffect if (BindingRegistry.isRequiredItemValid(itemStack)) { ritualStone.setVar1(BindingRegistry.getIndexForItem(itemStack) + 1); + itemStack.stackSize--; world.addWeatherEffect(new EntityLightningBolt(world, x, y + 1, z)); ritualStone.setCooldown(ritualStone.getCooldown() - 1); - item.setDead(); + if(itemStack.stackSize <= 0) + { + item.setDead(); + } break; } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java index e2176079..f7ef0e5b 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/rituals/RitualEffectWellOfSuffering.java @@ -1,6 +1,7 @@ package WayofTime.alchemicalWizardry.common.rituals; import WayofTime.alchemicalWizardry.AlchemicalWizardry; +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; import WayofTime.alchemicalWizardry.api.rituals.IMasterRitualStone; import WayofTime.alchemicalWizardry.api.rituals.RitualComponent; import WayofTime.alchemicalWizardry.api.rituals.RitualEffect; @@ -19,6 +20,10 @@ public class RitualEffectWellOfSuffering extends RitualEffect { public static final int timeDelay = 25; public static final int amount = 10; + + private static final int tennebraeDrain = 5; + private static final int potentiaDrain = 10; + private static final int offensaDrain = 3; @Override public void performEffect(IMasterRitualStone ritualStone) @@ -58,13 +63,17 @@ public class RitualEffectWellOfSuffering extends RitualEffect { return; } + + boolean hasPotentia = this.canDrainReagent(ritualStone, ReagentRegistry.potentiaReagent, potentiaDrain, false); int d0 = 10; - int vertRange = 10; + int vertRange = hasPotentia ? 20 : 10; AxisAlignedBB axisalignedbb = AxisAlignedBB.getBoundingBox((double) x, (double) y, (double) z, (double) (x + 1), (double) (y + 1), (double) (z + 1)).expand(d0, vertRange, d0); List list = world.getEntitiesWithinAABB(EntityLivingBase.class, axisalignedbb); int entityCount = 0; + boolean hasTennebrae = this.canDrainReagent(ritualStone, ReagentRegistry.tenebraeReagent, tennebraeDrain, false); + boolean hasOffensa = this.canDrainReagent(ritualStone, ReagentRegistry.offensaReagent, offensaDrain, false); if (currentEssence < this.getCostPerRefresh() * list.size()) { @@ -78,14 +87,24 @@ public class RitualEffectWellOfSuffering extends RitualEffect continue; } - if (livingEntity.attackEntityFrom(DamageSource.outOfWorld, 1)) + hasOffensa = hasOffensa && this.canDrainReagent(ritualStone, ReagentRegistry.offensaReagent, offensaDrain, true); + + if (livingEntity.attackEntityFrom(DamageSource.outOfWorld, hasOffensa ? 2 : 1)) { + hasTennebrae = hasTennebrae && this.canDrainReagent(ritualStone, ReagentRegistry.tenebraeReagent, tennebraeDrain, true); + + entityCount++; - tileAltar.sacrificialDaggerCall(this.amount, true); + tileAltar.sacrificialDaggerCall(this.amount * (hasTennebrae ? 2 : 1) * (hasOffensa ? 2 : 1), true); } } SoulNetworkHandler.syphonFromNetwork(owner, this.getCostPerRefresh() * entityCount); + + if(hasPotentia) + { + this.canDrainReagent(ritualStone, ReagentRegistry.potentiaReagent, potentiaDrain, true); + } } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java b/src/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java index 45db03ff..cb221efb 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/spell/complex/effect/SpellHelper.java @@ -466,9 +466,7 @@ public class SpellHelper return false; } - boolean tagsEqual = ItemStack.areItemStackTagsEqual(stack1, stack2); - - return stack1.getItem() == stack2.getItem() && tagsEqual && stack1.getItemDamage() == stack2.getItemDamage(); + return stack1.getItem() == stack2.getItem() && stack1.getItemDamage() == stack2.getItemDamage() && ItemStack.areItemStackTagsEqual(stack1, stack2); } /** @@ -547,13 +545,13 @@ public class SpellHelper int[] array = ((ISidedInventory)inventory).getAccessibleSlotsFromSide(dir.ordinal()); for(int in : array) { - canBeInserted[in] = ((ISidedInventory)inventory).canInsertItem(in, stack, dir.ordinal()); + canBeInserted[in] = inventory.isItemValidForSlot(in, stack) && ((ISidedInventory)inventory).canInsertItem(in, stack, dir.ordinal()); } }else { for(int i=0; i getInventoryStackLimit()) - stack.stackSize = getInventoryStackLimit(); - } + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + ItemStack stack = getStackInSlot(slot); + if (stack != null) + setInventorySlotContents(slot, null); + return stack; + } - @Override - public abstract String getInventoryName(); + @Override + public void setInventorySlotContents(int slot, ItemStack stack) + { + inv[slot] = stack; + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + if (stack != null && stack.stackSize > getInventoryStackLimit()) + stack.stackSize = getInventoryStackLimit(); + } - @Override - public boolean hasCustomInventoryName() - { - return false; - } + @Override + public abstract String getInventoryName(); - @Override - public int getInventoryStackLimit() - { - return 64; - } + @Override + public boolean hasCustomInventoryName() + { + return false; + } - @Override - public boolean isUseableByPlayer(EntityPlayer player) - { - return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this - && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; - } + @Override + public int getInventoryStackLimit() + { + return 64; + } - @Override - public void openInventory() - { - } + @Override + public boolean isUseableByPlayer(EntityPlayer player) + { + return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this + && player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64; + } - @Override - public void closeInventory() - { - } + @Override + public void openInventory() + { + } - @Override - public boolean isItemValidForSlot(int slot, ItemStack stack) - { - return true; - } + @Override + public void closeInventory() + { + } - @Override - public void writeToNBT(NBTTagCompound tag) - { - super.writeToNBT(tag); - NBTTagList invList = new NBTTagList(); - for (int i = 0; i < inv.length; i++) - { - if (inv[i] != null) - { - NBTTagCompound stackTag = new NBTTagCompound(); - stackTag.setByte("Slot", (byte) i); - inv[i].writeToNBT(stackTag); - invList.appendTag(stackTag); - } - } + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) + { + return true; + } - tag.setTag("Inventory", invList); - } - - @Override - public void readFromNBT(NBTTagCompound tag) - { - super.readFromNBT(tag); - NBTTagList invList = tag.getTagList("Inventory", Constants.NBT.TAG_COMPOUND); - for(int i = 0; i < invList.tagCount(); i++) + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + NBTTagList invList = new NBTTagList(); + for (int i = 0; i < inv.length; i++) + { + if (inv[i] != null) + { + NBTTagCompound stackTag = new NBTTagCompound(); + stackTag.setByte("Slot", (byte) i); + inv[i].writeToNBT(stackTag); + invList.appendTag(stackTag); + } + } + + tag.setTag("Inventory", invList); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + NBTTagList invList = tag.getTagList("Inventory", + Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < invList.tagCount(); i++) { NBTTagCompound stackTag = invList.getCompoundTagAt(i); int slot = stackTag.getByte("Slot"); - - if(slot >= 0 && slot < inv.length) + + if (slot >= 0 && slot < inv.length) inv[slot] = ItemStack.loadItemStackFromNBT(stackTag); } - } - - public void clear() - { + } + + public void clear() + { inv = new ItemStack[inv.length]; } } diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java index dcb522f3..6d0a7b0a 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPedestal.java @@ -1,17 +1,12 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import WayofTime.alchemicalWizardry.common.NewPacketHandler; -import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; import net.minecraft.entity.effect.EntityLightningBolt; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.spell.complex.effect.SpellHelper; public class TEPedestal extends TEInventory { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java index 138e12db..af245293 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEPlinth.java @@ -1,14 +1,9 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistry; -import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistryComponent; -import WayofTime.alchemicalWizardry.common.IDemon; -import WayofTime.alchemicalWizardry.common.NewPacketHandler; -import WayofTime.alchemicalWizardry.common.PlinthComponent; -import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -18,9 +13,12 @@ import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import net.minecraftforge.oredict.OreDictionary; - -import java.util.ArrayList; -import java.util.List; +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistry; +import WayofTime.alchemicalWizardry.api.summoningRegistry.SummoningRegistryComponent; +import WayofTime.alchemicalWizardry.common.IDemon; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; +import WayofTime.alchemicalWizardry.common.PlinthComponent; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; public class TEPlinth extends TEInventory { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java index b4047d94..ef3cf992 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TESocket.java @@ -1,16 +1,11 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import WayofTime.alchemicalWizardry.api.items.interfaces.ArmourUpgrade; -import WayofTime.alchemicalWizardry.common.NewPacketHandler; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.network.Packet; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.Constants; +import WayofTime.alchemicalWizardry.api.items.interfaces.ArmourUpgrade; +import WayofTime.alchemicalWizardry.common.NewPacketHandler; public class TESocket extends TEInventory { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java index 7be849ae..8043a587 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TETeleposer.java @@ -1,24 +1,19 @@ package WayofTime.alchemicalWizardry.common.tileEntity; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.Packet; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; import WayofTime.alchemicalWizardry.common.NewPacketHandler; import WayofTime.alchemicalWizardry.common.block.BlockTeleposer; import WayofTime.alchemicalWizardry.common.items.EnergyItems; import WayofTime.alchemicalWizardry.common.items.TelepositionFocus; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.network.Packet; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; -import net.minecraft.world.World; -import net.minecraftforge.common.util.Constants; - -import java.util.Iterator; -import java.util.List; public class TETeleposer extends TEInventory { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java index 628d8171..5bed0af1 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/TEWritingTable.java @@ -1,15 +1,10 @@ package WayofTime.alchemicalWizardry.common.tileEntity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; import WayofTime.alchemicalWizardry.ModItems; diff --git a/src/main/resources/assets/alchemicalwizardry/lang/en_US.lang b/src/main/resources/assets/alchemicalwizardry/lang/en_US.lang index 672226d3..77374fa9 100644 --- a/src/main/resources/assets/alchemicalwizardry/lang/en_US.lang +++ b/src/main/resources/assets/alchemicalwizardry/lang/en_US.lang @@ -59,6 +59,14 @@ tile.crystalBlock.fullCrystal.name=Crystal Cluster tile.crystalBlock.crystalBrick.name=Crystal Cluster Brick tile.demonPortal.name=Demon Portal tile.demonChest.name=Demon's Chest +tile.enchantmentGlyph.enchantability.name=Glyph of the Adept Enchanter +tile.enchantmentGlyph.enchantmentLevel.name=Glyph of Arcane Potential +tile.stabilityGlyph.stability1.name=Glyph of Rigid Stability +tile.schematicSaver.name=Schematic Saver +tile.blockMimic.name=Mimic Block +tile.blockSpectralContainer.name=Spectral Container +tile.blockBloodLightSource.name=Blood Light +tile.spectralBlock.name=Spectral Block #Item Localization item.weakBloodOrb.name=Weak Blood Orb @@ -203,6 +211,7 @@ item.itemAssassinSigil.name=Sigil of the Assassin item.transcendentBloodOrb.name=Transcendent Blood Orb item.itemMailCatalogue.name=Mail Order Catalogue item.inputRoutingFocus.name=Input Routing Focus +item.bloodMagicBaseItem.EnderShard.name=Ender Shard item.outputRoutingFocus.default.name=Default Output Routing Focus item.outputRoutingFocus.modItem.name=Output Routing Focus (ModItem) item.outputRoutingFocus.ignMeta.name=Output Routing Focus (Ignore Meta) @@ -360,6 +369,7 @@ tooltip.ritualdiviner.airstones=Air Stones: tooltip.ritualdiviner.blankstones=Blank Stones: tooltip.ritualdiviner.cannotplace=Can not place Dusk runes tooltip.ritualdiviner.canplace=Can place Dusk runes +tooltip.ritualdiviner.canplacedawn=Can place Dusk and Dawn runes tooltip.ritualdiviner.desc=Used to explore new types of rituals tooltip.ritualdiviner.duskstones=Dusk Stones: tooltip.ritualdiviner.earthstones=Earth Stones: @@ -368,6 +378,7 @@ tooltip.ritualdiviner.moreinfo=Press shift for extended information tooltip.ritualdiviner.ritualtunedto=Ritual tuned to face: tooltip.ritualdiviner.waterstones=Water Stones: tooltip.ritualdiviner.dawnstones=Dawn Stones: +tooltip.ritualdiviner.totalStones=Total Stones: tooltip.sacrificialdagger.desc1=A slight draining feeling tickles your fingers tooltip.sacrificialdagger.desc2=Just a prick of the tooltip.sacrificialdagger.desc3=finger will suffice... @@ -440,4 +451,5 @@ message.tanksegmenter.tankssetto=tank(s) set to: message.routerfocus.limit=Focus' Item Limit set to: #Achievements -achievement.firstPrick=Your first prick! +achievement.alchemicalwizardy:firstPrick=Your first prick! +achievement.alchemicalwizardy:firstPrick.desc=The first drop of life into the Altar... diff --git a/src/main/resources/assets/alchemicalwizardry/lang/fr_FR.lang b/src/main/resources/assets/alchemicalwizardry/lang/fr_FR.lang index 1073ef3d..5a957bdf 100644 --- a/src/main/resources/assets/alchemicalwizardry/lang/fr_FR.lang +++ b/src/main/resources/assets/alchemicalwizardry/lang/fr_FR.lang @@ -4,6 +4,8 @@ tile.bloodRune.blank.name=Rune de Sang tile.bloodRune.fill.name=Rune de Capacité Augmentée tile.bloodRune.empty.name=Rune de Dislocation tile.bloodRune.test.name=Rune de l’Orbe +tile.bloodRune.betterCapacity.name=Rune de la Capacité Supérieure +tile.bloodRune.acceleration.name=Rune d'Accélération tile.speedRune.name=Rune de Vitesse tile.efficiencyRune.name=Rune d’Efficacité tile.runeOfSacrifice.name=Rune du Sacrifice @@ -17,60 +19,68 @@ tile.emptySocket.name=Poche Vide tile.bloodStoneBrick.name=Brique de Roche-Sang tile.largeBloodStoneBrick.name=Brique Large de Roche-Sang tile.blockWritingTable.name=Matériel d’Alchimie -tile.blockHomHeart.name=Table à Sortilège +tile.blockHomHeart.name=Table des Maléfices tile.bloodPedestal.name=Piédéstal Arcanique tile.bloodPlinth.name=Socle Arcanique tile.bloodTeleposer.name=Téléposeur -tile.blockConduit.name=Conduit à Sortilège +tile.blockConduit.name=Conduit des Maléfices tile.blockSpellParadigm.projectile.name=Générateur de Particule tile.blockSpellParadigm.self.name=Auto-Augmenteur -tile.blockSpellParadigm.melee.name=Assembleur à Mêlée -tile.blockSpellEnhancement.power1.name=Renforcement Instable à Sortilège -tile.blockSpellEnhancement.power2.name=Renforcement Standard à Sortilège -tile.blockSpellEnhancement.power3.name=Renforcement Renforcé à Sortilège -tile.blockSpellEnhancement.power4.name=Renforcement Imprégné à Sortilège -tile.blockSpellEnhancement.power5.name=Renforcement Démoniaque à Sortilège -tile.blockSpellEnhancement.cost1.name=Atténuation Instable à Sortilège -tile.blockSpellEnhancement.cost2.name=Atténuation Standard à Sortilège -tile.blockSpellEnhancement.cost3.name=Atténuation Renforcée à Sortilège -tile.blockSpellEnhancement.cost4.name=Atténuation Imprégnée à Sortilège -tile.blockSpellEnhancement.cost5.name=Atténuation Démoniaque à Sortilège -tile.blockSpellEnhancement.potency1.name=Amélioration Instable à Sortilège -tile.blockSpellEnhancement.potency2.name=Amélioration Standard à Sortilège -tile.blockSpellEnhancement.potency3.name=Amélioration Renforcée à Sortilège -tile.blockSpellEnhancement.potency4.name=Amélioration Imprégnée à Sortilège -tile.blockSpellEnhancement.potency5.name=Amélioration Démoniaque à Sortilège -tile.blockSpellModifier.default.name=Modification Basique à Sortilège -tile.blockSpellModifier.offensive.name= Modification Offensive à Sortilège -tile.blockSpellModifier.defensive.name= Modification Défensive à Sortilège -tile.blockSpellModifier.environmental.name=Modification Environnementale à Sortilège +tile.blockSpellParadigm.melee.name=Agrégation à la Mêlée +tile.blockSpellParadigm.tool.name=Forgeron Outilleur +tile.blockSpellEnhancement.power1.name=Renforcement Instable des Maléfices +tile.blockSpellEnhancement.power2.name=Renforcement Standard des Maléfices +tile.blockSpellEnhancement.power3.name=Renforcement Renforcé des Maléfices +tile.blockSpellEnhancement.power4.name=Renforcement Imprégné des Maléfices +tile.blockSpellEnhancement.power5.name=Renforcement Diabolo des Maléfices +tile.blockSpellEnhancement.cost1.name=Ristourne Instable des Maléfices +tile.blockSpellEnhancement.cost2.name=Ristourne Standard des Maléfices +tile.blockSpellEnhancement.cost3.name=Ristourne Renforcée des Maléfices +tile.blockSpellEnhancement.cost4.name=Ristourne Imprégnée des Maléfices +tile.blockSpellEnhancement.cost5.name=Ristourne Démoniaque des Maléfices +tile.blockSpellEnhancement.potency1.name=Amélioration Instable des Maléfices +tile.blockSpellEnhancement.potency2.name=Amélioration Standard des Maléfices +tile.blockSpellEnhancement.potency3.name=Amélioration Renforcée des Maléfices +tile.blockSpellEnhancement.potency4.name=Amélioration Imprégnée des Maléfices +tile.blockSpellEnhancement.potency5.name=Amélioration Diabolo des Maléfices +tile.blockSpellModifier.default.name=Modification Basique des Maléfices +tile.blockSpellModifier.offensive.name= Modification Offensive des Maléfices +tile.blockSpellModifier.defensive.name= Modification Défensive des Maléfices +tile.blockSpellModifier.environmental.name=Modification Environnementale des Maléfices tile.blockSpellEffect.fire.name=Creuset des Flammes -tile.blockSpellEffect.ice.name=Source des Glaces +tile.blockSpellEffect.ice.name=Geyser de Glace tile.blockSpellEffect.wind.name=Jaillissement des Vents tile.blockSpellEffect.earth.name=Assembleur des Terres +tile.alchemicCalcinator.name=Calcinateur Alchimique +tile.crystalBelljar.name=Cloche de Cristal +tile.blockReagentConduit.name=Relais Alchimique +tile.lifeEssenceFluidBlock.name=Extrait de Vitalité +tile.crystalBlock.fullCrystal.name=Fragments de Cristaux +tile.crystalBlock.crystalBrick.name=Briques de Fragments de Cristaux +tile.demonPortal.name=Portail Diabolo #Item Localization item.weakBloodOrb.name=Orbe Sanguinaire Affaiblie item.apprenticeBloodOrb.name=Orbe Sanguinaire de l’Apprenti item.magicianBloodOrb.name=Orbe Sanguinaire du Magicien item.masterBloodOrb.name=Orbe Sanguinaire du Maître -item.archmageBloodOrb.name=Orbe Sanguinaire de l’Archmage +item.archmageBloodOrb.name=Orbe Sanguinaire de l'Enchanteur item.energyBlast.name=Blaster à Energie -item.energySword.name=Lame Liée +item.energySword.name=Lame Sacrificielle item.lavaCrystal.name=Cristal de Lave -item.waterSigil.name=Symbole de l’Eau -item.lavaSigil.name=Symbole de la Lave -item.voidSigil.name=Symbole du Vide +item.waterSigil.name=Emblème de l’Eau +item.lavaSigil.name=Emblème de la Lave +item.voidSigil.name=Emblème du Vide item.blankSlate.name=Tablette Vierge item.reinforcedSlate.name=Tablette Renforcée item.sacrificialDagger.name=Couteau Sacrificiel item.daggerOfSacrifice.name=Dague des Sacrifices -item.airSigil.name=Symbole de l’Air -item.sigilOfTheFastMiner.name=Symbole du Mineur Prompt -item.sigilOfElementalAffinity.name=Symbole d’Affinité Elémentaire -item.sigilOfHaste.name=Symbole de Célérité -item.sigilOfHolding.name=Symbole de l’Emprise -item.divinationSigil.name=Symbole de Divination +item.airSigil.name=Emblème Stratos +item.sigilOfTheFastMiner.name=Emblème Spelunk +item.sigilOfElementalAffinity.name=Emblème d’Affinité Elémentaire +item.sigilOfHaste.name=Emblème de Célérité +item.sigilOfHolding.name=Emblème Possessif +item.divinationSigil.name=Emblème des Pythies item.waterScribeTool.name=Craie d’Inscription Elémentaire: Eau item.fireScribeTool.name=Craie d’Inscription Elémentaire: Feu item.earthScribeTool.name=Craie d’Inscription Elémentaire: Terre @@ -78,24 +88,25 @@ item.airScribeTool.name=Craie d’Inscription Elémentaire: Air item.duskScribeTool.name=Craie d’Inscription Elémentaire: Crépuscule item.activationCrystalWeak.name=Cristal d’Activation Affaibli item.activationCrystalAwakened.name=Cristal d’Activation Eveillé -item.boundPickaxe.name=Pioche Liée -item.boundAxe.name=Hâche Liée -item.boundShovel.name=Pelle Liée -item.boundHelmet.name=Casque Lié -item.boundPlate.name=Plastron Lié -item.boundLeggings.name=Jambières Liées -item.boundBoots.name=Bottes Liées +item.activationCrystalCreative.name=Cristal d'Activation Créatif +item.boundPickaxe.name=Pioche Sacrificielle +item.boundAxe.name=Hâche Sacrificielle +item.boundShovel.name=Pelle Sacrificielle +item.boundHelmet.name=Casque Sacrificiel +item.boundPlate.name=Plastron Sacrificiel +item.boundLeggings.name=Jambières Sacrificielles +item.boundBoots.name=Bottes Sacrificielles item.weakBloodShard.name=Eclat Sanguinaire Affaibli -item.growthSigil.name=Symbole du Bosquet Vert +item.growthSigil.name=Emblème du item.blankSpell.name=Cristal Délié item.alchemyFlask.name=Fiole à Potion -item.standardBindingAgent.name=Agent de Liaison Standard +item.standardBindingAgent.name=Agent Sacrificiel Standard item.mundanePowerCatalyst.name=Cristal de Puissance Commun item.averagePowerCatalyst.name=Cristal de Puissance Moyen item.greaterPowerCatalyst.name=Cristal de Puissance Supérieur -item.mundaneLengtheningCatalyst.name=Catalyseur d’Allongement Commun -item.averageLengtheningCatalyst.name=Catalyseur d’Allongement Moyen -item.greaterLengtheningCatalyst.name=Catalyseur d’Allongement Supérieur +item.mundaneLengtheningCatalyst.name=Catalyseur d'Extension Commun +item.averageLengtheningCatalyst.name=Catalyseur d’Extension Moyen +item.greaterLengtheningCatalyst.name=Catalyseur d’Extension Supérieur item.incendium.name=Incendium item.magicales.name=Magicales item.sanctus.name=Sanctus @@ -106,41 +117,44 @@ item.crystallos.name=Crystallos item.terrae.name=Terrae item.aquasalus.name=Aquasalus item.tennebrae.name=Tenebrae -item.demonBloodShard.name=Eclat Sanguinaire du Démon -item.sigilOfWind.name=Symbole du Tourbillon +item.demonBloodShard.name=Eclat Sanguinaire Diabolo +item.sigilOfWind.name=Emblème Mistral item.telepositionFocus.name=Focus de Téléposition item.enhancedTelepositionFocus.name= Focus de Téléposition Amélioré item.reinforcedTelepositionFocus.name=Focus de Téléposition Renforcé -item.demonicTelepositionFocus.name= Focus de Téléposition Démoniaque +item.demonicTelepositionFocus.name= Focus de Téléposition Diabolo item.imbuedSlate.name=Tablette Imprégnée -item.demonicSlate.name=Tablette Démoniaque -item.sigilOfTheBridge.name=Symbole du Pont Fantôme +item.demonicSlate.name=Tablette Diabolo +item.sigilOfTheBridge.name=Emblème du Pont Fantôme item.armourInhibitor.name=Neutralisarmure item.cheatyItem.name=Orbe de Test item.weakFillingAgent.name=Agent de Remplissage Affaibli item.standardFillingAgent.name=Agent de Remplissage Standard item.enhancedFillingAgent.name=Agent de Remplissage Amélioré -item.weakBindingAgent.name=Agent de Liaison Affaibli +item.weakBindingAgent.name=Agent de Sacrifice Affaibli item.ritualDiviner.name=Sourcier à Rituel -item.sigilOfMagnetism.name=Symbole de Magnétisme -item.itemDiabloKey.name=Clé de Liaison +item.sigilOfMagnetism.name=Emblème Magnétique +item.itemDiabloKey.name=Clé Diabolo item.energyBazooka.name=Bazooka à Energie -item.bloodLightSigil.name=Symbole de la Lampe de Sang -item.itemComplexSpellCrystal.name=Cristal de Sortilège Complexe -item.bucketLive.name=Seau de Vie +item.bloodLightSigil.name=Emblème de la Lampe de Sang +item.itemComplexSpellCrystal.name=Cristal de Maléfice Complexe +item.itemSigilOfSupression.name=Emblème de Délétion +item.itemSigilOfEnderSeverance.name=Emblème of Ender Severance +item.bucketLive.name=Seau d'Extrait Vital item.bloodMagicBaseItem.quartzRod.name=Bâton de Quartz item.bloodMagicBaseItem.EmptyCore.name=Cœur Creux item.bloodMagicBaseItem.MagicalesCable.name=Câble de Magicales item.bloodMagicBaseItem.WoodBrace.name=Attelle de Bois item.bloodMagicBaseItem.StoneBrace.name=Attelle de Pierre item.bloodMagicBaseItem.ProjectileCore.name=Cœur de Projectile -item.bloodMagicBaseItem.SelfCore.name=Auto-Cœur +item.bloodMagicBaseItem.SelfCore.name=Cœur des Egotistes item.bloodMagicBaseItem.MeleeCore.name=Cœur de Mêlée +item.bloodMagicBaseItem.ToolCore.name=Cœur d'Outillage item.bloodMagicBaseItem.ParadigmBackPlate.name=Tablette du Paradigme -item.bloodMagicBaseItem.OutputCable.name=Câble de Sortie de Sortilège -item.bloodMagicBaseItem.InputCable.name=Câble d’Entrée de Sortilège -item.bloodMagicBaseItem.FlameCore.name=Cœur Ardent -item.bloodMagicBaseItem.IcyCore.name=Cœur Gêlé +item.bloodMagicBaseItem.OutputCable.name=Sortie Maléfique +item.bloodMagicBaseItem.InputCable.name=Entrée Maléfique +item.bloodMagicBaseItem.FlameCore.name=Cœur Incandescent +item.bloodMagicBaseItem.IcyCore.name=Cœur Figé item.bloodMagicBaseItem.GustCore.name=Cœur des Bourrasques item.bloodMagicBaseItem.EarthenCore.name=Cœur Téllurique item.bloodMagicBaseItem.CrackedRunicPlate.name=Tablette Runique Craquelée @@ -154,6 +168,11 @@ item.bloodMagicBaseItem.PowerCore.name=Cœur de Force item.bloodMagicBaseItem.CostCore.name=Cœur de Réduction item.bloodMagicBaseItem.PotencyCore.name=Cœur de Puissance item.bloodMagicBaseItem.ObsidianBrace.name=Attelle d’Obsidienne +item.bloodMagicBaseItem.EtherealSlate.name=Tablette Ethérale +item.bloodMagicBaseItem.LifeShard.name=Eclat de Vie +item.bloodMagicBaseItem.SoulShard.name=Eclat d'Esprit +item.bloodMagicBaseItem.LifeBrace.name=Attelle de Vie +item.bloodMagicBaseItem.SoulRunicPlate.name=Plaque Runique Spirituelle item.bloodMagicAlchemyItem.Offensa.name=Offensa item.bloodMagicAlchemyItem.Praesidium.name=Praesidium item.bloodMagicAlchemyItem.OrbisTerrae.name=Orbis Terrae @@ -163,12 +182,55 @@ item.bloodMagicAlchemyItem.FracturedBone.name=Os Fracturé item.bloodMagicAlchemyItem.Virtus.name=Virtus item.bloodMagicAlchemyItem.Reductus.name=Reductus item.bloodMagicAlchemyItem.Potentia.name=Potentia - - +item.sanguineHelmet.name=Casque Sanglant +item.itemSeerSigil.name=Emblème de la Vision +item.itemFluidSigil.name=Emblème Fluide +item.multiTool.name=Dynamasse +item.itemCombinationalCatalyst.name=Catalyseur Combinatoire +item.sanguineRobe.name=Robe Sanglante +item.sanguinePants.name=Jambières Sanglantes +item.sanguineBoots.name=Bottes Sanglantes +item.itemAttunedCrystal.name=Routeur Alchimique +item.itemTankSegmenter.name=Segment Alchimique +item.destinationClearer.name=Détergent Alchimique +item.demonPlacer.name=Cristal Diabolo +item.creativeDagger.name=Couteau Sacrificiel Créatif +item.itemBloodPack.name=Pack de la Lettre de Sang +item.itemHarvestSigil.name=Emblême Déméter +item.itemCompressionSigil.name=Emblême Compresseur +item.transcendentBloodOrb.name=Orbe Sanguinaire Transcendante #Creative Tab itemGroup.tabBloodMagic=Blood Magic #Extra Strings bm.string.consume=Exaction bm.string.drain=Ponction Veineuse -bm.string.tier=Tiers \ No newline at end of file +bm.string.tier=Tiers +bm.string.crafting.orb.shaped=Fabrication Orbée Formée +bm.string.crafting.orb.shapeless=Fabrication Orbée Déformée + +#Entities +entity.AWWayofTime.EarthElemental.name=Elémenterrestre +entity.AWWayofTime.FireElemental.name=Elémentaire de Feu +entity.AWWayofTime.HolyElemental.name=Elémentaire Sacré +entity.AWWayofTime.ShadeElemental.name=Elémentaire Nocturne +entity.AWWayofTime.WaterElemental.name=Elémentaire d'Eau +entity.AWWayofTime.AirElemental.name=Elémentaire d'Air +entity.AWWayofTime.Shade.name=Ombre +entity.AWWayofTime.BoulderFist.name=Poing de Pierre +entity.AWWayofTime.IceDemon.name=Diable Glacial +entity.AWWayofTime.SmallEarthGolem.name=Petit Golem de Terre +entity.AWWayofTime.WingedFireDemon.name=Démon de Feu Ailé +entity.AWWayofTime.BileDemon.name=Diabile +entity.AWWayofTime.LowerGuardian.name=Gardien Inférieur +entity.AWWayofTime.FallenAngel.name=Ange Déchu +entity.AWWayofTime.MinorDemonGruntGuardian.name=Gardien Démon +entity.AWWayofTime.MinorDemonGruntGuardianWind.name=Gardien Démon Aérien +entity.AWWayofTime.MinorDemonGruntGuardianFire.name=Gardien Démon de Feu +entity.AWWayofTime.MinorDemonGruntGuardianIce.name=Gardien Démon de Glace +entity.AWWayofTime.MinorDemonGruntGuardianEarth.name=Gardien Démon de Terre +entity.AWWayofTime.MinorDemonGruntWind.name=Soldat Démont Aérien +entity.AWWayofTime.MinorDemonGruntFire.name=Soldat Démon de Feu +entity.AWWayofTime.MinorDemonGruntIce.name=Soldat Démon de Glace +entity.AWWayofTime.MinorDemonGruntEarth.name=Soldat Démon de Terre +entity.AWWayofTime.MinorDemonGrunt.name=Soldat Démon diff --git a/src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphEnchantability.png b/src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphEnchantability.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7a925cfd7ba69e6818d452260a572accf3f043 GIT binary patch literal 667 zcmV;M0%ZM(P)%YEF}JlQ%o|MGiOGg zJh~t%?gWu)1JHRu-R@DF@_Lg3~6&YHZ%maulF@*h#G>5>dg5TfH*zbDs5PNd{{|Uc}iv~ zbc(1bwcK9L?nhoG=1bS#iy#7sjhGjof!@d_#(Hx(r<#Dni)$-QpzT6>N+1yds7keQ zuV!|*hy;~v4iN&w&r7AHp;bnkS$GE^0uYt3_@ew<<=O}|dJjYcL8FDvN|D)cI#HD} zvP74o4@>G2;SNu*rht%4t9y5n*QM1CPF;Qrgb2W_migx?)!89H3_>cw*6gdCT`~$D zgOMdVopcABqGHb9+g%YfJ1+r*fSe%$;ACkL)gaaGT>=hfx-qK=zArhww7ORXB5SM_dd_eFuLrfUGRyjiJ}t( zhZKp#5EruXLo{s{jWiOeFvwUC8vlF^_AK2JHKK7+eR<#ax%YN4bkVas$vHXs<;dpR z52E581Wju|Cu`jp0Q9=4Ka=@S$0ujGZtT*f?z^+EnpH*I0V}PQVrG#PO{z&n_;6NF zD%3nqKYZ==JJ!adt9wmds;Z=%QqunAo+kZ$?yr$*gsfF^bGr-SFM$Hv^a1Z`7K{cdl@B626^PA;tj3W!L+%8P|!cJJU8fJivMUfKQm z$L)Y$u8w}Y_N=Z$gbaie5swFBkj?phAgP+i^3K59*jYVV-nv2H0wfu&&%U43Uq08R zEl-Ds%g+WmC)H%(-jvPZ3yT1jpWGB>Qj!AUkrEN%5H4o&Xs}oP(>z%^T-_Z2ceZYh zRt{8&AOj+*N!+mrE4De@PY~ftTXS_l1aNn}s7c`>AYtU3GBR5Edv$w|yGplne%|)` z$<2HHBuEe!lsp1rdtrZRXV6p8#QC?js@j~js_gFWd<2i@#}QmmYR;RD8{@@4=TI%J zZQtIv;x1t&0u(gqy@T7+|H){5_W0!ESK%XBF2MGWG002ovPDHLkV1l-sMD+jw literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphStability1.png b/src/main/resources/assets/alchemicalwizardry/textures/blocks/GlyphStability1.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3a8245551422ec5bfbbc4031c148c7db79f2fb GIT binary patch literal 572 zcmV-C0>k}@P)pR=GHC5ISN?PkFx;avc~P2{GU&sAM-ft-MjV6 z7Aq&l?6O;tTPuG8MM*?KR9M69md|SwQ4q&JlW4oXYNb+)AjN|xbC5>rp#`DG z+KX5JnjZEa@UIX&s$kZhTJ&Z@>jqq*M+;&>{D~oIldp&DE}QMvCLs2*0}qxr^JYHt z-kW)Ak~mGNaLQ5wlmI2bsRNvu#CY2bfXkpmpcXj*KGeGmfUkdG0IL%;H_Lazj#)Z! zQ?h*U8t4G*M&!g&tZc*Ede;C^0I_4HLHxax@i}q??ZD`msTMhE&QXip2uvcsflHu+ zdKcQm;CuBhaquIuYo@D_W5GEVB1hXy?Z8HNpePW)uO_y1S4Vc|6PO;tln2x2V0I4P zFOx#7X0mJt2J3&LZ~}hBb{58qp7{QW=XGymgT%Ji>*0Cci2hEje>sM)+p#SnND`9p zeLwxqj$}Rr7xLU2!@AuP-)tcZEnk072^cgtJ74v+q3}43$UZ0WFJOJZ0}bw@YuBA-XPovH zQ4-t(OS)es!2UW~i5x4=u^c(3y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j2k-6f_fA+H?z%TPuG7Wl2OqR9M69md{GVKoEz&O)8WYQ4zt57f;Elmp+5gK9tCU zK8hfC5X3Eb@y|su1usf_^cn1-5lp6snAX-LCiT#RyRb0q%>MFiW@lI>BCK*ataw-e z3t#~(zz=|aPnB+sg9jyVFXiL2v{l-QQ>WL3p-G(Wj;K7bn^S)!8#_>M!1^}qdHJzL z+O;$w8YGUPfzg7_0^Zto$%3TeV7=5 zK|}-*L2Es=zt6n&z#vaoNZI(s^}rx=097}SK*aN8QKPI*CO}z%z#y+A5P?Ce{ynX= zOaYeJoI?CHg-d;3!Z?oUwvT9T!o}S&Q4}q836+Sq&Y zdLh2I<$K{v#|(y@4cx3kfys-^lD=?Ea=2wDKGkb!$1%@+N6qt}ojotD*!lm)r7!9N zi3(1Fb0usJCi_iN;FMQ*?>Mi?&f!4c29=se{p=rlRCb0(q*We1(6VGk=#6tLIOeNO zcqu!ji0yP`>s3=`@$%#^F~JNAX5?<16YjBGbe-I>7dDlXb~OJxFnQhUI%+YRmbo4Qav6B`FJg z;$tl@Wn^fuvN*bQ#S3@HIA^=RD&?IRk>1V8w>_*N$ny9v15r7Dh8fG48Sb3iQm1x9 zU*g7DX^GyB)9&(1l;3V^d*A-!?dsN`b2I!elzopr06(F|9smFU literal 0 HcmV?d00001