From 2e9e221a63f0d4aa0e4c39d2e107e0a0137aac35 Mon Sep 17 00:00:00 2001 From: JMteam09 Date: Wed, 21 Feb 2018 22:27:18 +0100 Subject: [PATCH] Built versuion pre-1.0.0.a --- Builds/Managed/Assembly-CSharp.dll | Bin 0 -> 178176 bytes Builds/preview-mod/TestMod1.dll | Bin 0 -> 4608 bytes ModLoader/Attributes/MyModEntryPoint.cs | 11 ++ ModLoader/Exceptions/MyCoreException.cs | 34 ++++ .../HookExceptions/NotHookedException.cs | 26 +++ .../HookSystem/MainHooks/MyGameLoadedHook.cs | 17 ++ ModLoader/HookSystem/MyBaseHook.cs | 81 +++++++++ ModLoader/HookSystem/MyBaseHookable.cs | 70 ++++++++ ModLoader/HookSystem/MyInitialHook.cs | 38 ++++ ModLoader/ModLoader.cs | 164 ++++++++++++++++++ ModLoader/MyConfig.cs | 74 ++++++++ ModLoader/MyConsole.cs | 76 ++++++++ ModLoader/MyMod.cs | 61 +++++++ 13 files changed, 652 insertions(+) create mode 100644 Builds/Managed/Assembly-CSharp.dll create mode 100644 Builds/preview-mod/TestMod1.dll create mode 100644 ModLoader/Attributes/MyModEntryPoint.cs create mode 100644 ModLoader/Exceptions/MyCoreException.cs create mode 100644 ModLoader/HookSystem/HookExceptions/NotHookedException.cs create mode 100644 ModLoader/HookSystem/MainHooks/MyGameLoadedHook.cs create mode 100644 ModLoader/HookSystem/MyBaseHook.cs create mode 100644 ModLoader/HookSystem/MyBaseHookable.cs create mode 100644 ModLoader/HookSystem/MyInitialHook.cs create mode 100644 ModLoader/ModLoader.cs create mode 100644 ModLoader/MyConfig.cs create mode 100644 ModLoader/MyConsole.cs create mode 100644 ModLoader/MyMod.cs diff --git a/Builds/Managed/Assembly-CSharp.dll b/Builds/Managed/Assembly-CSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..52ccdd3e4f3209503878a2889a541f1f5483aa96 GIT binary patch literal 178176 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℘+fJyk zG%meoZV53bWq1d|DwrrS{|XG^4#- zAbffMr7J}9iZ*jw?`pV@KBcutTkNiyrEVh%5{;hbTZp0tg94w|G1mETbC;5~Q$l!= z3uuWRx^5p(ly=|8mRcr>U1yL4yrJP>)?mY=tZ~l)yIG}#2IRq zqe^RdLCs&dQBK&1Wg@E8c)J#O80Xt;hDUEt)B}Z&snuQ!kJ{!G>S`YALuh|TBEXYG zLLz7>rN6%0LrT&=*y(ZmK6-WG=7aDBBg0%Qh0rqRN8eh+l8_;BF$+RYpj>uMpRn4= z)meB+&K+DV#^(dCmqTy^NNL+yoLymTY(Wty;5Aweok%Q}H_0srmn|k@y zmgh*sN--k`zo8~jaUX5BMJ-?&jZd$p`kZ`U<2x)>Voy0Tq!Ddnf>frS&N5MGdsJe? z9ahH`#~54MR|(FP(S+`U6 z^JS@Weoh!>O$dy1@fAkPa*j#4UvPMh4VyXZ9@~N;erIVP4}up7o(I95)bp_WFmb1* zqbykGj6u7qsrz`l;?9>VDR#S{1@1!i)P^=!E>9~)y7K05GarrJiNU!Km3beZZB z+s6Mt!y)nw7jz>M?#B>9Cqwx1W3(;Be`zn`))GoNNkkc1US~PW;U7j+!!a5*iRvY! zBr4=6>!tnWEmN0yJxp7O>__%cL$ym6PKgsOh)!F+AeKhRHemJe@|t0G+7>={c1Xc< zb48<*0jWh!!b@}Ruxdo5Q$PgCmcxvtS+Is4%)#<4cr$Wzo#Z&%T7b1>&Y4QMgAE`mY7#)c~8<(mqVwr zYFVTp525O*M{mg$fRfG1^j&!X@5@ZDeU&ZcaMuK%8zx4KW>z4R{Nq>pyB-BJe*Ll1#*%}W>(Gi3rXj;*mdm{>~G>|2O~rzlHv+Qb`6l zHEXy#Di#_a%%V!YdFy~KNu2dp>QO`?Vv)*Ml~m3uE${Ojt9w zTCs#98>rN)T!$5?H}maLq}Hm{gnB=#r0w?@R9Tm)8}^{LVn-wm(x+4Xw8J{T&kfppzqU& zfw+?9Uu(oejEa7uXgu9rNgJ4sY5O7-YPH%>h@v$AbAC3IDF&z_!*o2J=Kr-ahM`%p zb7+l)EFP=1()^bR|JG(LNf-N@i;RS86xBxJes6&Os5lmq!MI<2uZU|=D=`2V2!~Ds zDocsJTCF+BfNQmZI3h?&)SQf3@rpEmp;k*;H9&1na!qPgzWeENrb1`0BpDt2 zH34P-Xd}bUCGav74@R{}2=<0%pg#zw5AuNt29yy&{-HUQ#!!gINvcN8_7%FJ3CJvI zwtrM2{L)AuPnhRtsA|6^mVpE){aOyzARVs8t zAdMRWzW1P&sII0&?NKxT-wZl|4B!h=EA^pxzz`jYHeiZoJj|3eDETU6q~TC3sofWU zj$*=I9X!6oFX7*?+{`!dvpy|euNMWPJ`a#(Gejw$7XpkMu1Yko?Ux3!N;HPJs1JGr zV52YT02bBbzTS@dP(A~}g-$#z2Zcu)z|q#EfO$B5G1l?mhQi6UnF-~Lq$ zzv-~CUe*-bLF2HS22zU|6ri;)D5DtA!el%K0Th$fYUZ1*miUt;gh;dfizqUZP?;*C zz)KGSp@(V#iui?xtE?w5Qu`M%0(5b8bIPWFaWx~anl#jmGed^@Ew-p^O$$MvZ!3_U zZ>z-v3BvYUNu=}d#s#n+_(X$U59AAJzMvu>lm*J^S!l!qMVW1BzD?sVqpRbQ1O`TY z_Rw6eQfWNY5`K`hh6F+mehV&-Y8Gx^Ss7P>t^E;2wN~XH2)9IxAegWi`T^)x`ZOdo zh%|1wIDXp5a&fJ#Vu_?;x{f(xW~<`EX8xjeD!C&hg1&VMR~xbBM^jiF0>;?TY9I-U zs)$&`cA6FZs?s9J3>pH=9ptgz4Mi*C5!SafZ!%5Av|GB-%}>VS5eV%Uh_Q>t%4($^ z`juABu%tx(tmdwLQ5_r+<<)A{s#XV91MzfCBbtP!A$3o#Axw zL8d&@+}+xUlPUz1xO63C?L$c{hF^+*7rdyp4u;kPlaFae8A22X#P%-h$-4-JN=0Kx znR0}sw5yroQimv2Rw(5%K*@AkBsN_&;i^22vDlE%YEG#(;y}pKblxtgxu{|*QG_z9 z6vx{f7F|lx!56O?mWKuAgjRx9x>*D4;|g6?fq4Mwc!VVA+(ry?Nc6!+ zH$mz)J^759*YpYtg^-#_OL?YTBSiGm(E`Cmz2ZU-RP0E|nUdsZgmNL4zM3!y9qXq9 ze33B{`b5?GO-;rlMRVw?`Ai`QX9%i+BCC{-Gt2_5KsK6g>!LP_j?qhPH^*a8o+i{L zyU0`5MGDOt*ViJoh92&82b=;=q*LJHd5}h7M2j=y`!N&FdWTMc7)#sl3qs}Ep{121 zEhH?FQm)Ces|dl^SWRQGu>4m+5ljIA!qYjAB+nbyfOizBL9Q2<>NlWa&?s=!lH#gPo2DOoh9B-YCI6(ILD zl}Wn-$Xcr@>qZc3iPd@9SI(#D%3Aa2D#vE~<&~XP??Rei@QG%%EGh3oIms75y95($ ztcc^Z;U!(*iQm95S;ZWE$byqd`>SB{z_ZZM`7-Z3YFeRw<>!@N_Hcff=|P|{*OyH4 zVIT)Z3L(Z7yE4uHghjVG<$O?b!-&>U+S1|cgpreo5#dmyS#^aL!IV*KBu=zq2<}<~ z&SP~qX0QYX%2lS57`Hlvg)pT*%rN@L6h@t$WPM@Cn8z>Ls&-ivRBtZc3k}0$iG(Xh zM-NtR9gU_w9@`RNOe{usUPdHTlfGttFIEGxb#doV)))0PNJy%&O=DeiiJ6UIJz;|w z61&u)4e8kRIzlMTcLTvLz{mD~5k#O~r1{-VsdYA6rC~t{t?J$BYL3RSRY~(LH1k$D zRa=Yce0w}bcB#oF4XwdCGP=Y-xd`j!Z_y-8h)7AWIc&0;0tmx5BMEB&oZ47gv0YKj z7+Ht6XhC|U%lj%)oB6lj6>!89F9-|MHu&nZyk=T!%A(c;S5bqm#zuAQt2F_0PYe@Hr0qAsYBWKcIehPZPKbpT&zPpeC7|#u zew(Er&A*f8--XMO2mmQURNO?t8!!#twz1GZn6}>;M%?D#!y3mPCux}UQ6#RHAdSSK zP6?VBqd-eOmi+q>pj-s}i;V0dLZC=danCa~EFa1$D%4!e1q~fl3ekSm0a+7v#p#-0 zUFuR)F68&sw0*Uc*^|w*=RYzC1O>l|2~ahHL#S+^5Zmpmf|}uZ-b)&4MKHc(wUw%t zJhf~Sj-9}J8R;x9VUB3THkFEoM218Qre_ha%0a{Wre782=wuOa0xr|Uk(R;&AdW-3 zf~@QMvx)goN^ zGp6Qe4iQ4GQbkv=RhXi;#Ks_2(s6B$f@PJGXwqyo+VDb)(3@zsw`JJfR`SKt4YwFN zJ`rn_^$e#Inh4Z?(Wn9sGfedz5iXY+tZ9xBD=j_Hc%PM_+LI1$r2lSUU6B$bc?%NN zE+_*)$yP8d9Iyf@Sc``wHYuW#1s;dMV>tkuj#XOnd_d*Z(k1Fl0@IZL5N*|XfI{y` z@Vx_WMsZ@K`PE)1m2J5ybJZ6E1HoXTA*R2c^x6CY9D1K*+B%FA42KM}6kj$69xGeb zg{b!58WnD_g>{QY2hne_^-F0)wps+ggDLpXhu|^=U;dXgKWNG&Uf37Vu7?XHM!F03 z^=eTQQ)Frx5VaB{K$_o0_G>D_VkbNDF4uNmL$29uw=dWQj{(}4dtgdJXkQqXV@AzN z@uKou2KrkC=xcz{Ze>E;_YZN(@7Wl&Us(1QV($i$8_QP{+3RKbXK^=VC+6Ak|M={o4cU|0Lgv)T zd%w7Gv;H<@53u(PTXNlda{3H!jUV5T?LEUc9uM>K@d3WZaq`|nU;gscU5D@b((QNO zap&~rEq9Ms4n&Rp$7bhfiA@RpQ#zIZpJD48OxHz&Q9r&jJOwpf8#=8ZgMjp>!9)oY zI%SC)OYO^jgDsNN_V;zVsMAZ-IO6%})s$}kNT*B6`-x8fTBkqJ=@p7TufTuN>0M$~ z1zzNoUm!N8*k7u{4FmXY^UVt0sl-1m?zU{9loIj^fK(}jb57AAoiqyWcu@S0G=k06 z#-r5O%zxI0Q%xy&j>&Als~UUBn6_5FX6L8X;c>N)>vUPCk97L5KtR4w1{jCjlm%Ws zD&VsbykA6C71s@Ash7*j7s|kS8qZhj)CQEt6}X$g!|L-@0rMiU6^beUpaMV8>2+_~ zbgO)K*;>;E;pZQNpgQqp{zsPjGWEZu7B3f2&CpK%r#k&~&_+>L_;t1ZmO?0r6NtV&AeeAmQN@NaG3}P-v|}M-*x)G-m}5mbE`5>a?1l zS5Eta3W4Hg{zKJaMlgF6`eUmIF>wD%aqj;5Qt@^XSPWozhe|CPR;DPrD0_>0zuelZ z^`n9lj&WeZCR;<)+6U_#tPp3r5GJZsJl^iYRcP z5n%5$C$R#|Erqpc3EWh~i1Z9yY7{UFDYj(!VC)tQE^;0{6^s+bwGK?~-39n6_t+cw zci-1YG|Y61St(oVjbOKExSe35ZC|cp^l(4G$L^62JYptDz7<$m^tWQK2a+SP&B#AcbJ?noGTwaOsUSbuYL53Ypxd z6{;~lb*YVn7(DpFT~-1_y-X6LwkuD_OdGhmX#*$tB^!9dTD(kjB=e!q0O&9<+9+qD zDw7H|W5Y9BgBdnKI-^U~F8HZyBgDM0+D1*CL4JeO8n&MGq+7t%nvhQSn)r)6G1fCv z@Z=(`5p84zqs$0F809?FP-s~Ug$nshqZmB?RfvWJ2$8z=f_P`t7ws0*;e}L&_6m}N zYDK(y96=D;qa>)B3|e=*g>Udr#sb_CSU4z!i2^gq6o0>(b-XK=bpIRIqEnf;w|#*& zSqADN8IdeABr1|uL1T|Z%a$UBGpy@A82xY)$k`x$8Zz=JeVQyd-)hUBp>~WYMCdO8&r0{=lAT(al^&Xyy)7lq8z?Bw^r*TZjhh0Z`ErVU=?W&u z#=(0PY_Q;B}{*4<6g#2(425L>fiW_q&DaE`P;9M^0pbxDQ^844m~3MdGViU?Kx67?W& zVAUXKT_G;~MtNeyLhtyw2C6YS3jmRR=3FeURj#@P#nnV?b(pakBrP>b+rU``5p?@~ zevZ&ziQZ&m2G+?ftFs#Z(ZVgU%|wizF=|fY@Fjn1D;tJZFV~d==JTIwb>QC?1t`YpA=0J^)K1Ekvvnt7tOKX94kqJv~NP>5;}ySjmFc5iZVy zIvf*k`{gYg@LK{0j(M#_Ig^ITT^(Uu#+8f;B4Mr;9Nv1cTg!|bmniqh=|le4a$#Mx zRaui6N<-J`iM|HbOH=7jPzUTSknDkr%+Wn2q9`>8LSTxmC^=* z3I3C$QrL9_WXFZDrV=XQKy=erPfyJ~cIsqjBYbw5J9T!x@;jAqQ~4Q}%)ZZ-X)`kn zF{>S#G+2JN!&6pO!l<_D%jOSjdqvy-&vNL}k9s8x@a2U0qKS!080&Q5yQF4pVs(=h zR{Q0ygtS}5nnZ8!Qll7I5X64p$okBc+%uur@ zc4hWSkC0YEEz>7GrVh;)Nh6go_yF6qou0xv7lhlkg|MOowd`6~%bnY9f#?`d;43BC z#ES|+VBV=RI>sttm@kE#n9j7@n5QuvD{aTkY~fT^exobnn~O6%RexJ0tlu|1&z|S= z)5@Pc`5eY~c6Mg^WagD-=QH*vpPxQL>2YSrHU{jBQm8QCUft%P0HYs}P2cuSooJaH z!dm7Va>&Y!;Gqq+(_+`8`ASg;h?|ZnA&QMH+5fMTNxNg2ZOnBzn`3i5eRgPi{vMv0 zWoonH(?Lsfn23J+dZV?^L=0(@w;mMT!s8gW`RIJcUWb`|iwYF7jb~QSszU}HCgr}S z01HvXjuu||K&G^w~2NcF1J+Z4yfn2M-pVuhU)iZT?S%pI| z+pdC!rLxEvG(5vj@9YRTKgag_(_{cce|GFdMx`O9JhPCI#E-WbZTvll!Ix~@ym@m` zRJBfQnpZ7RvQ+|rLH7OiRH1sFozeJ8mI}ct1GW_^JiJDGX2XA!i=MC+(3= zAB+4c1F{K0?1=ip`!vh&d-$Y{m_}C2g^Q(3O*U?5}Y3<*}ezP#Z z5(B`i;KQYGyL95M>1)ze?qUAFb~Oq|x+Fzd>*AAPe|U$uYYH~)vH@GRVWLJru`&$*{rOWVP@LaTbqrhH*fuX{bi+Z;M3gKFtTBfY$%{RaH? zHoXAk$IJb%(`5yi^g@uo%5-f@KejU36TtuO{YBxXaac~=N z$?UiHZnVW*=k?2gu1Y(4FZ!sppcfM7C@(1eEog^tul2X5NEas5Upcn&eexUc_f8wH zUi#Eq&%XcA@=35MH40Ulc=W!{*v@aO|3+fq F{{oCqj=BH< literal 0 HcmV?d00001 diff --git a/Builds/preview-mod/TestMod1.dll b/Builds/preview-mod/TestMod1.dll new file mode 100644 index 0000000000000000000000000000000000000000..4d4ac59cee3905246cbf309f28e1bf8c3272f790 GIT binary patch literal 4608 zcmeHKU2Ggz75-+uc5Elv#C97R5~Y(k1t*a=YkLzX1yMV@wzG}hxL(^Wt)*sm_j)~K zc4nEG4PI1`K?0OWm0FRfJ~i+{c_EdMD5w+(D#Qbk5aOZmLJ@u74IxEB@Id&^ogJ@# zsv_}#D&Wk{x%d3td(OG{p1C{s+{@?ykmUQ|0q`bUfeDR29BojXdh|yre81=3@i&dx zd&d{o?7*!1Ue&j1X4!IGFEmTa^c${eyJr4s(X4qDmEOO<_hf76`6*!5=)k*weCfG( zw)b$t+-qcjUUIr3?y*yBO}-O+frGlAi2N3Y_^)Aun0$c_OngmL<=1Xoq_7CT90ION zX98H4MC^oXz&`SBe-b#lQ}$uB33P9fcay%ng-(ZRJtTdyhlnyAYs+s^8cg6?+7J9P zDec zmGEg=_xl7*68(xvO$;4ifJ1bLD|#9OnS>6RihYz(wbx_+OmCMzM~g49pX~AmMEf*< z=aKN2V*cq9iJ^zIguxV_ykxXImAG$=rZeetneowaal8`_@jUY|_+{WNw(<@ZL*I6* zfoQCELhB4J74bg%lCHs-r9z(VebVm>eaZ1kYz1g;Jo8WjJ+iQWH^y)%$`k$3XNZ1t zRzTW;5Y^1Uc5t&fE+6EN1lVYKs>og4X`)G zH%Z$!5|=S=itg7RIl`F?gqnH>LzEhLtwo*H)VDSDb9_^4zM-kut_MdF2A5h!IZWJ( zQ^W@`qVYwICp9i;{ItfO)z~6_7`E{RAG3yIb15vJLPU9*=m7DhTJi$_PG9+;G%qFxSjY&!9M6oSQ{0D0{wR zm*Baxo>gJ9!{(d%^Cp=Y1x$9PSq6yn55Ot7{)9 zs?{yG*|uq=Rp#V8CEKyXEz-ccp-|w0=`c`^ns`am6~{rb8HB2astUKo+Ty1d)T*P( z5+LG)4d;q$mS0D@9D07Nm$$8|>jj}*4q{fzwRFJ^mG9My%D-Wk)h=KK{Xm?Gyq2HYMY&V3X!axF)-FsjWil-sO96VHjvomOD zP5_fQHXN`I`@Nj{0v9)1oEZV>)et73ElS9AA zeRtsgbn&+@-9pkdjP4E-MkhOceL|)LN!{r$^v!jfNh6g?^%s(RjQ)K|6a7zjW(*ud zvX^xC55Bmvd^r2w%|utK+h~2Ek4Y(9OdNW~x9U%M?$ml&>8-c8=6hcV4C?KXBaZzv zh}W2vUh_U?pnr2;nLmBqG)FTd7l2a+PL5j_#;o(D((qVzzT-#Ax7Nyfn&-PSLVMBVm#ROfe|W60O3figX9N4(pX!y&8ly4_}H rc6a9Xg0`8Y_koV3L{FQH{9oD0d>FG literal 0 HcmV?d00001 diff --git a/ModLoader/Attributes/MyModEntryPoint.cs b/ModLoader/Attributes/MyModEntryPoint.cs new file mode 100644 index 0000000..9744e21 --- /dev/null +++ b/ModLoader/Attributes/MyModEntryPoint.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SFSML.Attributes +{ + public class MyModEntryPoint : Attribute + { + } +} diff --git a/ModLoader/Exceptions/MyCoreException.cs b/ModLoader/Exceptions/MyCoreException.cs new file mode 100644 index 0000000..cd3fe4d --- /dev/null +++ b/ModLoader/Exceptions/MyCoreException.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SFSML.Exceptions +{ + class MyCoreException : Exception + { + public MyCaller caller; + public readonly string file; + public readonly string msg; + public MyCoreException(string message, string myFile) : base("Whoops something went wrong!") + { + this.file = myFile; + this.msg = message; + } + + public class MyCaller + { + public readonly string function; + public readonly string file; + public MyCaller(string functionName, string fileName) + { + this.function = functionName; + this.file = fileName; + } + public string construct() + { + return function + "()" + " [" + file + "]"; + } + } + } +} diff --git a/ModLoader/HookSystem/HookExceptions/NotHookedException.cs b/ModLoader/HookSystem/HookExceptions/NotHookedException.cs new file mode 100644 index 0000000..48235ab --- /dev/null +++ b/ModLoader/HookSystem/HookExceptions/NotHookedException.cs @@ -0,0 +1,26 @@ +/* + * Created by SharpDevelop. + * User: JordivdMolen + * Date: 2/15/2018 + * Time: 10:35 AM + * + * Using this file for commercial purposes can result + * in violating the license! + */ +using System; +using SFSML.HookSystem; + +namespace SFSML.HookSystem.HookExceptions +{ + /// + /// Description of NotHookedException. + /// + public class NotHookedException : Exception + { + public MyInitialHook target; + public NotHookedException(MyInitialHook tgt) : base("This hook is not registered in a MyBaseHookable") + { + this.target = tgt; + } + } +} diff --git a/ModLoader/HookSystem/MainHooks/MyGameLoadedHook.cs b/ModLoader/HookSystem/MainHooks/MyGameLoadedHook.cs new file mode 100644 index 0000000..6627d98 --- /dev/null +++ b/ModLoader/HookSystem/MainHooks/MyGameLoadedHook.cs @@ -0,0 +1,17 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SFSML.HookSystem.MainHooks +{ + class MyGameLoadedHook : MyBaseHook + { + public ModLoader core; + public MyGameLoadedHook(ModLoader coreLoader, String test) + { + this.core = coreLoader; + } + } +} diff --git a/ModLoader/HookSystem/MyBaseHook.cs b/ModLoader/HookSystem/MyBaseHook.cs new file mode 100644 index 0000000..6b440cc --- /dev/null +++ b/ModLoader/HookSystem/MyBaseHook.cs @@ -0,0 +1,81 @@ +/* + * Created by SharpDevelop. + * User: JordivdMolen + * Date: 2/14/2018 + * Time: 9:26 PM + * + * Using this file for commercial purposes can result + * in violating the license! + */ +using System; +using System.Collections.Generic; +using SFSML.HookSystem.HookExceptions; +using System.Reflection; + +namespace SFSML.HookSystem +{ + /// + /// Event-like system, baseclass. + /// + public abstract class MyBaseHook : MyInitialHook + { + private MyBaseHookable infested = null; + protected Func onInvoke = null; + public MyBaseHook() + { + this.baseType = typeof(T); + } + + /// + /// setOnInvoke AKA Register hook as hookListener + /// + /// This function will be ran when the hook is casted + /// This object should be the object you are registering the hook on. + public void setOnInvoke(Func hook, MyBaseHookable root) + { + if (this.onInvoke == null) + { + this.onInvoke = hook; + root.registerListener(this); + } + else + { + throw new Exception("OnInvoke is already set @ setOnInvoke"); + } + } + + public T invoke(T e) + { + if (!(e is MyBaseHook)) + { + throw new Exception("event has to be an instace of MyBaseHook @ Invoke"); + } + if (!this.isListener()) + { + throw new Exception("This hook is not a listener! @ Invoke"); + } + MyBaseHook hookT = ((object) e) as MyBaseHook; + T invokeResult = this.onInvoke(e); + return invokeResult; + } + + + public Dictionary getEventArgumets() + { + Dictionary args = new Dictionary(); + foreach (FieldInfo fi in this.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)) + { + if (fi.DeclaringType == typeof(T)) + { + args[fi.Name] = fi; + } + } + return args; + } + + public bool isListener() + { + return this.onInvoke != null; + } + } +} diff --git a/ModLoader/HookSystem/MyBaseHookable.cs b/ModLoader/HookSystem/MyBaseHookable.cs new file mode 100644 index 0000000..748ee84 --- /dev/null +++ b/ModLoader/HookSystem/MyBaseHookable.cs @@ -0,0 +1,70 @@ +/* + * Created by SharpDevelop. + * User: JordivdMolen + * Date: 2/14/2018 + * Time: 9:39 PM + * + * Using this file for commercial purposes can result + * in violating the license! + */ +using SFSML.Exceptions; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace SFSML.HookSystem +{ + /// + /// Description of MyBaseHookable. + /// + public class MyBaseHookable + { + private List hooks = new List(); + public MyBaseHookable() + { + } + + public void registerListener(MyBaseHook e) + { + if (!e.isListener()) + { + throw new MyCoreException("This hook is not a listener! @ RegisterListener","registerListener()"); + } + this.hooks.Add(e); + } + public void removeListener(MyInitialHook e) + { + this.hooks.Remove(e); + } + public T castHook(T e) + { + T usedCaller = (T) ((MyInitialHook)(object)e).Clone(); + MyBaseHook convertedBase = (Object) e as MyBaseHook; + Dictionary initialFields = convertedBase.getEventArgumets(); + foreach (MyInitialHook initHook in this.hooks) + { + T ih = (T) (object) initHook; + MyBaseHook convertedHook = (MyBaseHook) initHook; + T afterInvoke = convertedHook.invoke(usedCaller); + convertedHook = (object) afterInvoke as MyBaseHook; + Dictionary initHookFields = convertedHook.getEventArgumets(); + if (convertedHook.isCanceled()) + { + convertedBase.forceCanceled(true); + } + foreach (String fieldName in initialFields.Keys) + { + FieldInfo orginField = initialFields[fieldName]; + FieldInfo newField = initHookFields[fieldName]; + object orginValue = orginField.GetValue(e); + object newValue = newField.GetValue(afterInvoke); + if (orginValue != newValue) + { + orginField.SetValue(e, newValue); + } + } + } + return (T) (object) convertedBase; + } + } +} diff --git a/ModLoader/HookSystem/MyInitialHook.cs b/ModLoader/HookSystem/MyInitialHook.cs new file mode 100644 index 0000000..5314a2d --- /dev/null +++ b/ModLoader/HookSystem/MyInitialHook.cs @@ -0,0 +1,38 @@ +using SFSML.HookSystem; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SFSML.HookSystem +{ + public class MyInitialHook : ICloneable + { + private MyBaseHookable infested = null; + protected Type baseType; + protected bool cancel = false; + public MyInitialHook() + { + } + + public Type getInitialType() + { + return this.baseType; + } + + public bool isCanceled() + { + return this.cancel; + } + + public void forceCanceled(bool state) + { + this.cancel = state; + } + + public object Clone() + { + return this.MemberwiseClone(); + } + } +} diff --git a/ModLoader/ModLoader.cs b/ModLoader/ModLoader.cs new file mode 100644 index 0000000..d11771a --- /dev/null +++ b/ModLoader/ModLoader.cs @@ -0,0 +1,164 @@ +/* + * Created by SharpDevelop. + * User: JordivdMolen + * Date: 2/14/2018 + * Time: 10:06 PM + * + * Using this file for commercial purposes can result + * in violating the license! + */ +using System; +using System.Diagnostics; +using System.IO; +using UnityEngine; +using System.Reflection; +using SFSML.HookSystem; +using SFSML.HookSystem.MainHooks; +using SFSML.Exceptions; +using SFSML.Attributes; + +namespace SFSML +{ + /// + /// The coreclass of SFSML. + /// + [MyModEntryPoint] + public class ModLoader : MyBaseHookable + { + public static MyConsole mainConsole; + + public int loadedMods = 0; + private Canvas overlayObject = null; + public MyConsole myConsole; + + public ModLoader() + { + if (Application.platform == RuntimePlatform.WindowsPlayer) + this.myConsole = new MyConsole(); + mainConsole = this.myConsole; + + } + + public void startLoadProcedure() + { + mainConsole.log("Initiating load procedure", "Core"); + this.performDirCheck(); + + this.loadPriorityMods(); + this.loadMods(); + } + + public void toggleOverlay() + { + overlayObject.enabled = !overlayObject.enabled; + } + + public string getMyBaseDirectory() + { + return Application.dataPath + "/SFSML/"; + } + + public string getMyModDirectory() + { + return Application.dataPath + "/SFSML/Mods/"; + } + + public string getMyDataDirectory() + { + return Application.dataPath + "/SFSML/Data/"; + } + + private void performDirCheck() + { + if (!Directory.Exists(this.getMyBaseDirectory())) + { + Directory.CreateDirectory(this.getMyBaseDirectory()); + mainConsole.log("Created SFSML directory.", "DirChecker"); + } + if (!Directory.Exists(this.getMyModDirectory())) + { + Directory.CreateDirectory(this.getMyModDirectory()); + Directory.CreateDirectory(this.getMyModDirectory()+ "priority/"); + Directory.CreateDirectory(this.getMyModDirectory() + "normal/"); + mainConsole.log("Created Mods directory.", "DirChecker"); + } + if (!Directory.Exists(this.getMyDataDirectory())) + { + Directory.CreateDirectory(this.getMyDataDirectory()); + mainConsole.log("Created Data directory.", "DirChecker"); + } + + } + private void loadPriorityMods() + { + try + { + string[] priorityMods = Directory.GetFiles(this.getMyModDirectory() + "priority/"); + foreach (string mod in priorityMods) + { + if (Path.GetExtension(mod) != ".dll") continue; + this.loadModFromFile(mod); + } + } + catch (MyCoreException e) + { + e.caller = new MyCoreException.MyCaller("loadPriorityMods", "ModLoader.cs"); + } + catch (Exception e) + { + mainConsole.logError(e); + } + + } + private void loadMods() + { + try + { + string[] normalMods = Directory.GetFiles(this.getMyModDirectory() + "normal/"); + foreach (string mod in normalMods) + { + this.loadModFromFile(mod); + } + } + catch (MyCoreException e) + { + e.caller = new MyCoreException.MyCaller("loadMods", "ModLoader.cs"); + } + catch (Exception e) + { + mainConsole.logError(e); + } + } + private void loadModFromFile(String modFile) + { + try + { + if (Path.GetExtension(modFile) != ".dll") return; + string modFileName = Path.GetFileNameWithoutExtension(modFile); + mainConsole.log("Loading mod: " + modFileName,"SFSML"); + Assembly modAssembly = Assembly.LoadFrom(modFile); + MyMod entryObject = null; + foreach (Type modType in modAssembly.GetTypes()) + { + object[] attributeList = modType.GetCustomAttributes(typeof(MyModEntryPoint), true); + if (attributeList.Length == 1) + { + entryObject = Activator.CreateInstance(modType) as MyMod; + } + } + string dataPath = this.getMyDataDirectory() + modFileName; + entryObject.assignDataPath(dataPath); + entryObject.Load(); + mainConsole.log("Loaded " + entryObject.myName+".\n"+entryObject.myDescription+"\nVersion "+entryObject.myVersion, entryObject.myName); + } + catch (MyCoreException e) + { + e.caller = new MyCoreException.MyCaller("loadModFromFile", "ModLoader.cs"); + } + catch (Exception e) + { + mainConsole.logError(e); + } + } + } +} diff --git a/ModLoader/MyConfig.cs b/ModLoader/MyConfig.cs new file mode 100644 index 0000000..e9e4718 --- /dev/null +++ b/ModLoader/MyConfig.cs @@ -0,0 +1,74 @@ +using SFSML.Exceptions; +using SFSML.HookSystem; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace SFSML +{ + public class MyConfig + { + Type t; + private object configuration = null; + public readonly string configurationPath; + public MyConfig(string path, Type baseType) + { + this.t = baseType; + this.configurationPath = path; + this.loadConfiguration(baseType); + } + + public T getConfiguration() + { + return (T) this.configuration; + } + public void loadConfiguration(Type configType) + { + if (!File.Exists(this.configurationPath)) + { + object obj = Activator.CreateInstance(configType); + if (!(obj is IMyConfig)) + { + throw new MyCoreException("configType is not part of a IMyConfig!", "MyConfig.cs"); + } + IMyConfig cfg = obj as IMyConfig; + cfg.SetupDefaults(); + this.configuration = cfg; + ((IMyConfig)this.configuration).setParent(this); + this.save(); + } + String json = File.ReadAllText(this.configurationPath); + this.configuration = JsonUtility.FromJson(json, configType); + ((IMyConfig)this.configuration).setParent(this); + } + + public void save() + { + string json = JsonUtility.ToJson(this.configuration); + string path = this.configurationPath; + File.WriteAllText(path, json); + } + } + + public abstract class IMyConfig + { + [NonSerialized] + private MyConfig parent = null; + abstract public void SetupDefaults(); + public void save() + { + this.parent.save(); + } + public void setParent(MyConfig par) + { + if (this.parent == null) + { + this.parent = par; + } + } + } + +} diff --git a/ModLoader/MyConsole.cs b/ModLoader/MyConsole.cs new file mode 100644 index 0000000..d7781c9 --- /dev/null +++ b/ModLoader/MyConsole.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace SFSML +{ + public class MyConsole + { + [DllImport("kernel32.dll")] + static extern IntPtr GetConsoleWindow(); + + [DllImport("user32.dll")] + static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); + + [DllImport("Kernel32.dll")] + private static extern bool AllocConsole(); + + const int SW_HIDE = 0; + const int SW_SHOW = 5; + + private bool visible = false; + + public MyConsole() + { + AllocConsole(); + this.hideConsole(); + Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }); + this.visible = false; + } + public void hideConsole() + { + ShowWindow(GetConsoleWindow(), SW_HIDE); + this.visible = false; + } + public void showConsole() + { + ShowWindow(GetConsoleWindow(), SW_SHOW); + this.visible = true; + } + public void toggleConsole() + { + if (this.visible) + { + this.hideConsole(); + } else + { + this.showConsole(); + } + } + public void logError(Exception e) + { + StackTrace st = new StackTrace(e, true); + StackFrame sf = st.GetFrame(0); + int line = sf.GetFileLineNumber(); + string file = sf.GetFileName(); + Console.WriteLine("##[ERROR]##"); + Console.WriteLine(e.Message); + Console.WriteLine(e.StackTrace); + Console.WriteLine(line + "@"+file); + Console.WriteLine("##[ERROR]##"); + } + public void log(String msg, String tag) + { + Console.WriteLine("["+ tag + "]: " + msg); + } + public void log(String msg) + { + this.log(msg, "Unkwn"); + } + + } +} diff --git a/ModLoader/MyMod.cs b/ModLoader/MyMod.cs new file mode 100644 index 0000000..b5e8488 --- /dev/null +++ b/ModLoader/MyMod.cs @@ -0,0 +1,61 @@ +using SFSML.HookSystem; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace SFSML +{ + public abstract class MyMod : MyBaseHookable + { + public readonly String myName; + public readonly String myDescription; + public readonly String myVersion; + private string dataPath; + private string configPath; + private MyConfig configurationObject; + private Type cfgType = null; + public MyMod(String name, String description, string version) + { + this.myName = name; + this.myDescription = description; + this.myVersion = version; + ModLoader.mainConsole.log("No MyConfig type specefied.", "MyMod"); + } + public MyMod(String name, String description, string version, Type configurationType) + { + this.myName = name; + this.myDescription = description; + this.myVersion = version; + this.cfgType = configurationType; + ModLoader.mainConsole.log("Instanciating MyConfig.", "MyMod"); + } + protected abstract void onLoad(); + protected abstract void onUnload(); + public void Load() + { + this.onLoad(); + } + public void Unload() + { + this.onUnload(); + } + public void assignDataPath(string path) + { + if (this.dataPath == null) + { + this.dataPath = path; + if (cfgType != null) + this.configurationObject = new MyConfig(path + ".cfg",this.cfgType); + } + } + public string getDataPath() + { + return this.dataPath; + } + public MyConfig config() + { + return configurationObject; + } + } +}