From 1459c9c0573f89b21f3f86cc3afa0a8a145b649a Mon Sep 17 00:00:00 2001 From: Olof Larsson Date: Wed, 2 May 2012 04:45:10 +0200 Subject: [PATCH] Reworked chat completely. Added Herochat integration. New tag-parsing system. Non-monitor-breaking relation colored chat. --- lib/Herochat.jar | Bin 0 -> 108398 bytes src/com/massivecraft/factions/Conf.java | 29 +- src/com/massivecraft/factions/FPlayer.java | 19 - src/com/massivecraft/factions/P.java | 14 +- .../massivecraft/factions/cmd/CmdChat.java | 77 ---- .../massivecraft/factions/cmd/CmdChatSpy.java | 40 -- .../massivecraft/factions/cmd/CmdHelp.java | 2 - .../massivecraft/factions/cmd/FCmdRoot.java | 4 - .../integration/EssentialsFeatures.java | 12 +- .../EssentialsOldVersionFeatures.java | 12 +- .../integration/HerochatFeatures.java | 71 ++++ .../integration/capi/PluginCapiListener.java | 10 - .../listeners/FactionsChatListener.java | 350 +++++++++++------- .../factions/util/SpiralTask.java | 2 +- 14 files changed, 316 insertions(+), 326 deletions(-) create mode 100644 lib/Herochat.jar delete mode 100644 src/com/massivecraft/factions/cmd/CmdChat.java delete mode 100644 src/com/massivecraft/factions/cmd/CmdChatSpy.java create mode 100644 src/com/massivecraft/factions/integration/HerochatFeatures.java diff --git a/lib/Herochat.jar b/lib/Herochat.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1f5773911fae12e5788fbd98a9fa670d4bb28aa GIT binary patch literal 108398 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

kb*hXr z=VYg`oZ71^bxcqqi)`X|-z?TKwS-UB!GNbJv)cvUAIctiY{1aQsPYaT$#7p<2GkoT zUr!$<`4?R`zw7)C{;O2B@0x1WZ19UCC9-&?Z?g<+Q?J*V1Zn|AwH;nE?Bwo^BGT6F z7?|nsgnO%C+2W1aT94+#HmI~Xr%}Fs*wNoXT^r3Gny{k}|6Sj=(U#(h;Cm=&GjL#! z)oRaBANj+bQ$dvR>K>D52+W-5>9xP<)b|%>B7J@}t)hk_wiE{6etK8(5?ic=Zt#y} z5h1>Qi(ctU!OSH<=nnUqsx(3!82$s=O4yVVV>hl;#={VJ9Gs0ed_;`#>acnpCpK>Y zS)2i~OoHE0io5}U^acV$0yF^%mh>Iff-AsOjMn@PhB(8gN^F7R9r-iEu53hQIXCLz#1HYR<#YEGzfD13g)sh|J z?4G&G7NmmD(rXogPt6>ODijW?@L$!ZbMYX557Vpc`z9xBdl^on2S%eQMj{z>vJJmq za>N5amka}wM2+gs2bZ+A8C6rg(mJn$E+6a*mEV5sKu)&ck4~3hiccvk*qn8_fd%Fb z6@F3Vd;&fHM~xtwIt<*I(281Y*@f|pTG+`}WV#axP_PwHQ~=uPqWd@PTcT=Y5Yi#D z#t0A_RFW0?t09*?{tKkzI%V%j`W8AnF}hVm@2$DIqiwDnFyxmLuxs;`yWek&%?){IP2W?b8V2 z9atT6Q_~Eas9W@o0}V;G;pnHMzV;`nSxOxFv7_dY=%(iqiE2aaGhq5E^q*Ij{eQ!} zK|~MSU)uQ7mp1-y7}BNfEdO(M?LVdQBxQizoC2CJJtK?;-W1pBhI9MaxJvu(24++o zlcWMAEZfBZKW&O5OMB8%BJ;b1uNtax6Zri>)jh7 zH&gYNCl%Wj ztKw9u!b;w`p1s%8-nI6ZeYZA#!Wh>%u6`c9_vw46cE1&5k@-v7N!rPp&WJZ!MiGts zFOV3#oFGV&vEEcIP&4%o88V#VXRP4OzaGZ`ED$95p(e3K`4xL5`w}p4bq9hZD^IJe zTiodBZLRJ<-RL$<7e4Tx-fSeO=4iaao5TGXzbOw$Gv@`XvTc?5I%JTz9U#x&ZZUdE zhKi&lvu8*6rD>K}X1A4#cwD8zmx$u5<}KYE7*4T2?DKHeal zg=Nhp{*zS?A_nLsl|)h483`b7E*VeY%r#BO$_O`Zb z?&T(;;`S1?w=%ZBbi9B0bSusrQAOavEVE~RE zU5We6O?`m;DKL{kMoO5BoWe|R0%Rk^bXkd$a-NBkDw4)NndyuK;?a(iL%f(Q#kp8( zWDc5B=q9-y36@fvlfrXpnpOi6hK|+4)i5iX{dpJd|CQ92A<&eM zyM>bR-HPNLEEl3#}o*QAj1zY7y@$ z0T7L@CwJgzDjaX@?gdQAszIE?j>sRc(#Jq+NXEh4Ju7geDCm&pllV@SPeVyFx>%&QK>c+a(8#N+C))!(do_t0kre?l3`(=u93b>dl7UU28# z)AWmOvF4xI8&M11R>y!> zeX$w$0I?(eyC`psaXark)s%avALf+@wiE7Ts_?%UdINIKzLucb=Gwl-$9mo8$3EQ$ zM0X|s4ILzLdRF9xQK%0f6;cLKAJIYeBKEVJ@# z?u;MlmN4mBTXp8G&kP5%F;Dw@llw-}PU&blE(t8Pv~-#`{NExtAY|c5vP(E{R<}wl z56d|%Hi@N2xl>6hfM1e&X3RMi0yxEeM_r+O{bFqUI-pP$@+^W?)#Ax>WTD#|gq5kt zHS9dwgM}|etrGln^GwvL=+6jbc1DA;r>J&Sm&Bu@c%hwjJTr3JSo$L~aDp}ZESzJg=p=J5s;N=&Vy!Q1>J z44Zf}S&?Yq50-cB?O_r3U@S%f5v`fCsK|4G`FQO^@ z$2s_Z0l@dHxJls>YU{!o71A9-;EI(tgis1mbm3@b2m{?3BedQw(G*e1f}PTPXEAeG z4P#cM-&_x{*bUC8duihk6l-y3%!7M@7lK9LPI`82M%I`9@YJWUk^5wj6b{4Hl-iD0 zDF|2L+;q*Q9uY=Y3Cq_v=P6}{*k+Qk{u}z|R!BYt550$e=o#QAFed-CaU*co2T`?W z0SB|8aER`>k)Ga%qG6iOaLg5YI8CTzQ7o ztb}gw(P>T7ozs`y(HihP>@Kz(75+T6QCmM`ihP;?c33t01zAiK6tKe@wP?#dRZZ>9#G6;em2Wy<$I!w42AH7!*$@0~N`&JSuI__Y zN9rr_80EcBw32u?(5W>V6#18cfS~R8HfXmsG!?5-fsT6q_aJK2$E3XRt>W#s|5T4T zzbtOKf;0no5Nq`hGy^#sGrRxN4D7r?e0`vjr>7Mw-wr3T_IHcmR7cF@w4gReYEE)x zRnFjM2WH~6sVj1vWVSX>- z`KU1xNt&DVAk^P80f;1{{NgMOq$Gng7$*)N#tt8UDd8T^sPo-$ zCP$aR&u9V=A)3)C-YsGiRMAH6{I_KgD<)cx8df)2ERWQgeq!DT*bjG zLr}YAIE8k}tm+b6Wqsbk0?aj=p4Bm?Pge6+M<&a+{6=z2ZWkq2Y9s8XNMU{mvR~vwh>)#oFP5 zOadGd;hU3Ail7i2QMxcmFcjLtsh!0jpViT3V=m+HBmAnsljsuD4ilAjH*cv3AIjn3 zSmUeX9xF>62P%J)3M!#fq-KdOEJR0SW$>f4kGT?6;{i;intwr{;>2$awFec8UvuEdWZE zvVHuyUyF1A#{J&N7(igG9I2s(GmcQvLs~%31@$wHA>9apa*M^qWv6JYOPTHvK6@>{ z*hUBWVLZ(Da2)hTx#<6Nvo-N*A-iS#`mrV__|iad(a0Y{dnSBx&DKkKiyTB%EMPnMDbm zN7$1bFy7NMZMnPLliTiU*1M##a`tkxLXpRj#&UBHEe^lcBzQ=;N)8XfPv}(N{}iCW z3!YssmB9HSj~@Q#`JKua3w)t-VL&3Le z{`{s;xFeC^=;ywny(kg()t}H`Vq%g)!09H7>Q3(D)8*bLB5s;fMQyh4h6k6oaC;0t zN%o@Lyml_vb~_i?F=1zJP;#k|znAT9M>~PVw{#Hz?d72Y*0A0(%BMAnQ5i)SiP`df zL}M2tkfx@j#1T^O5F^?}Ve0*Bno;9%zt*gpT*f#ZXX8mXufUPAE8rx?eu}=4Zx>5U zU~Kw)&E*z9J0*e2vA|Ait**eMphFX=esUy9sCjMkr=elf{na}81#+R}7m{E&f(HH0 z?6=4qpjA7zik(bXHsdlIuhU5g4|sK-$?f+9UbCBtQ<7Wi^Cf5v+jsUYUyd9Gkn|ii z0*ShmfT0m@qC>%$7-F8-{L@*MV=j2}dK%X5SeNEnRZZwXe-?eO>6^riz?T{lPdkOk zx5oHDs2%tZE$H!EZ{Pk5%O_H4vi&u2V4j2lDJr#yw0H;w5EWctO#BYK^h3B*aG6Q` zSRVGES^OXwl3eFGVBH})-;Q|6jYd=(3NkKofhic{u|ODoy9xEWwb~oZCXlWV$8$e` zFtd9g#X}&<(1a$qEF{Nptk|V?%N;gGwMd3OK3rBi86X*|7Rg)+Oph6+p^t+yl5*AM z3`R(?wuWs@Yh|Et%UgQSC2 zwG*K12W{C+$Q*|)N1GsLM?+>eLNOl;F(Q&iQC?wv;J2Nlso&^Pe#5&Q(fjzvZMcPP zJW$@BICUa86@C2_#`=gdu!r+(LAf%aTAU>m$&M?D=!-Sd6U@L?EK^4-WN)V0{vqsj@%n>o_xw}e3!*5_!d9QbnEf$*{?(5^S_ws zH?!O=aF8Ss^3QO6c?*;Otr7XRCXuJA-~@7R23&Ujk8=~;#^$A3CI!<~hl)(3~$A?OOyJF$qxl+ZQ1K3uh@YM5X9fUKZEZlO;Q!QGXyWxHFt3 zf&#r(kx7~CViCx{6f2a)ylLgmuVQAzmN)n^Ppip7&oUK1Fc1Szq6AkRmV z`Y2tv##@k57tX!+o_i_ZeFy>V^;5Dqr5Dam$MHU~pEdi+d+;1uil|Cgz^?HShG%v6 z6Ym+bZ+scW4}BXk=D6c;0ZEWc>y7mX+3^Ui9_lK~i$mq{4Ek2uFMb{bT#ZxC5m2Uc z|MU3n$<6uOer!d$q=3P9V@!}k=?#3o(8cv1hV?cm#E~r_58MnJ zCA!v*+Qpe~vD%8%eYx{2*je5c`-!xyG7*q6Om zEt-Snpe;2o{B8V#_n*IrLiNp&$sjJz3Di;Z4{-ed`_=llxN!0R@CBa9S&HT8qHqLj z;9$$CsGda@4k*;+K?pIB`sEkw1lcpGQ$U5CC&)1a=Mjvw;t*VF7;vIT`~mOxukTX) zllT2HqH;27#~b;-T=xQQKW<)c{C>Ut{+01%W9EFOu6w31onwFMtdm2gf6)0@C(VB>+Uk$tR` zrUgiEE@@V9QB$UXF-8?Ratp2d+OZ9c7DH4uWFM-R-P`K zTE&F%LQtmTBlwmC1jd8(9j(;4_&j=8n)SA8!qBpDkfaEI7ch+6s+J4?AFdaO4Q7A;x`njaa;{4PSW!hxgxD z9DQUr??G&SMx`Nsd=u2>@ls`xp zi|(ncwL$>oOf$^1w|ePC`wqP$$^!bH;=MKd0{9dK==dXV?yCA-5%M)WPW#Z$ca+yT zyq=dVfIBIG;J6DU2r57+pn1kOQdUOyk3s{0GzCEakWBInxTkgA?2G^FFJ8_|&n4+H z_-S)&p_PI1)}%t(lcXFaFs+3MH9-HE7odN_Mlnz2?rTNhs1hltOv^REta*P0DHo41 zS4@b4wFkLnhH*rZmOB9s5I8OYnZf-Vj)?IHFcQMY{TIIIP*p+qd*tp$?>VA6#3>7e zV?}(71D^XRHYL`sroDh4ZcPXzE+)sW3eB!gNrh?q;$>%7T4WQ4glrXlq`t$%vP|^| zXEIqj)y7gXmR;9kLghs)9Olo+RySFbk+m}z+K|p0_}`q^wSBv5WJr-}Jm?Ruqk=Oe zy1&)eE_5JC0PHI!s2QHI;@mN(pp_}t%jXfO_{4&%yesj3=7-@V)HVK(hoZ=bAk6Ub z{k!#Xm}oqo_2n7q_RBiB_{0R11t`WKXX5U8XVcx4+b*f#UTI<`RBYchS;D>JMe+(+%T@*enT=*^Fay3>fpTl${JCnIX!w;Qm^h@3@QG0NCJIZzY z=&>9bz)e0oWJ)^i``!(p`bI8sNF0G@XMvRF8HATjomAj^84e7|0M%C~X=GMpu^%ys zTXKIb7CncUq_zbDjo81Qw8pe1j>Fz9Y0H>lpvRU--Fd4of5WE5T#Qa0n=su$_<%7C zDbv}dfQ`IEu?yJ6NF@rDIdzho{But$yN)t%G}!vSKcOBz-?) z);#BnkWHJZu|?KU`TfUC9~QTi4ZA@WM}3~>!nb?64W<4gil;k1Xk|#4y+GJ4`1HCA zi@E79J*CUw6g-an!HT-#syQ>mPe7%qP&wP98Pv#Ob2aNhr=5W@bLCGB36b*&d9ZB_ zz*+5QVerx3SfMW)455TT!5S<3Wc54UcMYD23=LV8$j)L~Hw6!Hpx{Hp%52odD__fZa8NvtV^T%wvd_+{K##9 znyD>7JGz2(c#y29zL++lya`Dy1v-<>FB1YCYEyxz4r1`AE8bX5d-4HJ6mMh;i**$` z)0W6L@z%eg6r{zZ?dmgqk~rPt15n$&-%=zfHh!)Raz3D_mr)$w+8eiu6MgIJ^h$eW z`p-e9!t$fM0HlS`|1*9<-p0-SKeUiEP$Z$66^NghlKHWGtSn1h1~xuS&E~K!;asB^ z)2Rwj$VivvvaEusm?9Bi=b4)0$wEJKWF33+=sr9}uJ|32Q55dUy;H6TdD}tsKD!5+ zdLn;=o_ndN9DH@6|N6h?pZWYa3#i|FN~Ze^cwr49c&>?6|FWHwUIclkiJy{$vgg8b zjz3``KRF3t#0m=LmkK^Q`0~>P%6JG7v>^)dCQ^i8iApi`7Mds#0p17mf|l)JYiObe zGVv7_eKuBAnS_X{-p9#zadn*vG!^T7rh?GRj6%yr4Nl? z*3f_&m%ATUDA$^6qR7vw3XbqqncW4bm@bxCe_?{@Wb)LRij^yo)fLEF0EM4^2lkC@ z`9qg?HZ}ua(bxnBTLG@tHMfjgbyB^5owsVoRX*$T*kBu)Znbqv-iJ1;ljWh=SQKnP zU{(!JEso9Xl`Nqak;;+I>f~sIgBlmBL5Z9ML&RilKFdRSy5)vynX;m#(~p@d&)cX} z&BouoBq4>;2x8N$JFk>FkEs~a>m^)lwRCt4TfUt6jT~xizbI#AbgDC{my)F!I4iD?-2$oI4BD6<`Fc`g(8g;#%(7}_Ow(A%g^Dpe*n z*rYxUpQO}zKmoD0g(4;_?2O`r=0zbP*D?4v`bCL7lhf5EdI}2gm5>wRp*u{AhDXx8 z+m}4?XFUD#+mW^`xlGwK4h@X{9O@$HiU;Ym#Nq(nJ8-d-!aC}y-?hy6b*U0VIxGX6 z`M3#|GE}dxj{+sd?s`ac&!GNBXG9~4Uomu7D|0#`ELyBC-jGa(cKAkG%yCZ2CR#zb zFZm6s9X8b|X^nex_X?1E!yP=Jm;=OqxeK~y!hR(VSwUPNoTp)YT9QMMrVEX zJ61-TXBI=1e@P$7>O%^~-}7UUELLS^)$eExkGu_rl5S17N8+!;NjRFp`Xw5O+GLFw6jz_IJ2H8%!RnsW?YzdRehfZ z3cL{6PLc_U?6+ab@JW9upmS^IIf`6{{8wRTCp7Go`Aqmg01aC50rMs8tKy%xiFmuJ zW{DalB{h!=?BY^e&vqYaHn(mIo<2BrHrbG3PQT`Ai>R*}Klci-$=%lkfi*KK#Fy0e zTyM714OGu_h2a88J@8rd94jf1AfKj6gHLjd<iu$@ z^fwA}LRCD<#D#CGqC;IrTN&H1a^g2d(wdxOsBPsId`4Z8n8WrruZYoBLqV2lTs;{N zXdH_4NHR$Qf^@<^#Mi2mv21wQ3}RF(-76(yb88WQR>5Ydx@CX;08`L6ebkStQ~sVV zwjt_tbp4oXz9EeCvt#jz@sPhW=Oe50z`8eroY!9*%%P6N6D5Bwu>+!t2v!T4`>P7x6Zl4Q`WUAGA~kG&*Sp#+XEPx(i% zfknrUZ4wiVsQgDy>FbONWZS2k%wWD|9Cig0jZvy&6ePmzewQ$h*KNa*aGKiuq49RD zrXrw%`5ae_-Z^(h3xR(;qx{gf=oV(7uLCPXBdVDNq4??fp#`Q6J-}J?jk+RhSiRw7 z_g3Jxs2=1jLAM(>&VAU| z7Vnq|8Jct7CFZ(jlS)}$M!|X_K#0*ilM^pGoI(sZR-QkM(DRBhjv7L}cO!tpOTUq5j81{O<)5i!aLIApI=gUT zEUz9N38VlR=dM9Cbs|*oSn=N}`4dGqQpwGa%@fSRbmZb$(IO8wp>x^HKrfU=rK3G= z;g;M(p%{~5^Y5krBxH>UXoJKIEyB_?q$Kj-S3GrAqKO_JNp3`!*rk!EBY`X4Vf+Z5 zAAV2Y_PZ!E$<`Z_?hDU&%jWA<*w@GAH%nT78m*ursati#nWXoFMLx=Ab}{|m4XpoS zIreknaRorP+ZoX2{2v6fD>#||$IP$O{D1GZmdQ9v!Rf8&;H?OL*-KCW+Hwqs7~!Tc z*+N~wAv?}i(NyW2JgtYA1UlA^iVI{%^dYz_xQ6h_SKs$5t4{p~3`K|IqsJqPk zU#Is{a(E2j6i=oG8>FVF}F7<&I3S4 z#T(?sqcO#+heNO{#_>?)=l1m&>_b#_#uh2@0<6CaP-em$ODELWC27pu&{1k^aP)aG~c5Av&T8-r~ zBGw9H8sW*F3R+whDSg#V3Kt5<6YKfWG*OIW3(tbn=(T~f=Gv=-aug#jTa{5@96JrT zRoVllVNp5ikIx(H@Lr{db%?u@#MN&r+FPWV3PXQV7qM;>kl?M+bakdGt0y!{ngSYF zOMz(7Kd|C;!^@vI{^(CvZ;D{y%2SV24>5CLsjo83;v#x&S()#cZ8gHfH8^Dt)r|2B z62{p**SCQ_uUNroaUH^n^Kx_q11&W8RW zd7Ilx3A(cOg=%*|K;n9)06(+N?>bzBhat;4bDsmqe34P-2S= zY>B1S%;B#3Tkk zPNd5eI1HJNDB`)Ss&$b;$5&~4y`d%OimnbF`QJ}v z#(TV-mde^6Z#2x(BcCil@r7Ppe1g2^uMpfrG3C3FAid1@k7!3mdP=O8`}vZ}1| z^d*{et%+)iItuC!ekwZi*nK!0syhm!{$!Wrk^qJyJb$`FKF7n<*yU$II0Cr~KX$S% zgAOr+L+uh(!Z}yVV;B$T@kdw`zk!ExzZ?>E?FtE&wvA3_i=lLC_nXJ5TH|~X;S&4s zD&0$UHcRW!bONm?>}`dzgy^!=Ny`$Zyi(l_S2UUCSGHvJxU<96Akn)d~$NPMYk7cNtnKG!``#oQ~))ez-=i5_Pit37A5w~B9w zv`FO)8fAPQ8Muu{8#n}Cil|)vp|iXpp4!HF6jz+~p*mG_1@xvIKEJ6F&fq1P&R${r z;a5_4o2tSp&Sk;R&`k>-Bs8#cTSHeeW}elrYfr@wjMp4j%q#*}4+)cp#ZfhZZ(19O~G;&Zh+n965qf}9W$JCTlMaIN^sB^GovYlxS0 zp^(0lm|^-?4&u*9My^plH$^L2Ob}}xVZO5NL~r9;MKh+fi`N!tiyNbOT{BVhM8C8N zm5?9uM5qo>g=V32>0qSCWHgDtc&#hmGn0 z%N{%Mr>XBnXv1~wOAVkkY>-wj7?%Wv$6T|ckKxlMd}@cBBKMKl50%(ih;EEqn$jIa z*|x(mJz?sunAe)%fWvb3ROLx|tV`W_SE?cwF>z`r!^WJe;+`?~whTAqLOgjqRq-$sk{E=FX>Z4F7cy!enwVfekq+8;LTeTrFT6;P`5c^+A1*DgP@Jl`y#p4M}d{ zg&)`V>U$cUe_9&zxRuzb3v3^%E9wKPJSUR}>a6SMuqmjllGs%%k zZtNktAkBfA{>d__AlXrixBR%IzvA#&*9Vq3KVu1jl5}UWUmX zPrqQ`#soPoMY8=cIZNz5I5|%)UUPh6)~9aYe5-LBzQ<}GC|E=V*PSL;Zm`|zDj?N> z;StZ=is?QfkmxZBTf)?!m#$*G(JLM_1O_PQ(Q9%TaXnKX-c06DF*TUAO44gfpTvu+GjZ$8_#xLq^mK;8=)n8C@S@nR+ zbBVdBI&SQcs>psYIw6l+&6$_Ou z=9{E!E8FAi>95S>r(f(xa;Qhz&v59|%`5ICN@-BNp>tF?Rkg-CpXZ49RVLiQP1GxH zqws+HSac|kd$uv@L_!G2S7uVWPajykU*WAWG=JxYk^%?}UKf8? z9csAaLIwdEKGoXlSK-k;~?r%&&NznCZY?56yxi*R!q zTvmSuC-IfAcALBT4c_S`9$hzMx-ZFsSw8n;j@Q3UYmV84P_6cr2rG?zL7xLb`lHBCfzcPv{P z{uLW>3ClByq6tLGmBEkM((a}ce#-O2^zt{}Shlj6!?FsMrW&+69Bxp2ZFlTj(oDq? zNOul!oFhm}}x9nd7=(!^h~Y^$YbjwRU&xf`i`)U_Amb@Iv>i z8HV9Hr@*1@D2APbc(R=)?l1m?p?RaS>djjOw-2Bj$jw&57*1u&4RZ@LQe&gjaN_$E)yoKr45M~c>|C=sTY z%2{T2N>RI7Y~b*n(Y3~N+4&OL5(ES_8>at=&raMAVQny##9X3 zc!GKI0s9X&n@p^%38c=Z+`U7E^q)mqQBH|yD<<>ysNx?==@`vi(ra(X6mkTeah@1+ zl|c^v9(;(dP)k1%cVv1`Y68F005Lt$y;LkAaC#!H;1?mM8Z~zmnqe#+wW6&e{qx5Q zT##!A6d-EU7hD=;r@LZ29uCQDRBFRW^1|a^Bv@cY6;@BvG{#&z!5`*vIefBqM1-C9Fnpa7cBg#QegQ}FoTjO2f>L*I<>|J7U*uxpY9 z(F{wDwrwsW-Ax~?AoGg6#7|67q=WjMvNW;$x{;3_&C|-o5;JBM6hhYCZx=wWS=WS7 zv$$o;xw$r)Zd<)tJ#fCauk-J^gllU-zUr)r)kSy}(R+Q>S@^1Q#yN`OdBSyu@ZEcJMm)Jik!gAB zCYRY6iU|!q$(35$((g)iYXu!`gii|~F*u@)Tm}0kYShh=movK{bKz`EHWzkQ+Qw4r zJ(jm@oV7YBp2A*@YssJjGeuW&vSccjw=N4Fj}DYYzjl4G5#&adni3XXWP#1eWD<}t zE!|E%zl#|A)M7U-zVAfJFCJ zm|?S6qWMm+8<6RbrZ&PE!))rkgUB|zTzo`}IMV#wj!!lE;qrliqwJsW-iT-B{?L0A zkCy^2_%6Vy4OjWRme|_^pYXNKtmDPpI*++I>x2HL#w555cAy7c?pg)AS%jIqHoAq_ z#*2)VYl$r-+x3^SEen4mVF&GMR_-~FC(>}=TV))HW#pa=hv{GfUnt21OepQ1t(X4j z%scEz0|%th;%LI1L&xb?8Jp{in*@KGkes)c$vH}nou*bjx9AP0!`HHS$8}<^r2&Jt zw$$vP7qC)hHSdkm!Erj^Qb$7+W3`ICu>1o&7`OiW8|-TCGAmVjjG$9(+{r~@eET_1 zJCNy!pqIZP($=9HUd+?Nywxy-SnjLA3paATl`jxtp!fx zy2Nbd8x|7A6&DkxpM#4T)%h5YBJPqdoQiF5N`h7Mntza5f4yHvq$tp=yEm9ZR z4IOO$h|J1nzm_U!3=yLo0L#iHepver%Ad8U4}_9Sk$)>~XrN!?;!>@|!X;a^JV}h9 z(v9}!)abZ(wgF}D2!X$8gxV8NkS3*{SeZnnl&k-WyIX{)#&0!9DwBE!M9Umy12!Gc zhLpwbU}tkt&k@Z1A!FqF73*j8)L3M;Yb@+Gy=Hgh4W(#np=l;#KmiikGx}7p6<1pub~rz3cftC`yZ{j;MUu>~0yclMdH3V?Qdq z7xKB773CvUtah<=>U$T;r^0$RXPn=%g+Uy7 zAMNcm{pt~gz*J!rI~fM8XO2k#lPQ6iRpE8@r%(GWEACb=0VKQUEBf9x5DlS@$vE^0 zkUG6_-c$J8U=nkv0a;h`0=ylDZh%D{!)K`GyMc9F zAaY$Nwdr#0bBuMFQ#FA^tB-TNta~Tk+8^0sX>_cpWb~>??2?7udTB$|=H>f?H6A(H z7uW09aNbiD%SO2*e>c*ebkt3Qs!ZCcOHjp)xb?1l1tmli5bf&!R9| zC+P0Q@W5ht((s5zv=Vo=uwCyE+!Gnw1glEY0#sJA>uY_iLr z7fwQm${mj_dQ-)O&(fSRp`Cci=b@?zkp@hNQT;``CXXr|QM&@%qJh2wETb~R2@LtZ z4^;_wTLOak6z1_}4^#S*vn_Th~ovB4o+ol?*F^2#D zf0USt2MB9d`2XCa|6REWvP97!3udG@*KLF=OFPh+hEOk$U&}jlgl+H+KV<9 zjWw)A8!5#%2)-_18T!kJR1o|g!}&z{gtns3@6jntMaG_(Ilcke_2&1w&aOUQuFfjH z%pK^#k{MQFr#UaiDC#FOj~6)g+&DQpy8djAbb-|(?;Y_%K|wRrA1lRLcg|De>Ww@s z2kO0h%Z@rQ{TOSF#9`89p3Zn8?==cVa*kjka*aQg;5fBaj>(MdgvlFXv(60X7~OyH zQeuHA$>MgoBn_`JVkkX(+);2~l)yJ4M_X1^)1BM*i=fe#A)9ALj7R>yOg~vQIbLhuWs=*IUb8eqT7pMl1n{zsot25lG!9rGh znu7XZoYiqkhqJ8CdG*g3=rX$|dzT$B&UU(>tzYX#v>_=69$#zovnsk-KgitR!aqc0 z6Kz9!NIGrlmo>|@Hf5z5g@z}3-j(JU&ROI}saOTatl;b3i0AKlXpRI47xL6$ zZ9%@LqFAOz+9NrCiX*#z|B>MHPp7z1} z1}ndsa+BI(;SZQljxZZYz@(0y8C9g!2pkg$n|40#?-|h`{7kGLnN&%*@-~5ad%FGe6+fcm>uDz;n&JpsF0EbhjPwpwe~3kC2!)*|9GpKWSEM0GRcXs>ti+Iyao{Yt}EsaVn?tEhGsu7JYF8AKgS~Jae+OZ zL2LVnSWUv3fGrm}0LcCUg0hv+}+JpufYJa~+ zZzVRylSM0w8%*}azZ$N0k>ZLHj{Snh^#d0)LW!%VveuPqY5W7HTTWEMK@Rw<+OqQY zDAh`1>eM1m>mV4GzFmXr*ZPui_(PaaOj>m(dg5ejPz5ZyP}z1O`g~*Xo^~PXI2Xna zJ#|{q5gwtHFf7sx-InSnjBr@tCFxx^P1Jg%ZyqXMQ7h?aR#}DQ6k}nAA$)+g1oGZN zEy5^&Z>P8?I7Hm&vM2Gu3Qn>W=c*L02B!yRgEG2@x3p2f87ys>Aq&Ni$7bG_Q4CwLA&#bG^dK?7h%fTmmbej=QKBtpqS`{!Nv$f_of;zkI(n*8(Fq>8}n3nzufuQf1~S z55}1VTQHTyuhdil1}Q9V#_vCrnafPsDLeP${fon>(6X&cLqz#~eAC6bO< zBPNiA%y~4OGf9$fvWz1UyLpBhO;%h-r&LX3y{%$ta>%Dt*4eLMM_P`1X=9<-(&rbr zY`a0Z5@;s#fB;GFdLAXtlwEAJmPxMiJ_8T74bKC18s_K#9;fREu_fbc4XBi2plEcbU$w z2Crjcxsqqwa4h0d4a2b$)s-E+hcXixUu^JQFFxGrIJ!EAjlfXj32@3jbEFfVu2(XY zSV^Pm%Xrw3B^Ys*5$T6D#$+6SB!R$mV1dxEuW?v-z~PRDf}nNZ9nQ5-cc8G@8`go- z>TEW>O2LJ2yKgXT-96WucALkvkv#8*e{1*rg~;|9hRDso_(1LAo(-Yk2oAyMkd8M9 z5CT_JrL}O!(O*^KVf!ud(%P%)Vywh5NkjWu2{|RG`GK*W#G0cIHWP5y$b7 zhe9|@onI0w=9M64Eel?!AvPbwOdNn4pcEsHaq5V$l7Aw?ppl9NhC{>#ZZ_FAGGk3L zT{b2{n|I+WbJTLKKN9#*j6m1(8#7}mSXSB=T}vRf`gG8?OaB)(6NX#3f2eLo>cnDW z4e&12Y}roR2bH>dds%=^5T`n6T0=>jmZ_n8(n0@2N1zPfT zS^fdzjse(UGlVe3<_`GUlN45Ckx+Vc`eHIEOdXtbdXvf=7enE-mwi4wg0s3Gw4gtMU0lnE1u&OBPo7jqo_90{Hob+n*NE$@goD=@; zdPKgMG)Sy-LsstsuV#<9PpHcy;=(OWCc#=KDH4BE7NEo3jr63(e{v4?h*plxX!a!n znPQKVu(Z$2J93S0(LH5{f}8M^d)Ot_Eb$0?f(&0Q*8i_WA`T%!g4Hw8e;%r-VlN?i zAgCY(gv|egfCyC!2dDqFWBgkrvhf2Qs)0^9mgN_z6lDuR!odI=ongk-D+{{zAOv(h z^jykiPit11ELia9&Rdw9!}`chVt{NRF-&J+<>#Q$ft2`TZWg%%iG#QQRYVS`?fuQ~ zrfZpQeLfeO8Es(7`oS2AbERq zR=))>gJDj=t4HDxYZS^sYH@f2)^@o_KV_&E7&T*-G-F$6wWnXrDIGo0jd)1t2O?Jo zCnT_bS$~=Je1Y?X77Yn3w=Smw2SdpGHgq!H(L72mgKVt%X?MB6GsqoKE=&g|?C~32 z4upPNQzIpFry*BsTakgg(jBh>wH@;tJQLPU8ykU# z4IU8E?S%}OvYB6Halmw>jj9l^T$-Pa!fJAEgW9<*PJfXS)g=RtUGVG-!y&DaCYCsz|)-E7TgD)W@S6#;qw?QD3Q+3UO`y%4KIzs1bE-D_caa zn};gmGa3`RWryKb!qF|5(<38V)4F#V0uuAbRbb&=Gf!xU0K3(H!AtP#b?R|XwiI_; zsee8w>mGlJiG>03em{zTC?orYS*i%KU!uHW^a3*=!*?>fgiR!4aC!4gqD%HMdT9?h zARCSlWW|R>dSx_om+K_y(T?@JdlG(o)NQvWQXCLK-X01BH-G5L54}AL4@UqH56B=R z?xTQ882;h&uvM`IzjgVmbIJ+XsORzAw9^;JOxoGeTF~*wumJG~a*##`+-g+l{1z_Qx5E#2MSNOvP3 z-QC^YDIp=<-Q6W1-H0?25)vXM-7O^`yzP7E9G_f0_uRV`e)vB27;DcpSM4>|m?!+c ziYMg23Ar=DCs{XlQ3gQhUv-cJZMov8<8|EC8tdKgv2$|hNk3q|pkHT9b`ytAzr z)QWrKtj{cAkXSivTFpb&yi(1;$o$Q2I%38y1wTtgIDLHyG5bN= z)7gW}-Ltn(al$x*jAv(mFNbr0_x8g_P1$rRU*AAE*ZTS5jCt=UTk65Ey7 z&{4tk%L{J?ZOC6)Sx*a9-0{2|UM=aV&18EU(coug<@2pgjxGiHTKK$?-bKn7wNued z^;jR%Na;2xm#?v61j^^tGk9OF{HzS`JCOLVjhFD8qq&XSCCkb#mpDmPnm56Y8Ch?g z%VtHUwhrwPt+RBTh@p1((pOnJVm+z{_4X9sH_pqC+!tA|UVU6Xj}}Pg4xT8VDzqLX zVKxG3Iecwp6ez~uoY|A&>LS)KGQYX_a#K4~y2h08p+#3D5MK!~bP829c%2T$TH$~-eWqGK~CqN_`&Z|p}UW% zs_Lyu3tv(jIwxyn3F{|wJ%iOqZYF_sPaa7QQdM(Aa(3x#W}Z7Z^9qo{AZ(5v&3B_% zY(Oe(#DELwjYK`S(hs4%W=@sI7-T={;=932i?trKTXvN^L9ywZzDu8ZJ*D^x-WyWj zOhfnZvX!YYXbm^1Z{^Mf#~DvVPlC!I=!zsDk*Q0EAzM6LLE2ce@gULX$UbRn6(WRq z!1e>4kT&B7>#=8%bz3SYwOx|_6yhvy_$q~oIOq-US#2uwn1DET>me#PldL?2To^!L z#RpQBgxEg!U{733fb;8y{o>dfy4I_pHF;yS><_h{#Rl!M%1p7!L{b zV!}dOn*#SXbofnbODN2-NzfM_;Tw0bb!4zrg@9FuQ7Tz17+82Q8mv#uhfngh3=yqs zUK(meQEEz3u?}H>Y8S4X4JhVxAeN;UVHiU7pfOC>j=@CWRHCbmm=7$UDJ!Ih3re-E z4uB_8ih8P~(3%8;jrXoD(-_KZtrO{OkQ>^pOv^qKyPimG(1495J*fw#e}ySCGX6p5 zLKyk^KB)zZ@|{Qc@gw;`l$zrp3SeIZ?LW)ar)=hE>-lr!g2t{3J`g|uX7=>82Hi-? zdPC-l>3Ulg{YNFK1;LFK<);)*K>ix(rMdh;ZG9R1{k@~%s(eMb;1uU`D7+&u*d!2! zP&BR$YGT6>Chyf37C84XP`oVT?d>Ut;weuF`Er)FeU5JRz8%glqyp;gxs-hLej$Lw6-zQrQVL&D(nPZbrVg)Iu};zi z1sF|GbCXYaaP>Tdd$xl|vAJ`SCZn08=ctwy#8A+)maY?`nAWXgs^9JOYxJ)I#}d`c zZZd+lDZKSwevX@raDXd!aN-+31rzajtHqj48X{QWkU+|9kJEy7?~aCV$~!6StbJff|(Gh4*@um+D*|Ws+XJxH7b_ zdK#7bD-^`K)76!xa zL!tg4uPz6CkDGLTj@u|?1iNkfB=fl~5lf)$7#`(d7F#exYf_^AaQdV=-49Q$p z|8$TH`B2%QSS@dip?v~Ew;)<}lS&hiy4Ozt~BaX_v>prP#C0 zM}QUMlrnZtOj?qCedp6xr#EYt7;?~qkpxVWJB}R(&v)qvM5ezcMa#BYn?(nf?7WF- zeBYpBnnQcMhOro~HhsxqFt;&vyAlGLos_zB9mD6lz646MTWE_77nH29zNT)8;KJx2 zk8m0coddEEZz=b-*_rQ;F3E)k~JnPBH=urWu+r4 zowg2YF*pZz1M|PqY_*Q(-NP9|rA@*i)I-IuI!2o((?O4JqH;R2Jh(L?&g<4$0=syL z9^SciYvy*tCBMoWeKxPhmNw@xV`rR3Z%?IW!oGpNjCV3PxIl@}>Sa;WB_-$p5j7 zHQGKLk*tc>oOIL5>S>61B5CH_SMe}?f6ii zHacPPW7RJLzI6`hIa#$WbM9{ySuIq)W$*DSUfZ%-0WbEu*hKpAd+1VQi|IzCQl$!4VyXWsxpI7L_RXG^@zOU-CrWh{DVvQEIqwEw(2U zqM)r|o~-BN^$ZDSeI%j$O4%R}x#nz6ixX>FBJ4!Th8ZKl#?kO*bFV!x2T*&lfCh95 zCZxt06n8~#7;XErMV0vIT$g1WLSk3fbD;eN5_UK-!I-}f)&whC&(3)SgKiH^lIAkAndqONF`8auAhXY6KrN8F=a+w?e%KOlp<4syEI~X!n_v| zS1Gw@*tBD$#9IzR+!k*eW5x5%#%j*cd_+pUl>Z0{asa~^_Lg0 z=J59;+#27+*mKNdE+pD(U^Zs!hEeUFc1^K7fBrR>jNw~SN|_DC3ceDibA8A{3iAY5 zfvAu43Be}+%IqG`c?;(HocuHS=MxTz*{XEWHT*4@TuRYiX9IZjt`x9Nh6qf|sn1u%G0zFx%-oet=XoU6^P|4sSs-iuWr~fN_y0 zUhhVsFt5V^XhL)ZrD`o3nT{MNB4e zOEhrqk~I&sc9xQ!q+8h5D7rL7C*^*c@@#b{@gs{w?$9q%x`Ld+ku4N6BT~BEGZ?Q| z6C(D}ILcSV(YTysy6qs{apsxeBp_08jnm^jL#~T-))2BiS5J1ms@}cPs?em2%yGA? z;C1j6-iv1;QVkk+q;+WLs27E+W^}6W;s5wr(_d;fV>4;i{WHBLop)WiDK5r+$il@- zk0bN5*BYFW7sZsPy$r%wEh=mJoDcKbwWF^#limxjz?NqD+_YP5z?yA@A|Zq}Ju#Dv zKywGHr7jA+e@aei?N8=lN_tc2mKEstaqC2H3$D#B*vfeRiDQPTC!2^dtGIIcnYo!LibLPP4lXcB0 z4`LojWOhDLq3+5Mo>4lFqE!|s4*HewfYJ}wvfVCFayK0fdKO9^9EeOOXQkw$7zQp+ z6;GrCgUNdP-j0I=p1POrr!XBLIvSLS^;(&`-|)3``z)Z3_&XB5BEsGBuAtWuUgN0N ztyW4TP9RQ4OV_nuVrZW9-gERTnGr>;3yiyJ)j;ngK09{s*?St_HKDiFZCc;1k|F|~ z|7qA%{N7Q{SNww_q8+qEy@V2+|9)_|y%aHNbJ1r*+iIp%de5hYwgE3+ER2|=pH;8k zM>{=*we8{9XY2pAMS{?bm!r;ggS>GesQUhij>ng^v*fSDOd4N^CbNKuy>alkTux>$ zRw%0_nT%Knsjim%`dCZ0b4_q35e4=M`#wqas6M>u;Iz)d8kCQT!BEN}uQ?`8NsHzs z_I;@vo)-}6O-vwWceYQ0gTLYS7q}rdMGjm6`Ov_|JC?r#a*QI9b-Ai`V4L>^y$wfw za_QwgEI&eF$nt`qfi2> z3t5Dm2mE02noqJvhuXjl!AHjqxv1qarz#JF!P6LO?$_HMr5de%uX zfb7Uey$&;&$`caAYp{C#O4B23-6%#PsKfw$U4o}`>=b8^t8d3ChKf69GNy?i z>kfjMU5MF|l}iz&2sl4iWi!HVN;=VpEUXN|$tc-VyXNyf`A~^w7U~R+mKj^F_gSxT z5fHoj5jChQ4*Lwl{UHIGhQ?R{u!Cmoas@kJVc#t+?b^H+G*QcZ5en4xdQa&FK#2 z?&^WiH^Qd1Fd4;eHQct7yIiVzaLD6ZWfg5Xmf>UNGd+|66(0P-e5?r3Ty>9B@o66) zOOV}1_7Km+%yE?W=0T|Kb;4wl_9cat)ob9|>ScP6wR!(R+O3sICTTx98Ia8?#k_-fW|rnviM{K{hXQw3kZfGGVsXvW+eB_+Wgzp^ z%~Vz++SaQ@YH4#oFp>Awr%U~*VfOO=cUH zU(&8|k`tn-NxhYV{;@dy05w7tJ=3(1PDwcxPVJ@)%6{K)3u?|(+G|W-xghehCA8A9 zOBL;-k2JaziSnCTkZ-#kc3m;6u--hRNn zM>R|f>DO&w##g=KaNQo|M}1ADA9q?1ka|KKaDMrzNQYc&p#;My&9ic0;mapoaS}Tr zCdk-;)YAxIEaqS-4{=4%V94Nnp;f2gU_o31rnr$$wQBgYh{3_TuIZyKJ!DZTqp&3n zRtLk{y0s0u+lIE|(hF*|)k|w=Z1*PV zvy1mw+!G2`ZFus`B3R)v2aGWS?;CV@Fx1COZtu^VcTQ*#nZ#2Ad=C^g!83&#HBWX! zU~1lbvU>LsonI8L@Oi0UnkXBw1#dLendUaH6n+gT9+Kn<(khJ0QclsOOYyez;qkNH zeOL^^Nf=DE`gma5)>kR7u7-=1B?)Vq=A+9QvO7b22O*a*|D2GgP^EcFefHUNdGrO_ z`4N|CYa8Zg!mAy@8h@ew(@Yl9z z55nxHZZ&54L=EU~wadB5yFq6iqhrtox=IgvFbHL48%Bnw^zQ~Jzqdoi|81yJ)NY$ zZzg1d=R23wW?M9uL!{~uYyQGBDbT*-T^U0#BZV6CO%2IBp)gyt7IIlW(aTgwiQLo8 z{c7OQhBx*FI4@p0Je3#Ek|Y)Tq>ns4p<8cJt2Wk~Vf(kA!r`%ifOq$%E%b2_36v^$TWGXFLGSAbJb~_ik_gUlTB|pd}C^B4LW7tw>zXcN{K~ja>2+# zg`0VVhB%}dC__Cohd_oTj1)tP)6(1MnF-G{>B6X0sczeehrLGTbzJno3})xA=K8F+ zzok!wq6M4P`rYe_Oz^65LzkN5bE)7Ak*e|&qfyx*CmtgDJeL0TJELhPsev`fQMkp> zM5OhN6+#)JzJtKI+6~ZAc`+mtc|PT?MOAj9=+HH90&5WW)g%$_)Qzop0-jqyYmHBI ztP}go?ePFuw;QbpC_H4Nq+&Q2)>YfisUrPuMq5fl-jud8$`ovQd1W`w3)ZpqRVQ{C z5+dMy!*WINwS4tPdvsSyn_)eFxH@cKePzP7^cqj^rWNI$Z0f5>7tWY^iYTE|h;e7g zaUi#?!ohaSfyLmE-F6OU_?M7(+{%nLI+PU|5fjr9!{you`n%GlLFb<3l6+@1HoLFj zI7bT(VO<&{Kk2ug;efiffY3n*ZVP1*Yd5{GQvLNQ#hOBOLK>=))rVA-gZuc0XRNM&Da$_ zK7Y0I@HzQhbwUrK?DN{XkQpNen?7DnV!cY({ZDYN^=>;x{B!S`Owgw$WwhDey{ps2anlrh>cdKs;- zpo%HqNsrX%?1{?nb%#wui?rdCn64>XG12eR9ym>1drileWS(kUhQ+z4AIh@@F&F86Y?-8y@R@ zZg1&P%4yr2j3)K^1(RV&l5Npvs1Iw1_WVBN_lH#t+v0^{mpB4S>};E6oR;ub3Jc6{qFlFm_3>{!~90b?+aPNW?)*1~ne20gnFen2#A z=X}hagKp2pN1NO8wr(WuXgJ>R-4&riM~u11>hVdw%sXp?`NgHp&ca#PH1$>1m)!@R zIVbIm$Y4V6dJ`QCtd+rdX#^Z|%eY3q@!!YmFkTJJlAIGdEb5EW@=h`_z_+jAhbyom;6u1#h10sp9|+21l-REMCQ!8)aGYS|;Y^Tf&szU>t2llb+0t zxy0o_&be4Bbi?F80@15;#UhzfmGK-%It*2*-RC8im0c9<5+A@V&q2i-FCi;$Fy}3_ zt+*u~5I%trZtOY?)cJ$W=GlW{J~Q%=o{eBrsURk~uo}B{I?&^5knBiyCBioLfx?#h z0H+Xks@!v(P?_xWTKm@DHG2SbY!u!7o^%JR;*9k?F`z{QZ9WnT)x_xpP zQ!T*@n$ao+gA|wj4nMDHCf3-uonb&gSW*9@HO&ui{BsW*)!AfW#6G#KHI)^b~$>peZT$eD(l6uXDr`CmlO!RqrP}g zVDV03{J9~lGV9IP2b&ft8D`ToR@TJ@^7SXUFSH2a9P6R0`}g@g_?K72K$;z|qKP_S z9k#aAac?zG8PJyZy6xteR_%yn`w#Uy2#-(JvOQ9oX+Y-pY%5;jw|P?~N9Sa7tq@@ZKeN z)$OXzHLVy(TSQRdyA1xxzLR7%Ea()DST!Z48oJJO!`QdQys3jpME_uhNmT=CaYBa4ieRq>SK9f)3{t#9mBiZB2l29c zsu|l6Ik1E#jYxCZ04-u$sp9qgBUy)PfjZjKPx+K4+HK`#&218hl+&hs(?%s1rX5xb zbNTaC8;X9ygcBdYRN#dgi^?;>^P^`8@TmfZic(P0oM6x1H-YW8-Lfx-IjPA_1u#t7 zK+xJ67EN&}9r$$O%g;o#Xo)e_?18XuG&R}s9GnT~q^4>R9VVWlKTb>)0z&91fl5H7?~wHusUzTKHc z2QK`Ls32|(mph<5Oa&oa3SDSNqXM5xGz}K7=Wl8~XDrAC=HwHbVhe*12M)?%tsMKD z(eN8w18WFYX2lA{x?HR3u=I6AfQpA=j}@dr|3?gOLSz~boX>G5a*(l(+d9{rhxG9a z@v#Vl1Nm zIx^txngiT@%=g6%`F&)u-#RYu5h8?JjM{x5739`iOJvBs0fTyFj&n-Q0qmGuj zk4t@%+lfbowW-O1W;O3NrN?_kMc6c~#M!H^GQDVNNT#~XMWR*AQxjXr2*=Nr)|#ex z@th&a<5$h%@ASl)71V0x4&U?-tb>d3&h+zZrJ_ST>E~ceb*QpV;6^z$ta*MX!&@rl zuJ}HAXYw1Hu~;6B$F9UCYsio>k5E<3k-s;$dCVZ!)&0iZ#&YsktvsIBxrHd7hH33m zGo;cypXZ>CxcWwJ_L&W_iB_1;(Xf_Mi^gB=p=DLkH%?Zze;OL!d?@s-aS)>ex9hoE zQ9+W2o5kX@B*c4`h%Sz(IK21OM1@28&B|e_mujKhf{nJ>tom!nN_nxG=k&1t$^|tn z8vU~5$)|fb%69d85tEu=d{*psjtzbxt5EEQMocz!XZ{C-3%Q?m93mB zIX#>_CzV_Bstp?5L-J|i7T4>AJvvfjE@vt#g$v)&W1Cs~y~Vs6Fn%4a(#Ec@gcP$g z;tgdhts*{H5Eo-x5&{p!L}ezhnH}O=ZyuaI{8S2}>%W0TLt9_M^QP)bxLzivwDg}`W$LVWRx0W5#Pd4WoMmREC^7+Ouk z7*$L`(b)F89<6N`v(?uw-1TvLx>O|YJl@5Gdh)rYH)mWsC9Mj)#7|A(K)pTlHsGSjT;qe z`1aWR#p5w!<+&M;Gx^bzb|T^Q&m0iBf^$4!t%J-wk#JZRiE}%eabjk3yY2$AAa0$n z=wCZ$btRdcJVhoRoPJ%{!h3M}G?ZCRv6U-Zkm4}gyt(c7tG+#WZ|K8H(c7vEUO zZ>&Iu*aKYC^~&}zH*n9TRP4zrdbcA}o%^g5j$<8Lbc#%8tdCzbJuJSSy+A43_V?6c z*IN9Nbd{`+(?|c-w(6*X<#?cIa{gAjeU1)#ecBO%tSfufNSoH$l?W)sE_L z0&ZDpI@D;dF1wL{*#Ow$%ix_Jx4Dr1uvM=E2^@DNPQnrduMFoMdb0_hN>oZsx?xn* zsTzIyZbV~3?Vu3O_&%swWWqHP&Tx@A`lEg;rAkaMOipi z{k+4g;%nI5UTYoPOotMXEY|teTkP+f3lPz?_=6GWB=_%SijU|fW0c3%bVKT={pGSQ zDD0lRL6eyekQde?N7{%ZTw__3e8<=qBt_&v31x9g|8+^ebdMmXr=lkNpp(}<#I}mC zs4-D|*0{%|AsB61dK_|IqB+PORtc5`_FS$p^2y6>MM^-nb(;?_XONRr2>YSeSs6~9 zD@)?SlT|-pY1Zke7y_)7qEd1481m<7%m!i=$`LT3MnwYwVf*cA5N9(N2RCOEGZ!W~ zGZz;l3o{o+M`s5|GiO&TGnZmbnb-wRluo9a2mes8H?5XqOIYulGF!^A7xFUmr~*@{ zGdaZCC^my1e71$8ld3ASE=?1@ynn%sr_FiWSm$h#)PnBUDlb_bkQVf{L=&-2J$T0N#~B+!a;fw!`=!8=C|>f zG0$znW}F9j3fU&r^~B+vwVp|fH#XI&`3=7j?v&7s49n~n{5aED+Iy3gb3h+30HI!> z9m?8CW~-+N9C$J|jFovx0sU!#QS`KVs;f?=K)NB?nqcD!;w4-MGBoAYo1~^*5F|Ch z+njmHY%_4WH1R=U9eMmf&bs@94j~#8Rl+iX4OGqYp01mgz$xs$xZCK8Hf9|yTufp| zB@8+pVN*_W@@izN{<4)N$5uomNobK^bKP$gA|M(lcb|HFP(xiO0z(!H*+0bGlw}P) zWV434!SiU%4*;PXp8h&vbO+tSu);pmY8FM<$u>GxHmC~FkZ5R6g^$rU<-M;&guhYy z3L|>i2rbX=pnRqa52MVnY$u%bwL?CI5RKHHDJZ2x4wJwfJ?O$Yw{;8Qza$im#d!%? znJwo5rkC4asLn*dMtxEVC&FJ5A*er7lgNqXnF{sV%4d&`PwJK_S*-F)aI#^l+XeeH zrjhxGHL{Q8>=%f(Wl~e>(f4=LJ^ow_jH-DO=r}O))-t%#m8L}jYLvX4j&4mcLZs!4uk(9zp+sE z#9TuMGhp%6mE&&o*~6`k%||b=?D;vtS9&1C zuG`KB0`ih#l11=8lcIsC8n!~_W@37BkEJI1my`WMcT zjQw2Y)kPZ{HmgiYoox2x?_2$Jco`N6GMxrQ?NjKhZ-*9#FqhL*&WyFEC{oVu6`&b1 z;EygAKQDWjWmS%};%Y1)MPhrKvW^Ku7ZymT3NXI`tvXbuFX1^IB=ey>)1 z%GrlJ2)*9o*=TivXGJOBq#m+_4Ovrjw00Z&(e_zD26oiNb4s09U}*;`eR*K-Ah%4c z=qe9@A3NL!JZUw7?dX+y^>L#k!>a}2FzifB>KrM<)PoYUbmo+D_1fmc8TG0L$s;=Pzb zk+jb^>p#~k=zyZxozB)A`ONjB0)GhNgtZBskVxh^L8PUu zCFFe>Ak;S!SO>WSNK~t1D7?v2lxJ;mC8^V`$ka1ba+`Lu);Rd_0s2wtZ3Lp ziO7nJsO!s>b0I|`e0XIq7e%fj8*RyS5&Vb^q;n!+xr?igO zpRDK_cCg=qu_~jFt9B&eeq>}7tG9noU@s2(LI#=tYoK4Yi!R;(m-<0Mm*N(bbjc=p z4X|&ZvA*^>~Och-N>heWPj#OFA+C6jl%w_>ttKLj>$Wt}; zqJ6P?ei(Q>oHrjhnmw@iPGv%b23flX>8SG(Mk5Zf6ip_`P<)rBIW#t=k)OSoW;)QQ zBbN>qS4Ts>AmRo++KCo?8W{U_M(1_|4qOto?8t^Y5u%flp;`%oGPWGTMlreTdGG?^QY~3Q38?i&~}Z7<>}I^YtNQQSx}#%6+A) zA@8eIm=l{0q9*sA;*4KLgj?b`X=v!U)7Si=PgEmz_#Y8$;j>@GG56@A^{>xMF_E>R zEf&6le%Ig@E9UL#@qSnQ1pzh(@sgbiDhBIjl)a!Oc%29Hrs0csEY{aK^YTm%4f%D&t4K!oS|AEf5>7p63+?qjg*IXzGrBl$tR|vw>|;-z zNArcjLF@@Huk8_5ce$^=4_OeWYBm!NHEGdtZlOu%ndB^kHq7SnaZ`tT>e02Xy73<}1G{>!h8Y zQO-tY3@whNI}7HU!xOGC+;V~e=jAzz2`!U%`xP}9Z;al7U-GDTV=R10%5v`48`dLQ z3_zEX-dx}E_MHIM&x%&RmtXR|2aYF~_)`x*v@$X+X|Ld&Sz|qw} zSo#0;?7-YuWll%=CRw*dt zijsrrk+t@_!@JHTz~8hoi`av`d9JCbO~aprPZfnJHh~zDcHj;Pr^_VVjF^&+KOCrD z5Ra{;Fl!3+_;@+z$Ag;&w)(XH3RE21J`@Mw2S0%L%y@b9@sEDo%a6dlOY zexDn5dw2zVQFtA0Hj+)+jZf+G1<4;3yQ3#;Xt24>o@l2c-u&ZzaqLa(P=8ks3;zwb z*b-j4lY^o!5_5#6CImKaA8BN&s$dU;yjdutI6alsn;Xl`0$(ggBpF(jd2X%oK_-?f zo_wi!zp5%hzs?4Y8?I#$x%aB1JG< zFHm!aJinqA+O<+_qBhM*4o6k$a3+NX)>2SVt`FBmQ!yZ_ohdMid={JvF=Qo&Aw^F6 z>NVWK!RzQyQ{Qejs(B}6mUhubO76-TqkRrC?p2aZD4&5Fs_A=mmt!6$p{DnBX?bi}^&T-7PO3&&T(^Fv6|E9lkDrFK|$8$p>x7j5H3?44DT zgvtEoCvgy7_{eFi{PHnAJB8;MqhZ^)Yqnrl3rjJRSZXU`3DK9 z<3$!l7rLJq$|SNDgJWHGZ3m-fZ!>TdT5!|ZEXd_tu8EbBVYbN)KO4b&%TtVzK72xtq8ikwx1R^{`l%kBEfgM4L)o0y#u_6Ut`&y#`PW7xXE7(u3g{1x znC%6~Lr83R=^vzck7)?3?n&QBfUl>og)uL`;kr9d_=aE3wAAhE<(OR-!YgkyM2Y+g zoLFd%9@aaEA%+)1&%WcMW&nM8rzz#+X6BNZHjQL-rtT?DZWQvVtWk8rb{LxsG*4{& zX}18_Lgon?LP-r5du||2k18SYrpbg#1%2sV()}2UYYY(vg&eeWjFAaxef6nCh`|)& zMzq}KYUgwij7E)+-c8jibA#wJF^N{<3A-xfZ(xWT?XVVxX-Z+is?-M1V!p4eNIew~ zsoHuO5=RoAInxlkS|D?rn!dSlZQe1j*T+PyTjddu=d|)7e&3CY?l-(5V-KoxDd;i( z@pP6sU}>-}YyE>FA6N(~E167Nar_6L?7YfurRwsfXSv1l3+1qH;}kWXPh!uXKL^LO z@mn}k6e3d?WBi0|*BW{yz@?gyNej&~%D{J*es6h;{quW_Hspu!3n0Ri4G^B9{q02D z&DF~Gk5?F0_7?xQ0~4)bWvHu$d4H67Xnr;y(qJWxPnx9oB(cd#L`V4vMjeL~o7_CT zoJjon`_cUkj{1xDvNkBm)@pDq>z$+pEqP6WB{cmJ0bwoqYawMVD*c3*sNF8dqnRB+ z{#z2uw`0!Z{M+qUSzMkwt?dfnmd24CEl{CvJQ(!1`$wFL2&xD1`8*1-83`CgFzr!x z$~+dSiMX5=>6abQnz$nSxjav?IvS&}-pb`QyL1Gur#N?@AD^u(ZF(Rt?|0vJlnofg zTt%7@qYNNBdxx#}3U?;2lM^&Md8wgW z3r^C$*y%29or)k9Ze4+g zX#F}J``I89pT}aL0c%U|kmd(jHhQ?Dk4VGA(#b0I5C^xgWxb&VOUinYdf zN}Q^4#zjv!#;auP-XYxV8)-79P4=MoJ@Yd{jj2n-~T6CF$-4I=KV?XBe$4&#Qm5mb)i z{lq5{ryk1vxhEC{ZSsdDZK*B0 z*Xb0&#sg&vV>_EY<`JYrM)tKKcIJvAC8&hs7}Q2Y`Aj?X%DPxQ1^0YRx{Sz5u_HGl zMK~qNEV!eu=IIKh^lEJ_h9za=xF$DprcG)$NYNyZdD-nvMJI3H2||b_I3*`Xg1qL| zQ-T|N!Y8Zt39KnD-(H|FGT+$##iUu?QX}VAvV;OJb44!Xh?I)6_tsxKc$r^hZ|W!! zMD>%Zsac0itT@F!hYI{gUdJYbjM1DTJ)~4Oz?GY?zVo(=;9+gf%gHZCYD;a}qcdTu zZs6k=Wl&x6C4Q0Y`ng6hFWGE!jkK_x8VfPEjKCZJ${d(|f9$DL* z5!-F%x$j`;7E-N@b+bVpP@*B--T|L)DpvQAcnD z&pM-|CT{dAwP{XI!7@2q`})_Zdy|Gpk*(G&IH+1>v5qVmEnUI+ik&y9(pa7!6F$Sa z_K0e$qtF8XRpUr?p*FQD4af5W4Y8nssHPqo+{&^1fMM>^x;keTGbc0|jK#=TCN7e( z3zF3Xq^;vh9bk#Ujy_3|D-su6l_^O~YRo_&D0QiB)u>p5&8c*HH7%P3TKFiYqprmg z)FA5FlgtF3U~4ibt?IXDiv%gTeQ?m?cgY-_cXb3~^(S9Bb!~dFH)=lgV9z^dBN`<2 z(!v|q_6p#?ZZ`5mLd4Ry>$S1Hn(6l;Y z%N-{Y8O+qY%E0LzjA&rhTgB6$)v^@w)On}jL>>RAZq*+DXviot_=O#JTJLlCt51%8 zNKffIrb3`?Jtjgz%M$7NYKojL#|P~*fb%&ema zH2T7)9RwBS4;e}#Rc=JjSG;xQ=A9~wI@?h`79w%2lif65880Fc$K(@T<$)r9cqLH- z6>Gwf)5psfeR0nAI$X^VyrNrttM^G0D3FH6)?7$;;5m60nWYhptd)&>AZQL4BHX01%I-ql@XWqsXG3f_qPYopC=DenDiajz@(uP6a)m2dI52? zb+fRtXY{nQb&KOy=wn6*xsv{dyxf*YFv2jii-nU0TAPP2yKmF8Ss1ZYaec*Y2TIy) zOf_~Z@SK1}5gs{7#X@P1HZPLFl_pKUlH8Bfq*>xiVVkmfs%i_@3l|*?wl}rtkXrGz zONU#Y`gXYE2?g%)QLOuLRJAlN@YPr2boZ(n{7$J$)bOYB_%EM_$Mc;)!v`1O&|L0$ zbq_^qV_-2~F3w_heSA3r3GzmyjI zC>RDfU<)9^MI6Wk0T|`43l;>}FZ$mL1>{iZ`wwzrszMA>^5RVQ!ytel=%2U3fP7CP z;c?8Mq7VF$HSh(zCH?Cv@}~oS{_9pbA$cirF%?xtIq@F|ARwZT$p54U0r^he4j`B~ z*a3lJe{%lo9YF4iKd$e0Ed6nZsjH=xnXQf4Pq%(A?w^1B{S)i2U%uZ819-=GvcGP% zG;?+^u{3i13FC2riGIT1`z;25Y-eO|`V-dU@=*PRtAV=6BAT&Q!8a~i>{sz~<-rUOKx5fS5UW>6C zTtNU6>;P6|`U#d5*u(lQ>~k|`7b91|3;wprEh@Z zeqC^AKa{0npd~{PJa*(O-G7GsYus!Rug|nViK&1JWcaJR-wm>1^*dY@SD>s$&Zd8O z#qWx|f3xEZhXZKo0h*)V2mU{=B7ZI0e+d2SGCK^Uc;^AK8p^=v_%m>2&_4kF-oyPG zcsH2i+#3+73IjT^pN)~6^gCcJIoUt#@V5=Sfv#a45rF>iFVMP$e-Hh=xPJ@X{Z!p> z3aCCfz&)7%G&1m6%<19an=z|7KG-83l`@6>7 zpI4Fp&B8w>5pgyH9QJQ{c(yK2xB;KN1V)&jtHyNoAM=RWIs8TQtKR#&)%HF!Uy%b= zL-<3#=*I(Htp8U;|LV@)Y0{0nVab5!>H3%FaoGRIG~x~>ZZ3bA?RU>}W2w@Z2Ru(0 z-~~K?J`C_#jl2WA;EQk zxB0+7_BNbv|CmL}!rsC8@4anoF_8crFxpGN3BD_7{CO4mlYxW&X5MJ>$I$Y}rwfym zz4@Q#v3_kc%wW=UUcd*g03Z0d?L@-;V-{%#t3O-l?_9u^DHBjF0|62Em%1TD{BL-E z{WP2)lk?8s8xG)TKifjAeWS@U3k%>w?V-4NmbV-{JnACf1(GupG) zbzupBLpuQD|Ih8llkmSH`nA;_XB+?FX~q=)oaS-v@&7-^_}<$*PH*~yMT7nyvpi0A z`k3T##=0LQyR845dcYctB12Y4l?fv4V)xWgNe@VjgnB{TifFCUM!vC1% zmw5ypGd&jG{=uXn@sF8)A;bNc=dl*;51vZd|A6OTlxZLHJeL3a!IQ7@AMiXD1AI*L zSnB8p4S~)-rui4)qsJ_d)m(nCn~1RJT}(jDC8dmo}T}l;OCg+#~hDC;(l-_`uztS zj|1c$(>#vj_(1~}{5zUoMRh#JeZ0l<1NT`p=>OaBQIvrMhBpupG2q`<;B|#T46y0} F`5#v~D%=17 literal 0 HcmV?d00001 diff --git a/src/com/massivecraft/factions/Conf.java b/src/com/massivecraft/factions/Conf.java index e142fd84..0e81a3c4 100644 --- a/src/com/massivecraft/factions/Conf.java +++ b/src/com/massivecraft/factions/Conf.java @@ -64,21 +64,18 @@ public class Conf // Disallow joining/leaving/kicking while power is negative public static boolean canLeaveWithNegativePower = true; - // Configuration for faction-only chat - public static boolean factionOnlyChat = true; // Configuration on the Faction tag in chat messages. - public static boolean chatTagEnabled = true; - public static transient boolean chatTagHandledByAnotherPlugin = false; - public static boolean chatTagRelationColored = true; - public static String chatTagReplaceString = "[FACTION]"; - public static String chatTagInsertAfterString = ""; - public static String chatTagInsertBeforeString = ""; - public static int chatTagInsertIndex = 1; - public static boolean chatTagPadBefore = false; - public static boolean chatTagPadAfter = true; - public static String chatTagFormat = "%s"+ChatColor.WHITE; - public static String factionChatFormat = "%s:"+ChatColor.WHITE+" %s"; - public static String allianceChatFormat = ChatColor.LIGHT_PURPLE+"%s:"+ChatColor.WHITE+" %s"; + public static boolean chatSetFormat = false; + public static String chatSetFormatTo = "<{faction_relcolor}§l{faction_roleprefix}§r{faction_relcolor}{faction_tag_pr}"+ChatColor.WHITE.toString()+"%s> %s"; + public static boolean chatParseTags = true; + public static boolean chatParseTagsColored = true; + public static Map chatSingleFormats = new HashMap(); + public static transient boolean chatTagHandledByAnotherPlugin = false; // Why do we need this? (Olof asks) + public static String chatTagFormat = "%s"+ChatColor.WHITE; // This one is almost deprecated now right? or is it? + + // Herochat + public static String herochatFactionChannelName = "Faction"; + public static String herochatAllyChannelName = "Allies"; public static double autoLeaveAfterDaysOfInactivity = 10.0; public static double autoLeaveRoutineRunsEveryXMinutes = 5.0; @@ -260,6 +257,10 @@ public class Conf factionPermDefaults.put(perm, perm.defaultDefaultValue); } + chatSingleFormats.put("pl", " %s"); + chatSingleFormats.put("pr", "%s "); + chatSingleFormats.put("pb", " %s "); + territoryEnemyDenyCommands.add("home"); territoryEnemyDenyCommands.add("sethome"); territoryEnemyDenyCommands.add("spawn"); diff --git a/src/com/massivecraft/factions/FPlayer.java b/src/com/massivecraft/factions/FPlayer.java index 89190094..4f713da6 100644 --- a/src/com/massivecraft/factions/FPlayer.java +++ b/src/com/massivecraft/factions/FPlayer.java @@ -16,7 +16,6 @@ import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.LWCFeatures; import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.Worldguard; -import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.FPerm; import com.massivecraft.factions.struct.Rel; @@ -99,23 +98,6 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator // FIELD: loginPvpDisabled private transient boolean loginPvpDisabled; - // FIELD: chatMode - private ChatMode chatMode; - public void setChatMode(ChatMode chatMode) { this.chatMode = chatMode; } - public ChatMode getChatMode() - { - if(this.factionId.equals("0") || ! Conf.factionOnlyChat) - { - this.chatMode = ChatMode.PUBLIC; - } - return chatMode; - } - - // FIELD: chatSpy - private transient boolean spyingChat = false; - public void setSpyingChat(boolean chatSpying) { this.spyingChat = chatSpying; } - public boolean isSpyingChat() { return spyingChat; } - // FIELD: account public String getAccountId() { return this.getId(); } @@ -153,7 +135,6 @@ public class FPlayer extends PlayerEntity implements EconomyParticipator } this.factionId = "0"; // The default neutral faction - this.chatMode = ChatMode.PUBLIC; this.role = Rel.MEMBER; this.title = ""; this.autoClaimFor = null; diff --git a/src/com/massivecraft/factions/P.java b/src/com/massivecraft/factions/P.java index 0c28d636..c390c8e0 100644 --- a/src/com/massivecraft/factions/P.java +++ b/src/com/massivecraft/factions/P.java @@ -24,6 +24,7 @@ import com.massivecraft.factions.cmd.*; import com.massivecraft.factions.integration.capi.CapiFeatures; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.EssentialsFeatures; +import com.massivecraft.factions.integration.HerochatFeatures; import com.massivecraft.factions.integration.LWCFeatures; import com.massivecraft.factions.integration.SpoutFeatures; import com.massivecraft.factions.integration.Worldguard; @@ -34,7 +35,6 @@ import com.massivecraft.factions.listeners.FactionsExploitListener; import com.massivecraft.factions.listeners.FactionsHealthBarListener; import com.massivecraft.factions.listeners.FactionsPlayerListener; import com.massivecraft.factions.listeners.FactionsServerListener; -import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.FFlag; import com.massivecraft.factions.struct.FPerm; import com.massivecraft.factions.struct.Rel; @@ -105,6 +105,7 @@ public class P extends MPlugin SpoutFeatures.setup(); Econ.setup(); CapiFeatures.setup(); + HerochatFeatures.setup(); LWCFeatures.setup(); if(Conf.worldGuardChecking) @@ -241,13 +242,12 @@ public class P extends MPlugin // Does player have Faction Chat enabled? If so, chat plugins should preferably not do channels, // local chat, or anything else which targets individual recipients, so Faction Chat can be done + /** + * @deprecated As of release 1.8, there is no built in faction chat. + */ public boolean isPlayerFactionChatting(Player player) { - if (player == null) return false; - FPlayer me = FPlayers.i.get(player); - - if (me == null)return false; - return me.getChatMode().isAtLeast(ChatMode.ALLIANCE); + return false; } // Is this chat message actually a Factions command, and thus should be left alone by other plugins? @@ -276,7 +276,7 @@ public class P extends MPlugin return tag; // if listener isn't set, or config option is disabled, give back uncolored tag - if (listener == null || !Conf.chatTagRelationColored) { + if (listener == null || !Conf.chatParseTagsColored) { tag = me.getChatTag().trim(); } else { FPlayer you = FPlayers.i.get(listener); diff --git a/src/com/massivecraft/factions/cmd/CmdChat.java b/src/com/massivecraft/factions/cmd/CmdChat.java deleted file mode 100644 index 25b4c203..00000000 --- a/src/com/massivecraft/factions/cmd/CmdChat.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.massivecraft.factions.cmd; - -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.struct.ChatMode; -import com.massivecraft.factions.struct.Permission; - -public class CmdChat extends FCommand -{ - - public CmdChat() - { - super(); - this.aliases.add("c"); - this.aliases.add("chat"); - - //this.requiredArgs.add(""); - this.optionalArgs.put("mode", "next"); - - this.permission = Permission.CHAT.node; - this.disableOnLock = false; - - senderMustBePlayer = true; - senderMustBeMember = true; - senderMustBeOfficer = false; - senderMustBeLeader = false; - } - - @Override - public void perform() - { - if ( ! Conf.factionOnlyChat ) - { - msg("The built in chat chat channels are disabled on this server."); - return; - } - - String modeString = this.argAsString(0); - ChatMode modeTarget = fme.getChatMode().getNext(); - - if (modeString != null) - { - modeString.toLowerCase(); - if(modeString.startsWith("p")) - { - modeTarget = ChatMode.PUBLIC; - } - else if (modeString.startsWith("a")) - { - modeTarget = ChatMode.ALLIANCE; - } - else if(modeString.startsWith("f")) - { - modeTarget = ChatMode.FACTION; - } - else - { - msg("Unrecognised chat mode. Please enter either 'a','f' or 'p'"); - return; - } - } - - fme.setChatMode(modeTarget); - - if(fme.getChatMode() == ChatMode.PUBLIC) - { - msg("Public chat mode."); - } - else if (fme.getChatMode() == ChatMode.ALLIANCE ) - { - msg("Alliance only chat mode."); - } - else - { - msg("Faction only chat mode."); - } - } -} diff --git a/src/com/massivecraft/factions/cmd/CmdChatSpy.java b/src/com/massivecraft/factions/cmd/CmdChatSpy.java deleted file mode 100644 index e41dddbb..00000000 --- a/src/com/massivecraft/factions/cmd/CmdChatSpy.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.massivecraft.factions.cmd; - -import com.massivecraft.factions.P; -import com.massivecraft.factions.struct.Permission; - -public class CmdChatSpy extends FCommand -{ - public CmdChatSpy() - { - super(); - this.aliases.add("chatspy"); - - this.optionalArgs.put("on/off", "flip"); - - this.permission = Permission.CHATSPY.node; - this.disableOnLock = false; - - senderMustBePlayer = true; - senderMustBeMember = false; - senderMustBeOfficer = false; - senderMustBeLeader = false; - } - - @Override - public void perform() - { - fme.setSpyingChat(this.argAsBool(0, ! fme.isSpyingChat())); - - if ( fme.isSpyingChat()) - { - fme.msg("You have enabled chat spying mode."); - P.p.log(fme.getName() + " has ENABLED chat spying mode."); - } - else - { - fme.msg("You have disabled chat spying mode."); - P.p.log(fme.getName() + " DISABLED chat spying mode."); - } - } -} diff --git a/src/com/massivecraft/factions/cmd/CmdHelp.java b/src/com/massivecraft/factions/cmd/CmdHelp.java index 1601d032..5368b6cd 100644 --- a/src/com/massivecraft/factions/cmd/CmdHelp.java +++ b/src/com/massivecraft/factions/cmd/CmdHelp.java @@ -67,7 +67,6 @@ public class CmdHelp extends FCommand pageLines.add( p.cmdBase.cmdPower.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdJoin.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdLeave.getUseageTemplate(true) ); - pageLines.add( p.cmdBase.cmdChat.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdHome.getUseageTemplate(true) ); pageLines.add( p.txt.parse("Learn how to create a faction on the next page.") ); helpPages.add(pageLines); @@ -166,7 +165,6 @@ public class CmdHelp extends FCommand pageLines = new ArrayList(); pageLines.add(p.txt.parse("More commands for server admins:")); - pageLines.add( p.cmdBase.cmdChatSpy.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdPowerBoost.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdLock.getUseageTemplate(true) ); pageLines.add( p.cmdBase.cmdReload.getUseageTemplate(true) ); diff --git a/src/com/massivecraft/factions/cmd/FCmdRoot.java b/src/com/massivecraft/factions/cmd/FCmdRoot.java index 9bf36b9c..28eac6b5 100644 --- a/src/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/com/massivecraft/factions/cmd/FCmdRoot.java @@ -9,8 +9,6 @@ public class FCmdRoot extends FCommand public CmdLeader cmdLeader = new CmdLeader(); public CmdAutoClaim cmdAutoClaim = new CmdAutoClaim(); public CmdAdmin cmdBypass = new CmdAdmin(); - public CmdChat cmdChat = new CmdChat(); - public CmdChatSpy cmdChatSpy = new CmdChatSpy(); public CmdClaim cmdClaim = new CmdClaim(); public CmdConfig cmdConfig = new CmdConfig(); public CmdCreate cmdCreate = new CmdCreate(); @@ -73,8 +71,6 @@ public class FCmdRoot extends FCommand this.addSubCommand(this.cmdLeader); this.addSubCommand(this.cmdAutoClaim); this.addSubCommand(this.cmdBypass); - this.addSubCommand(this.cmdChat); - this.addSubCommand(this.cmdChatSpy); this.addSubCommand(this.cmdClaim); this.addSubCommand(this.cmdConfig); this.addSubCommand(this.cmdCreate); diff --git a/src/com/massivecraft/factions/integration/EssentialsFeatures.java b/src/com/massivecraft/factions/integration/EssentialsFeatures.java index 2b4b8af1..25058292 100644 --- a/src/com/massivecraft/factions/integration/EssentialsFeatures.java +++ b/src/com/massivecraft/factions/integration/EssentialsFeatures.java @@ -11,6 +11,7 @@ import org.bukkit.plugin.Plugin; import com.massivecraft.factions.Conf; import com.massivecraft.factions.P; +import com.massivecraft.factions.listeners.FactionsChatListener; import com.earth2me.essentials.IEssentials; import com.earth2me.essentials.Teleport; @@ -105,13 +106,6 @@ public class EssentialsFeatures { Bukkit.getServer().getPluginManager().registerEvents(new LocalChatListener(), P.p); P.p.log("Found and will integrate chat with newer "+essChat.getDescription().getFullName()); - - // curly braces used to be accepted by the format string EssentialsChat but no longer are, so... deal with chatTagReplaceString which might need updating - if (Conf.chatTagReplaceString.contains("{")) - { - Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]"); - P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you."); - } } catch (NoSuchMethodError ex) { @@ -127,7 +121,9 @@ public class EssentialsFeatures { Player speaker = event.getPlayer(); String format = event.getFormat(); - format = format.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTag(speaker)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(speaker)); + + format = FactionsChatListener.parseTags(format, speaker); + event.setFormat(format); // NOTE: above doesn't do relation coloring. if/when we can get a local recipient list from EssentialsLocalChatEvent, we'll probably // want to pass it on to FactionsPlayerListener.onPlayerChat(PlayerChatEvent event) rather than duplicating code diff --git a/src/com/massivecraft/factions/integration/EssentialsOldVersionFeatures.java b/src/com/massivecraft/factions/integration/EssentialsOldVersionFeatures.java index e867820a..232e92fc 100644 --- a/src/com/massivecraft/factions/integration/EssentialsOldVersionFeatures.java +++ b/src/com/massivecraft/factions/integration/EssentialsOldVersionFeatures.java @@ -3,8 +3,8 @@ package com.massivecraft.factions.integration; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerChatEvent; -import com.massivecraft.factions.Conf; import com.massivecraft.factions.P; +import com.massivecraft.factions.listeners.FactionsChatListener; import com.earth2me.essentials.chat.EssentialsChat; import com.earth2me.essentials.chat.IEssentialsChatListener; @@ -31,17 +31,11 @@ public class EssentialsOldVersionFeatures } public String modifyMessage(PlayerChatEvent event, Player target, String message) { - return message.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTagRelation(event.getPlayer(), target)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(event.getPlayer())); + return FactionsChatListener.parseTags(message, event.getPlayer()); + //return message.replace(Conf.chatTagReplaceString, P.p.getPlayerFactionTagRelation(event.getPlayer(), target)).replace("[FACTION_TITLE]", P.p.getPlayerTitle(event.getPlayer())); } }); P.p.log("Found and will integrate chat with "+essChat.getDescription().getFullName()); - - // As of Essentials 2.8+, curly braces are not accepted and are instead replaced with square braces, so... deal with it - if (essChat.getDescription().getVersion().startsWith("2.8.") && Conf.chatTagReplaceString.contains("{")) - { - Conf.chatTagReplaceString = Conf.chatTagReplaceString.replace("{", "[").replace("}", "]"); - P.p.log("NOTE: as of Essentials 2.8+, we've had to switch the default chat replacement tag from \"{FACTION}\" to \"[FACTION]\". This has automatically been updated for you."); - } } catch (NoSuchMethodError ex) { diff --git a/src/com/massivecraft/factions/integration/HerochatFeatures.java b/src/com/massivecraft/factions/integration/HerochatFeatures.java new file mode 100644 index 00000000..6ed01a5a --- /dev/null +++ b/src/com/massivecraft/factions/integration/HerochatFeatures.java @@ -0,0 +1,71 @@ +package com.massivecraft.factions.integration; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.plugin.Plugin; + +import com.dthielke.herochat.Channel; +import com.dthielke.herochat.ChannelChatEvent; +import com.massivecraft.factions.Conf; +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.P; +import com.massivecraft.factions.struct.Rel; + +public class HerochatFeatures implements Listener +{ + P p; + public HerochatFeatures(P p) + { + this.p = p; + } + + public static void setup() + { + Plugin plug = Bukkit.getServer().getPluginManager().getPlugin("Herochat"); + if (plug != null && plug.getClass().getName().equals("com.dthielke.herochat.Herochat")) + { + P.p.log("Integration with Herochat successful"); + Bukkit.getPluginManager().registerEvents(new HerochatFeatures(P.p), P.p); + } + } + + @EventHandler(priority = EventPriority.LOW) + public void onChannelChatEvent(ChannelChatEvent event) + { + Channel ch = event.getChannel(); + boolean isFactionChat = ch.getName().equals(Conf.herochatFactionChannelName); + boolean isAllyChat = ch.getName().equals(Conf.herochatAllyChannelName); + if ( ! isFactionChat && ! isAllyChat) return; + + // Do common setup + Player sender = event.getSender().getPlayer(); + FPlayer fpsender = FPlayers.i.get(sender); + event.getBukkitEvent().getRecipients().clear(); + if ( ! fpsender.hasFaction()) + { + sender.sendMessage(ChatColor.YELLOW.toString()+"You must join a faction to use the "+ch.getColor().toString()+ch.getName()+ChatColor.YELLOW.toString()+"-channel."); + event.getBukkitEvent().setCancelled(true); + return; + } + + Faction faction = fpsender.getFaction(); + event.getBukkitEvent().getRecipients().addAll(faction.getOnlinePlayers()); + + if (isAllyChat) + { + for (FPlayer fplayer : FPlayers.i.getOnline()) + { + if(faction.getRelationTo(fplayer) == Rel.ALLY) + { + event.getBukkitEvent().getRecipients().add(fplayer.getPlayer()); + } + } + } + } +} diff --git a/src/com/massivecraft/factions/integration/capi/PluginCapiListener.java b/src/com/massivecraft/factions/integration/capi/PluginCapiListener.java index c1a04273..b82be061 100644 --- a/src/com/massivecraft/factions/integration/capi/PluginCapiListener.java +++ b/src/com/massivecraft/factions/integration/capi/PluginCapiListener.java @@ -77,13 +77,6 @@ public class PluginCapiListener implements Listener if (event.getChannel().getId().equals("faction") && myFaction.isNormal()) { event.getThem().addAll(myFaction.getOnlinePlayers()); - - // Send to any players who are spying chat... could probably be implemented better than this - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - if(fplayer.isSpyingChat() && fplayer.getFaction() != myFaction) - fplayer.sendMessage("[FCspy] "+myFaction.getTag()+": "+event.getMessage()); - } } else if (event.getChannel().getId().equals("allies")) { @@ -92,9 +85,6 @@ public class PluginCapiListener implements Listener FPlayer someFPlayer = FPlayers.i.get(somePlayer); if (someFPlayer.getRelationTo(fme).isAtLeast(Rel.ALLY)) event.getThem().add(somePlayer); - // Send to any players who are spying chat - else if(someFPlayer.isSpyingChat()) - someFPlayer.sendMessage("[ACspy]: " + event.getMessage()); } } } diff --git a/src/com/massivecraft/factions/listeners/FactionsChatListener.java b/src/com/massivecraft/factions/listeners/FactionsChatListener.java index 4e9454ca..e7344910 100644 --- a/src/com/massivecraft/factions/listeners/FactionsChatListener.java +++ b/src/com/massivecraft/factions/listeners/FactionsChatListener.java @@ -1,25 +1,31 @@ package com.massivecraft.factions.listeners; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.logging.Level; -import java.util.UnknownFormatConversionException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.plugin.AuthorNagException; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredListener; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayers; -import com.massivecraft.factions.Faction; import com.massivecraft.factions.P; -import com.massivecraft.factions.struct.ChatMode; import com.massivecraft.factions.struct.Rel; - public class FactionsChatListener implements Listener { public P p; @@ -28,158 +34,232 @@ public class FactionsChatListener implements Listener this.p = p; } - // this is for handling slashless command usage and faction/alliance chat, set at lowest priority so Factions gets to them first - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerEarlyChat(PlayerChatEvent event) + public static Field fieldRegisteredListenerDotPriority; + public static final Pattern parsePattern; + static { - if (event.isCancelled()) return; - - Player talkingPlayer = event.getPlayer(); - String msg = event.getMessage(); - FPlayer me = FPlayers.i.get(talkingPlayer); - ChatMode chat = me.getChatMode(); - - // slashless factions commands need to be handled here if the user isn't in public chat mode - if (chat != ChatMode.PUBLIC && p.handleCommand(talkingPlayer, msg)) + try { - if (Conf.logPlayerCommands) - Bukkit.getLogger().log(Level.INFO, "[PLAYER_COMMAND] "+talkingPlayer.getName()+": "+msg); - event.setCancelled(true); - return; + fieldRegisteredListenerDotPriority = RegisteredListener.class.getDeclaredField("priority"); + fieldRegisteredListenerDotPriority.setAccessible(true); } - - // Is it a faction chat message? - if (chat == ChatMode.FACTION) + catch (Exception e) { - Faction myFaction = me.getFaction(); - - String message = String.format(Conf.factionChatFormat, me.describeTo(myFaction), msg); - myFaction.sendMessage(message); - - Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("FactionChat "+myFaction.getTag()+": "+message)); - - //Send to any players who are spying chat - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - if(fplayer.isSpyingChat() && fplayer.getFaction() != myFaction) - fplayer.sendMessage("[FCspy] "+myFaction.getTag()+": "+message); - } - - event.setCancelled(true); - return; + P.p.log(Level.SEVERE, "A reflection trick is broken! This will lead to glitchy relation-colored-chat."); } - else if (chat == ChatMode.ALLIANCE) + + parsePattern = Pattern.compile("[{\\[]factions?_([a-zA-Z_]+)[}\\]]"); + } + + /** + * We offer an optional and very simple chat formating functionality. + */ + @EventHandler(priority = EventPriority.LOW, ignoreCancelled=true) + public void lowPlayerChatEvent(PlayerChatEvent event) + { + if (Conf.chatSetFormat) { - Faction myFaction = me.getFaction(); - - String message = String.format(Conf.allianceChatFormat, ChatColor.stripColor(me.getNameAndTag()), msg); - - //Send message to our own faction - myFaction.sendMessage(message); - - //Send to all our allies - for (FPlayer fplayer : FPlayers.i.getOnline()) - { - if(myFaction.getRelationTo(fplayer) == Rel.ALLY) - fplayer.sendMessage(message); - - //Send to any players who are spying chat - else if(fplayer.isSpyingChat()) - fplayer.sendMessage("[ACspy]: " + message); - } - - Bukkit.getLogger().log(Level.INFO, ChatColor.stripColor("AllianceChat: "+message)); - - event.setCancelled(true); - return; + event.setFormat(Conf.chatSetFormatTo); } } // this is for handling insertion of the player's faction tag, set at highest priority to give other plugins a chance to modify chat first - @EventHandler(priority = EventPriority.HIGHEST) - public void onPlayerChat(PlayerChatEvent event) + + /** + * At the Highest event priority we apply chat formating. + * Relation colored faction tags may or may not be disabled (Conf.chatParseTagsColored) + * If color is disabled it works flawlessly. + * If however color is enabled we face a limitation in Bukkit. + * Bukkit does not support the same message looking different for each recipient. + * The method we use to get around this is a bit hacky: + * 1. We cancel the chat event on EventPriority.HIGHEST + * 2. We trigger EventPriority.MONITOR manually without relation color. + * 3. We log in console the way it's usually done (as in nms.NetServerHandler line~793). + * 4. We send out the messages to each player with relation color. + * The side effect is that other plugins at EventPriority.HIGHEST may experience the event as cancelled. + */ + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled=true) + public synchronized void onPlayerChat(PlayerChatEvent event) { - if (event.isCancelled()) return; - - // Are we to insert the Faction tag into the format? - // If we are not to insert it - we are done. - if ( ! Conf.chatTagEnabled || Conf.chatTagHandledByAnotherPlugin) return; - - Player talkingPlayer = event.getPlayer(); - String msg = event.getMessage(); - String eventFormat = event.getFormat(); - FPlayer me = FPlayers.i.get(talkingPlayer); - int InsertIndex = 0; + // Should we even parse? + if ( ! Conf.chatParseTags) return; + if (Conf.chatTagHandledByAnotherPlugin) return; - if (!Conf.chatTagReplaceString.isEmpty() && eventFormat.contains(Conf.chatTagReplaceString)) + Player from = event.getPlayer(); + FPlayer fpfrom = FPlayers.i.get(from); + String format = event.getFormat(); + String message = event.getMessage(); + + String formatWithoutColor = parseTags(format, from, fpfrom); + + if ( ! Conf.chatParseTagsColored) { - // we're using the "replace" method of inserting the faction tags - // if they stuck "[FACTION_TITLE]" in there, go ahead and do it too - if (eventFormat.contains("[FACTION_TITLE]")) - { - eventFormat = eventFormat.replace("[FACTION_TITLE]", me.getTitle()); - } - InsertIndex = eventFormat.indexOf(Conf.chatTagReplaceString); - eventFormat = eventFormat.replace(Conf.chatTagReplaceString, ""); - Conf.chatTagPadAfter = false; - Conf.chatTagPadBefore = false; - } - else if (!Conf.chatTagInsertAfterString.isEmpty() && eventFormat.contains(Conf.chatTagInsertAfterString)) - { - // we're using the "insert after string" method - InsertIndex = eventFormat.indexOf(Conf.chatTagInsertAfterString) + Conf.chatTagInsertAfterString.length(); - } - else if (!Conf.chatTagInsertBeforeString.isEmpty() && eventFormat.contains(Conf.chatTagInsertBeforeString)) - { - // we're using the "insert before string" method - InsertIndex = eventFormat.indexOf(Conf.chatTagInsertBeforeString); - } - else - { - // we'll fall back to using the index place method - InsertIndex = Conf.chatTagInsertIndex; - if (InsertIndex > eventFormat.length()) - return; + // The case without color is really this simple (: + event.setFormat(formatWithoutColor); + return; } - String formatStart = eventFormat.substring(0, InsertIndex) + ((Conf.chatTagPadBefore && !me.getChatTag().isEmpty()) ? " " : ""); - String formatEnd = ((Conf.chatTagPadAfter && !me.getChatTag().isEmpty()) ? " " : "") + eventFormat.substring(InsertIndex); + // So you want color eh? You monster :O - String nonColoredMsgFormat = formatStart + me.getChatTag().trim() + formatEnd; + // 1. We cancel the chat event on EventPriority.HIGHEST + event.setCancelled(true); - // Relation Colored? - if (Conf.chatTagRelationColored) + // 2. We trigger EventPriority.MONITOR manually without relation color. + PlayerChatEvent monitorOnlyEvent = new PlayerChatEvent(from, message); + monitorOnlyEvent.setFormat(formatWithoutColor); + callEventAtMonitorOnly(monitorOnlyEvent); + + // 3. We log in console the way it's usually done (as in nms.NetServerHandler line~793). + Bukkit.getConsoleSender().sendMessage(String.format(monitorOnlyEvent.getFormat(), monitorOnlyEvent.getPlayer().getDisplayName(), monitorOnlyEvent.getMessage())); + + // 4. We send out the messages to each player with relation color. + for (Player to : event.getRecipients()) { - // We must choke the standard message and send out individual messages to all players - // Why? Because the relations will differ. - event.setCancelled(true); - - for (Player listeningPlayer : event.getRecipients()) - { - FPlayer you = FPlayers.i.get(listeningPlayer); - String yourFormat = formatStart + me.getChatTag(you).trim() + formatEnd; - try + FPlayer fpto = FPlayers.i.get(to); + String formatWithColor = parseTags(format, from, fpfrom, to, fpto); + to.sendMessage(String.format(formatWithColor, from.getDisplayName(), message)); + } + } + + /** + * This is some nasty woodo - I know :/ + * I should make a pull request to Bukkit and CraftBukkit to support this feature natively + */ + public static synchronized void callEventAtMonitorOnly(Event event) + { + synchronized(Bukkit.getPluginManager()) + { + HandlerList handlers = event.getHandlers(); + RegisteredListener[] listeners = handlers.getRegisteredListeners(); + + for (RegisteredListener registration : listeners) + { + try { - listeningPlayer.sendMessage(String.format(yourFormat, talkingPlayer.getDisplayName(), msg)); + EventPriority priority = (EventPriority) fieldRegisteredListenerDotPriority.get(registration); + if (priority != EventPriority.MONITOR) continue; } - catch (UnknownFormatConversionException ex) + catch (Exception e) { - Conf.chatTagInsertIndex = 0; - P.p.log(Level.SEVERE, "Critical error in chat message formatting!"); - P.p.log(Level.SEVERE, "NOTE: This has been automatically fixed right now by setting chatTagInsertIndex to 0."); - P.p.log(Level.SEVERE, "For a more proper fix, please read this regarding chat configuration: http://massivecraft.com/plugins/factions/config#Chat_configuration"); - return; + e.printStackTrace(); + continue; } - } - - // Write to the log... We will write the non colored message. - String nonColoredMsg = ChatColor.stripColor(String.format(nonColoredMsgFormat, talkingPlayer.getDisplayName(), msg)); - Bukkit.getLogger().log(Level.INFO, nonColoredMsg); - } - else - { - // No relation color. - event.setFormat(nonColoredMsgFormat); + + // This rest is almost copy pasted from SimplePluginManager in Bukkit: + + if (!registration.getPlugin().isEnabled()) { + continue; + } + + try { + registration.callEvent(event); + } catch (AuthorNagException ex) { + Plugin plugin = registration.getPlugin(); + + if (plugin.isNaggable()) { + plugin.setNaggable(false); + + String author = ""; + + if (plugin.getDescription().getAuthors().size() > 0) { + author = plugin.getDescription().getAuthors().get(0); + } + Bukkit.getServer().getLogger().log(Level.SEVERE, String.format( + "Nag author: '%s' of '%s' about the following: %s", + author, + plugin.getDescription().getName(), + ex.getMessage() + )); + } + } catch (Throwable ex) { + Bukkit.getServer().getLogger().log(Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getName(), ex); + } + } } } + + public static String parseTags(String str, Player from) + { + FPlayer fpfrom = FPlayers.i.get(from); + return parseTags(str, from, fpfrom, null, null); + } + public static String parseTags(String str, Player from, FPlayer fpfrom) + { + return parseTags(str, from, fpfrom, null, null); + } + public static String parseTags(String str, Player from, Player to) + { + FPlayer fpfrom = FPlayers.i.get(from); + FPlayer fpto = FPlayers.i.get(to); + return parseTags(str, from, fpfrom, to, fpto); + } + public static String parseTags(String str, Player from, FPlayer fpfrom, Player to, FPlayer fpto) + { + StringBuffer ret = new StringBuffer(); + + Matcher matcher = parsePattern.matcher(str); + while (matcher.find()) + { + String[] parts = matcher.group(1).toLowerCase().split("_"); + List args = new ArrayList(Arrays.asList(parts)); + String tag = args.remove(0); + matcher.appendReplacement(ret, produceTag(tag, args, from, fpfrom, to, fpto)); + } + matcher.appendTail(ret); + + return ret.toString(); + } + public static String produceTag(String tag, List args, Player from, FPlayer fpfrom, Player to, FPlayer fpto) + { + String ret = ""; + if (tag.equals("relcolor")) + { + if (fpto == null) + { + ret = Rel.NEUTRAL.getColor().toString(); + } + else + { + ret = fpfrom.getRelationTo(fpto).getColor().toString(); + } + } + else if (tag.startsWith("roleprefix")) + { + ret = fpfrom.getRole().getPrefix(); + } + else if (tag.equals("title")) + { + ret = fpfrom.getTitle(); + } + else if (tag.equals("tag")) + { + if (fpfrom.hasFaction()) + { + ret = fpfrom.getFaction().getTag(); + } + } + else if (tag.startsWith("tagforce")) + { + ret = fpfrom.getFaction().getTag(); + } + + if (ret == null) ret = ""; + + return applyFormatsByName(ret, args); + } + public static String applyFormatsByName(String str, List formatNames) + { + if (str.length() == 0) return str; + for (String formatName : formatNames) + { + String format = Conf.chatSingleFormats.get(formatName); + try + { + str = String.format(format, str); + } + catch (Exception e) { } + } + return str; + } + } diff --git a/src/com/massivecraft/factions/util/SpiralTask.java b/src/com/massivecraft/factions/util/SpiralTask.java index 98d5927a..ee01dce5 100644 --- a/src/com/massivecraft/factions/util/SpiralTask.java +++ b/src/com/massivecraft/factions/util/SpiralTask.java @@ -39,7 +39,7 @@ public abstract class SpiralTask implements Runnable private transient int length = -1; private transient int current = 0; - @SuppressWarnings("LeakingThisInConstructor") + // @SuppressWarnings("LeakingThisInConstructor") This actually triggers a warning in Eclipse xD Could we find another way to suppress the error please? :) public SpiralTask(FLocation fLocation, int radius) { // limit is determined based on spiral leg length for given radius; see insideRadius()