From f839f0b6376098fa4e2324ba9bece9d8925fd030 Mon Sep 17 00:00:00 2001 From: ErikasKontenis Date: Sat, 9 Apr 2022 21:31:51 +0300 Subject: [PATCH] drafts for market system. It would be better if I remove the inbox system and market is still working like shit --- 800OTClient/data/things/772/Tibia.dat | Bin 249412 -> 249435 bytes 800OTClient/data/things/772/Tibia.spr | Bin 25550430 -> 25553993 bytes .../modules/game_features/features.lua | 1 + 800OTClient/modules/game_market/market.lua | 14 +- .../modules/game_market/marketprotocol.lua | 60 +- 800OTClient/otclientv8.log | 2744 ++++++++++++++--- 800OTClient/packet.log | 1067 +++++++ config.lua | 2 + data/items800/items.srv | 16 +- sabrehaven.sql | 41 + src/actions.cpp | 12 + src/configmanager.cpp | 5 + src/configmanager.h | 4 + src/const.h | 12 + src/container.cpp | 7 + src/depotchest.cpp | 68 + src/depotchest.h | 40 + src/depotlocker.cpp | 10 + src/depotlocker.h | 4 + src/enums.h | 67 + src/events.cpp | 30 + src/events.h | 2 + src/game.cpp | 471 +++ src/game.h | 9 + src/house.cpp | 1 + src/inbox.cpp | 57 + src/inbox.h | 32 + src/iologindata.cpp | 77 +- src/iologindata.h | 1 + src/iomarket.cpp | 307 ++ src/iomarket.h | 47 + src/item.cpp | 41 + src/item.h | 2 + src/items.h | 1 + src/luascript.cpp | 77 + src/luascript.h | 4 + src/mailbox.cpp | 41 +- src/otserv.cpp | 4 + src/player.cpp | 44 +- src/player.h | 64 +- src/protocolgame.cpp | 316 ++ src/protocolgame.h | 14 + src/storeinbox.cpp | 51 + src/storeinbox.h | 33 + src/tools.h | 2 +- vc14/theforgottenserver.vcxproj | 6 + 46 files changed, 5402 insertions(+), 506 deletions(-) create mode 100644 src/depotchest.cpp create mode 100644 src/depotchest.h create mode 100644 src/inbox.cpp create mode 100644 src/inbox.h create mode 100644 src/iomarket.cpp create mode 100644 src/iomarket.h create mode 100644 src/storeinbox.cpp create mode 100644 src/storeinbox.h diff --git a/800OTClient/data/things/772/Tibia.dat b/800OTClient/data/things/772/Tibia.dat index 9afa4b1896fbe4503c9ba417a475b2090bc35d62..4efa049594bd147183b1006b61ed25138a43245a 100644 GIT binary patch delta 55 zcmX>yhyV5*epchCxz47ItgWn!t*lI2S()AJ#94U%GeUrGAe`wJxZT^1`DZ@>pBW9r delta 31 ncmcaThyTbNepchCxz5IotgWn!t*lI2S()AJwkO#!|Lg|upl diff --git a/800OTClient/data/things/772/Tibia.spr b/800OTClient/data/things/772/Tibia.spr index de15dc17b8dd174aab3732c28db6bcfd6539e575..89e43d54da3fb5775cf502be1d47a35d6ae0305a 100644 GIT binary patch delta 89057 zcmWif1z20l7KMM@o!|k22MF#C!QI`dyL+3uySuylt=p};ySsaP>wWY1zQvidXYIB2 zAtaeIGw1G}8HOjW&oET&E1ap!EkOLlrKq7yQ^Pkyjj35`d@ocZu~dy6m1=CQQ{zOV z8pW;E*w;mkn%-(08?46pVQTaqu7=+@HD*p%qyG#wJZ7r#kAU6+HO4PiBYKG%?^mf& zxkZh?JA~GLHCi84qsv7#`l{}#k@ZB4hp*J=^ihq{?`quqtHvV(bv{_A^TSDQ`u6TYpvC(>ZH!S9_l>rtxoSg>i7*( zr);!3_0!cEwLl%ah3cGJuFlpK>ZnpysU2D;PVsSdYA&nO z=86y$@Vg<*ZmYBZzB&_LsuTZNou|Lm8LFcJ1{!QP)?l=`27y)@SW7h+D$~H+OM}~f z8ia&t&?icRA*mXSE!1FItp@YkXsB4xLxYWjHP|^`gF~}5IJI1Z%bPX0vrmJkCpCC? zRfBI2HBft}f&NboEOaz+u+YTaNfSRGO~S)9Nl54crNtd1Ekdlc z7~`nL88+M2kfUTCC32VoSLedzxu+q>~nB`)P4)q!#z5YVl&B79ZDY@pFe3 znn$!Sx}b&C9W9(*Xi@Y=i&pQo(ElvXe`?{SqfMa7LYpWjZInLRWQS{0qSU4~Pn(ui z+T=E9)3v2G#R+iZrbGc*G6}kHrK~$qdi3%m#Nw;nx;*}3~d}{Yx8}+Hv5)} z<4SGLuGgm1E}?lqXdc#P!WnH&p4Ddld2zg`P3UE9R6nk3lX+j8OOLe~_(YpgAGDeL zTbnt0IxLmwu+d(Jsm?lda@FCBw+?Q>I$R9bp>wnjzv6UIrt6TBuR~h74*AV=sOY3a zV?Q0*j?|&sR2}*+)M5Bq9VYD1Vdh~S7M<5&^=%!tJlA2*XB`zs(B-V5F4t^yx$maS zivV3d#^~}hT^G#~U5pxZv1+f2Q*T|ohUpSGNtdX3x+qualD$orl7qU`p3$Y{4P81t z(WUnXT?YTwWsII4Qzd%Llj*Tsp~r?uJ$9t%aj-y-lQnu=YOTlZ?kYW=4ASH6I6eNG zr3cIP(A%ts`93`?kLqD{Ru7x2df467!{MnOj&JpF{;G$|A3fZ(_3<#)$ID6|Z%2KC zz4eI+(1zTBy(2CHmZ1 zE;?4}W3*bI9|Arb^%=8CpPgIuvE8Om+CTb)?a*iSetmWw(WloLeO6u5=k{%V%pT}t z_eLMr@A~*^84zk_z;J5={GAP0>SDlrF9UY^8Zb;@fNh8Y&qGB!+JH@o2B?N-7?50G zKz)S)rVR${X(i4(8StQ|0WDPqbRA*9-|+@?oNj=|d;_j8H9)?`fTAr1OxkUL%{~JL z9~Pn~#Q90lK5fA6bHez70qgDFMr`@a})T+NURMuyz9HRO@IA+G}s`4VfW;!lPl zI;Dn~HX35v!4Q`|hWHFOBxJH7vGWZ{U2RC-c0H5@=ejf$@li+_g zr0I(xx4#bze+MISx*M^qhY{Ajj2PA1 zh&FwM@NgsgO*Z283?s_s8W$aqqOK?wk?Xmy9UCVMN`1BT}A=t9oz5wEv74{MU$%I>wwe zHfFb#G1-pBsN9Wt>nn~S#w?FE#!P99X{Irg@{LI;Hs(yJF-aB1{8MGjhFW80GzxA) zb7Rz78FQtzF{$m0Ip4vUww;Vw+Qpc!-HeItVa$NO#*9!IvrE8zkTKVW8S`wMG5w|( zV>i2$}K-Y<-CcqIyXXN=xwWAQSHf`1z0_uH6Oe~meg zi3)WM6Z-3$5NBb+1UnNh$xOJdFkx!23E7b*XvUjhDxef7QJQc!&4d$KCa4vdpjTpo zd4ma!ZB1Cy-GqDnME?*Ic8@e+;5ZW$6HRzO#RSPL6Qbvt;JVNRtEDDfTW&(ZDicPo zSDBEp*@TT-O{m#pLij-wW}h@cb-@JN>n1$9Yl8fd3Adh_@cESq#&1l}d1pf34<>y7 zPvra-eHx}5(=p|ffhjJgrkGopGQ-XkFBel(a#ODOo62g5`TsFo1nkm}_zTPqA?+a6O zznWsEZpLJ7GZyNYaZJ~YbR#o9Tbhw&WyW}GGxj-~an#j}d^a_8eX|7^_sX50R&AHIQoSS{jc{JRd>0`_}Fv*;8)6I!mV9t=`=Ezr@b9kLO%Qu;$ zzs;N%yUb}iXimd1(SJtdpEalDd2{|;FlW&vb6jqkv**4rd}hwTx8@jsF=z2lbGoQo zkgjLJ8)FMjNmLeeaj+o8)q*R&7K{qBpe)gXhnW_%$+cidfdy_Q7DSg@P*QKf`BoNW zbhco7ZwmqjTaY!{f=81rcrx394NEO(yWRqa9TsdnXo1}+3qD=8;OQL;dOowj>zxHF zzgl4O*Mc!RmROluvOr~H$zx|rEajFg@v)?%!jgNzmi&#eq@B`|iP@Hz6Qnpp_ z4hXNqmb^J{$$`t3%)McWYQY_0eovS^6T~+n@Lp8**^<`3Em@->p`W${3w;SKEF_Gu zmVl##KkgE06cQGPNN64|VN|4qglGwMu@VyFCEQIC?KBAkG9)z1lJF!?f=hvf_C*pF zlt@S^l`vS~Ou0nG-%1I!H4^63O6c7rA*Pjt3vDEnc9BrsUBUx_jlCs2?I&TvKoJ`v z;mU9ct42uJJ61y9$r3(Im+)hzgqQOqELkXF@*)ZODVwkEtYNoRko8O2XIk5;|Ow(EXZ(rrQ!6?nyAXFX6-!aaAuRq`#IB_CdnC zPvQzcOPKpZg5_Tc_G(t>XpFYDJ`@6~|>(qTku|P%9i_thlX8vcfaNiphCad@8ZxpK2?@o2+Ql+6s?OR;=n_#gBeg*blZsGRlgQ ziB`nV5XtkcP%N|J)*35*ZnnaEmldZETJi9>6*}jwn0C#IVRx;#`q&EIi2g5D^!a7Q z98GIh8d?)&X-&0*wRo$$S##9Knn%IbT#vSZzr{-AmVzCfgZH@INYg+wd&BJ{HM?~z5HH$7=)BTn;%N|L~+R)9^owGI6{+3>c94deRT@O_BDXd6N&+0bFS4F>aV7`ViS%r!OyZn9y; z4jYc|x1sW=4fjvm;Cji1r`J?AOuTKw%11Voy|&@`TN_M1*@)NHh7Esg2++3Wg0U^N z*0%WB*^=gHi;m2exgNG0^Rz`%VT;nwmU|(B6K9Jw%@(TyTlyB-;#F)*NQo^M%WP>X zwUOYA6H){L=b(NtkN z%NE&ETXwIp<=a-l-D6AMep@^b+p5na8>UJCxP#N0s zkHn5$Qaif4*oj*&J5~hSF)_xD;zT>9q}b6X*ABZvJMIb0EwbZfu^ofT>=;sMNAp@c z(i-h3X=}&3c6L;BuwzR{I~CH-Lb!_^vTkJzFJ4{Ci zfl(rHydA%%+Yvj@4(&yDn5+}r?RKQ>up?%d9r1hY79?_ z3sgJV(^+PZqqjYm1R@mnWcu6lE!>{NQKB!}o|ssB9>fcNx;-s3>^Yq!;<@%XmDzK- z(OwL6?RnVIo;9k@_BeF0=YxP{KYNOX*poNLo{LlLnK{oMzoqspUuDny_4Wj96$1a* zBim_@>u!78_uAvR-yZovdwl-2M{z_PkK0pt-kw3%?KybYUcBD+^mt~^p_ld;zqKd! zi#=6;>=~uwfU&*oeaX>P`0mnHGc&>0DV2cBh`yEI+i%hu#S}O22$coq)axKBD0dR+g8d{sg!b=l!b0mhI&eAH#A_b@3REcZ30B7n(JJV{qGo2SZ(`UUiLv}ec_NX({E;=*+t}`oM zI5PJWr8vBwNPWav9f}$w+S{ z<3LH`Nmy8pAWgHT@mj}yuFq5tsF7(>!!k_IfTs$N=M_ll_AaX7W@vEYJ*M&V#Txk2o zg*KmEDE#Tdkv}dR{p&(!HCNthy7ErnRmFRAS3<2_>0;~3AE_%JJY4zZ?}}!)E2%NA zq$RkrBFPoqWLG|=xRR3YifxuF!MUPc;L52YS4Nh&a;VIeX_c;GEa{4@-j%+MBCp96 z`)0136!_cRl~pZW+1FZVwsj@5oh$p>sf1|K9hdt4d!uPdWYyW(`ol{42|S$)ryna^FB_1cv-?_9a? z&6Uq;ZpgIUkm$HkW#UGVts8HoZoHSdF;FFULoLXSzM*cIM7wb)*^O)2;+W^gvtl=- z)o$oDcVk3rHv&7kq29}l*8|-+GsKO%BizJj$Bq2iZbZy=6LY(6{JX-9!JFKex6O^@ zU2Ysc=tlTyVR*rfeK$k_58N2}%8f4X-LU!QhU)GgQJJngc82Z@GJaCg*V-6>YO^EAVq&w1_~Dsksdl{x|&$D*A(A)Va$-P0YF%3ZuG z+{qvBPU$pv%IAvs5_dYTacAddcQkjo^XGs&uaCK_n0m&Y{TJP7b={pWcid_7#GQYi zyL0NjI}iSIr|_FQ=fAsS_RF1pzun3F?ZG2m4<_n+ z;9%gvdovHN*m&^7$%Bg?9voJ9&^yF~#%K>Bl00~juJT}8o(J1YJ@{DT!SQAu%xvSq zh>jj4bnzgthX*fvd2q6y2iJ#quy(WuZ6!>g|Es>{=Xh*tF%3FH}b^N#FMY4o@}!8 zWVgf^Dq9%Ewx;WXBd$T>sUF^yJ<(@2E z?TPhPPa^hsGWv)oA?HOQH$8du(394$J?ZR$9R@IuqVi&auDT-?0y z3GiZUw1_8p(KFSH*a9!{x#GpC5-(A(7u~D8=vd>0XPp=Q8oX4jY~jV}R$kP#_M)MU z7w0;9v8<~XwmrPq*UO7V{k%vW=7rN(FLq4w!g{tBPZxOce4!V67JKn>r5Cb|UU={E zV(|el5|4}6MK9*u@uJytFV1}QV$2sWCjIc@o|>G4`f_fX%5gWB^FyMN)7n-}rMsMa zUUJg?uWV&Yod%x{VQfk@I$joObi&d{ixzbAPd%oF$@jwVbAP zau#op6TVr_^=S`T@n{H0tczbwL zF89XD*PGKp-sp#Vi}$`ae`3AaliCM|l zZz`I3)31d$Gdg&)sgpNOUA>9w>&?f0-UJWy7M}~=c#iU>WUMz96TDSinB>jhsouoS z@aEGzZ)A(SxwpidX{&|kT5rrYcynx=yunK&U6@o4e(*|XdmWG_hIQ`AJ(n+Vf!v0W*qe4 z=m{TIpZCG!h7XtT`e6RthpIO|O#SLZ;4dFkTE6Vj_vMX+FPrUrdEny9D!DIKsvut` zMEatgFZp@mSnSKx3STkdBnT~idD`9=-|oI#6&Tjf7ytgg#1Hjl+8AGg$BO>R zz6_n>%gounq%ZQtd8seGR{FAStuIEKd~w<4OZZOVv)5P55%}VE)R#WTec5r^7uB;1 zzWjI1mz#He#f^e5wl77cuSMcpUv|Co#o&W4?LPW)^ph`LzxZtI?pE+-pYS-W5(1|c zs9zH1Hx#tEui*1j1;<}1==fHF`$q+fz9{JYSAk5=kK^Wkv~cjFnWG=SWPWt_@MD>e zA8!Nv7!~2iJN62Cg8pe_9m#^Pt+F%I5xbYcKk{`!l+qI3May?=k+U z;wSr)G|OMyO8XPD(jU!@{#g9u&)&WMY(4Cc{YihU&iUhV(Vxp#{4u}jFD91!+4oqO zJoD%1D}N;K{aN-|nEmt@{|o-OX#}9H8-TS@01GVxSmhkRX5RpIM+9&m?h0M8Qv1Y8Lq@<9MeZvx2r9zd~HAT?%z zw2%hUQ65OI&_D(y1~NJ)kSP^`%xxY>X!}5xcM9Zh*FY?L1)|~Kp>T> zKz0rb2fKMX98<) z1oGyV;64i^<7FW0-v-k8Qy_WY0x9|($V>GgPU;3>YaGN=iy+eNg6QBBgo}F+THZmd z_Ya~bG>99js34{!1YwaHM9b_TR^|usPe~A!RYCYP1aYcG5NFy2q1H8soxOrE?;pgU zK|#zO5k$_oAcjs3B7bHO-t&T(xg-d;RY7c9AH?|0!enO<6$gTl9SNfM@gS7vf;e(T z_}vIX<8~0g9t5FU{!9?x2J!QY5dSTbHG?^57|aOEV2;@b)66xP72d&g2nwb}R4~~| z!31T9{+wV6ii5dV8O)a2U@9Afx!OFKv8{vg?i$R6e!&bHE;tiK-`rrPFAZk>%3yA< z4<>GBFs%;;bNpnmiqn^ZNxT!x_$R?Qy$dG(TQJwvLg=m@!T^mB_G^X^p&h~rgAm4; zhM;8`g0XW5*1jRw1cXo<62hB^5N^eVa6d7GkI5lo)hh&@oDedKLa-|hVN-=TZweu$ zSqOVth7rZ8ud2Gy8?GXk-Z5<3ji~A%xwNLTE811p7InJvW4$g&`bW9758X z5PED5p>#(G>-U8qJsg6^`4IeXivpjAkoY--OhPF#45iv8l;&=sbO;C~F)Wmik)ce9 z2_;?`igQ*dt8zlwToKA{Rr62|cMj!D|4^=u3gzCkP@XRe<>^w9uqu=jn?f<(5h{jb zp`;!OrNy~WoUVql@@^*$G}(pmz%7iGeqr2=2xDYo80#{_ z$SVq?S9KUJ&BI9R5QcHDFp>v{iTD55F!oLlqs9C%UM&j4d3hMS*M|}DPZ&$~g>mj^ z7(dU3G4WCu3Ae(?cos(EhcG&S3!~GYFve+wQ>Pb>t9dw?cH!7Kh9mb3XS9DfGs40# zhzn<6ayb6k;ao2Wr(0P#f2+gk(-_W$7U3%9w+|=0TR1KI2!TQ2IE)Nu%J^_1riHU? zPB@zuh0|$eI940N>Ao$T3A@A5I2caUk#MFS3+KNR;Z&XuXZG1}9-R-z{gN=g5{}(< zk$*Fs@3+ILy%)~m2jPr)EQ);=&fOQ`bbT9+(WiFd^#3oMV?V>>zqioo10g2!GF*eW7;9~wc|xCnlvMzAe6g8I@3_S8g(u|foQJ4BGu zGlEA0B4`{Q!TfO%I8KWoa_$0|L|e^vMt-$}Ts3@g1fI(yII=2&)$1Y%+#Esv&ImFN zMDX!w1k2Be%*zqTZbjhyFaoU?5iEWeLG9NFZv2Yif<`2_^&?qr7KyKQB>7H}^z)1) z+&>bF@JJfsBe|Ly$;;eG%*!GM>2J2BzEH?QJ)&g{aKOR zToB37Ws%%iBjTGQdHPQzr}sv({ohF1orvVZIT61aN!_hTa_&cR>`5fQUq@2;Ig;3) zku<7DFSPQM~bu!Ym{T+vq6zB}Q>CO%=ti>?ocWMA4}viusjM zc+^Hw+!V#_7E$Q8i(+!eC=PUsBE44>)%~LQI#?V>MUgxq3dyu6=FW~{*}^C~t`G+6 zqWHcginBYTsMsGRR-vQlb}9;&3sGYKMig&vMltJN6ek}?vFJq<7gcYg*!wApDc_>R zaEL}RBLjgDb7D=eeQl18(`J(>xA(b$JavnDH zZyn9$P0_U59!=Fhf^aCBp~s>LI~k4bsc5(u&GYL*?7lF46iv|cXs*5%0-vI({ua&Z z-_fM##c@bcw-E9z#Gt48h?sgvG`1Fgb<|*)cRLieX%JjEbbD7}~ar z!L&;ZwgX}~J2ZwF!((U~8N-B8F&rNq!-_F6sEv=oc|r_BCdcq}N(^_V#}Ga{hBtF# zNLv_#{n8kAu8Ki>eGIEM#_(-(4Ewjm&}~l)+xEq9_gD-aj|-nuF-$ufL*@Ax23%6b z(B@hUH*X8mhcRq_8AIgf7`l9oq3%Zv>;J|uRVS85hOx*bv3Sd3X)cdtt6wa$!eV(I z9m|l|Sb`E_iA#)SbV@A8(qf6sjHPQj%DWHSgs8b7%I$0$1;0LEdNf8rFwQOFXqHzw=5Rr za*?}M6tPa^Y>yRN=3*(_7t4VCv9vlK%g~deh>Ni#--xCDRxIBh#Zvb&mhP`bpFsZS zSX3W=#8U7(mU68)LJi}XW*mpRbsS@*aolx^W4UJ>I|VxU#gXeD$B6*JiHM_le4M!I zINB!0F)Td}le{=~3*5?&gVH!stKx`jh+}2TIM%k0!?9bO82ZHVVptrsjuU?`6ZsYf8%M=OTf({f#(hhwD(A0RX_qyq7sm$Bv6x=z^sY{ zt~4bO-64Vby%NwIl0e?L1m?|1zZf_axBwU;;gkC7?Q)z-NIQml9~a znZUC<2~^(|@x*5d+GNqm@^#QFJ2SguH-*Ty6|ZB3%{o+MOe8UUgJ5uZNO0J%xu#{Br4~6*;Je#tx?mQ297WLi&6#$awT2Nox@dPOp8Hzsp+ zM>3WNlUa8tS=@IY7KX=?>3=+#1t$gJv@krI%&POrbi9~Mo6E_xyP8bP>&Yl?CgXKG zS&X5QiF=+*%G+edeoPi)^i+lESZ^DdhA|A#P|2 z=_6C6@IIZw*K;W} zUQVI#Mhe$&rts`R3VEuhqJTFk=)OxK>1zsUKT>!=D$~_c$!$nd(%owo2t*w^W`FOvPF%JTVoUDXH|Gn#%3zsi@}6Oy$JIpl3%4F{g{g3 z_f#JKO=Yll8as^AxN4ck82dC8wJvG6$qfZFi1@!AR`Tv{4@>FB4Yi%EcVh8L%c{rc(5ZkA5_ z*6EaWNGGRjIw8H%@#~+?mq8*&H9Vd1W727um@bwm(g~WK&dvGhJYAg5q~#)MT{_aO zqP;tvEr-&HIhD?o)9L7(O=r)!bjDpw$Lm@;t~b-!ek+}B57KdZozC0$>0JDh&Y~Y8 z_fI;%v@>{VoWWP~3}#zr5aE=;WO)Xv9f}Nghh@+?E`!U78T`)3U|~@P6_pv>uE}6h z^9&Ys%)ql(2HpE*U@$a;lyMoTP0paxvds#4LO!Wsx`~i@wvdP|nU` z&V13iObD*XV)Du?aeF32*JROiT^3h22%&9R?B1Kjg=1MPJ1)deWYP6h7By$GICw6L z1y{0IdMAsR=UKG-kj3K9St$O9i%`oZPb-^r<7^~m*{C|(WfNhajgvz*p9BVYWOGH4 z&7i<+rUhrSCL){l@!1?#W@D9_jc-;q&V|`@D9)y3X*QY_*+{FhdDD>1$(GqTw9n>h z$86$zX0viYHf|%cQB2JyY+*Lt7iY6|SvFd0ve~scoAW!fRovW{P0vHwtot{cCx^3X zb2^)LXR`^qn9cL6+0@_8X4b=OPP`E3?}X^rY_$Jm^Y?GISW(EKOgD#clN=OQIfS|7 zFv2T`>wY;rh|1w*Y7WskIgBmJVOm`d^V{a|u5%6vy>iGHn#19dsvI#!%OQ4r4reCi zuyAS)`ZIEfo1Mdgc{!|Fn1klh9I?qi2c7jfeBGSGi7h#t-I2q%gE>q&l*8P!In274 z!^}%L%($Gx#H%?BxsgM^TRBAC&*9tS9I^X6hi-3knD`zeRvpL6*1Er(&M?>XH5 zk;7kdanZ>o#VD6n7P*YE&865r7cXfp-cGr^kms`5Czs)hT*mt6k`^0-)=M^&>t9=FcJyL}$&UGiw&J&!Ft@_5-VkHo=w_zlma+o(LIPRe7_ z%slST&ck)SFkB!CSeS?1;yjF&<)OVI4~-3Zq;1dR*4{iW9nNF(sXRtq%%j6iQRss_ z;$Gwt^~hdugb@xCZAjN`II$@{`UFQcFE_z?)j|jlaKnad>TjOQ#n2#t!eqppOeqz zh4~aM%V&dXRX!o>^GVs9kMDMoyenU9Tg>O_k$iNH<)b*BPx-lg=3dSx@@hV71is$M zr`g?n67T1;^GQB;-sYqFlFyf)`NXRi@LacmJ0=CxSrzcwp@0at0^WHSa3ZjPeh~%q zh%F!_ses8D1*n?x3s_uMz`p{abp@EWC?KPK0mB7abuHj*uLAlEC?I=i0WPD&18U<7 z(4HWK1g)9?r^DN}JKo_q3z?i*h-+aXKIMft)fTd}c_E7Sh1hl#oL+@|7Tg&_Mbg+pdQ2`v zeR?6I1Rl>VByUL}zn2%1yRwjg^@ViXUdYLR3fa1+kkEe%`FKolPK&}W6k>I?kij<# zQQa$K>i>Uj6L5Jd3|<#f`mqq>Z-u=5Q^*^wBI>k@$TBM8lt77b5t$Z646+lD717VD zh;#BH#&{QTTHt+P5#xi3XdPLEVN?;OiAC%Y_?2G7^o$~+@{2GpC?cV-h=A%M7S|M^ zO06woZmS|@v@RmHO%X@C74f}$ky!RF;)1}H{zdd2T7=7(B5qGAqG)Cj*X9>-YgrLJ z*B0TnrHGq5i^P1P;2$j_`dASi&K7Z9pzoC;o(O!oU4+*iQShT8HVEjyEJ7hL>clFNENSVorT4=Gfn2vDu@9 z-bN*yGAkj+s)R|-C1P!*g#Us|m=jyVfVdLM<4ed*D4`^=gxZ`ET2_?Mskz8gbuK}t zPYKHgiNL554o)he&#V%9E-GQ$suGl&N_e@W1e1d$+&*5y&hsU_y;j1TyCuk;mC)l| z346bmu;Wh&3$;thGcKj0RVk+(OVRKsMcc2GAEBkpi!J4Haw+QBrL@W`rqNdpHlP&l(KBN5F1^}-3g^EnO;id zf>LfSDP`}B>a8| zAI&nc?_RHr(MDxVvMfU`E#teaj7*O*EEHud3oWBpR2h=^G9ILqF+R5pWlQSbS|S+uQHMbm$7wN84E_2F>O*Aqvn+1wV;f`rDepfDI;xb8E$*acz3vr zGpEbgb44Wt?v_#iq>NLq%P9UL%zl?~SiPKPdgaKC%DG@!&ObKgJa;Omhif^xKIM1@ zmGd~PoCC4tj7TbHXhu2Sx#gTIC>IOHhED=@g6og>P5 zIKG^XQ_3k;%__%zQ8}%bm-A&^Ioeyw8MmXHdHc$_c(|N*C(ALtP)_+Z5x-N;v`6LK zd{NHNcjZ`q6-E9MG4%?D=~bX*T0ym>f=H_hmP;#`?pQ&LQw4_373g|ah)=%?%)BbN zD6imQKn2HwDp0iyt{@?*g8YOECZ<$yA*X@|g%$KFt-zwbf^)4Zi0W8@N0$mt_p0Fh zKp`}&g8xQ}yh$QwRs~`6Dv&IyKy7seV>egu?Vk#k?h@Ps6%0OJL66fF96eLP#;X;4 zxm!WEheH2Z1+U&$sF?D-f|kE3Sg&45f?g#7W|jC@R-$8DiI=RBPV!316qWoAsN_s! zB{4~ryicyAKC_aU`IW?#SF*mMlGQbpv}#d_XNO9nyH&EGPbK{ZRkCJeB|FDea&>Yg zCNnF=BafA|oL9+|1(gIZRaFwSrV_KwmHgOIDV~Y0q~lQ`a;6gV%auI1S;_VX!tA*y z=v^hdzf`jMS0$@7s#v63#Z%)d@+4L0*jI7Qxr*r?RRs7}iI3tcHiTCZ8CyjgWffK# zRkX~j5<8HpI9gG~^O`Cen^lR|zfBbyorOS8(b=zxrGu+59wo#lR54~+6;tL2(M45c zuc%`0+A8*Msv>Pi6>j^h7<{CPlGCDnu?puKRZO}k%$`<>Z4*^={8UBI_bRlh7Aw`& zG}o_2&9s`nR@Dr4sOE%oHT^uQQH@hni*3x+EDf*bYD_gPl-0aVuclXaHH!;HysVlP zRn>HEs3yH-HEHdt+25&}Jw2*v>|f2%LDk$HR*lt|YNk)DrewO{&#h+j!fGOyS2KEz zFx_0uu_C+-TZ>u@-shXBQ zstNv6%>wlrCg{{4(W}ADv_|Y2s$q|P4JpzZRBkm4^{T=qcyXeJA?HN@l^V2e*Rbh94V|CW5b&mk zT^~gu|JAVjr!f9oLyl%GGjwY?XIM+BSuJ}cwLDYV))MAeOD~sN7JAh3-m8{sAJJCS zq7_if*q~aDhKPjlS{_E$QW#UqtGHTLC)Q$_ERb5urL|Ef;fZ*_B_* zhQeA#7S}Shw3d10wM?(9WpQ;ayK8INT3^e6mbIvUwXa3DTP=5b*V0N=OZ#E9=!_M| z$+eWsti@w~E$f!lvVB!8r#IBnXIrg!n7fwVduthdpq4TJ3WKA<;6yEl&ew|P^2J3w zszvgu7RUc;@zkgzz@&~y`#RdX*3r$sj{ebg9Eq>vc0!$s4T*K^NUGy|S{>_i>%>0V zIxg4M(Y~pU9v$m=+`Ep6syb4J*O5E9j;v{Q6fdgd&C)tNR@O0YLmfvq*KuxN9j^`u zonv);I9zKhHLJ(jrk<;=s(PY5>&3IT^>hiZ zCorNOqr`fgl=ZC0u4i4jAU6qen|krMTRp$~*7IjTJ#7Zn({)@u1(Suyw0c@jug7#= zJ*$`0vt>g)t+v;bwXdF%qxD3bttatjJ(*AINqbYz{7?0a`BBeH8rZ1PY2d0+0~0M9 zIBD0wC65Mf2Q}~{u7S6i4g6Qy08I_(b!@=AZv*xt8dx~Gf!PxqNSf5Z@;MD+V|N2P zwlpB$E8<5RSaPv}wRaoX_OgMfw+);U82F`uReu_|sMCnjtdVcljjVHQM0M4(k-q_r zYz=Q@udGU9O~<6k!7^s12+Z$-lAMqUaW`X)?&Hj+k@*q7gguVE9{&6_B(Zep*r ziBFDAG?O*)ML_P}grQFpcLJJd8`MO%xF$vmyc2kv)WnU{CUVo7c#_qGSH7x=jDjXw z7B?}ctcla*O@vi9F}tpbXAMoXYu$u*hbA_3YZ4oTgkkq4z6zY`(ZuDRP2B9=MEn3D zJfsP;aUyr3C}N5*nchV3>?UmIH}QT^6TcTXp}({V>t#*2EpH-lMH6u=o5)hFYNC8~ z6V2B&(PeEDs&!4A6^K~h#0Y^y0)<<|742?9_OIwW*+ieqqUh@){O$Y;0_7+qO0w+n(vMZCgEd&rFYEXJcz)8ymm#@_qkw z->N#eJ(<4uR-JRo>c>8EnrX&AEZISUmB!N(qPGS z4HT{BYoNPOgUlrw>{_nD?$sKEZqUGRs|M~nH7MDqfsc*`*@hYnGt(f+N`tZX8jN(- z;DWmbRX!Tr4A$UKveNPniZcgg?qP*jlT>;zJr7KB2+> za~ksecTNMRD;g}gt-(&A_MrxA9%~RH+1*1{2UEp}8gxgb5uraqOu{aeqyUhH1hCO_t7*wuPEFtk7iZT1|Ry(q#KK zg(flEH2JtglU;vn5-D8UrOAxlnq=ymQ zO)lDLvPkrtb<<>-pC&DXHHiq-WN3sYSE4nkPSE6q(2yjrLep%qsnq1EFiw%9Nk)k# zeakf2CtMaf)@m~Eka&Mmljf&1S$9E`8y7Wcdr6apH#Hf5Uz07u+XtH5f2c{-3r&pP zYclz(CI-TBv}oE$i`o`i9Br$`zK&Y#=%$5LPc3@))nfD@Ev^pNV(@4!dH$0hV*zcu9O@J20fm*x}3WG#{uok;Rv}hfs#h*goa4oVUv^XB2CC`76TG&Qw5fP)s zfH*B?3S;B7B;Q(#lY(=m7Ro{`c2;QNRj)rRNH7ex7WEw8nkz0on{6tWEAPZN~hiP1jM{d=>7DR%ml*j5fNHwCOZM8}(dm zb}!Z@W0^Juo3x4AuFZat~zE@9fb6d34|Zmf%mxh~E&y0muC#Ymyc1b1Bp>wR=3 znO|3Or(|%vF3Zw%nV+XiO^Li#=#p8bOYmV`{ywV9$z!@aI;G3&e{?ZDuSK>a7~x>H+AWCTNm%Ux(vIgi%OVvUzhJf!~)jk zaeka0I#cvmIaQC_g7Gvx9OmfZF<*~v3-n~IUyl##^|0Nn$Eclp)C*6v^$0N3W1fW` zpY8O(OWOVQ=oFyG><~Qy!}W+t)+0waC45NN<66ER_lxvsTP5vvdaP3%*5lhrJ(^zC z!|jG1L+|NPAzXegov-!y`cV(>PkQA25{2l~y^%gjp`wL8wXOA8-bSAf9i_deK7D)Z zlOt>zq>t4oeSCz!$LZrG*i6@F*(`nh7U?r#u|7Nh&r*FUFtJXb&Rg|)yj!2)+WL$# z(dW6XD00>3otHj)1N704(WfY0l%?piC{v%+CHl-(iQ!s(ZXM9)(HVV0FG$-}X}hh@ zk7qLOr8x3hpOUxwsDJ1)y@>(N%?JZ>5g_{4yy4+bP-h_bCACEX2C4>XiNc|%UmFy!(Qg&}t~7;<2%A&Gko zxu#`El93@QD?_&08;w3y%+>^$~hBSR{$kJDa zc)m7d-v@E%lOglJ8FKfhwEZ&VAV$#0h+R#LxZA=A$2La9b}(Xc7b8OcFv6vm5nuWk zp*PHk7JnJhVX6@uXBaVVt`Vyj8A;Znkz_3zv2?S%-)h9|zm4d*%Lv5|4I|WAM$FJR z;vW+uSsD@Lwnp5vH{w4JBW!(*NDVh)agq`4$wnk+81XC12o{Z5Cm6GOk}*wZ8OycYn2OoP?4N5)-<8H_ ztreM##xiwljPX`u2JSFs=HH@gmod$CjQJ@v)-$G=fibfUjiq#sG4D)`Iccjf=1)gs z#&{Sr&RdN68xt92Op7>U?xae4rm<8MF($ag7>9Cks#@BGC$+{hyJ5_O!^W5$F_z#@ zV**bZ)917?MMA_GF>=nBjhBtNFTA*B%*C6=?7bxp-ZSRILt`dCH6~T@(wJT!jXCgD zJo_omG&dopl?hfIP0;RQ!h#+qToP{oX~I8!OvoE(!puP?EE;MebvjIF7;i$a$tFyj zZNi9oCe#Sm7Mrkhxe2RRnQ&M5vEBsN%_dUe!h{_=P1vt%LN_B5N=-~qEHD)VLbaI; zur%SOoe5tQCM0^8kQHJ=QG$tt)tPXh+=P?+O}Kd4gj?54c=S-5d}M;rV-vPLHNpA0 z3Ef|sQ1;P;R$onc`O}1wW~MxEXG&2gQ>wZNy-Zm<*pz-FOfeg6%JfO53Qo^5C3(In zGnbgsYPBg9n@!Q*VT$=4Q`YF3^2pQ_FDp~@>`iIzYRZ3pru-9Z%GhvI*2kF=o-T^B zO-ao&mBj^93~Eie-C)Y`!=}`qGNtsgDeJDA;&8_l?MJ3`e{IUZ52if*&y*yoJ3(4& zGpgE~v7oaV%l|NA;{Y?pjWpxOcr$KHH{-+tGZI#s$%>~L*S4F{VYit)oSN}S(~K!b zW@MO{p=V`AvYm`|He;%r83TOG=o?^0&oDFgN0>>bvKcu^@;<{%N}`#uB;Sm~MPgG? zX~ufB8ND0KIDgQLb0^H`b;gWV=gpXQNgTLo#+o}~;J%rx)tPbpwHY(snbGW%8AHB{ zQ;p5((#%|D&deFx-kd+XnzNz1Ifr|iv!t&%O@^A&ZiG1{qs$2zZ_eFm=8TzTj^uqxu-Zz&LHRck*V9usD=D2(g60ki3-$<&T&2Osg7^Lw3=6j4ai|5mV=XX9u;5;j1&*l}@)T>q;6e-PN-QL} z#DWL4;>3On1|71%=ZGjhV?oe43r1hGAnu9%gbcOh-{F?L`OA{riI&`* zBK7w%W>um!(^IW6&9Eje*BaXbYetlc@d|5fYOUGSV9lgM)*Lxz zP2Cx5a?e|H;)*qIu3OVcao3tX_pM2IVvXvBoY5Om@X?xQU#%r>$C}wqY}nA;2J1F9 z7hL(eE_&LNzeqA=4{mX_XT$ zz0ii^t88esLG7;Hmi zm<`XOZO}@#!9CrEl{q#n%d=s8sSOV+Y{*mFND&wtjE>l__LPmJK-jSOoH%gRhW6KO z$hl!d`M)+4KCz+c3+aDn!@CbQ%=&JlAnun90Znc3XkklDJ6i%f+v3p8mTNt1ncdHp zUIT5}HQ1KRBW(FO&X$o=Y&kU3mb9XD;{)xnOA3Oj~*+mY{QN82Df%0ldT93yfGc1%dI<6D{?-Sg}) zD72GMJv(}q+i|E)jt__xNaD3;%_qwfPz^w^F)&+Pc|(vEAN z?9lsaN4p<(^5oJ@yOi8MD})9n0)lxZa-ZP4+z5YLEU-dq!y6b6(e8(&OwE{AOy;G+TRY?d>Uc zvS+!gJU4XyWZ83Ca4it$RQ9~6wkKu3J>3r2 z^X-H^&S%8HC3|v&pxgFLcwo=dXZ9q%wI}O`Jw-TB)kNXIsHP4Wws2r%YX?f&JCNPU zLDu{n*!+hBH+wm-zMlhE2Rg{5)Bzje=U)!Y7%OAO%b2MSw4LL?+a(TUu6Dq0ivx3Z zIWS1af$K&N)LT19f{O#wog8RzabTjW1JAr2_$R~x_h<)n6)6t%&KBjx4pgcfNN8|i z-BAZ7pLO8HWifKc0nbMc=)ZQ5f}ajF`{h7&Ge?rzIkKUvqZIUV3ZN*|g7*=?0FxF>~aSy(7M^ju`tnGBDIp=KtaxsY`JrEys~9 z#g5FZcH~`yBUg?);(yi=(`zDp*O9(YMfkNN)&Du-{>u^FmQM6;??jXCPCV=B#QEM% zTo~p=+(;+fMmuqQk`wD^IpI0qNmfUl7_-8Oo2#5SxYmgS8=Ppq#ff&?oD_WA<3#FS zCtNk0h%sy@U3&=;z1|69&w`oDKUD+iL)1-@VMcG-UBC@Uv{GD2Pdk&Dx64cB9joU z6-?=@K&yu&B=l3zdboluk`&r@l7h*zq&Vz+1&btD?SKR<8E;fbYNRBL%Hq|=-BLJG zCb1?8V+<8^k_Vb?La4ArZf=)ZC~y?U*(q4*BIDf^pnV-w#xOA;E(c7GH+2c&A zjn|V4iJ>mkjdWq% z7#FrpaN*Hp7dp;$q0<5v-Ys%r(lQrbuW+Hq1{aR)aN*TH7a|N?IBD)edwUngySmWI z+l4y;E)0usVST*3rn<;Oste5vU3gjH!i_o?`WTnU@xO2Q0R zjxBH{X`w6s35}M!^7k57Hf?t0v0(MLEA~3B+}CrZxrr-t&0LAJaK+rtmFteK%vZR( zQYk$1ccp2VE0g0~NlSK>?{ZfLWsA`qSAOKVa<9Y{&vIAxSG#iJh$|P)yK?ikD-WN! z^6HZ-pBuYDdpBD3bi=NX8*U@q@Sp5P#C$grSG&m)t{X+#Zd94ONx>jDM!LDN&BsmV z|NPxJ8SF;K2sfhQ-PoGs#xub_*^M`8ZWL#@;gajdynHvBl)7P9?#4y68{xHXG(O}; z>0vjlkGgUCv>So{xN+-}8#8XYG3${VO<%gP;Jq9Fd~hT7qZ?tL#Hr726n>L&KitUv z<)&akb9e5xb;qHzI~RX<=SO#UR`hho@=te8_jRXne|I(xbjNp)J2fNS89l+B4^!Rg zG}j%?CGLD$>5l0-cYfO-I<~mecAGmsJKgzjm%AhayK_&^oiY=5@+{q%=j={jPj^Q8 zx$`qvWFr*r_$Rxgm+6jGt~*PL-I-G%f(;^c#GQtd?u4Eb*v9wK^}Y^>A}qL9?YHL!Ow*r99!u@n++bc|J#F8 zS{`&T@IXUh>_LOj$ijoIRvwfKUu`|;uketfydIo)^AlQEZ^YC`AwdbZSf>fL)x@F`P1&FSUd>{;cF!&+~O)_aq=QDnAzb9J{j9W=bTsOQZoeQ#8T-b9#qqh;aE3~O%% zwzl4Uckrf%t2e$L-bDI}5q5O!C)NSyQ?-3ueZurpqu8%Bq z`!MT;kF0`x5}~g?jQ%A9n)~vry)QSr`;yhy7muO7q>uH*dYUgw=K4~)#FrUsefhD) zm%N?6tkCpjvYs#POnez-<;w{>U!FVrGSJJHss6s45Ah`}$`|i=Uy4(GC0fFlw|OF4 z;!Ay{$kzIzn7>~J9QGylxUb}Ti-L1v;F7P*So+fHwlBB-_2ukCUtT`-}Ov-e)XmLr?1pr@}om@KMu6=L+3X?c69Wkdsjcay8EH`rym3R`bn6DA18+R@oc0Y zTgUowe}W$eXZq25o}U7}#eNK0&~On-mLr}rmrtUr?``eQT0pMXXFG+pkG;c9;d zZuV!x9ud;?r>mayoBH$6&YuHrGS1H*{V;!goFWGJW z-1{Mle){vGaRByB0_fZ_fKcJUZvj$sF96-n0Xz|={Sm;Do&gy33t&h80NM`?Krt$S zq{#tvpB2E|#Q_{%8Nky`0oeU5eQ8<&cxwl+RWATv!vMl;1K8{ofJBCI$SpwbSOe(l z9YDIE;UB<#;Z#5XH$p`?EC7dy01Acb_yE==1h6+XfUm;Xv;Y=m1fZE0z{`RFmKO$a zraXY#wE;Y62w?pF0Gb>PQ1JCk04L4`@b}dK)c@yh0DnCQpxLtkwg}em0@(0AfO4Vb zhX7W631H^W04eYjh*Rr8Y`O+Q_ds?EHN66PJ}40N&_KqH3Y4t*KyoGpvSn%@hlF0U z0(rk6kl;muG+rF||6BS%OxFi8Z$lt^wggfqY}*!=1%X6Y29m1|WLAA36~gBuf&4rfNV9X|#HBzMUkjw* zRv=yP1(NtUkRdMvdG{ue+7E$LeF~)fzd&>dBDF~nH=761s8tYy+XV5gQ;_^84??$p z5RHciVLLX6H&cQ*Jv#_R&Y~a*9t$FIc@RBT1rfd`h=lb)WNs4S9U`@sC>&i@k%mC>Z($@k+?|4`O(b7zhsHeMk^fLW5Wr7KE2D zEh32ikwLsp2;ymCkUUN$2XQGSh{Dt$tkZ&|VpNc%N(WJw8^q_lAexql$E88EuLz=> zT0Gt#MAX3`><$Itb~cEwSAuBrAc(eag6R4^h~6!O8PX+~F@1xXIx?7fQ-WE(Aeaqn zg89BNnD^U)Ik7t!8_i(m=qrNdizb*EHo>Gg%K-0SwucC@!QxCXi}Qk6P#(<6{lRQH z9V}()f@yyxn7KED@w^+%wTHp{`7D^8uVu{pVD$bAX7_hFZX80t79m_~9fG=D2o{|~ zsOuhrTdxpG`-QM^a0nZQhp<&KDg@tgA#|J^!sY29B+d?D@q!SRE(sxQWe8i=h0u6& z2!pqWFl<){z4wKXq8-9B{Sb0Zq~AIOoIG2_Gr-d*oH-w(0 z(yj_&U2O=42SX@6CXSp5A>&dAiitNu=zKSXW{;)er8x6G1mpigWc?GR!rUcHW_c2ZrJi7K(OEsMK9f4CP>IDCSvWC@+*2#i9ID9?JUaP>$Ax zGWB36r;mn8q^q=_4W-p(X}cau^{r3_+zXY0@u6&f6N=flP)7X>CAD!Fms*D5-Z6~% zox-T@9LC`8VJQ2ANd{FI>Iq@Ym=eabIbpnCp$OyK>M+i14CBMjFbuT9IBFn+EW`Na z6vjT!Ft!AQ@iaV)k%?jKPY)v?H;h%KVPw>V(eqFk<4%UL@nRU8Z-;T`QJ5^_hOy~m z81H_BF|%nn-&==ELE&)T_6(=xfN)ZWhtq08IDKY?kg#wm<{FMgS~zEO!f`DL=axF0j0559Js!^JbK!Kn5zfsA z;cR>pPNT2k_%?~)XqyO3yGGEjR|InhMX+>a1P{kYuwhyRLl;J%7`!rqS(_thwKsyj z1`(uMM)1311j{`l=o1{lg{TPPQzGb<7eQG?1ea?gn0_b%hcgizxDr9`-3SaHM^N}W zf`30mkoh@+gdY)%Xc0+yn@Ild5J_bBNEH1dc{n_hspBHWcqE+{MzU&Iq=L>XBbl;3 zlAAjsQT`ptid~U3-W$nUgGh2MB1yN6B+WjOP41CY`bLr$9LbO9NZO`HvN2P}=SLD& z5Q(!YlIH42R1J|F-Y@+pB3XAXl15j=5h3MnB$^K+seT?QbAXX7`5wuKUy4Z1HjR>k zyiu5TiehS)D13yn?oll16@^y6D0U2qB63U=yQV}*E$t`{Es0|8x+sjdMd7t4iWt2p zR_R9(E*$+o#!;wjqxk3$MR$)VX8J`@9~s4qxF~8obD8^okV$}60`rVBpP0)QDh5nN$=Dmo*@l_P(-$Y5dJ2`F~O;EFF9<+?6uuC*P zJ)>nUAe!HXMe}ZWH2p_K6EiNFSCgV?H!~W$+0lHMEAN*?vu{N-ch^MIVMDa6DQ*8BL>o(ahA1=8JwbYNKf0T0|3S8;!A3H0@oZC6g^$!gZo?3y3B;B$_GV(Ktj$ zlNT4w+>B_J=0|g~Fq)#0XuheV-$cs{XEfH|q8a}yT2e4#FlZjbmsT;nX&b}Xjxp@%8iP@f82bMi!;=0n z1PzH{*w7f#g`dKb5it}Ap9Hg!F?1apBPEq%cs4zTNAqHMxim(esA6#45F@|77<~6A zVmP8D2J~b2&rCXPVq{S;hNaT}+%*Op&lsWtL{UTx8{%VFpC;q8V>nkF!*^8-o9klu z<5&z87h>?bCC3k9aCsR+yDu?pYZ}YP_OVhzHI|nBVx@XnESo3Aa&&eq7??TTfkZY)vyvFtUD<)B3@C+%Yy?HY@wYZ99>?w*QGmhNhaX5^RlPV~29G@L0H;{3(ULD7{ zjd8M*KpYDU<5+1M$0mDlMsigGEU;e<8a#_hyUp~BCf@e_%M#Fw{aBxh@+}i zJO{eQGvE)I`Sk4@&(1;dQUf5K%<=J9&WdNvym*S1#ItpEJfqgfGjV4;%XQ-!W*E;@ z(|8_P$8*Ucp4;B>JPwcNO>#V6^5SV+6;GSP@pL&CPp@0?41OBV=#TMCX_Ua+-x65X zBZ2jU64)^|0nM2Sat%-<$VDK5?^_aRrkOxH(**hUOQ5e$f=nhRFfJv5>G=sPs7hev z;RH6FOJLWn1azJzVEQouyGDupYMO{evqXlqO{87dL=N^$l&fSSj)M~M9Gb}Q!xA|) zI+2f463LmJNYIi*7Oa->TN3%I*p^7k-HDWGB{EbmQPz7Bv9?U)jAJ5h?uqCGB+@H9 zk;Vy$sL~RN&r4)&X(E$q5_x_gk+UZg@i?D|-VJ$wE0GTO6EPPupC@weRU(UCCrU}Z zM2RCxB%)aocI}cF-8G3Wy^~~hP2wLO3`t_^&?IJ!O`_+7Br+!@(QRrHvD1=xFEpK# zgwOmW0v9FGd07(MRwQvixUe>fEgO?a+LAnZ(=ONgUpn#9tbsPdAB^`bqRR zN@A5s5^2J7(gVw7r|e{zu~QV{z(b5*{DL$^Vj=|0{_~A)#e5nQf9OY?n;W z_Q_oBm`rKsWDa#t=5o(ue)LObVShz3Uxz1iZbUMRMkX_NbTWgdB(rvUGLG|;8MiE% z-`6K|YHKpZdy|RWmrNUtWSj*L-DJWIlF2Yl#>Om}m%_N63qJT;ldIigG0QJgGw_sWu~uSsTOT{7zqC-dY;G7;yJd3QdUtZT{m-xH^v zic{~BdH+$`eLXIK@#b^0p?2#fn&!sRwB!$!ADU$b*!lk$r{zyu} zH#LQpnJG9ZQ%KBB;fwHBaS9WvQuwJ(VOdQIOAn;*?nDY%=Ti9ddKO~h6!&1o|naU4g=U=HD z6b6n;W&YSy+14Tz!zrosnVX7+V7fRJ^^#OfR;S9^Zz|okr*dGA=+a8%x^60en56Qr zSt^^%Q)y$D%30S`QoU2@5RxieB&HG(mnu6HDpK)KrpjJ>sf<&nGJC%$JR%0pr_$p> zD!YWx|8pgkmN!!w@j#S5Nu}xARO~*cGUltCN%J%&woYSRhcukJq~Z2QnpDh5!+dy} zr0b{2o?B^Lnvlko$!VC)NF#Z18VA><(Rx#w0W7LT>ZVL|Q)9}8S#*|BG?7WhO;>qnaUffN??rEA-5KUw8i!>U&N|W@9 zG`74+ z>BLV<$7Omtljfy!RG73NondRz$=Z@m%Fc9h_NFTst(7j5gCby>&McdB9^1-5dl3-M zdZlwMEL}oy(s`bnF120K>06X8&x7fNmZkH1WjZxA=^Q_hj??jU_MK0s`?Yj_{F_e6 zlXRlqrnBO|bjCKy;6RfMoSJ8Fu|)Qv%nV}ZWDv73ga4LhuxNb-9$PcGzD<<;oxxxGGT5!1fw^u5+J+fuSY+^< zLk4vo8RQ3L@MmNOrg0fWre-iOF9WNx3_L3`u&>YH$FU3sD9&Zj@^S`Y*E5)OFN3sa z;?-*re3QZQj~Sf#ks&1(GjVO1$++J#<+3UC%H-X^OqveMf-C2y#%3`HX z7S2ZUY9oeRvha4xVys6N^?_OP6`Vy;NERc*L~nc+`%<%*k(9(s9o8_>Sj}Jo-L2)+5B?Ore#1j-y^eWmX=Ms!ff&@v#C%V%9fy@ zY>r;f=Io?}aG*m@PXFWTXEzo3Txld~2qpOG_o8os|sjqolH*l12lSQrSw0 zaAlKm5v_)b!y7%^GN2O(mL zl1WpQToG)hDWycFl4@ba3?(lG#Y}0RrDWx7C5z@L={Z-)8{zOgC9(6B7%xz=V4;$C z!qG)aEEg-8wM5BTA!ezP5zCYeT(0E2aB_tb+m&)ctCg~%y++BewMzQ0S4!@_lA?_w zuvyMvi=6FNB`vloWr14B-@D}u_bG|elTScj$yy5~m#vlfIVq)lwUUM2N>2ERqoGPV zgej%Wsgm0%O2V?0EGd-nYNe!YDtRs>A69bwj5u*o1RGzMkLRvZ5(Sk6yi_vwqmoD8 zl(cV_L-&q3^5~qy@L@TOpP0jpxj8IcnZv5BIc(O%Axvc4z+J{IPxQh)6H_Z+%cCsy>fY?7?#WHvAO&=Gna1*b7{IR zm)~~g(oHXyK32I5b+IQ=|Nk`wZ1@hJ}nVb8BTx;4+o zxqUtpyXBMAC!e$Z^NAjoPs+%Ami?74r5f_lotaPL1^H4HGoOAN^6~qB#KQ!Qe5t*g zkFiNU`>pahVVlo(yL>vhRp;(Uge=W|D$ zk4a5FF^9$2agjfl&y$OCd^MjT5Ar3rDW67f^2z)tecwfQlLC6QFTl66qCg%d3#jN{ zfYsmv36Ch?_vr=1%_?B}!UEZmwt(Xs3eebGz|(C7sQxZs$<6}F?JporyMR2s0%qzL z;B8pIE8_y@SQYTnwt%e;1!y`Ju*j`|5YGb21P!kO*~_JXZIK1k#ums%K_a8b5M!AI z6btrQ1?*BvXITMLD+(mcqJYP>1)Mrwz@^ClHCWO^a%<`!~yK_QEm6v`Hxg-qXEi2m+E3icGDh}AA+ zrAZ-9W`%^?6mmy6=~75*k3uPhUdZ^sLPmubvLm{XHSvWwWQb5^AwhYC^3fO4LM4U- zgIei7Qi$q!A?D`_xq4oVT`fc@R0=l)?;A4qW+7{ZFZT-B_DrH(x;&RN5RSbqWat-B z_^ps$f;<7@*`kQ#mPIURU&Ll1xmyv{zZbEqcM)bn-Jl|=6In#fUqzf38YUEBJE@4? zGm99$ponp6irBWUh%Fn6B&o58pe>?jTM<6OR80m=pshO7EzT}#E$$TG^>h8sw?8!!6N#dC_?LO5vwm2$>K#3=C_Jy z^luS`kBeCGyol-VizM;5h*e*u{d*A;e-@EPF?Smmv$8p#e+*nM` z_F}f~DW->ZF+U87$u=vNsu;zraVloFTQM5m#ViOcCM2quWy!_tR2HLf&MjtGVKH9C z#T+OrrdMULEJ76Xu&$W<`-}PgusChkq2JOHiTNy{-P#iV zT35pFn@c#iy+pP@DIsBBiEN2pLSx+$CK{CR#6;xGO4w{wLV#_FgyNM*-F>m+R)V>Y zys`8zVRxtyEuD!a^iD5fWL60;@=CZ~UP7f>#?+VKbhw1GXG$nPUqa#45+>X!LHk(= zhhCO2;#~>+C0eeOHqNE&^(p1|;8MOvmtq=IO1Q8pMUK-;amyw#p7S4^le$j<@RNq>RyI_-!iTYD?@*H85SeT2pCz$iHT*jpIS!c zv@-V0D5GLw8FN>ZNghF&6r?WW-@Rp0J-dwSW@T)4ETgxVyoQ$XBcTk#%re>*mT^*5 zCi|`&EaU#^GL~K`LS~@03eD?{WseD98G3ImbSg^Z94F6fmkF=(h?gyHya^yMi@?Drh#cLVoWR z9Gq5x&D;v9|FN`!R%2p%@sV`Ucr;S6_oF*ps#iX{~1UR? zVDXI#p5Cco;KK?OEuM*&A1e6tQ=Dj}LZgd{OTVj_*;6G2WK?+cQ8A{U3XA?KDhH@| zJxImip(+-PRIzuAin|k3?3}7%&oq&pu9Cf5RRqmc(PWm2>e(t1=c@3Wr$TRmiggR+ zSXjDPMT9VCsY*f1+4Jv$ux!Y8f2>aNPJ5Vt@M(hb) zV-+fTrm3WWsEP_JlK8&iwXL6L62;0_l_Y); zWj`wE*R+b!zg6Mep^6*bsxbJy3cJ2l+#OIw*O65y$5jzDp^A1BtJplbibhka(3)Ds z-f2~oPOqYVMisVms`xdpiaiUfq)J{D8N%kJRcu{e#rV}#99~<+(e+hy-&V!6eG=t5 zMyrZI-74Asu8MDVRjl!>A~c|iKcmEv#44P#tN5a zV%e!G`Th_G&Q{4Pc@-0G$(Vn|+51(JW>>|lmsKRZt>WYRDoj6B;r&zWHLk|0X*C+n z71dm5S55Cu)tGjvM!S18v-?!z*uR>{LDggqlYwKZIXJ$Wtclgkm|D%IIn`{PSB=fW zYE~?*=ERz6TCcBW<)&&}w^g%!kI3z-CR$76^s1>ct;WHuni5MHXIsr<*J_O1s=4b~ zE&1O*)wBz%=5~y9CREcTshTa>)f6g4C`a1!#kq=V*#@JUW|h@ks;=hmgVlH+62}f# z)AqQ?ovS9~LN&&htNBN`bgP;_?pE{eUNs5##ffLt41HP6g4d!~@c&fJi_g{Aeyx`K zzi)E3P1FQ6RTI-fO=L?oyE>>j+fmKdE@~!qRWq)aT57?o8Qo7!-2gQ{!_{0Hsiwy$ zHFL+R$(yWZ=QK6()73nlsU~ZIn(K?zG%Qz3Jt;L8)~mU-Nln-`HP$=Sl2I@68ft#m zQ7ibat0u=t&3WN>V>Ls~)R@|-rGAr|dG>0`9o3|JsJSUbda9Z4qvmd~8s9Lr6cA98 zAE~B&qMC$cHI386u;7@ZW?H_QsfB7f6sd7hi9Vs7THXtd4yjo!WFA$h(LJVS$yv2T zyQ^t+QBCJdYEo~C^4n_8+)?xTp7cMHz87lL!uB^Z=Cgb1atCfL_VW<(8%jx~&OszJ-ShDf2WXAJ}VYj_e+!{MMBnLV$ed0Y(@ zNi|qz*N{|D!|;k4LThWdC(J!qL(5||xSpxu?&TV$Ua4W;{Tj*tcwIxs4>hPh*D(HD z4f}uA$gZ)q=rym!pmiiOEHo?UJ0`LA6)le*P2@b`LRy4TaT ze?95K?g8~&8c|Qk$a+4EtEcCrdJ1ROb8}8TR~OeSFke>Bl(qFz+rOT5>t*n^dWq4g z=lKp%zOSCH8uc8~6hXs!QjJ7Nu&}D9vrRoq1xH0af4J3?=3dWvp|yWKPJ#7oj}*D+ zdTNsD$xf*!BfFlXMfLons%K(tJqd^Ed2n2We>)=rLfZLynqR8t)RlUz}GGfyz1H@+haD+qfZ07hBxqYWCQAP4OmWUVC$R) zs^>P~ys!b5HSm3du(5&iZ4Huo-yqR34Kn{@(14yvgFKyx0_O(oT^d;6Ap?9GC=P2t zE4+b`|D)(E1KQZ0KKz^D9wY%0>Mpna*WHD>+pYK3-Ca@_>hA9DZg@fx+}$M!1QHwq zyz_o|*zDOkGjq1xWcTcxnXA4Cy~%A)eR1cRFS@_>h4Gy)f`0lU^OrA<`}*R3pf9F| z`@%fJ7b|0Yu|3|GvnKmOn8SVYeKD!f7lSH&;a$bfRQqBb{J1c*ALoDIKfca>xG42Q zHe=n)53Sq#VNw@AThzQ+DYYVD5?o&B+_yFZ5Y@W=4p{^-`vALRr5@no<+uYmSP@kp6J z29Nhguc@qLou2_;Eypc{c-4{ zKQ{efMSuM)#vS~jj{y+(Gj+#g}p{+Lkbk6*F| zfBdEZJhcr#fPDZSi2@Mp9)QVB1CY=>0O}3_nA#}-(|ZLVr4P#uT|ZnbQDN z&I-W4a{`dDH~?pt1>o@d0Cd|FfPZ$g+};4(JQ{%ioe03#3js*K7=Y6^0+4(&0Eg}c zaDBf3$lksTK)-hZoWmgiuYU$$ntuS=Dgro>cmNDh0X&)jbWdZl1K^=y$MgZHE)Bqk z>HzF$2;g77K(163h;L4TnB^9Tj?zG6H3`K1)`1w@K9GYA19>HVAUgF8M8E!la2(9- zLj%!xR3O@p3FOsI69ZwG9EiI!10kIqh=U6P(Xc2GvzG_r=E^{Lt`Ef2je+=QJ8yRe z^2&%n3_lQvq@#gYb|MhJ&#>%y-d+iW%k@CKx)X@=_gTl&K-j$q#LTyWuznwi{htDH z>02O9{s~06A3LK6gijxDruh=X{6 zLJ)*agW%aN2va)-;e7WX?Cu?e1w(?+cX$vY#s%T)q#&5h4&rx1L1?oy2p?7i;n(UQ zglq{y!=4~q-yei=hk{^#Du}acuuj>vAe^}wgg1|Zu<=z8+P@9r^qE1tTs{bc0@;{6 z2%95<;1C^zfaD-hdJs=81!0ah2oFnx(6WO2Rt4b{1%vE@@zjC0!eFfS42DhfV7Rsl zhOA96+WjvWxBCR+MgL$N8x#y*?_lho#K(S43C8JZ!Pql57?DeY@q1Y?oK|p$^})#8 z7K{nIgE>nbD?A*GlgERx>~t_ZE(Bxkm0*0l!N>0gW7ET6jD8l3+E>A7@|kt~2u8u5 zUyA^USRwGB(RdS5mAjk5Zava_zljF~BIZF1+k>(?Z_>`O% zlF8w8Nshc*a%{iDMjy-Z<%Jyoeqtk^W71+u=ovpyV1q#0Y`A_{q1uB>F!DR|eU#{Tb zQa-pw!8f4_EZwBQ`RxiE+@Zkky$ZZ#Quiqke25JmQ6TMv0=<0{7=BWL-)Gsea|+Bm zufU_r3bm!OmAI z@S;kAPqhk!BLv>oA^dO?f_S?SJaP^}g+~Y)OJpJF(1;tGh2Uhn5bW<5f>Hm3V11Vm z==y|U<^VoEFa#+>La<~EZ^wmjE|3t|ObNmE*&&!PCj@;KhG6mH5TvgPLF?75XF~{b zHiz)TO9)o&34wNh2;2{cKy@+%zGp)4@w2gAf!x48h!2A&7Ys z0_%?1kQmWun!HvIwmF}1pWyj96}d@_9?75Cj?Q}yAm`1DpBXB#Hv6g*922yWdtja zQetkb5^gCjQ-I@1YR45Xw z&`GMohbAgqY^g$zb}EhyP$8m=3PXCU;6G4>LxWWa9z4t0?_@Y9$pDNV;<#vA+l7m!S)lLNmm5P%VtI$21 zor+L#R!tRFN2{YNsWohStw0SQTQzEhymeJW@219R zFExHN=WQ!BUbj}GUnezQb?0p_HSYFSLpMl`H6zq`F;b1O-fBdRSMz#qHLB*SVX;un zd1KVDS+2&P6>3HO?MU!|fP%JkI+*YOcSoM)xynd_SwkjPq))x2(p;yK3}$qUKt0 zYNUTwW701*%Kg=xWKxZHQED_xR3kWDjVt+Tv^J=5p+=3x_54{N3&mE8P}tdrat@$S zTyYJ>E%#8kH0HLZp|Eew?VUm~wR0$PdW0gqUnsf^4uyO~D7K9W#ia3}h?^7&(X>#6 z&kRM_>`;Dv8_M;gLOJXr6lQBfaeY%L)@%vI_HCgUyekxa_J+c^KNQ)ALUBfRER+KS zLh|mnEo&n>Sv*t^(qv{->~ryp{V@M&ixF<-=I(|lZWDcNGJ-zLZOTe zg=1zYdS|opyii=#hQhog6rL5K(A9+^uYm_*7KXW2Vfbnv#_yTJa90wB+(u!XHzW+Q z`VPF)IgGFEFq|0{hTGm@csM?cqg=w!X;BzN%ffi!a2PIZ4nwcqVesD*2E&0cekB_Q z)8#NMyAg&n7Y5JAVTgMY2HR(082CI4`7grI=2aM$zYYW5hGFo#FzkOHhAtn& zu=G|W$3};95xQ{L zj15OB^LSi1`i~Ds0rPo6I1WzawprnP-G?J;RX7Zr!|`TMIA==_N5YwKe!mosm5;)) z>0LN>{|d)pML15&V#0AHBOG@N!||*t9PiB|@Ix5E(<~8Cw~gSyu?VCMjzIpn2$al< zK=qOc2sTE*Zf^wKPDG&5MNIcg?;!Q~;K9)z~TTLW>H$>tXMPag8 z6ekae!c4~~>~xC48DSJYJ4Zq85{2WUD6A4k;jttNy&Fg2X!9tHX%&S=t)pK2X0UeS2jA{sy1M-{2Prgi=#1YT{N^iqB$*RG)(8BVR1Vej?bgvF8dsfrhd_A7aEPO ziP7kn8;#+HXpFCm#tfSnED*(DMY9-e{3iyx`o!SSh!~uj9D~dAVsK|=44!U{!Mg)7 zyqY-%{?}umdK|-LTw{>>I|g|nF({6WK~-i9hxEn3wk8Iyma*`1iAAf%vFOx37P4MF zWBGY37NaM`V#@4T%vlzTC7WWgc3&*E`LMv1SR8*4i}P<{apOlU9tOwaRa7iKr^Vur zHWu=VSVRcokmwkPEJ+-6t>bu}Ck}N3<6t>94o)-U@NIq^e3!>z&xSbk-Wi9%2jieQ z5r+%s<7BvTBMvhj#)00%;ndeSSo_7{qbd#qW8?56Ee=aHaVRmyVT~ycFD>H{0OFX>x#bfxfcuYSVkDzPu zD7qhyv9IIt{98P~Kaj=aPk21GCdZ>=emp)HOq75N%@VNZp9GBRl7PgX z3250r0lS7K@U@?Sh#3i}U6{c4dLjs3tCtzZ5 z0#-yM;6PFWZsa7upl6-c3AigWOGJf3BF1|p@^o1uYC9%kO0Pt`9Fhq0afz5WBayRU zCc9xHKh+!@6cAVdRn|Ox%#f35Jre=y(!VT}r~A zJ4tYPo`hu|lknqr5*!st_%A96Us94_o1X;N(j<5_B%zgEGCH{@qgRV$4DOta(fyJ! z#XA{urY2*_f@G{+os4bUld*kwGPcT+@#9c3S2<6{#tX?fb1PYf`%jXQ{WKXppC{wg zi)38>l8h%`letW4G8c(V#_ix_{81+3VpKA^CMClula1uCk^E##)+9r%OGaf;GBm}> z_*BZyRIoFG6byDu!DvYe?lnn4o0cgkX_tcaol~Iho`MT~Q_yr!3KkESrQqb46i$(! zg4_S4;K{lae({ikZ%0$$cOeDJJ1Ja5E(IxHQjqJP0)1EtDw9%x{1ns{rog;91r8Re z5Id)$NuyM>ZI_BJJyOwkNGgVVr(*onRE`x(k+9`44nIuf$K_H1|Gy^;AK_@KIt>?yCws{mYE25$wWfqOisO*32o0z zln%{=X+kC}=48Tgc_!R9XQHVr6Uz=};>M9ov^tT=xqmZx&2J_?Fm7iuafI=?n8`1j zGr6Q=CW0Piaz$L;f0+s8n@lYEkO{er|3v)BM4!Kzc)+;&X2K&V6QRmX{=&$_)VNGu z?U0H8WoP0M*4SjBy=@j?mjyi|8}E{Z{T^9JYMh1tT4nK1WfuQbX7NvD7Qe5_LjL3| z^qG-`pR==Ivmgt*R%AiBCJTKxW}(rhEOg(T1;;H}$Yct(X2GzH`)tobhl5$Tdol~d zE@z>~-7E}znFa5!S(p@%g@41@Rx;bl&*J%?Qa09*g`;-aIP0E`Yb~;IzjHQT^vlLa z?`+Oum5rbU*|@bl8%I}VW7PU=G~J$!IlHsb@jy0i`(&f+R5piSW@GW~Y&3b4jdQQF zas7KXzX8ccX<#;%gk{4sAsbkM3AuPNITx#@ z<>JQNTr@1n#i!M|aNWY}%|+*<-0@5>+YaV|DJWBHf4nEomk!q>S_ zF-PCz;`7H`6nx7?r$4#;o|xOzx#$<2izO+!@XXHTb%eR7H0GkIDHj%Xxsa`H$i+6~ z!OtuY%WU!>73QI(S01{y$it_Od05#k52~Jd_%k#Qy~gFCa7rE~&&Y%Ae=M^)4^bQP zaBO=X5_jZb$-z8$p2)-XOL?fjnunja@{syC52v5xVa3Zl_9|q7idf$9}@XJSvG9Nu6@}Xf|lk#yTEgxgjxpP52J{IO< zc~L&jSL9=OZ9bNv08*<09Cs-?;*)nGu%?FyUSS z%$^qD+v@_pQ!2pafC7wB7T|PD0T(AL;2@*|i1G_CzPJF!ssfBQ6`;gYgV{n2R=8`h zv4w_T?P!qvKMl_H(qP0u4P-ULHF!H#gC$cm@cdW9#l&w_C&x7?Wk#LS zU?0=uEcd^lL0@LbWsM9EE^APHmA$*ko$qOQnUn^Fk2To*M#J&F8eZL^LB$sh2a9Pi z=O-)trNOGd?5M8>*8()y8_1(jXiy)bLAX+b)nOWZ2xp=+I26s>I1NJMHP9unt}J#s zN5fe*G(6*~K}@Ag193HX5@<2XLW|>;S}3fvcx(@BOqKDX&GvC@or!(_-WVExJtCB6oonE=ySFDlO`^ zXt|=I7MFHux%Rsj8)S#Hc*aaWtcBsYmVXkph-CJi(PH&^Ek<0_V)$h(u3yz6{hAhw zZ)&mdjuuDnY0>tt)M9e5me+qPwUCBt;TxvKu_!HWGpAy;=oGI-d6E{TsjM_z%LOO2n3ShQ zUcMH|S}oq`+36B3yvnrb$~3EF#Z_APnD|UJuujs!)m(>MD;;**=rGAahY>;@w9Y!b z7wI5pzIf<3&7MTZE0=ZX+FFO8HaZTK(BV;M9W>o^m@!a?m7{cU9HT?*cpVp_&>?A( z4tu8PFl>enL;lqvX0{Gb=Ic0pJL_4jR0M8cB77?sB{>$h2^*E@NSz9CEIm4 zu~UaL``MY}I(VLy>2UutE4Zb@yhl28d8xzq_d5Lfro&cW9Y)J_2n*Fg5u?MtBpsJv z({ZeT4hwR1u+-|Xw@`=IdL7nQ=&-y_hehUvxMNp{`|gF1com{&qe6UZUWk6}3Srx= z5L5aVBBp;Kj*cwEp0S0z{$olZw$3U<{p>;vUsA{w3k&%ctPpQ@7UJ#xLJT=lh(D(a zVY*ZZx>bk+_X^SW8S}0X9$yRjN+`s!;6n6P6(T*FbtM#Henue<FxRdK|GE^Rz^#bCNsF+xWf5d6I}{=NpCY7oEyB(IMZD^<2!fGC_&v4=ZKfA- z7L+2inqP!B%+5tca9C0V@$w=lR~2FEYF4_g2&xT5Sg^SWB~0DUBAnS(gbRC$IPka# z=l2)E`Vb#GT!iIEi*V?85r_2`q4Aj_OgLX8gWaVfth-W#Ue}9o<7N?N-YLS5dqwE* zs0i(!7UAWKBD{EA1nK)CNIn&z#rGm~{8NNuens$-7a=I52w}1OIk^b$Gm0=fy9kSm z`EywjM%EOe*i?inYduCf>T%aq&k4%(aA~E-`ZjtfI?D9u+EtH!1NFEzSP#PpJ?4zn zbG*MEe*fyRVy+(d7V2TOM2{!S_1Lmr59^(J#O>E(m5&}rFX{2%4l8`F$H9+!q<+z3 z>~}rB|70D1^^p1Vv0yzvitDix=Q)ss#TzmLT7`1VU*EN6VKWtYryj zJS^c!>JlvKR|22mB^Wfe1S_VMplD_Z#EVLxT3&*(4JCNKy#!JFOK|L13C{V*N?>um z1f6b_;N$HQq&z9X#@8jV`Bs8(zY^$GY#_FTGa8oQOHK)H>r3#nvIK_(21ME$aLC<& z`OOSSWsWsB;9M&McD6BKRR=!S$-uFLyzOGZiXH~I^faJD9|OAgH*m6h16q$UptEd- z0nKL_aFsbe*8r<|2F~+lz}`g$boZZx3x76X27H}GpWR&vyUdrTJ}182lA zAn2q4GtL?~C6fV@E*kLtiUIx)3{br>VD1Mt{E_v2HX!S(0V}_;Q{N4k^Vc>L zZ^SeQBmO!W(bC0;m&`X;BW}AJ;q76>La7le+Zg$7$cUvKjab*)h?#wjP&2;=8fEA| z$cWK{jYt}1!~$<4VweGAjTkx8h>44h$XI5?mE}gzDkGMyF`|eWvd)MX8;sb#(TMEL zM(o~Vg!wij&h0Sb(oQ3R%~>P{FrNs$r%ot3e` zStFDe*u#rP?7C`%?R7SE&xqptMqGShQG9I+vonQ7I0{T9o2O zyHa#+Uy4KBN|D~96qEXu@>}dusF*h1rPw>Zlv6X6V#v%=wEwphZyDbOrCiyz6sA?B zShKMdRohB&aeFDY?<_@QSt+I*FGUh_?Mx}|-zY`ey;1}`DuwHtQat-oiX}fw;q6<> z^Z&tYL{*BGk=zi)f{CTjB$eV|Mk#c8r8rwq$_va&@u7^3)^KN2Dc>!X;euTm-0jP- z*|7}vPGxB0QHJ_PWe_$imT83)}SmD7k2#%HE z_^C3?JXZ$0n`OLoqYQ?JWt>g9jI*VdLHd;)`&EYLfowda44tFOAd4x(>Etqmrm}o4 z+sK!dVWP2&BjC%>yRwYS?3AGc$|0n3D9y^T*}j~w^KyJ~DCelya&+=4M?vFqgf=P1 z^XBD@j%Yo&n9$Jpw!^$BU zSB{wz%DJ%N#BwMmm&0L7IrcNVr?C>I@$7O8omY;w3(GNLX*mqb%Q13gIqt76hjdLj zN;Z_EZhJWf>?y~LL*)oNR*u#_-2Y@b(wG*f%5nTmIlf&ehsV`&jJjElXLrky@UR@c zpOs_9E4KTt{QvVmmSfg;7XHm6^JC%Qa_msDa9BC4qggn<9M_UrIGvrzVc7y!TF9~` zthAhEt66Cs%L*zui%tcu*;a5YU_Pm&70i{`c_60JsI}fVBv?1I!yaN9l$#SDA zaC{86jjzCxiQG1&0)wY<-x=)0ES8&7fs(lu__d${>P0NKqyjCMaodUtU^Vw$TY*{Y zW!$)_0^PT;;I;~!+QE&xc_e#TkdOHu;I_jRxOJ4}PE?@Ghucn9AmVHVZl0?^qpKAN zxXudiR^TnO^GO97p7DU*RA9oF3Y_^R0;t-xpVN<6TsgvqrM-KCXCZC%L=5-TxaU?oaMS7OBUN~jiA!fZt)Zm+FG-i}HR z%c;b}la*M0sS*<}SEBYxCEi`-_M4Rmeq4!m&nh`%W+mhwD|xkZC49bDLLX3xTty{H zm8}1+x)M9$Dseco68YJcyqc*Jp;eXmTvLf4^C~1;Rw2f@3OUj$E>2m6Z=I{Kwr3Tl z461_F$SRB(SA|J4sxWwN6(Skc{3@6hR>5s?6{?n0angw@Tw76vv^7;YyN-`Z6^8Dwl410LD)c*211%wNnVAYAytq>RAECjAB(9%U~Cmy#a96dRVZX$CsyHlQWe%^R^e(+ z6>jR-S$!4ml*@RhstQjVsvs9so0l3r?zWRbGvuQPs#wsD?u_ z8_cNY#G%y)EvSZ-wi*?M)i_dFjX%}Z7+qTps;|bs)-_mQTZ2Z9HAwcTK`TiO2e{NA zy;TiXcCO(os|H60)bMNj8YGOX;rgF5Yp`um4a}C;;OoX3oZDRkul+Sx=Tn1QCu{Kh zd<_O(tAY2U8l=3a;d&1>aQ#+;rhjTM`)>`7ht$AdS%Z?88uUr8!S;+AuJurZdR+~d z;;TVYLk(Bbu0?a#TGV>g;#jj6Tc5K!P4G@I_9&33DIH`K6#q(RBFPbMkWkwZNm6=CWt$j zu%?pk$*Nh$B<}yO35q!;l*yKucn;2l%NtERood41 z-Q3}T2|W**5bk4w^?4J{UNu2}&xFJ$CiH)8!ul^J=$MwjO^6IK@v>VJCoeEzmD+@( z5he&@P57N?f?Ki)4jCpa%rv20t_fWYCiJUg8x1A|FyUr(kfm7Fp~#^QitNQZ4h!4VA){j*3YmFb>)_m{j*AZ0p=wwi?8eric2XUhO|Qenf9p`PpboJs>hNP@ z9o%=+A!t_}ejTjCWS=^8KUD|8g*ptpRENK}>#+W59W?Lj(D!2SkjxH`xa>o6>}4lUB_@F%AZHU)K9tE=O;ThV!n&ylqCXzo#uTatP>HL8ccNj)aDtjE~)yx+MV>D}u&51_0bmi_B7 z&buC`C)Z=h^m?>iP>-w?^?1Iq9@?Gtm~*fm4}I!kd!ZhSuGgdHPCcGJs>j<`^^m>c zws-Yd_`V)1zSrY_KkFg>T@TTpddv>2=LxBL%!;h%5S)5kPO9hC&-J*PUXQLh^$6Cm zGqR$3q%fM&diYe-b2apO#MIU!lNzu|(7+2x8xZN-fW6`dNZlKFVxa+Dnl+$Ls|K88 zq8Nux4d~ddfxny@;5oQ~%lJ0n;m8KGozQ^MlNzvo8uy#Q?TZ@lzoiZ6u%ZF9u>sE* zS^SO${N2@nxPuL7IN5-6ry8I?%L=YE!1+!Cm*8vw?lmBY$$Q!Wi{}lv#oT<+fKDIS z!1o4}{cYf6rMwMoKzM8er)F&6K%)juYTJOrng)cHG(cI=0H;?_o3p#L^b@+hVod)eX2U>j{bpJNU`<@K+{ShdN z^8<8y&)=XQLDPS5nHP>X=ZI-K&(XA>6`<%y(2#i0i7151OM0>grb&~ZU`rL@I;e9oLSGX-{z%m36VcnRL}GuUV}V36n;@bmaw1J6(Z8`o z74bw#sYHQ!L`@5bGPOjaLZZ4d9#Jh(1arE9owX5AFM9zUXJ$Jwo&vIK#QRMIByKIB zicSJ@`JaHyx(R4xcL6yM5YXPCyd5T>z9R*+W0HWrOcBUv##90Qnl7Nc1p;dLPe7lR z3aI01{=AtLZ57buZ361OOF(B13h2lY0X07+Am5V$s=pwhg3AKBe^o#~ZwM&!zJPW= zVWm$66!JnqEj|h;>x+Pzd=rrRr+{h$1oR_VK(`eF`l}Yu-Dm+t$H@eglpvr9DFW)6 zEui7~Y@|Ry8*~CXR4O3zN&$IR3CPVPpw8xI1S>O|Vr@oZ2Q!-MW=7N9&FG|jP_-OVVfml@R#Hlu%sn~|2eJJyU8(|CWn8GW5)Mr&jX%;@q8 zGa9qrj2gC@QCpcAeP^B?WE!=C1}YJfTY9&S#($C;CA zsyRvKu*?!Zw$z+bR+-a@HRe>c)|?X7nbW4t=2WuJocw&)&=qrPbHkj%Z<|x)J=Xck zoI>83%joQTbE;?heKV(Xf6S?YS^L+V-UOLbAGJAMV+O^TQ{x)66M4)0{GM z%*i6(oO}%CG|y;G+se)9YXkR#1x4Fh&^reU8sK3;TO}4Wqp<}wZEHbE%-{|d6w|(8sn8}LDh^`ng#hVv(qi;GoxZg=JROu7F5gZtgs+8Gpyc% zx;0qPXyy?!9hSu5r__urNoQ?IM}?Nu#lwFLmymi z=w}lf3hZD*p}lM}JkiQMR4zi(lAvSb8%!a;4+R(RH8@iQbL#e4YG$hl8_UGA9qe2^+ zS8PLv%UEBH4JE*qR$1B7aR*znb+aW8i7h>8YD+)c*iuF(TUyq`mfH2Vl~KoGw&Xp= zmW-2ZNjTG%F3hu~mP>4@>ndCF-C#?x+ij_4pDpb_VoTvZw)E+OEty@jrJgr!DgTx& z-MV8-U+>$J<#Stl^ud;t-)w1)pDlSRY$-XymfpwP(z;Ar+F4*rhxE3TTWL%4VMk4^ z>?qhlW=EIAcJyykJNmDq9WC!j>&W_s6vZJm`?5N)cI~u;n zj>aFiqZya%DD(;+zhg&v_v|R~nH~Qhv7_xDx$j>)I-#GKJ=u4)r(Qkm zY48wxQZU{l>}k?udpa=9o^qJ=3+?IR5_@XA!Jd>G?Mb}No;vNYr@}qx>x@eXusI)9$$Kr@#*P}W)p+O^R^M!oqyNwmX(mhN_-%|{$)f}fd`|_4KGT4#Mj&UT*8IF`R%aJ<$=SV(_9qHyeM{2yw zkz$TGlIwZychiwnPaMhfgCkA-{wXKgXjT@5VxE-<0P-TMOxUTOnQOAS7)^A(eF&l3O<+sd@-$ z*B~KjyoEGz95Y@>- zB!@#nI(0}WBi&&kO+PB6P-gaNA@w;Yq!|~4u(6@?M)%|xFaOHr$TaiCZvFu ztn9UrmM}JNgmmdGJH(8B$IgA=E%S~EWfDK}pgs#J|BH~?e&qpu6H=@1Lh}0|q_IDR zRQO9Kq-DQ_}b={e%?fFQjn+Lb}LEg17?{%w#iiIgducXD&oYj!Gfj zR0%1WnHVZ019LE(orw_AwMZUFl#s3`3aKhhNO!aNc%G1sX!)#^@L**IA&n^&($^{> z4XF`Q8#8BGYwt|!T%BpI)R~sF;QjW_bgQE?J?P;~je0v%$05!XJ=&S7$2n8}RA=fm z$C)x0Ig|G?XG&k`Ob(l!X~I@#>b2LI5{@|2!QP%0rIn#w3&UE>vGyP#? zmmfOQt|!i6&ADzkmhcnIi%?|x_ruBZ#slPwl4JA&4s3m zU1U_?=|UHzF7&*W3oU5lLKW>*+!tdU0D{7aBLfg*tk>(2y}MlsC?W>c_iK zqggIg$9OGvp?+&!D14g>z1{9Y!w$Gmi-Ruo^`r}3J>^2buDH;l>n>Dzlec$W$oIJm zWxsJD@AodW>x;~VN_|~uW}pl04|AbokuLNn%7y-ocOfk^FqNIjW91qbI;nG^!+JJa z$==tw(1-?pu(NQb500*M%-NOtySUPCkt^jkcBKI=UFl^jSNhz}m0Y{I(v}{s)VjAT zh4ytNw-K&nJI0m1jdP`X*<@FmH`kRS=DX6?MXsd#&y_~6aiw7!T&dSCSE|_UN|X1n z%sy9&I_gUMPrA~r^R8rZ!Ihd{W&^ieY2q^oxS4ydIrEzd0GjgLA zmTq*?+Ktj}-RPx*8#NWW(R7g;P4jT$M|L-gY34>Bo4e89Hg0t4A2(9}&yBKsaC=WT zI?~&X68pN*!jWzi;q6A9N4e3LsczJ5wi~UP$9fjH$*6vT8x=2d=bYY!{?rsp#(2XKGwNWObiJL{FX2e@W zRK8V2=eCK+#B|y&qOu(#I=WLt5lrF{K6Xq**DrGCE3D|6h`!zwk?f9$uHF;T#|I+% z^hiW$Pejz^xrmOx6w#O0BKq-8M4vzMu`eQe_FY7;e~KvRw}>+TiYQCwCnEbm5iJO2 zVTFitlp<;oE}}M3B5EEhqGkyq5+(B}Qbc^aC8BBRBD!24BE3dLJ9Q$G7KtcCFQQQ; zB5Gw6kwck?>dHkFTqz7^ ze5#oFX=1vTBPP3CF&$>6>%=s&LQL8!F+Hpi)2w7PWDwFcL))yJJK4C3twcWO1#ogOjkW#in*VZ1wCWUQvTQ`9VX($9CN z&I{b>AoFXfJ2|d#r(;YFvwp2RJ=o|@Mh3gxso!CD>U-RsHe7Hg+l%fr>Z&{W+;ped zyYBS!Asc+=PB%ZXF<*Cjt#+p`3GVba$DI@*~Cwq|RJP&HV(t}#8^&s0#9@J^G2X)-;K^u2_kbI8^CG7Q})%!f?wT$=odrq-6{JZXDZPnz4$lOma< zfu3}BgePs8;7NNYds5d~p5(sBlbSB^q}WxS^kcIp1#I)A9eX`#-ce6lcEXdS=RAqy zZ#*gJjwiji>q-6Yc~Zt>Pdf9;ldgXAq|tvpNgwD*l@XrwINp5+OR(VNiMr#SRZ6l#c zZ6!3gtAw7(x=DC?OhT6iO6b)f2`v~bA&iw!#6$@Vnj)d)GbQ|WDIteB63Sj6A=M%Y zefdv9#}`W|pZUH@LhUw6$ZC^>)-l~TOXwt1&0O6gAtUo?tAy_Ck< zs=O|tfO`^>;hBV@-tfWC66*a+Lg9X_P%fc3wS-l-5{Z<9PPJ-q$Czd=_j+$OiDG(RdXqIw~*3IODXNOlF|!nDK)c^^4y`6 zM7B~oWh<4Di9Z~+lhSzyDP=M<9i=o~D5V&tjkA=dxN-+3ms#j0r5urz`iiAAkx62< zcu46h(^Dd)wM+`rTgtMG+Dl5U8*zW;3)7{sl-@Rxl95^3OiH26WIQq3TuMurl`W+d z$#iQar3cKVHd1O}+P9a|1tyj`(m_fenVB7>bews>gfe^ok(wf&&s%4IRWIdmx)ciZkFfzYCe2V`{=@`?&S4!iUXvWB_@srYNriZ_j#xnDn zzf2)IDJ^Ey%%BDy1=9##w2Qn*C-9=#=3ex{!i%S4y=alO z7frMAqWQL7G}6wCX4!ku5(h7u?C3?ynZ3+e=05Y431zaGXt5VHZX)xd$F05Sd?zn5 zbn_ygK3+sayvSjs7Zr^0B9BR4v}q={&u67ey{PLNFG}0wMYTJ<=;?khT6&BPpYfuK zOI~#CrWdVy;6*K;dy(R;7e9=6(IrO7jQQwAs~H_L=#v-yVIr8(vL9Zwm6ZEm0#Xu^N_QhI9ZCs;fYk5v`{Olt z_TF=z^PF=>cJ|(Lj}Mj1qb8XDZo-=&>QPS7k-}R!dG)$SSha;x$x0) z7d~0-!lxTtXtULY*1x&1PeKm3Fz}cQ@6Wif@RAExuDj6Xo`OAgq1SWmf30mf1IsHJ zu+=c|Zyf^%8yUzk8n|dN5bI;$w*Uj_AqKWY8VGX68+emqV1Jf@w5A4zHB*5?1OF5o zc-Tq>TN{|v*1)m$20rLyAf<}|=Vu0flv}+GI6gPfLel#h7$G~qF!1C{1O8tbXgtV3 z!@&mXe{G=DX<)_>1MB6{FaySs23n3*tOa`cbi9G)-x^r(oq;n`4OE$7;NJHJdM-9_ z>3>S>M+4{A80fr7iOJPp3@qDX;IUlVrk-p!@X-zfmv<`QuLd?s(Jq7jf;P}>w}GjW zwb#I1X|~V6NUuWsDY4U3NFFN4Q!B^Ck=$1GH^v~ zrk=?h|$Xx@8_YB;TQ-5hF?;Ef`Fc2rL9vb*k_Q}1+23G%V;FXMhYM}Bz z2KGqxXX@c|B`H(?)wzCQV3jm}rPz}GpMjIk*9HRL7^v{pKwJ6ioq^o<20s4475y*b zc!w*)%DGZf-j%g7?;}^<$gK*lypYn0uB26RrGq%DxN=*@RCVRL^sDB|IT>8tRbND0 zIUv1jy3(SyE8E0bM~dpXvP#10tAL9da(CsPw<}pTSKLEgF^9P_N4kW&@<)s-`%@Jp z%@yBtSK7*i99NnayE3rEm7-Et{%+}tcPm%gbarKE7gyeQb!AjHS3LVFG1=SCmF@jq z`RYs69qQ_2|1eiVhr4oCs*H4H$`~au)|KVox-xvSE6u-iWyloucB(54r@7*o?#idK zcZQOjrG{m}Y*)@p(Og%e=DFfEUn8=>m2VcgvQaKCb*0>LSNx>Y3Rjj%)s?O!|KxO~ z-5OW+iDRuRdFz#cJdi3IUHN3QD>LPiRNm%FlJwc>%J;jpPloJv#b=KzpUMB^l{DMy z%2@ebo=N6Dbw>6}^Zn|GBpq|5*BMtjJ1?og4fW(t1^QbR{&mIv)>U7jj6_v6vhHIe zwW}NHTf@ksPmFw8%gBM+Mq=t3*<8=aA<1_!GC&rYjck+mUPk>HZsfWw3^B4^{*E%z zB-+T?L?i#okLgDCi1R|Ok(zl%1{E2ZD$AQ2*(#6P8i{RZWUQPJLq{XsI~)1FtB!S7 za=nyPZzBh#ejg)kWxc$Wq|c3f*U!kc{zmEy)UiQE)_iT`-Vh_vLydeRzf10Lqm%O^ zR7q}+GV(%_#u!;9Q^y&ZGTz9BiALNf896Eb-x@hBZ6_OX`%cNoE2%U^Kg)1=C)K7Z zhCG&f(~Nv8n zbdwj-c)yWW&cjCfNZ3gusWR-Wk>eNC!;9*PT)JeW+!Z57<=7t@sjE8w*YxvsBkgY( z`S_+rK8pKyZmgAsHucQkjiv!^T$R7<+UIa%UZ5L! zL2kOUrIC`IA#Q|(y78ZM3v=W1a3vz;;@ot*&yAQAH;y{f+*qCI#^f9o$akZ#z>T2h z8ou^!^yny^-T0xqj`wn-=I3tI=`UaFl#Fnr$~SIQoZ`kOv)$Oc(2ZTobsE;V(RZ^O zB|F_P@6|9LQQebn{PMdSFE1&9>)LZu=8YQz%9)r}(Zq?5O+-~U zF}H?^S~X2%)H3mDZ4+bbm{?WU#83519I0<2uAzx#jZ9dZnE1rS#D@kGk7Tl|2@j)* zEmG)a($JgeYBEt^Hj(CT!eKE{*Vjaf%|y2Vlanb96C;95{4G_&O?)A7ktV7|n`j}Y zQ%#uDOdL%&@n5Ei`Z*?I^Gtl!R0$WD*j{9!LaB*9V*S*_cT%y1iO;2WD--QxPiqr( z+L*ZB!Gyh|iI$yBeAU&&;_gmm{<#U;022oX>cAj1GT6jK?XNe~L^FvQV`9ccW&W*t zJk3P-3=?J2OY-I@`Nbwyh;fC90UJ#Gvctr#U)AG%CK~KFaYueSVB)UW4w~pIjSiVO zB$J(oO^iNbqWw`5-H(~@K51fsJeT!nOpHIL1kalYlyetNRJvrsAm^md9}0TS#FXnM zHcEvXCdS>;@ZUBOEyIL+>eOE*_Q{_z_`Zq6N7_pD$0nR-o+#sICi0&v0r7sR1mwB! z%EZOjCMv%%F;pz?O%zFYv3y|W*K%fpKQc2?mPtVcGv_Oraj9%(i-dn{W_ooq@8r80 zW=d+A`BTib%~YzVZ9TJ-t$OoP(p}8_Xf|_F!hOsfbeP#1ZsuB?nL%l02IiWXQe@_; zTrM{AxVf2t7G{#Aql|BFrcF09jr*AS{tGjg#PXGyZB8>+ad$T5rnK`q>%zH5|HS_gyGj2bbdA{0Ai#29G zm!&dwotX<#bG?~OKbxtw!Az`dmfoApypZ~v&9st+Tg-gv)XPGtzSYbK$=+^ep8O&c zcA9mOSQUOXQ)QO|iBqEXm{}rQuX)J%Wb zDTd?fq&R=lOX5j0(`2jEJ7s3hX*2gF?~Iw-^$pd$H zZhN}Z#o^AS5O?NAyR$jPomLs{ICI@`&vPeD_U1d?$!q4$X!)qXofC!H7P-@1#>%u3 zcMiznGIwst+UD+Dm%%OFso2V$Wv$&YwQ=WITX#)5ac5Y2cNR%z2Y0^f=*|Vn?c~lO zc`d`bxU)cpcXMZ-^mF#mK`HL#&J3yATfLE(&y|c6^mFI5qzravs`MV=POop=`Ci&i z(N><%cBk7S^+sm=sGdv4I`#M$CAY<$dB15CWX%D0b{%);t{gh6PF~VzG`OzdcNIVk z58XNW)Sb6d|CNSFF1>T->kln#lnqrZx}|Huqn?GIWljSN!x~w*F9nS){33=X7BE=2 z=w{)bv@lsXCDCS!zNlIVcDFd$=x)KwVquy1SuK1g-X0bP$@j8SPRpP2 zUg~;U@R4{amL4)(7Rze+T{?SNxGW{!7H-Q2z7`t$sbQOi7=H`>rCWf76uZ;HBD=Da zP=|${K^E3Z?NI$Jqh!0(kFYRQc12mRL|d2;YvH6+inFjZ-on`g3nP;>Ldh0BO|{S} z&BC>G3vV(kjL%Z%vMo4rEm-p`bZ=^5ozP7CoP`$p$;o01#u5uj;?>H+kq)ZZ-NO35 z7V7k~&_%u-Y@xgoUMkZ^sW%f8WU7S~vow?o6k~}-WQ95;m!xo=8eVUq^3N8w{$e3{ zr-dtfETr$XFjZcNv)4Y0E;w1Jx!=NAse3>f%6&;Vs3DbQhb$~SY~hC^7B(GK0>?B0 z$1UuTW~VHSle%Xu%s!_iq}~OMo=m=I;a7>ctk237wIkK8S}w6Z)+_!K}T0XLH^=}KdCl-GD$HGe)`mco#Us;Hh z$^Yqd@Y=#hZ!GkEtJ5fl-|2(Hj9-MtCc4b;HkP^R(_YA-c~mFSefOk z#{8^ov{@f~1X(c#Td5pk<-Obtwel=Xi9}dgAiE;1EQ?mK z7%Ma5tgKA1GAU8XCMl6*m6bs$Rz6R)vM0@oce<5sGCRY{=}aqYv#iw5wz6LSmt&=B zo|TdEyEq#*wNjy(m0t_2^e?i~uEdI=)JokJ>a84;{FYXx$O5@3@1<%hjhu9okupjQl@`*Vt42in{r|S7g3CN<(MLlk z9$%WS~Uw=4Sj7TW|)=FhFggqVWrDRD+!~lR3EKVC`ZR=6vk@Q##veQjXE~o z%GVRDte)Vs@>Xw#OtZ3C7R<6zZnl-C(sqFr^Aangqh2;8Yb4YS!|gZbJ_m7(MhM^I)}X@bKWKJn;0OvX=)A85Q8ciC_<^gm^%x2j&Qs zkM^KnoCmAqZ*h(HAV~VkdU-7V2_E#6rQ+PDmr;ox?2*bz9-7U%ZMFxK<(Ndz@u1UO4?ddb^kBw356$88pp|Tv zrwcp?{N981;#}&%T&eRvB_L;i@E~NF2h+v8T*E9Mu27Ovd8G#}<>V?4-ih-k59+N} zk7bX1x<;pMtvV|)>oj`e>s;?anWX)!0`gQo-{8R*aoy;lc^n>Cw<-884=e{g*e`ug zco1<;r%Fy-Ro!bIOp)#4dC!BHk39(c+k>{UN-n?j;Imiy9LY&(jwdH7c{0ATr`EsK z%R{MF(~~)p)WDN^uAYn(r_qxI7EeC5dSdhOWQoiV@Z^om3GrmBR1fvUQ$COKWI((p zv!p_TC)+bT8I$M9Kk`w&CvGye$dh%SdJ@{)lXU6O+|x7)d@doocT z_4ef7zMi}v;z^|mo(!ApNz*BwJe}&vv+14;ndeE{`JS9y;K{DVp1fY^N$WM9R9x%H zFY7(=-tNgKzk0G$n(y)CgTw0NaZlQx@Fe4;_Dl9@rze-rc(UPlPrf*>4CRZ9o+MsY zZ=~WMo=m&y$>w{W{PjQyKJ?U7Y){Th`eRQ5|5p81o|OO3lW(Q)ttW@%hAe)s5&FQ3 zEWBth<|3To2jvfEO)m_!yx7&qi#;x0JdvIzFV@K=s~3;Fy-4=)V!po$ z%cDRq&WC#86XwO!2roh+y?8D=lDv2f*DUR>|2gu8h0tgE)&wC(Q2tRAY{(~A##d2zRwmy@ZVX^47z z(MI0O={{a``rM0{zFwS?asAYjFVsMPFK)=4fnG4!i+b|zYmLNEFAm97Ngn1!^U+?6 z9_z(2nfZ;9pP(csdeK>yedom{`D?ltv2(omX^vCDzxQJEQVqR0mU}V&C-r)RhJTwE zYj!L1Lta!p<;8>ZUfjQ;b9h4|c30&dc=6{WFFyI(i-;#)c>Uw0xnW)$c;m%dyy;iL z8{ewlY^>$Yo`&8WGKRFyr~@KjV;cbt%Hmpi#OlwP~5%VY!>Sg#gu2Kyg6{e8>juEH!H4r)9AW4J??t*{X=ht{G*It zDd<~o_T!_!?R}_H#fK=VUEPN)`J|Q)1MB&)QbsrOVVjIK_%OlbLy6UgXm20-`T8*3 z=A#SIKEww4FfG`Jr=dQiMQDGN4>x0coS5T%C`j~SL9!3$Qhj)t?n7dh4~ueqc$Mcv zels8D7W#0t*oVetK788Thw&{{wzUs?+xW1(t&(Wx!~fb#2Onm4^r2xVA67_cXEiPp zy7=JJ)ra=IeYhY8zx3g>(}$qZdf7SJhb=R`8{?vM-}P_Qj=|F9W4!bzgeQ zPjX)DHGIjJP7+qjSC{O3X;{~nKkNJQZv$V3H1uVwT$AgKeCgNNm+?(}so>&^GhQzp zWs<>{r_#;Um&5Yf=&LCbzWgCJlP`&8UslN;cVC)Vd>Jd(e^Ytaz&zAz5FC*oM>%azBr_%?3e3OGuW3nSuO|Vri6w#eQ6t_jO2hkm+Vjt zrHqpek`n7n{}f+lW&2XE(3jZezVv9Po_6qMMps|j_3-7JKE4$9^CjvlU)IWlVZL~b zQ|!qa?wP)fS>Vf@|7lcL_)>ng>in#c-sH`SQgpo%eUXyea3$nu>n9?B>VgPyBTC+>iAx zemLCyF!=ZpC|^oYfFHjF`SDe_AI|!ber%5Sms^W$i)AMeC9&yQ_Iems=zE&T9m z??;QSew_KtPrcPK@%!A5_kH~c=;z1Ra_$R1Jo@`_U)l}O`+*3XV)@#S zv(m`v$H5_fPOL-y=qBOA{pc^-q|Zn{7E7H`N@%nn3&;9#N{r+D==Y5udu8l+Ke8vN zClmd6DrJ*Y=UYFTP4;8!cZxYhqaiJ)>1X+1x*w}%_%UFXA3NlY_|8@qJ!ktdY>~2F z?1ycMA4_D!NWF?|8_q%%D`QI1n*X(`_;e!Ka!97aZ${t{b+l}Pft4e zu}_X(P){%U5ic#I;F=$!ulq6ejvqhV)kul?o*$2#5B#Y0Q0GX>9{J(&k00*O)bm$< ztdLgk{PHCq56B1X!MovW=KgtJ{Y#gs_!>@{sA@W>qeQd*2%|=`KOE%Q7 zVfe(RFCHo@>uTA!Cr;1WHolj2b!^z`+UPH{>e)CYIrVL9ll#)GfsKW7RGv%ChBgYM zoh*_~@>skY*+`ecvRyuGY{Md9vP|kWu`x{Ei^0{VfB%g(ZkufEGOJ;WjmjQ2>Ub-- z6#FS5*%@G?iQPu8KpP(gsX@6CqW7WdVYrQI5jGr=HvFS(RE@ULAx3p#ZA^}{aYRz% zZH$m@;z+acD91)-u8l^;P8)|x)FY`_Y9qh3jhCHlOzL9ev^kv+@Cd>J;+##{+sXk*I~8~fzRG8;pe>r}3?(Q2(t z^S|`+Ov-Pxu|OtnvC(FS&a+h5sUg~}p_AwP6!ehJw`@AB9*EBon;tl@F-m^^|Lt*= z6Uzx3-No&c_Q|i}ep+?TD4DYw9oZ&5&guN0)JysE8g3bULBl1LE@|jxuyeGK^7@HBL{Dw-kAgf`!521SUfSp=F|TZler;o`)P1Yt?`)*Jx3Nk>@Mm5* ze;!HQ5B<4O#h-Fj{b^p)pWo{Hb4DH+{3&zwr9hra%l`Z@g>9^|iw%>7vq>90SF z{n;mz(*0Q>&vX50S>#U-$td&Zb_)e;<4>Co{(L3>cJ`-TcYg*;pU?amAvOB?)3?7r zqomVUNjw~G2;iuD0DZj!^s798%-{f0BLny)E`a7K z0pw)`ur5D<_eB9rZyrE!+W=kv>lDC)?g5PG6~L?B0W9kqK+paGBn=E8Y;b@ckqF@Y zumFA?89>390Je_{p#6jZJsTE4@9&hzv;gkR2w>an0M^V4;EV6o&|=m7UjRpzsgV@{ zTwbMw)&=n6)&TbJ2w=s|0Ni#3@b-{`PdOUE=wm8;Qkk9$VA7=kZd?wa)fFXkGl1W2 z1>k=tfRw)iDEChQU;V3u<;<%94wSQV?ISzk73};~*-qvscE;7QbEdAH>-Fq3cGG_8 zZMNg(Ysb%F*DQKFpT^qxHO{Wl?N(~OPQ+uqP zq=|Ntr`UNt!_K|AcAQ5S+G+JaJMJs&Oju)Q^#&!f#m<~2g#ZIAdpzv^lFJW$^EIYMrz5nwYE9@x46 z&`$0nJCh&Vsry8uA$6bHSs_jSv6Jyk9e8f1(hH5A9Fq>O>`eL3Y3IY&cGipQTRV^5 z+3EM*&MS$;L6!0jCQIE99s1Sl(BE_px>R!TL1hPBCAq3Yt5`UAAswqZh_B&b?k5ha z)^t#@wu4G_9JG}yVyx$2ZG8uk4IIpr{~GFNXJZ9#;-HyKcX80j)xmaoV06&J&A~s? z+3aAQyBf7P_)=yYDZs&D@pd>c1Uc9suE9zmM9D=t zXqD(-Q-*`?`3{`BOC0#Oc5ttwgV>%9UiMXkUpep?=HSR^2Ms4U81S9URDk(vbg_e@ z%N^vcR^l5R?AxNUzdD$+*TL?64#w|ykZ{1kor4bc9&%9Oh=V#u9lVy`jyX7f+`*a? z4tAV$@ck)=lSQW;j5y<9)L94Jes}O*=A2U@nR4F2HF+*+7nG26zUbhp?7r&2eoMXi zQ{^5ynD)d$y?-4v{m;Q?@04h{Kz^$jsLS_(B-aeYvtA$*8wGN}HIUurKtA&bWUY@g zkY)aXbO{V(erO;)q5|0&7s!+3KptcTQXxB#k<9{`DbZztx?&Z`JXt4oS_R@OGus4m zLSBoZZ6LAINqV#oWSZ>j7zmvL@e=o*frQBNzJY9(4$iLvX*nd2_ag$iHa3tCCj}BE z$x{Onx)O62!ITFc&Z>VR}QAIO>uf!vkE=b5_^;Uko5~zg^ z0;%*zAnpGMbaL}*AU@XuNtCnK197>b>~02fM%vz1Bl7-EAfxUEa{OK(xqoVC<+?Xa$dNaJ+>yEEgV-)hsswSiW{{p6a0ap0 zHHZoxK|JsaqFitg4mz4L7ER9gzN4g-Qy1;a-SO7A4I!@L99F!gyo2mIV0zT7;`0v$$thh z`*{$H31(%rVA|9R=4O*%db$K-a|`BYb1)&^!JL%awqRD+gLxeqjB`|2Fs;IaIUNy9 zzr+*cJ`2-!F=35m@)F}z+f!Hg6TFq zSdVZAvut!QUA_%wL zp##B;Ivh-`GxB>dEiVNVa3h#%4}v-KRDoUw6ZSfoD<6iiv|0#l>xNLZQ3!WUA(UA| z^ptD}H-hv&I)s+7AxuvSVMJyKZ3;thZytiRZ3t7_hmhVg1Y`dYo_y^L;n?sHEe;ey z*7y+qm>9y>--eLDmqJ)6J+3I;)esuo3?cqb2!H;m1Rg2glMs6U6GE8tc?cu_ zRpu{3X!Y^Xm{sy$_*z`B27H3}tiGP$EAGrE|SdmP%oRP<}OpGQ=3lW7%j4 zCDaN}_DVqq?e7%I;?AK2bq(cyw@?=K z2&MgJq4e$($}vgrr(`6&e<*bZgfeDeC=~~X@}0bu7RvrPp=8euC4WIE+ZTpXwn$ko4JGr3P(EEA$}?%WDioJBN_c%J#XpB~ zc}plYcPJt8*sD?6uQrZ^vg&9kAD>Xer$g~RAIgf$&QRSx3FU_yq1?I|%Fw%^lzR}$ z@V`SbJ_}{xOAX^2jnMm0zAPWctBPTiR0(5R)i5GI4&zIy`$-tn>x5CiVHlQ1VPrK9 zW1D*z6|7;r@zn8vFgAsTu_Gdk_{1>gW`*Hd5JqBg7|)%0Szo4|ZNg~MEsUn!!>HUZ zjBf@hs51j_Zdj2nrqc6j7&V3uE|NU?{KUEH=THSDV zHVh}bNjPf^;hggbr>=K6Q9@ovCUNF z1>t=Qa@} zd=x==#Rz_=9zjga2o}|fU`Cw?8a9fci#dW!YXnz4BdG3hMriV31V08xa3MT`pA#bJ zlp4Xh+z84QMo_b51Ru7GpmDbdJ$4bnfc_Cw9UQ^Os@Hx@1kc7raB)Heho(pH)4T}! zEr_7+4-s5j9zlb35tRKLq1$&6jNB2y+r1G498jEt5kwt|VChM5o{pgM*$5`f&zB>Z z|A!7tJg+SdxN%{BYC&`EgGq0sAAJe0MAo-;^O4lQ7Rj0$ksP?CUi=x!&_|Km%-=@R?0qDu<)XO#Q51<4qnKDJ zip;7}l-7u1$R|-48b-0GNfha>QS5M!qJcGvTV7GL_l+VvFbdbGD57Jd_%Fq&N@-E_ z%Zp-sK@?vUM=_u*ij?M2JZllfsn)90K8ngcqA1@xikF{9>1LDyd>KX0K~W4E9K|O? zqo_D0ir(X+7&{?~W0Rsd`)w4prbQ7yJ&Nt;aQT%j0iZQpNSn()|t&gLa^HTf%i(=*5C|bOa(mmT~s+W(}Q*Y6HUMZS8A4d~c zBbp1cw0< z(KwGMMsqD$L9(LxA}3l?x^Ma-5AC;jA5Qz44<1~u$p7o=n+GZe+=X7F`Sf-0%MpM5kr1d4ByC^ z=ols^$6!g*e%YBG!=3yXQVU`g_2k}B!-z|VpuyahQtXmjGq`o%Jdk{&s2apG0d79!;JsM5V1UlyFbRT zZgmX9w#4ANT@C-LvU_9jKORH%Q!(s59mDDK>g|mf2Hc6^fA?aT`Y?v|FVwl$F?9bR zmWCh2a;HWt&Od6!GNDc^H5dj5A*EdPBIOXS2@dP<*3u~=usVwe-F-*U0o=f(1y1T0aorLm;1 zjAi`>HLx+3)|+E_wuyTT#D5N$5=+(kLB{iSjIkz<@ytK z>S-*mUdOVaoHLFpAIGsqnpTVBpPF&3t{2B<*Eoim<236bPODYLaUvv+){$|V<0r{+ z=8NI(4 zr?ue}e+8pE#mk#o<;y9z)f5s#TB2zg|3zjPXqMjAyVG8U=8c#`CJkBL;<7wR?o+>@#IoUs+!oe~;o~SYLte+guM>FGjJTD&eqIfzjkJsP+ zs=Oker)%T&pKZKWqKs$JW(AjZJK~x1TRabU#k2Z=5;+vlzenO(aw?t*XX9CRF`j*w zldqq~v+-3tm*2;8xIzN|eVoAkItg5Alt74E0-H<;EcQ;&J%9w= znv?JZdc`G>m6Cu&OJGQu%C}D7d`Fe-k-+P|2^4*mz}R64*T)}#b_PEX+T zc?q0Zl)&%H6S%S_feM?P2|VAHz=b^te7P@y{zp{!RD%9$O~B`J0$pz?p}PrG`8xsc zr)ub>8h)3+#Y%}xtCC1mwM0Iumq@kxiF{y47leUSp6t7N+IC~^&PH-Y;`z6w9U?R(hB+_|g zB9kU0^3}vd;wL3)22`RJA4$|dt%;nNmq?>Ui40qw$e9&tbWI|c`o%>?j~Zrm&nk+6S?(F$KEPA z*(RGwVpHWL+^Q$>dHp1=7?ZeTO2XYIi2=Szlm#ZyFenMXkR&{!lZZ}8;?LwHZe}I% zA}5I_g-Lu=lEmniN%{*q$;r^pNp$R*#H+qZEa;zvaiA)VNMgjOBqokYV$6gj3MVG9 zdS()pzE9$}MM)(8ki@e!Ni5r#MBU9v9N3zqRc?~#bs&jR2i4FKC3RNY3rYNUGl_yn zNwj>C#I^sDX!l_;Z%MKmp@HmVTTkdc1>Y+-xLN7 zN}<}X_qaVoRT`q`4oMr$fpyiyr&Pt}F3RNX;IWo&4wzEY*~OMEI%lTtaB zoT^#Rsf=uzilZQv{K8aPv`FPbn^YdQOQms#RMvJ+b+V>+Dh)nQ#k+4R-3F!7YG^9+ z#C=#Qfn!s-Jwb&hDj{h*EtT9^3My4*r&4{1f~`p9yEUn>DOC?Ar{cRkmC&6kw^t1u zNac$oO7>JL=T4{Mc|kERrQ&)$RjZ<=^6suPl`fA``RLzNPX3pwn@4FBR!$?lW*Q@F zr%|y%8vC21QDjcT>5;}$zcfvQVwZMX_H3Z zj%g(KNW-g78ea}f!qwdp4v| ze_I-7e@)}a{xm(qkw)%`G+vxbBj!>Xzg^X_>uC(Vtw#S!8z0X_0#F!Af3{N>4X~6*{1(l?#Q{Z#JDbUn|Ru5Z5SoRjFm3NDXj;_!5>ikMFM32JCcIytk` zsXi~AVN254@;|*_mQLC7bk?m%=lhN64E!aXs$0@^{dZeB-|kPR>!EaB%Xde$J)KV7 z3+cLal1{-*Wq()u@2At_aXNoIOJ~_@WnL~r3yNeAQ9VNsBVg&~7)JTgf2 z&ER*x3}S2?aa_(Vi{CvmcdH7BF9=~VD6+~-7+}e zD}ztJ%wW}58T>IMgZ!}>EFPah!Q>3K&dT8O{0zGNkfAA88T`F2gK3*Gn6o8=>bte? zU%b@cdQ=J8mnPI~mk? zn8Dmf8MJt&Y@cWF*MI8q>kRzfD3GlAFq4!jne?lbiMc^07hN;y<(A1P&rH(2GwJJ> z$?$+o8aXoY2+5>Grpwb%?T^Z2TwbOif11#8cLnWs=q^ zlbNkEIV5S_Gl}S%sqg!l3>%TjxiOj4oSaFYX_<_ilga-UWwP;qnLPMW4X(-5ngN-- zT$jm~t(jE(P4#zY((rI5c_%Y5UdZI@%b8AQT+P&@_L-b|l*z+qnbdeCZ!>X}%i`mz zS={?Li+Rrqt&OxbW|3;nqJ~cvJp!{R3&~<;cos#mSv;2gaap*eXKBr^EbMuj ze3_rcE-{v6G4azZ_BPL=YpX0m+iKg+nMK2nS*XbkAZ~pDaAS%F@60S2-q0&R*0t|n?BOkoJ~{DY`V(?*(Pr!)+?L7 zGDq;qrja=N>1B?Lc4U(hqDI29$&JY7ev|^oWb6B7HX{GOEvKZmzxIXXa8>Sy=5RDFhjs}$cqHf0Fg=I%`8is4F^7>wIr`$6Lr}XM zI-y9|n$l;f-a=1P?hsr~8*f=}~m(e*Ce49g`?{a80JBMyE!l{?Z z^HpeJ4v&`P;Qd1mdsixvH91-|CWlcQRPYxC*q+1NojH8@TMp}Y=V0BN!_uQU{P24Y zx31*ib~^{--5iGfmBWeqIXr!&2A}5e$#W(9uX_Do4mIBA@Yx5s+$Wcb<#XBeVJ^;U z6>?q9TNXuLrwa#U2+g#Rn$YolWT>AIOW#kvR zobI3Nr0c+3x)07JXJ{?~BXfzFm`jt%3Nl5(r{ywWdM=A*MfUx$DC^DST0wN=i+`!J^4Ks$Aw&cF6L6_axPE)$YtM+T&CR3#qV)08(-w=QcNE8 z%jHp4K93zA=3%Ok$JZ6}m{BQ@ewFhGtCGiW)$_=xokxp?d33boaY`=P^SBkA$HVkI z{w>VoeVaTz|Iss#ngjD_G%8Owi}LWDpGWYIdBkkYBXw6EdB^f7y_iSaJKBFQPuBtS zc=<4ozn|n0@^2njU*ysJRUX6M=253yzSjE7C%Sq*EhMf+KBiCdc~UDMm-_j7OfR3A zP4emNlF$DP`GlGBakjALbHpoOD_P|;-j+`<|9tWT@>v;}Phyz1k@+-@R-l-Cd@|HP zQ9kCfd}_4IC#$=H^vh?bGavu4`D~n$k9A%?6@SR5-kN+~{E||DY-TK5puyPJ^brFgN9*e^c5-HsxMQQ?6w+<$O+4x)n6#U1?KXS~n%C zV^bD(Yf6RQO-UTs6#wB(={~+GCDWR+d_hy1EN@DW^{TtAsje9{<;3x(ti8~bUvD&} z%LDCu-juHIo3g7?Gt%oc8G#`Mr;1SdA*OinYlmNjEh$7am#+KhfFFi)S|D^n z+e{ZKo6);c0Xse^plZVcQcML5^(o+1Z~>`t1;jWr3J5MJ;Czb$zUow<+b0EN4=CXH zumbYO7tm{30TbpIaN~ypLe~}$yG0du7id}a0{%Q#z@h5}T==ViEzb(@epkTkiiJdc zQpm*yg=Cuw`PHY8<3WX7jV|PIN+Cgcg`}1iGO|q})w>qrT-&#h)=nK9SIFt{?TZ&-y|>-dxD$ZH3(at&leR3+Z~gkk79cGU&d7yeQN^Bt?`}FT&ceh^OWv zcG!y8A5p}Klp-!PE#li2MWl8v;$5F2HVoGBu{u7jh&nTi=r*UwiETjcAhPw@zo;Q|5-%wgCbr$ETZM#YWQ^#2_F_~F^Xay zd{WH7y2ZR|P|Wql#ajEJm|5mxT3L(9^(dw!u$VTn#SF+OCOyBH<7LH6Zs9EEOvhrz z_9!N}e=*kv6tibUF}p?=GiY)#X)}v)UsTNfCB;gz#ngITO#b^~EofMxMea*@CFSaru*un| zgn!K?{Lj6Fqn;%U^Dm)IUo3)9lu|;BrL^(UdwVJK9Hk5i zEF~+Xl$T+pTIsHo`7xz*jxQxFsg(MurMyos<$6{rOLI%<-Lw>!!cyK8m+Fb?QYSyP zDCO(crHt!X%E7LsOzK%mY%dk)UCP2fr5HXh<=Gedc~B|e4N-s*rFsfNjgKj%$=Fi% zO4IQwH>s3ElS^4SwUmHqrHqQXvxE~W9#QeC7{{N2t{ zwjU|w>e*7JUM?m7dMVr}W#he49y};z?nCwT9|aJf=i15*%Jgr287FI$F{)k}Yh26d zU@haccNqiXuha2OYVg-GdhRRZ=3xaqQl{?! zWmG#>M!kz=yuMn-|CM$g&`lg`-`78w;szKS+f>tg@6EK(JEmKfWXY1OViilWB+HUk zZuDLQp(cb50YVF*w*aAq-U5UgNF9?$fXy_$a8}(_EGFYDH!}QCQHK3>WH{PF z#*W4^^yw!(`0CDks-z{!x6s>1M(P-te7B!Y`P3LXUXv6LK(cmH!>*K$q>6) zhOk{S>^>mFcgJPWos}Ww7a5{%%kbwT8CE}+Vbh;7)O{sGNr@c$i^*{;RE`a01hiyVD=$jyu?mcgQ(yx5ndDYdph$IvfVZ_2 z5b7z=s(}L68!KRFs(?LFfvH^;INVbK-v9+hCo2#pS0LIzKdS;SJqiQ@3XGqqK&NR6 zyqTfE!&wTvSfaqn6$;E+tAK5z0y(=BXuppJolxM_83nA@6sUPefyPf2So4x;y%rQ$ z{FaJ8C{Qsh6*Xg1Ioc%^RqCapOtVx(v`gh^##EFVkc#-^R8-ZbqMj`k&Hbs+=ceLj zK`Oo-lZufOQt_JXo|uXmlTwj9ITb_Zq#}QDDoU4iTq+pGze4T7+D;yM4t#H{vh|tDiN2U#8-8c_|Q~| zcP*6Y*jkD8?UeYjqY_bFm5A=HL_{woEPa$X*I$W8gOzwYREd!zm2f93aaEzj5v7vP z7nMlNP(nChRzl`b!sS%L=~AM!SBV!sCBpnlbP<%eov*~pLM6gSld(!vB@yG4s5C)| z1yhwcGhGSC7fL?sQKIHTCEAnJ#Y#M0s>JG5)VG#KeWygRO-k(gUWraSlxVb1$>kc9 zsCZNKy7{PO7Z?X!{iB76w&t(;ms=^zRuTVOJw^BAsxddI3D8_zU_Nh(yIqC)I+6*|pO zq2z28MlGO)3su;-T!p1;RCrCwuT^nj5fy&fqJnyt3bl5tu=cPD>Bm)=MnX?8{8@&* zz#QISZttov>vt8pKU1N?D-{%fGowY)@T_#pEYDnW(G0$hG;b$_!n}+WGG%OyShL+>faBD&us!e9tSv>be z8m7)?A`8+`ds!OJuS?_Kt~5;8nT9+_mQ;j+ zrW!5gs8Md78u~?Qc)n62f1Mf=x2rMhkQ$1^YAigaM&~nXbUmlW)hkT+x*7)_s&V`k z4SuV}&Hkn1)Z-HCPm_!LEuLToh_*I08XHVw*TX*e&42I(#h z9(go;n5=<1SA*4LQ-KEIg&K4n%ea#@h?}F~KV=Q>tkB@t1`QT()bRO&27>W>4TkR4 zAme}rPk*El$2DktnkO%45OH0Db2l_xIz@vS4>WlDSc6e7HMsPi{vR}W9HPZL;wz@b z(oiiPl3`(5v8#lq2ATp6Q#O>6jmx4nyg5Y>!Qcv0OUlB&4%%SUSS%rel%ND4lJ2I(oNGM?(8_yiQDq zw_7^)^hxKm`sp~WO2-v*I&OQ?(IG$m<4>(2y#R(BXTT4*OKpsn;PTLx=Vj9e#D{P|B^tYY%ni>aev?$7wlq*gs7tp!AnIOkS#k zZk-Mb*XuZimX0$a=#a5Rhrl)+E^pVN<4&?$hvg)4j}B(Co5&C8Q0XTf&YYwn=XHp< zro(gc@~)1&WI5l36Unl5c6lUsiaGstM$mubADHW~O z^D9#i?G~QgsmHB@jCf2B+gUw2p3|evH9hu`ad-4^-__&!BP#!0kEJj4X!Mc>{H4bh z@?8-F%pnFGjx^x=7y~v{Fraru1J2bj;6P0Se{C5M(b53H(7}L--3*B9YrqupMUnx} zNZv>T2b|DfWSVIzX3<&ia@FlSb26WCf2v8IlAQ^4I<*^1#on(N2iUHfnw=)e$p3Q_vvo8%C zt8c)m`3AIHV!$dQ`Ip8Bl4n0b9N|uor~^OLiOZ zlx*E=z|unoyd(a@w4&lsT6fX__s<3xE*S9qq5%n)SXAT{S$)}n<7CPe8b%aX4fuu( z|Ajdt?XMYds2cAj(uDjw+3KOx~s$Ijr7@E2L+-5ufXg7*2K=jF_51e=^5R1Fc5f zB55`wEDj@o`4~CxixC%HMnt=fNXa&$Uk<~PbzUPEE;ZtT-zZ>Uz=(2rM*c-IVqXCR z7c!wSM&y%k#u@P^sW;Jxg_DiwKFx@ctA$-%D$BWf%)q9a*PEZ-P0opf2oVkI9)g9kym8h3M2Ls z<4Pt(LPIT#ioL^+Zl&?&<{j~|bmzmIHr3n{F!__AILO!f9;odqE#&0koa}yP9HlgJ<6FTo_ zxI)=5;K&=%)FD#=oe;&FWk)8 zl?5}-mNKJmX)`Xwo3Wsr8Pm#}(Y}Hi-D;cBzqy$&7R^xfHA6Ro$H`_imzfcfYQ{~K z8HY7ytks!0!?hVHW;42Eno-+fMlY`!cSxGgjJbX@++)lrIo6DGtdPS9hARf43PO_VAeWK4OOYs2O#B zGIKnz8M3ox=+Bu^;k=o1y_)ghni(x_n6a0%{?&}qcg#p4Uy;@K&0H_Q%!bJfq0>_{ zwh%mH#Fw=GjTw{3dlLQDjNJET{6_kIFyn7npebs>Q_{DX1>M3dSWj+}0pS)5EM-B< zXbY-Vus~bcf+b{Nf(1QmTTr8(1%+gNeG6pGEwHw-U{foLfKjb2Sk{@5x>(@uZb58M z3n!$uU?RCO)PkWSEV!Uxf~gj~Q(KT|wqUZ$f;Tx9qh57D%UA zaCxo;^A=k0mQ?u4g6LHiB$KUcEgUIDwpj3iJpNv=An6AS;`Uo$B(o3k^G6HLAF-g% zF(yDxo#6RX7UceHLFF?RG$B3DTF~IU1uC-lf(4f@GO;TbY`A7Y=nV_%-LjzTZ41`k zwQyxj8bz)>wcyAr3wpe>VC)AAcEgGRLQyN9*;`R0%!vO|dtzlrLo13Q6S`uV7!;O?cTt&~3m_BGRWkXTF%z2`X5vM&Omu6P z30cQXF3*~YI{h*+cSt5Sj>v?d$V9p>6B1J<%Gojn)X2_6eqJX29G!_G6Em@YdM1b6 zWMb_i?k~-RdQB$!Zp_4nZJDUJHxr3R817^ydYsF|xvQBtbt@A!A7-NQlT0*wlZopR z8)wD0p-!ZYlNs2srjiZOHEdjp&4wmTZAfTiLzhGw^19hDt-oMHvtc$o9%aK;l?}Jk zZ5-KT<4Q+1=)E@hb8UDw#)jS#ZIH~eq2xRpN_}JFa0?p>*4q%V(Z&x9V^S(Q9QwpRaNXz*0Lj{4#PCHV|NQXrnj-< z=Pq{a?_)>q06T6cF`ks+RCcZlXva;19pMf;S3|essHB>c9fIL*Q#r2lnV4 zm~V6-F2jMQ4hJWXcVM8;fn33Xb9oN*&Uaugc`}-c#yBv3yaT_Jnv)$UB=?DYx&uD4 zZ7vO%&qTj=VAeMdY+U0&^0y95+v0%cd+Oigz@dE(&ZOqRm&cgE#IxkQgF`PIsC~l$ z$!`uMJ)rVu4y-35UpV-m&cTTW95@w{g(hKHd`q5%DP^+oS4K>?4+i=iRc9-;?JDX0c(*!nwg&sF<9E5{fK5E2+%F6Lr?d|8>(e zS#ywCtWtD^jG%}3TwQc49l;Yt;&MLjv=mzTv(RU37RF7@!ikwoV|EtWFUjI>k}OnM zmxW&Ivk3&Rd&;ozw(crVlcZWg}(Ba08svQYX>7ApUpg^c1(^o@4ni#R8TA3Nc$ z?nF{uCq8TJ#Kjg)tZL`P_|8sFFX_b8eom;8oa`m$~nXE`|=ixc0>aUyb&6VfG4eEpRZ&6hhd zc%2jFzH_4cCMWuDaiYmiC%)V3#LIn7q#ShO(J?1HCj}>to^o=1S|)tei9OexczvC@ zxb4KEhfWOmgZq!2c=z0idhcoI-%e~3feYKiTzC`VLZe6*I+SuDI^M;R*e>YHyU?tn z3q`BB(5H?IotwI_shJCdTe#p%bm2iq7e;n=vDdeYvo`l}aRGD}77cab!Y~&;40my) zz6%iw7ZOul=&y9aPWtLyC@{FN)9Au8vd!TF#}MH@sqJxbO?wv(k9OhU7#CiVh^a1Q z&U9huEEh|Ox)!*wbdd`!m%FfQr3=zkE>1Jz#iz zSr;tlSZbu|c^9f(bP14Mbg`2Ji;Z}%y7=3{4+NWhPgRcksBQ&-8fp(jcc)P6vVqxy1W~WtGThEI{j+6IkMA@ zH;vqw+r*7!O&Pzr;D))q8yyne*w)dFS3TTV(94Yzz1?Wm*NxXnZjR=0W79Afs6o8jiXlr+NS#$O~ppJB(k@nE7GvD4hRINOcvFWpcq zawB}P8vT@ayjml%PkufbBeP?Ck9cj8Kn*;B%QDtd1lGbHo=GJV!Zp?<}KsL%A zWVjOyN7|jq7SQ1;mEO+Av){9!dzsDA)!C?2)Ps?c9%PmEU|l5-6g52T7Vbf@<{nP4 z<-z0*9`x?w!KmIIz9{oxdXfjRBRqJW;=%D$4<>0nc$4A51&4<(<2|_N@gO7Mfo!Y? zlJOqQndHIN86Ir-Qt;r^LJ!J(<-yzK9$fs^1N~+X9&cmBA3W@RN&mx)c+7(*$30vg zhzVWwpuu$y5^j1>^Z^zB;X&>T5B_?^Fn=?FkR1Lk$U$Oc4(dnez+Nr~pC{xXzIqO- zHqJr4_Bm+YGY1`plLqSiz& z8h_zMo23l9+>4qkz5I*m<#RGGM{Rt|2;X@zZj%?IwlUE6UU+tR(RQa7@Ar6dWUm+d z4|s9+pclzUyl8mRi>YMLDKF-e4d=Y<>qLbl=8~67i+OS7nio5N^&{T_E_NTjpaA93MN#`Pe_j$HA^X^g8B4{5cwR$%m9% zKGb{ULy?z0RDJKmm|}iRDCtM3I6t;l@}op;KYBFuqgg9I#&z_gObgm} zKWeA@@zUalBHNF~0YBVhd2Xs7cjo$`5|;Sc?bDBM*ZFaJiyudK`=LJK$AXi7uGHYi zt80GVvwpOA?8n|`ems5UNA6ocwh`5PKjx7z3Fkf_oV9?9A`7@*gm+blfLBGiCPr}q z))E3D!vypqnsEM3jubczwSc*$1PJe=1T-ik@b7|v31tPbBO{8$3+PK?%JE!f0qqh5 zOspxuQ;QKB2w1|m(#T+ab zuz8KZh49$hd%M7~C<3PL=99m@0z&pv;Q_7!dr-iT!vaPg<%&>03G6V<#7+u`{h5iM zrJ?5poV>u*VlE4~afJzoT;r?b8v^9F1nj)c61XR@Z<&BU9|*YoI|DyqqR*MDmjX<$ z1ulTcsb(bs{1FmB|L_2IMg-8XWB_?l0d_48V0ugdpT!2CiVJW#fdD#I2;gpIhOZWY zqjmt@8U>(j7QmtA0n8WL1h6+T07It$E_J4ot^u^|7QoH!0S*ld;BBt}HuMP~X>b6? zM+MMV6~OGY0E%b=?8g>BR(b$?bTq&afZG^As5O8|jsQkD1NhAoz#u<$2?5v(0(do+ zX^js+K81--4`AfX0EGJU0&p!3a12U-!@g*S(#(_Eyq%*E2S zxqPjhi+kO2F|U6vwhqaKkj!g7LYj+eX$+{(#R_XK8n|<@-^b5_T+Yy!i*hq^(RXex z=cT8jdM=k1&1J8yTr_==izk2OqREF` zY%G??_mz2QT{;hGv3V$&kcYSAaxEbbKQ+k1Z!Pl>)hQ3}dgkGWL3!-6o(D;49(rr@ z*o7z$-@EdV=+47Fe;#5PXa1Nx^cqY5$$4lvB@Z3vkk4r&^C6MvV}v#zYfSmrl$DRCIr$i0kdL+#@>yE>s4_1f zExyV}@0Iy@zdoPOuJdtsXFg8u&&T~E`N%t+k3m=R@$6(4X1~tIbV&i8 z7b`%Wk_G4+Tfkw!1-M_m01N6DAkc)gD8R`M1zfA302|1YUIn-}xB$9Q1(=prz;O-* zd`e${F}?z?6*;72>zEh5WA+ zCXr~b6|$FIAr>wEzAP$^N$L*r87V?SNKsOZ6elG}CHQk7IA)kzIflhh)$NgYy`)Fbst1JaN*B8^EC(v&nK z%}EQ=lC&bNNgL9Zv?J|F2a-rSl1`*E=|Z}a&q+7Zo%A3*NiWiy^dWsoKhmEJAOp!D zGMFThA!H~SMuw9SWF#3yl8Kb05E+pZ1xY1Jq9SQTO*BMH(ut1fiGdhN1~Cycu@EcC zBsO9v4w6Nj#6{dBn|MeL@e&{L6M+OsF3BVLq<|EX(PRu6OU9A$WCEE;CXvZx3Yki# zk?CXxnMr1m*<=p+g3KlJ$d_b3SwI$&MPxBqLcStjlcnSvvWzSzE67T+imWDU$Xc?F zd`s4o4P+zvj%*^E$riGeY$M;3?c@itgX|=`$ZoQS>?QliesX{uB!|e4;)oAScNw@-sP2&XBX@963)ekc;FJxlFE*tK=7Qja(-;$gkukxkYZ1JLE38M}8ys z$pi9`JR-l7KgeV9gghnB$aC_7yd-~;SL8K$L*9~i7a8X2vB2pA3MNvu=r9}}XiZY^z7DbFG%8DXZ6mg=67X?=y zXTuJ3u$2%+9Z}R3MLki}7X@c# zW?LZ&&cDglLKICz(Nq-8MA2LnEkw~$6s<(jS`=+W(N+}gM8Qcs*mQ^@Q52k5fUSop zI*X!kCLz6ai7>iXu-G`JyPmZni;)m@E7(`TJtALP<$UsZym&myY7bosuO>MMjpS4EjVx zmEjf)AbLv5NO-zp#Y(MPx9-`qXUC2m+qG-gxpU{PUAy+_(`VqofjvGtp6%4BQ;ixm zYSpU6Xb};Sk&+k*RWh_pCL1tdK)-%MKf3-O9i#U8r|Z(CONR~}>eQ)|kdV-}ZQC|& z+ElDqkqROtWhL?P<&;Y0h!G=_l9Gn~iyJz0=%7J^1`i%gf9hr;j6;*!w{PF9S+got zs?g4&MT><=;v_LKWoe<5PLN7z3Y}ao7mxqxl9Q8}!jK_D8Z~NEyLN5b)3|ZtmMvRW zuU?%onWwO@@K8y-q)eIUw6wIBFJB%$e3)7;UAnY<`Enjok6NvM{P;0Vy?y(3N=izT zCQWD(3xqq(n>VK-X1JBmsufFz%1TJeN#f$-^?LoohYuP1>eZ{1D^{#fsZ=|6?xeC! zn>Nvh`;;_^I#?`}bpKG+s#S}Rj_Qg_%1dHn>eG#V*aesr^D&HAKHpbt;f zuV24m!-gy%7B+KCeSQ1(r7m8CpbHO=C?=^ORuY9mv3T)f#xa>pL6wvZ zfAi+et5&VzC1pkv6B8+$Hf_pGvfQY>)kjCAOeQomOc1qJsZy2k=xC)zqv4L>qoYcG zrhjzwr%L8KXe6&FRd(yvjb*^g^2t!#BQI@T7N#HvQc!JXc{ds8J{&|KCZ?l1+`;SfnBu>ubtKAiTja4EGP9c`q_PmXDh z966Hr25SnhIwR9sUT<2<{h-a%+op{mTL1aypNEEqh0ti$0A`w(ocgGjb_ZQB5&EXqik{qm9$qL-(2{3qYw33|p!!o_p07G?kKG((K6BgUqS z;dd!NvRak>zlCGaPoaeU*$T0uHUFP#{$pc=k9CUG;(yLlOjOD072<+7O0dEQD{`<}eySe- zQZjM>UNThCw0b3OR20-D1a(mUcQw^xB?&R&CjQX+*D?;O`MhbJ;Py#hP*+l|C~lwZ zsT?D@xv$%eJzf06L|rBL!|0Q)h%h0vN_@=!aSNLGuU65XTID1Mr^RfvN`lJbqa@tK zpD;m{VPPc_8&sz{%DM^VY2NXTG4lddxI@o2b*px$UxRvCM0Lwa8kCoGtR+b99O`xN zV7s8oWf_vIo2uVE*p`NhzhS5~=;C6cDwHh~A6=UAzi+`S!#K|VAynKvL2_?zUE29| zx@2;)gi242EpcXcY1&U~#b1V0%Gyh-stXn3_>tJ4W^ij&rz$t`M686G8dZ=a){qQp zCb_=7-V{r`v%kd9O=9gWnWd4q`buc?RHay^#rfOylge6^;u*hYbY#Uck(EDgOq9{i zei{AnaPz09+R(g|juK@TNzOotTNo(n%N`)H_LN-xq5ZX89T~br@OuBl#E%x%iYb*+ zK8l;HLYbhx&2~w#(nYzQT-WLL!Jg+fG%gtW51$KLdw*jOWdSf`Xz>30q^onITGTZn zK7t!{2@FCV^B;_-%vFY+SW*4{(asN#eg4Ul0l0++TRf`a#_QLxM&%YUrH92vaSH~O zo$AY-f7|F8RQ-=8_aB$@pC83a`-?7pG?SsYjlFCCw=L+;0Mr^Si4YBKGPWLl|1A|B h(vzpSQAzW^Y>;==#{ delta 85463 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%0D)EYD+n3 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 Nl&B+KuTq-5_kRiDt@Qu^ diff --git a/800OTClient/modules/game_features/features.lua b/800OTClient/modules/game_features/features.lua index 30a2292..cbe3841 100644 --- a/800OTClient/modules/game_features/features.lua +++ b/800OTClient/modules/game_features/features.lua @@ -13,6 +13,7 @@ function updateFeatures(version) end -- you can add custom features here, list of them is in the modules\gamelib\const.lua + g_game.enableFeature(GamePlayerMarket) --g_game.enableFeature(GameClientPing) --g_game.enableFeature(GameExtendedOpcode) --g_game.enableFeature(GameMinimapLimitedToSingleFloor) -- it will generate minimap only for current floor diff --git a/800OTClient/modules/game_market/market.lua b/800OTClient/modules/game_market/market.lua index 5c6abb7..829e0a7 100644 --- a/800OTClient/modules/game_market/market.lua +++ b/800OTClient/modules/game_market/market.lua @@ -740,6 +740,19 @@ local function onMarketMessage(messageMode, message) Market.displayMessage(message) end +local function dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end +end + local function initMarketItems(items) for c = MarketCategory.First, MarketCategory.Last do marketItems[c] = {} @@ -768,7 +781,6 @@ local function initMarketItems(items) tradeAs = entry.id } } - -- add new market item if marketItems[entry.category] ~= nil then table.insert(marketItems[entry.category], marketItem) diff --git a/800OTClient/modules/game_market/marketprotocol.lua b/800OTClient/modules/game_market/marketprotocol.lua index ab4a673..16f5caf 100644 --- a/800OTClient/modules/game_market/marketprotocol.lua +++ b/800OTClient/modules/game_market/marketprotocol.lua @@ -37,39 +37,33 @@ local function readMarketOffer(msg, action, var) return MarketOffer.new({timestamp, counter}, action, Item.create(itemId), amount, price, playerName, state, var) end +local function dump(o) + if type(o) == 'table' then + local s = '{ ' + for k,v in pairs(o) do + if type(k) ~= 'number' then k = '"'..k..'"' end + s = s .. '['..k..'] = ' .. dump(v) .. ',' + end + return s .. '} ' + else + return tostring(o) + end +end + -- parsing protocols local function parseMarketEnter(protocol, msg) - local items - if g_game.getClientVersion() < 944 then - items = {} - local itemsCount = msg:getU16() - for i = 1, itemsCount do - local itemId = msg:getU16() - local category = msg:getU8() - local name = msg:getString() - table.insert(items, { - id = itemId, - category = category, - name = name + local version = 981 + local items = {} + +table.insert(items, { + id = 3264, + category = 20, + name = "sword" }) - end - end - - local balance = 0 - if g_game.getProtocolVersion() <= 1250 or not g_game.getFeature(GameTibia12Protocol) then - if g_game.getProtocolVersion() >= 981 or g_game.getProtocolVersion() < 944 then - balance = msg:getU64() - else - balance = msg:getU32() - end - end - - local vocation = -1 - if g_game.getProtocolVersion() >= 944 and g_game.getProtocolVersion() < 950 then - vocation = msg:getU8() -- get vocation id - end - local offers = msg:getU8() + local vocation = -1 + local offers = msg:getU8() + local balance = msg:getU64(); local depotItems = {} local depotCount = msg:getU16() for i = 1, depotCount do @@ -78,8 +72,10 @@ local function parseMarketEnter(protocol, msg) depotItems[itemId] = itemCount end - + + print(dump(depotItems)) signalcall(Market.onMarketEnter, depotItems, offers, balance, vocation, items) + --signalcall(Market.onMarketEnter, depotItems, offers, balance, vocation, items) return true end @@ -89,9 +85,11 @@ local function parseMarketLeave(protocol, msg) end local function parseMarketDetail(protocol, msg) +print("DETAILS") local itemId = msg:getU16() - + print (itemId + "assadsd") local descriptions = {} + table.insert(descriptions, {2, "28"}) for i = MarketItemDescription.First, MarketItemDescription.Last do if msg:peekU16() ~= 0x00 then table.insert(descriptions, {i, msg:getString()}) -- item descriptions diff --git a/800OTClient/otclientv8.log b/800OTClient/otclientv8.log index f66dfc8..8a7b8d8 100644 --- a/800OTClient/otclientv8.log +++ b/800OTClient/otclientv8.log @@ -1,429 +1,2315 @@ -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 06 2022 18:32:29 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -Login to 127.0.0.1:7172 -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -Login to 127.0.0.1:7172 -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -Login to 127.0.0.1:7172 -ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/client_topmenu/topmenu.lua:266: in function 'callback' - /modules/corelib/http.lua:172: in function -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 08 2022 13:58:07 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Connecting to: 127.0.0.1:7171 -Connecting to: 127.0.0.1:7171 -Connecting to: 127.0.0.1:7171 -Connecting to: 127.0.0.1:7171 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:21:31 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -ERROR: Failed to read dat '/things/800/Tibia.dat': corrupt data (id: 100, category: 0, count: 255, lastAttr: 1)' -ERROR: Failed to read dat '/things/800/Tibia.dat': corrupt data (id: 100, category: 0, count: 255, lastAttr: 1)' -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:24:10 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Exiting application.. -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -ERROR: ProtocolGame parse message exception (3635 bytes, 2979 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (206 bytes, 101 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (320 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xa2 (162)): InputMessage eof reached -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32345 32218 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: no thing at pos:32345 32219 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: no thing at pos:32345 32220 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -Login to 127.0.0.1:7172 -ERROR: ProtocolGame parse message exception (4035 bytes, 3404 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32346 32221 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: no thing at pos:32349 32220 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: no thing at pos:32347 32221 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -Login to 127.0.0.1:7172 -ERROR: lua function callback failed: /modules/game_walking/walking.lua:322: attempt to index local 'toPos' (a nil value) -stack traceback: - [C]: in function '__index' - /modules/game_walking/walking.lua:322: in function 'walk' - /modules/game_walking/walking.lua:259: in function -ERROR: ProtocolGame parse message exception (4208 bytes, 3577 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (222 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xa2 (162)): InputMessage eof reached -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32350 32220 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: ProtocolGame parse message exception (313 bytes, 181 unread, last opcode is 0x65 (101), prev opcode is 0x6d (109)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (230 bytes, 91 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (105 bytes, 13 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (103 bytes, 29 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32368 32219 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32368 32218 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: ProtocolGame parse message exception (66 bytes, 33 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 -Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) -ERROR: no thing at pos:32369 32218 7, stackpos:1 -at: - [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z -ERROR: no creature found to move -at: - [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z -ERROR: Missing file: 800/Tibia.dat -Missing file: 800/Tibia.spr - -You should open data/things and create directory 800. -In this directory (data/things/800) you should put missing -files (Tibia.dat and Tibia.spr/Tibia.cwm) from correct Tibia version. -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:31:16 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:31:57 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:39:00 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:40:17 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:47:31 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:48:35 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:49:23 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:50:38 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:51:46 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:52:17 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:53:55 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:55:45 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:56:13 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:56:55 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:57:26 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:58:55 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 12:59:22 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:00:28 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:01:26 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:07:44 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:09:28 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:17:50 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:19:55 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:20:53 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Exiting application.. -GPU Radeon RX 580 Series (ATI Technologies Inc.) -OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 -[Atlas] Texture size is: 4096x4096 (max: 16384x16384) -Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' -== application started at Apr 09 2022 13:22:25 -OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 -Connecting to: 127.0.0.1:7171 -Login to 127.0.0.1:7172 -Login to 127.0.0.1:7172 +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 06 2022 18:32:29 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: /modules/client_topmenu/topmenu.lua:266: attempt to index local 'data' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/client_topmenu/topmenu.lua:266: in function 'callback' + /modules/corelib/http.lua:172: in function +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 08 2022 13:58:07 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:21:31 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +ERROR: Failed to read dat '/things/800/Tibia.dat': corrupt data (id: 100, category: 0, count: 255, lastAttr: 1)' +ERROR: Failed to read dat '/things/800/Tibia.dat': corrupt data (id: 100, category: 0, count: 255, lastAttr: 1)' +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:24:10 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Exiting application.. +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (3635 bytes, 2979 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (206 bytes, 101 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (320 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xa2 (162)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32345 32218 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: no thing at pos:32345 32219 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: no thing at pos:32345 32220 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (4035 bytes, 3404 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32346 32221 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: no thing at pos:32349 32220 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: no thing at pos:32347 32221 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +Login to 127.0.0.1:7172 +ERROR: lua function callback failed: /modules/game_walking/walking.lua:322: attempt to index local 'toPos' (a nil value) +stack traceback: + [C]: in function '__index' + /modules/game_walking/walking.lua:322: in function 'walk' + /modules/game_walking/walking.lua:259: in function +ERROR: ProtocolGame parse message exception (4208 bytes, 3577 unread, last opcode is 0x64 (100), prev opcode is 0x0b (11)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (222 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xa2 (162)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32350 32220 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: ProtocolGame parse message exception (313 bytes, 181 unread, last opcode is 0x65 (101), prev opcode is 0x6d (109)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (230 bytes, 91 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (105 bytes, 13 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (103 bytes, 29 unread, last opcode is 0x66 (102), prev opcode is 0x6d (109)): invalid thing id (0) +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32368 32219 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (90 bytes, 57 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32368 32218 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: ProtocolGame parse message exception (66 bytes, 33 unread, last opcode is 0x20 (32), prev opcode is 0xa0 (160)): unhandled opcode 32 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: no thing at pos:32369 32218 7, stackpos:1 +at: + [C++]: ?getMappedThing@ProtocolGame@@QAE?AV?$shared_object_ptr@VThing@@@stdext@@ABV?$shared_object_ptr@VInputMessage@@@3@@Z +ERROR: no creature found to move +at: + [C++]: ?parseCreatureMove@ProtocolGame@@AAEXABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: Missing file: 800/Tibia.dat +Missing file: 800/Tibia.spr + +You should open data/things and create directory 800. +In this directory (data/things/800) you should put missing +files (Tibia.dat and Tibia.spr/Tibia.cwm) from correct Tibia version. +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:31:16 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:31:57 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:39:00 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:40:17 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:47:31 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:48:35 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:49:23 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:50:38 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:51:46 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:52:17 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:53:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:55:45 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:56:13 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:56:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:57:26 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:58:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 12:59:22 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:00:28 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:01:26 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:07:44 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:09:28 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:17:50 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:19:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:20:53 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 13:22:25 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 14:11:26 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:00:09 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:00:29 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:01:03 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:02:09 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:02:30 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:02:40 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:02:53 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:03:07 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:04:57 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:08:19 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (9 bytes, 4 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU64' + /modules/game_market/marketprotocol.lua:61: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (65 bytes, 60 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:49: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:40:05 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:78: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:40:35 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:50: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:40:54 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:78: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:41:16 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:78: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:43:02 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:69: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:43:18 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +FATAL ERROR: Unable to load module 'game_market': LUA ERROR: /modules/game_market/marketprotocol.lua:75: 'end' expected (to close 'function' at line 41) near 'signalcall' +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'ensureModuleLoaded' + /init.lua:71: in function 'loadModules' + /init.lua:92: in main chunk +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:43:26 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:69: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:44:03 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:44:20 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:69: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:45:03 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:69: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:46:07 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:46:56 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:48: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:47:49 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU8' + /modules/game_market/marketprotocol.lua:47: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:48:37 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +ERROR: ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x00 (0), prev opcode is 0xf6 (246)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +256 +ERROR: ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x00 (0), prev opcode is 0xf6 (246)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:49:59 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +49152 +ERROR: ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x0c (12), prev opcode is 0xf6 (246)): unhandled opcode 12 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:50:30 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +ERROR: ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x0c (12), prev opcode is 0xf6 (246)): unhandled opcode 12 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 17:51:29 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:05:23 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:06:04 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:07:02 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:08:14 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:08:40 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +table: 0x0e38bf10 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:12:19 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ } +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:18:42 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (63 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:19:45 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:20:18 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ [1] = { ["category"] = 255,["name"] = sword,["id"] = 3264,} ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:21:45 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ [1] = { ["category"] = 255,["name"] = sword,["id"] = 3264,} ,} +papala +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:23:16 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e5f2a78,["thingType"] = userdata: 0x0e627a08,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +256 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0582fae8,["thingType"] = userdata: 0x0582fb08,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:39:10 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:57: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:40:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:47: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:41:48 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +0 +192 +îù" +{ } +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { } ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +256 +0 +192 +îù" +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: invalid encrypted network message 24577 +at: + [C++]: ?xteaDecrypt@Protocol@@AAE_NABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: failed to decrypt message +at: + [C++]: ?internalRecvData@Protocol@@AAEXPAEI@Z +Login to 127.0.0.1:7172 +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:48:11 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: invalid encrypted network message 24577 +at: + [C++]: ?xteaDecrypt@Protocol@@AAE_NABV?$shared_object_ptr@VInputMessage@@@stdext@@@Z +ERROR: failed to decrypt message +at: + [C++]: ?internalRecvData@Protocol@@AAEXPAEI@Z +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +256 +0 +192 +îù" +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:53:46 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0ed938f0,["thingType"] = userdata: 0x0ed93e98,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 18:54:44 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +256 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0dd83c00,["thingType"] = userdata: 0x0dd0c270,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (177 bytes, 153 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +257 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0dc6f830,["thingType"] = userdata: 0x0de4bd70,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (181 bytes, 157 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +258 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e4ad7d8,["thingType"] = userdata: 0x0e58f280,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (256 bytes, 232 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x1bba9838,["thingType"] = userdata: 0x1bba9858,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:06:37 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e04d868,["thingType"] = userdata: 0x0de5d880,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:07:26 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0defdda8,["thingType"] = userdata: 0x0defdde8,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x1bac2ee0,["thingType"] = userdata: 0x1bac2f00,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:09:59 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0ef42100,["thingType"] = userdata: 0x0ef42120,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:16:12 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e4a1438,["thingType"] = userdata: 0x0e49fad8,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:18:24 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +259 +49152 +12 +1 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0d7bf9a8,["thingType"] = userdata: 0x0d817630,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:29:32 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +768 +44544 +269 +13312 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:78: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:30:40 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: /modules/game_market/marketprotocol.lua:42: bad argument #1 to 'insert' (table expected, got nil) +stack traceback: + [C]: at 0x00c9e880 + [C]: in function 'insert' + /modules/game_market/marketprotocol.lua:42: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:31:05 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e22f4d8,["thingType"] = userdata: 0x0e22d610,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0edb7a88,["thingType"] = userdata: 0x0edb86d0,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e938f20,["thingType"] = userdata: 0x0ef15a20,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:32:46 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [7477] = 1,} +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0e712e98,["thingType"] = userdata: 0x0df74fd0,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +{ [1] = { ["category"] = 20,["name"] = sword,["id"] = 3264,} ,} +papala +{ [1] = { } ,[2] = { } ,[3] = { } ,[4] = { } ,[5] = { } ,[6] = { } ,[7] = { } ,[8] = { } ,[9] = { } ,[10] = { } ,[11] = { } ,[12] = { } ,[13] = { } ,[14] = { } ,[15] = { } ,[16] = { } ,[17] = { } ,[18] = { } ,[19] = { } ,[20] = { [1] = { ["displayItem"] = userdata: 0x0eacb5c8,["thingType"] = userdata: 0x0eacb5e8,["marketData"] = { ["requiredLevel"] = 0,["showAs"] = 3264,["restrictVocation"] = 0,["category"] = 20,["name"] = sword,["tradeAs"] = 3264,} ,} ,} ,[21] = { } ,[22] = { } ,[23] = { } ,[24] = { } ,[25] = { } ,[26] = { } ,[27] = { } ,[28] = { } ,[29] = { } ,[30] = { } ,[31] = { } ,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:33:55 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [238] = 9055,} +ERROR: ProtocolGame parse message exception (54 bytes, 26 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (65 bytes, 5 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246)): unhandled opcode 53 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246)): unhandled opcode 53 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246)): unhandled opcode 53 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246)): unhandled opcode 53 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:44:08 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:45:01 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (165 bytes, 141 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (62 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getU16' + /modules/game_market/marketprotocol.lua:74: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (66 bytes, 61 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1)): unhandled opcode 246 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:56:36 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:57:07 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ } +ERROR: ProtocolGame parse message exception (66 bytes, 44 unread, last opcode is 0x00 (0), prev opcode is 0xae (174)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:57:25 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +9056 +{ } +ERROR: ProtocolGame parse message exception (66 bytes, 44 unread, last opcode is 0x00 (0), prev opcode is 0xae (174)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 19:58:53 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (66 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (66 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (173 bytes, 149 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (22 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +ERROR: ProtocolGame parse message exception (22 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Exiting application.. +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 20:13:04 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,[3264] = 1,[7476] = 1,} +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:34: in function 'readMarketOffer' + /modules/game_market/marketprotocol.lua:145: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (98 bytes, 38 unread, last opcode is 0xf9 (249), prev opcode is 0xf6 (246)): unhandled opcode 249 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 20:19:15 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [3502] = 1,[3264] = 2,[7477] = 1,} +{ [3502] = 1,[3264] = 2,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[3264] = 2,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: protected lua call failed: C++ call failed: InputMessage eof reached +stack traceback: + [builtin#146]: at 0x00df4070 + [C]: in function 'getString' + /modules/game_market/marketprotocol.lua:34: in function 'readMarketOffer' + /modules/game_market/marketprotocol.lua:145: in function 'callback' + /modules/gamelib/protocolgame.lua:10: in function +ERROR: ProtocolGame parse message exception (143 bytes, 38 unread, last opcode is 0xf9 (249), prev opcode is 0xf6 (246)): unhandled opcode 249 +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +GPU Radeon RX 580 Series (ATI Technologies Inc.) +OpenGL 4.6.13596 Compatibility Profile Context 20.10.35.02 27.20.1034.6 +[Atlas] Texture size is: 4096x4096 (max: 16384x16384) +Found work dir at 'C:/Users/erika/source/repos/Sabrehaven/800OTClient/' +== application started at Apr 09 2022 20:20:07 +OTCv8 3.1 rev 163 (dev) made by otclient.net built on Mar 31 2022 for arch x86 +Connecting to: 127.0.0.1:7171 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [3502] = 1,[3264] = 2,[7477] = 1,} +{ [3502] = 1,[7476] = 1,[7477] = 1,} +{ [3502] = 1,[7476] = 1,[7477] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +{ [7477] = 1,[3264] = 1,[7476] = 1,} +ERROR: ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249)): InputMessage eof reached +Packet has been saved to packet.log, you can use it to find what was wrong. (Protocol: 772) +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [7477] = 2,[3452] = 1,[7476] = 2,} +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +Login to 127.0.0.1:7172 +{ [3502] = 1,[7477] = 1,[3264] = 1,[7476] = 1,} +{ [3502] = 1,[3264] = 1,[7477] = 1,} +Login to 127.0.0.1:7172 +{ [3502] = 1,[3264] = 1,[7477] = 1,} +{ [3502] = 1,[3264] = 1,[7477] = 1,} +{ [3502] = 1,[7476] = 1,[7477] = 1,} +{ [3502] = 1,[3264] = 1,[7477] = 1,} +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +Login to 127.0.0.1:7172 +{ [3502] = 1,[7476] = 1,[7477] = 1,} +Login to 127.0.0.1:7172 +{ [3502] = 1,[3264] = 1,[7477] = 1,} +Exiting application.. diff --git a/800OTClient/packet.log b/800OTClient/packet.log index 09b0f19..4f3f602 100644 --- a/800OTClient/packet.log +++ b/800OTClient/packet.log @@ -68,3 +68,1070 @@ ProtocolGame parse message exception (66 bytes, 33 unread, last opcode is 0x20 ( a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d aa 04 00 00 00 06 00 45 72 69 6b 61 73 30 00 01 6c 7e d6 7d 07 09 00 65 78 6f 72 69 20 76 69 73 +ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 32 00 +f6 00 02 00 16 0d 01 00 ae 0d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 39 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 32 00 +f6 00 02 00 16 0d 01 00 ae 0d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 39 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +30 00 2a 00 f6 00 00 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 39 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +30 00 2a 00 f6 00 00 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (54 bytes, 49 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 32 00 +f6 00 02 00 16 0d 01 00 ae 0d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +30 00 2a 00 f6 00 00 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +30 00 2a 00 f6 00 00 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (9 bytes, 4 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 05 00 +f6 00 00 00 1e + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (8 bytes, 3 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +08 00 04 00 +f6 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (65 bytes, 60 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +40 00 3d 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 6c 5d 7e dc 7d 07 01 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (46 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +30 00 2a 00 f6 00 00 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (50 bytes, 45 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +30 00 2e 00 +f6 00 01 00 c0 0c 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x00 (0), prev opcode is 0xf6 (246), proto: 772): InputMessage eof reached +38 00 2f 00 +f6 00 01 +00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x00 (0), prev opcode is 0xf6 (246), proto: 772): InputMessage eof reached +38 00 2f 00 +f6 00 01 +00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x0c (12), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 12 +38 00 2f 00 +f6 00 01 00 c0 +0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 41 unread, last opcode is 0x0c (12), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 12 +38 00 2f 00 +f6 00 01 00 c0 +0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (63 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3b 00 6d 5e 7e dc 7d 07 01 5d 7e dc 7d 07 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 46 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 2f 00 +f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 00 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 2c 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (177 bytes, 153 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +b0 00 ad 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 78 06 d7 0b 4f a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d f6 01 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 17 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 03 c0 0c 01 00 00 00 4d ac 51 62 01 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 01 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 17 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (181 bytes, 157 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +b8 00 b1 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 78 06 d7 0b 3a a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d f6 02 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 02 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 03 c0 0c 02 00 00 00 4d ac 51 62 01 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 62 ac 51 62 02 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 02 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 02 01 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (256 bytes, 232 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +00 01 fc 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 79 06 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d 78 05 d7 0b 26 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 03 c0 0c 03 00 00 00 4d ac 51 62 01 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 62 ac 51 62 02 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 c6 ac 51 62 03 00 01 00 64 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (51 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 2f 00 f6 03 01 00 c0 0c 00 01 00 ee 00 f9 22 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 53 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +38 00 36 00 +f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 02 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 02 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (54 bytes, 26 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 32 00 f6 00 02 00 c0 0c 04 00 35 1d 01 00 ee 00 5f 23 +00 00 00 00 00 +00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 c0 0c 02 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (65 bytes, 5 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3d 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 6c 5d 7e dc 7d 07 01 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 53 +40 00 3a 00 +f6 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 +35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 53 +40 00 3a 00 +f6 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 +35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 53 +40 00 3a 00 +f6 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 +35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (62 bytes, 41 unread, last opcode is 0x35 (53), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 53 +40 00 3a 00 +f6 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 +35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (58 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +38 00 36 00 f6 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (62 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3a 00 f6 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (165 bytes, 141 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +a8 00 a1 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 78 05 d7 0b 11 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d f6 01 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 03 c0 0c 01 00 00 00 44 b8 51 62 04 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 00 00 00 00 + +ProtocolGame parse message exception (62 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3a 00 f6 01 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 5f 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (66 bytes, 61 unread, last opcode is 0xf6 (246), prev opcode is 0xffffffff (-1), proto: 772): unhandled opcode 246 +40 00 3e 00 +f6 00 60 23 00 00 00 00 00 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (66 bytes, 44 unread, last opcode is 0x00 (0), prev opcode is 0xae (174), proto: 772): InputMessage eof reached +40 00 3e 00 f6 00 60 23 00 00 00 00 00 00 03 00 +ae 0d 01 +00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (66 bytes, 44 unread, last opcode is 0x00 (0), prev opcode is 0xae (174), proto: 772): InputMessage eof reached +40 00 3e 00 f6 00 60 23 00 00 00 00 00 00 03 00 +ae 0d 01 +00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +48 00 42 00 f6 00 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 ff 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (66 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3e 00 f6 00 60 23 00 00 00 00 00 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (66 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +40 00 3e 00 f6 00 60 23 00 00 00 00 00 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +48 00 42 00 f6 00 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 8a 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (173 bytes, 149 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +b0 00 a9 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 78 05 d7 0b 11 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d f6 01 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f9 03 c0 0c 01 00 00 00 6f bb 51 62 05 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 00 00 00 00 + +ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +48 00 42 00 f6 01 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +48 00 42 00 f6 01 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (22 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +18 00 12 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (70 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +48 00 42 00 f6 01 60 23 00 00 00 00 00 00 04 00 c0 0c 01 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 ee 00 60 23 00 00 00 00 00 00 ee 01 75 00 00 00 00 00 00 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (34 bytes, 10 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +20 00 1e 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 f9 03 0c 00 00 00 00 00 00 00 00 00 + +ProtocolGame parse message exception (22 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0x00 (0), proto: 772): InputMessage eof reached +18 00 12 00 df 01 00 00 00 00 00 00 00 00 +00 00 00 00 00 +00 00 00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (98 bytes, 38 unread, last opcode is 0xf9 (249), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 249 +60 00 5e 00 72 00 00 78 05 d7 0b 12 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d +f6 01 61 23 00 00 00 00 00 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 +f9 03 c0 0c 00 00 00 00 01 00 00 00 02 bf 51 62 06 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (143 bytes, 38 unread, last opcode is 0xf9 (249), prev opcode is 0xf6 (246), proto: 772): unhandled opcode 249 +90 00 8b 00 79 05 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d 78 05 d7 0b 62 a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d a0 f4 01 f4 01 ff ff 68 e3 18 00 30 00 04 34 08 34 08 2b 00 64 20 0d +f6 01 61 23 00 00 00 00 00 00 03 00 ae 0d 01 00 34 1d 01 00 35 1d 01 00 +f9 03 c0 0c 00 00 00 00 01 00 00 00 3f c0 51 62 07 00 01 00 01 00 00 00 00 00 00 00 09 00 41 6e 6f 6e 79 6d 6f 75 73 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + +ProtocolGame parse message exception (16 bytes, 0 unread, last opcode is 0x00 (0), prev opcode is 0xf9 (249), proto: 772): InputMessage eof reached +10 00 0c 00 +f9 03 0c 00 00 00 00 00 00 00 00 +00 + diff --git a/config.lua b/config.lua index 3b865b7..20378d2 100644 --- a/config.lua +++ b/config.lua @@ -11,6 +11,8 @@ ropeSpotBlock = false showMonsterLoot = true blockHeight = false dropItems = false +marketOfferDuration = 1 +premiumToCreateMarketOffer = false -- Combat settings -- NOTE: valid values for worldType are: "pvp", "no-pvp" and "pvp-enforced" diff --git a/data/items800/items.srv b/data/items800/items.srv index a9da0a2..c9ad1c5 100644 --- a/data/items800/items.srv +++ b/data/items800/items.srv @@ -33801,4 +33801,18 @@ Flags = {Bottom,Unpass,Unmove} TypeID = 7475 Name = "a sarcophagus" -Flags = {Bottom,Unpass,Unmove} \ No newline at end of file +Flags = {Bottom,Unpass,Unmove} + +TypeID = 7476 +Name = "your inbox" +Flags = {Container,Unmove} +Attributes = {Capacity=30} + +TypeID = 7477 +Name = "the market" +Flags = {Unmove} + +TypeID = 7478 +Name = "your store inbox" +Flags = {Container,Unmove} +Attributes = {Capacity=30} \ No newline at end of file diff --git a/sabrehaven.sql b/sabrehaven.sql index 0101986..6fd3088 100644 --- a/sabrehaven.sql +++ b/sabrehaven.sql @@ -55,6 +55,47 @@ CREATE TABLE `account_bans` ( -- -------------------------------------------------------- +CREATE TABLE IF NOT EXISTS `player_inboxitems` ( + `player_id` int NOT NULL, + `sid` int NOT NULL, + `pid` int NOT NULL DEFAULT '0', + `itemtype` smallint unsigned NOT NULL, + `count` smallint NOT NULL DEFAULT '0', + `attributes` blob NOT NULL, + UNIQUE KEY `player_id_2` (`player_id`, `sid`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; + +CREATE TABLE IF NOT EXISTS `market_history` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `player_id` int NOT NULL, + `sale` tinyint NOT NULL DEFAULT '0', + `itemtype` smallint unsigned NOT NULL, + `amount` smallint unsigned NOT NULL, + `price` bigint unsigned NOT NULL DEFAULT '0', + `expires_at` bigint unsigned NOT NULL, + `inserted` bigint unsigned NOT NULL, + `state` tinyint unsigned NOT NULL, + PRIMARY KEY (`id`), + KEY `player_id` (`player_id`, `sale`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; + +CREATE TABLE IF NOT EXISTS `market_offers` ( + `id` int unsigned NOT NULL AUTO_INCREMENT, + `player_id` int NOT NULL, + `sale` tinyint NOT NULL DEFAULT '0', + `itemtype` smallint unsigned NOT NULL, + `amount` smallint unsigned NOT NULL, + `created` bigint unsigned NOT NULL, + `anonymous` tinyint NOT NULL DEFAULT '0', + `price` bigint unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `sale` (`sale`,`itemtype`), + KEY `created` (`created`), + FOREIGN KEY (`player_id`) REFERENCES `players`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8; + -- -- Table structure for table `account_ban_history` -- diff --git a/src/actions.cpp b/src/actions.cpp index 6e9d108..97e4942 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -273,6 +273,7 @@ ReturnValue Actions::internalUseItem(Player* player, const Position& pos, uint8_ DepotLocker* myDepotLocker = player->getDepotLocker(depot->getDepotId(), true); myDepotLocker->setParent(depot->getParent()->getTile()); openContainer = myDepotLocker; + player->setLastDepotId(depot->getDepotId()); } else { openContainer = container; } @@ -325,6 +326,17 @@ bool Actions::useItem(Player* player, const Position& pos, uint8_t index, Item* player->setNextAction(OTSYS_TIME() + g_config.getNumber(ConfigManager::ACTIONS_DELAY_INTERVAL)); player->stopWalk(); + if (item->getID() == ITEM_MARKET) + { + if (player->getLastDepotId() == -1) { + return false; + } + + player->sendMarketEnter(player->getLastDepotId()); + + return true; + } + if (isHotkey) { uint32_t count = 0; if (item->isRune()) { diff --git a/src/configmanager.cpp b/src/configmanager.cpp index 224185c..3509e95 100644 --- a/src/configmanager.cpp +++ b/src/configmanager.cpp @@ -63,6 +63,8 @@ bool ConfigManager::load() integer[GAME_PORT] = getGlobalNumber(L, "gameProtocolPort", 7172); integer[LOGIN_PORT] = getGlobalNumber(L, "loginProtocolPort", 7171); integer[STATUS_PORT] = getGlobalNumber(L, "statusProtocolPort", 7171); + + integer[MARKET_OFFER_DURATION] = getGlobalNumber(L, "marketOfferDuration", 30 * 24 * 60 * 60); } boolean[SHOW_MONSTER_LOOT] = getGlobalBoolean(L, "showMonsterLoot", true); @@ -74,6 +76,7 @@ bool ConfigManager::load() boolean[FREE_PREMIUM] = getGlobalBoolean(L, "freePremium", false); boolean[REPLACE_KICK_ON_LOGIN] = getGlobalBoolean(L, "replaceKickOnLogin", true); boolean[ALLOW_CLONES] = getGlobalBoolean(L, "allowClones", false); + boolean[MARKET_PREMIUM] = getGlobalBoolean(L, "premiumToCreateMarketOffer", true); boolean[STAMINA_SYSTEM] = getGlobalBoolean(L, "staminaSystem", true); boolean[WARN_UNSAFE_SCRIPTS] = getGlobalBoolean(L, "warnUnsafeScripts", true); boolean[CONVERT_UNSAFE_SCRIPTS] = getGlobalBoolean(L, "convertUnsafeScripts", true); @@ -126,6 +129,8 @@ bool ConfigManager::load() integer[KILLS_MONTH_BANISHMENT] = getGlobalNumber(L, "killsMonthBanishment", 10); integer[STAIRHOP_DELAY] = getGlobalNumber(L, "stairJumpExhaustion", 2000); integer[EXP_FROM_PLAYERS_LEVEL_RANGE] = getGlobalNumber(L, "expFromPlayersLevelRange", 75); + integer[CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES] = getGlobalNumber(L, "checkExpiredMarketOffersEachMinutes", 60); + integer[MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER] = getGlobalNumber(L, "maxMarketOffersAtATimePerPlayer", 100); integer[MAX_PACKETS_PER_SECOND] = getGlobalNumber(L, "maxPacketsPerSecond", 25); integer[NEWBIE_TOWN] = getGlobalNumber(L, "newbieTownId", 1); integer[NEWBIE_LEVEL_THRESHOLD] = getGlobalNumber(L, "newbieLevelThreshold", 5); diff --git a/src/configmanager.h b/src/configmanager.h index beb3442..7091c15 100644 --- a/src/configmanager.h +++ b/src/configmanager.h @@ -41,6 +41,7 @@ class ConfigManager ALLOW_CLONES, BIND_ONLY_GLOBAL_ADDRESS, OPTIMIZE_DATABASE, + MARKET_PREMIUM, STAMINA_SYSTEM, WARN_UNSAFE_SCRIPTS, CONVERT_UNSAFE_SCRIPTS, @@ -113,6 +114,9 @@ class ConfigManager LOGIN_PORT, STATUS_PORT, STAIRHOP_DELAY, + MARKET_OFFER_DURATION, + CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES, + MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER, EXP_FROM_PLAYERS_LEVEL_RANGE, MAX_PACKETS_PER_SECOND, NEWBIE_TOWN, diff --git a/src/const.h b/src/const.h index 68aa943..69dc919 100644 --- a/src/const.h +++ b/src/const.h @@ -21,6 +21,8 @@ #define FS_CONST_H_0A49B5996F074465BF44B90F4F780E8B static constexpr int32_t NETWORKMESSAGE_MAXSIZE = 24590; +static constexpr int32_t MIN_MARKET_FEE = 20; +static constexpr int32_t MAX_MARKET_FEE = 100000; enum MagicEffectClasses : uint8_t { CONST_ME_NONE, @@ -281,6 +283,8 @@ enum item_t : uint16_t { ITEM_DEPOT = 3502, ITEM_LOCKER1 = 3497, + ITEM_INBOX = 7476, + ITEM_MARKET = 7477, ITEM_MALE_CORPSE = 4240, ITEM_FEMALE_CORPSE = 4247, @@ -301,6 +305,14 @@ enum item_t : uint16_t { ITEM_DOCUMENT_RO = 2819, //read-only }; +enum ResourceTypes_t : uint8_t { + RESOURCE_BANK_BALANCE = 0x00, + RESOURCE_GOLD_EQUIPPED = 0x01, + RESOURCE_PREY_WILDCARDS = 0x0A, + RESOURCE_DAILYREWARD_STREAK = 0x14, + RESOURCE_DAILYREWARD_JOKERS = 0x15, +}; + enum PlayerFlags : uint64_t { PlayerFlag_CannotUseCombat = 1 << 0, PlayerFlag_CannotAttackPlayer = 1 << 1, diff --git a/src/container.cpp b/src/container.cpp index f949f81..0878a5e 100644 --- a/src/container.cpp +++ b/src/container.cpp @@ -19,6 +19,8 @@ #include "otpch.h" +#include "depotchest.h" +#include "inbox.h" #include "container.h" #include "iomap.h" #include "game.h" @@ -264,12 +266,17 @@ ReturnValue Container::queryAdd(int32_t index, const Thing& thing, uint32_t coun } const Cylinder* cylinder = getParent(); + if (!hasBitSet(FLAG_NOLIMIT, flags)) { while (cylinder) { if (cylinder == &thing) { return RETURNVALUE_THISISIMPOSSIBLE; } + if (dynamic_cast(cylinder)) { + return RETURNVALUE_CONTAINERNOTENOUGHROOM; + } + cylinder = cylinder->getParent(); } diff --git a/src/depotchest.cpp b/src/depotchest.cpp new file mode 100644 index 0000000..948cc09 --- /dev/null +++ b/src/depotchest.cpp @@ -0,0 +1,68 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#include "otpch.h" + +#include "depotchest.h" + +#include "tools.h" + +DepotChest::DepotChest(uint16_t type) : + Container(type), maxDepotItems(2000) {} + +ReturnValue DepotChest::queryAdd(int32_t index, const Thing& thing, uint32_t count, + uint32_t flags, Creature* actor/* = nullptr*/) const +{ + const Item* item = thing.getItem(); + if (!item) { + return RETURNVALUE_NOTPOSSIBLE; + } + + bool skipLimit = hasBitSet(FLAG_NOLIMIT, flags); + if (!skipLimit) { + int32_t addCount = 0; + + if ((item->isStackable() && item->getItemCount() != count)) { + addCount = 1; + } + + if (item->getTopParent() != this) { + if (const Container* container = item->getContainer()) { + addCount = container->getItemHoldingCount() + 1; + } + else { + addCount = 1; + } + } + + if (getItemHoldingCount() + addCount > maxDepotItems) { + return RETURNVALUE_DEPOTISFULL; + } + } + + return Container::queryAdd(index, thing, count, flags, actor); +} + +void DepotChest::postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t) +{ + Cylinder* parent = getParent(); + if (parent) { + parent->postAddNotification(thing, oldParent, index, LINK_PARENT); + } +} + +void DepotChest::postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t) +{ + Cylinder* parent = getParent(); + if (parent) { + parent->postRemoveNotification(thing, newParent, index, LINK_PARENT); + } +} + +Cylinder* DepotChest::getParent() const +{ + if (parent) { + return parent->getParent(); + } + return nullptr; +} diff --git a/src/depotchest.h b/src/depotchest.h new file mode 100644 index 0000000..c61bb4d --- /dev/null +++ b/src/depotchest.h @@ -0,0 +1,40 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#ifndef FS_DEPOTCHEST_H +#define FS_DEPOTCHEST_H + +#include "container.h" + +class DepotChest final : public Container +{ +public: + explicit DepotChest(uint16_t type); + + //serialization + void setMaxDepotItems(uint32_t maxitems) { + maxDepotItems = maxitems; + } + + //cylinder implementations + ReturnValue queryAdd(int32_t index, const Thing& thing, uint32_t count, + uint32_t flags, Creature* actor = nullptr) const override; + + void postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + void postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + + //overrides + bool canRemove() const override { + return false; + } + + Cylinder* getParent() const override; + Cylinder* getRealParent() const override { + return parent; + } + +private: + uint32_t maxDepotItems; +}; + +#endif // FS_DEPOTCHEST_H diff --git a/src/depotlocker.cpp b/src/depotlocker.cpp index 09189a1..373d4cc 100644 --- a/src/depotlocker.cpp +++ b/src/depotlocker.cpp @@ -23,6 +23,7 @@ #include "creature.h" #include "player.h" #include "tools.h" +#include "inbox.h" DepotLocker::DepotLocker(uint16_t type) : Container(type, 30), depotId(0) {} @@ -87,3 +88,12 @@ void DepotLocker::postRemoveNotification(Thing* thing, const Cylinder* newParent parent->postRemoveNotification(thing, newParent, index, LINK_PARENT); } } + +void DepotLocker::removeInbox(Inbox* inbox) +{ + auto cit = std::find(itemlist.begin(), itemlist.end(), inbox); + if (cit == itemlist.end()) { + return; + } + itemlist.erase(cit); +} diff --git a/src/depotlocker.h b/src/depotlocker.h index 094defc..6b91500 100644 --- a/src/depotlocker.h +++ b/src/depotlocker.h @@ -22,6 +22,8 @@ #include "container.h" +class Inbox; + class DepotLocker final : public Container { public: @@ -51,6 +53,8 @@ class DepotLocker final : public Container void postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t link = LINK_OWNER) final; void postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t link = LINK_OWNER) final; + void removeInbox(Inbox* inbox); + bool canRemove() const final { return false; } diff --git a/src/enums.h b/src/enums.h index d6bf53a..7be97dd 100644 --- a/src/enums.h +++ b/src/enums.h @@ -63,6 +63,26 @@ enum VipStatus_t : uint8_t { VIPSTATUS_ONLINE = 1, }; +enum MarketAction_t { + MARKETACTION_BUY = 0, + MARKETACTION_SELL = 1, +}; + +enum MarketRequest_t { + MARKETREQUEST_OWN_HISTORY = 1, + MARKETREQUEST_OWN_OFFERS = 2, + MARKETREQUEST_ITEM = 3, +}; + +enum MarketOfferState_t { + OFFERSTATE_ACTIVE = 0, + OFFERSTATE_CANCELLED = 1, + OFFERSTATE_EXPIRED = 2, + OFFERSTATE_ACCEPTED = 3, + + OFFERSTATE_ACCEPTEDEX = 255, +}; + enum OperatingSystem_t : uint8_t { CLIENTOS_NONE = 0, @@ -351,6 +371,8 @@ enum ReturnValue { RETURNVALUE_YOUDONTOWNTHISHOUSE, RETURNVALUE_TRADEPLAYERALREADYOWNSAHOUSE, RETURNVALUE_TRADEPLAYERHIGHESTBIDDER, + RETURNVALUE_CANNOTMOVEITEMISNOTSTOREITEM, + RETURNVALUE_ITEMCANNOTBEMOVEDTHERE, RETURNVALUE_YOUCANNOTTRADETHISHOUSE, }; @@ -371,6 +393,48 @@ struct LightInfo { constexpr LightInfo(uint8_t level, uint8_t color) : level(level), color(color) {} }; +struct MarketOffer { + uint64_t price; + uint32_t timestamp; + uint16_t amount; + uint16_t counter; + uint16_t itemId; + std::string playerName; +}; + +struct MarketOfferEx { + MarketOfferEx() = default; + MarketOfferEx(MarketOfferEx&& other) : + id(other.id), playerId(other.playerId), timestamp(other.timestamp), price(other.price), + amount(other.amount), counter(other.counter), itemId(other.itemId), type(other.type), + playerName(std::move(other.playerName)) {} + + uint32_t id; + uint32_t playerId; + uint32_t timestamp; + uint64_t price; + uint16_t amount; + uint16_t counter; + uint16_t itemId; + MarketAction_t type; + std::string playerName; +}; + +struct HistoryMarketOffer { + uint32_t timestamp; + uint64_t price; + uint16_t itemId; + uint16_t amount; + MarketOfferState_t state; +}; + +struct MarketStatistics { + uint32_t numTransactions = 0; + uint32_t highestPrice = 0; + uint64_t totalPrice = 0; + uint32_t lowestPrice = 0; +}; + enum CombatOrigin { ORIGIN_NONE, @@ -398,4 +462,7 @@ struct CombatDamage } }; +using MarketOfferList = std::list; +using HistoryMarketOfferList = std::list; + #endif diff --git a/src/events.cpp b/src/events.cpp index 868901e..3f3e026 100644 --- a/src/events.cpp +++ b/src/events.cpp @@ -130,6 +130,9 @@ bool Events::load() else if (methodName == "onLookInTrade") { playerOnLookInTrade = event; } + else if (methodName == "onLookInMarket") { + playerOnLookInMarket = event; + } else if (methodName == "onTradeRequest") { playerOnTradeRequest = event; } @@ -499,6 +502,33 @@ void Events::eventPlayerOnLookInTrade(Player* player, Player* partner, Item* ite scriptInterface.callVoidFunction(4); } +bool Events::eventPlayerOnLookInMarket(Player* player, const ItemType* itemType) +{ + // Player:onLookInMarket(itemType) or Player.onLookInMarket(self, itemType) + if (playerOnLookInMarket == -1) { + return true; + } + + if (!scriptInterface.reserveScriptEnv()) { + std::cout << "[Error - Events::eventPlayerOnLookInMarket] Call stack overflow" << std::endl; + return false; + } + + ScriptEnvironment* env = scriptInterface.getScriptEnv(); + env->setScriptId(playerOnLookInMarket, &scriptInterface); + + lua_State* L = scriptInterface.getLuaState(); + scriptInterface.pushFunction(playerOnLookInMarket); + + LuaScriptInterface::pushUserdata(L, player); + LuaScriptInterface::setMetatable(L, -1, "Player"); + + LuaScriptInterface::pushUserdata(L, itemType); + LuaScriptInterface::setMetatable(L, -1, "ItemType"); + + return scriptInterface.callFunction(2); +} + bool Events::eventPlayerOnMoveItem(Player* player, Item* item, uint16_t count, const Position& fromPosition, const Position& toPosition, Cylinder* fromCylinder, Cylinder* toCylinder) { // Player:onMoveItem(item, count, fromPosition, toPosition) or Player.onMoveItem(self, item, count, fromPosition, toPosition, fromCylinder, toCylinder) diff --git a/src/events.h b/src/events.h index 7582c29..4a3a558 100644 --- a/src/events.h +++ b/src/events.h @@ -49,6 +49,7 @@ public: void eventPlayerOnLook(Player* player, const Position& position, Thing* thing, uint8_t stackpos, int32_t lookDistance); void eventPlayerOnLookInBattleList(Player* player, Creature* creature, int32_t lookDistance); void eventPlayerOnLookInTrade(Player* player, Player* partner, Item* item, int32_t lookDistance); + bool eventPlayerOnLookInMarket(Player* player, const ItemType* itemType); bool eventPlayerOnMoveItem(Player* player, Item* item, uint16_t count, const Position& fromPosition, const Position& toPosition, Cylinder* fromCylinder, Cylinder* toCylinder); void eventPlayerOnItemMoved(Player* player, Item* item, uint16_t count, const Position& fromPosition, const Position& toPosition, Cylinder* fromCylinder, Cylinder* toCylinder); bool eventPlayerOnMoveCreature(Player* player, Creature* creature, const Position& fromPosition, const Position& toPosition); @@ -79,6 +80,7 @@ private: int32_t playerOnLook; int32_t playerOnLookInBattleList; int32_t playerOnLookInTrade; + int32_t playerOnLookInMarket; int32_t playerOnMoveItem; int32_t playerOnItemMoved; int32_t playerOnMoveCreature; diff --git a/src/game.cpp b/src/game.cpp index d4595e2..ea6159c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -28,6 +28,7 @@ #include "game.h" #include "actions.h" #include "iologindata.h" +#include "iomarket.h" #include "talkaction.h" #include "spells.h" #include "configmanager.h" @@ -37,6 +38,8 @@ #include "scheduler.h" #include "databasetasks.h" #include "movement.h" +#include "inbox.h" +#include "depotchest.h" extern ConfigManager g_config; extern Actions* g_actions; @@ -310,6 +313,7 @@ Thing* Game::internalGetThing(Player* player, const Position& pos, int32_t index //inventory slots_t slot = static_cast(pos.y); return player->getInventoryItem(slot); + } void Game::internalGetPosition(Item* item, Position& pos, uint8_t& stackpos) @@ -4452,6 +4456,473 @@ void Game::playerDebugAssert(uint32_t playerId, const std::string& assertLine, c } } +void Game::playerLeaveMarket(uint32_t playerId) +{ + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + player->setInMarket(false); +} + +void Game::playerBrowseMarket(uint32_t playerId, uint16_t spriteId) +{ + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + const ItemType& it = Item::items[spriteId]; + if (it.id == 0) { + return; + } + + const MarketOfferList& buyOffers = IOMarket::getActiveOffers(MARKETACTION_BUY, it.id); + const MarketOfferList& sellOffers = IOMarket::getActiveOffers(MARKETACTION_SELL, it.id); + player->sendMarketBrowseItem(it.id, buyOffers, sellOffers); + g_events->eventPlayerOnLookInMarket(player, &it); +} + +void Game::playerBrowseMarketOwnOffers(uint32_t playerId) +{ + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + const MarketOfferList& buyOffers = IOMarket::getOwnOffers(MARKETACTION_BUY, player->getGUID()); + const MarketOfferList& sellOffers = IOMarket::getOwnOffers(MARKETACTION_SELL, player->getGUID()); + player->sendMarketBrowseOwnOffers(buyOffers, sellOffers); +} + +void Game::playerBrowseMarketOwnHistory(uint32_t playerId) +{ + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + const HistoryMarketOfferList& buyOffers = IOMarket::getOwnHistory(MARKETACTION_BUY, player->getGUID()); + const HistoryMarketOfferList& sellOffers = IOMarket::getOwnHistory(MARKETACTION_SELL, player->getGUID()); + player->sendMarketBrowseOwnHistory(buyOffers, sellOffers); +} + +void Game::playerCreateMarketOffer(uint32_t playerId, uint8_t type, uint16_t spriteId, uint16_t amount, uint64_t price, bool anonymous) +{ + if (amount == 0 || amount > 64000) { + return; + } + + if (price == 0 || price > 999999999999) { + return; + } + + if (type != MARKETACTION_BUY && type != MARKETACTION_SELL) { + return; + } + + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + if (g_config.getBoolean(ConfigManager::MARKET_PREMIUM) && !player->isPremium()) { + player->sendTextMessage(MESSAGE_STATUS_DEFAULT, "Only premium accounts may create offers for that object."); + return; + } + + const ItemType& it = Item::items[spriteId]; + if (it.id == 0) { + return; + } + + if (!it.stackable && amount > 2000) { + return; + } + + const uint32_t maxOfferCount = g_config.getNumber(ConfigManager::MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER); + if (maxOfferCount != 0 && IOMarket::getPlayerOfferCount(player->getGUID()) >= maxOfferCount) { + return; + } + + uint64_t fee = (price / 100.) * amount; + if (fee < MIN_MARKET_FEE) { + fee = MIN_MARKET_FEE; + } + else if (fee > MAX_MARKET_FEE) { + fee = MAX_MARKET_FEE; + } + + if (type == MARKETACTION_SELL) { + if (fee > (player->getMoney() + player->bankBalance)) { + return; + } + + DepotLocker* depotLocker = player->getDepotLocker(player->getLastDepotId(), false); + if (!depotLocker) { + return; + } + + std::forward_list itemList = getMarketItemList(it.id, amount, depotLocker, player->getInbox()); + if (itemList.empty()) { + return; + } + + if (it.stackable) { + uint16_t tmpAmount = amount; + for (Item* item : itemList) { + uint16_t removeCount = std::min(tmpAmount, item->getItemCount()); + tmpAmount -= removeCount; + internalRemoveItem(item, removeCount); + + if (tmpAmount == 0) { + break; + } + } + } + else { + for (Item* item : itemList) { + internalRemoveItem(item); + } + } + + const auto debitCash = std::min(player->getMoney(), fee); + const auto debitBank = fee - debitCash; + removeMoney(player, debitCash); + player->bankBalance -= debitBank; + } + else { + uint64_t totalPrice = static_cast(price) * amount; + totalPrice += fee; + if (totalPrice > (player->getMoney() + player->bankBalance)) { + return; + } + + const auto debitCash = std::min(player->getMoney(), totalPrice); + const auto debitBank = totalPrice - debitCash; + removeMoney(player, debitCash); + player->bankBalance -= debitBank; + } + + IOMarket::createOffer(player->getGUID(), static_cast(type), it.id, amount, price, anonymous); + + player->sendMarketEnter(player->getLastDepotId()); + const MarketOfferList& buyOffers = IOMarket::getActiveOffers(MARKETACTION_BUY, it.id); + const MarketOfferList& sellOffers = IOMarket::getActiveOffers(MARKETACTION_SELL, it.id); + player->sendMarketBrowseItem(it.id, buyOffers, sellOffers); +} + +void Game::playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter) +{ + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + MarketOfferEx offer = IOMarket::getOfferByCounter(timestamp, counter); + if (offer.id == 0 || offer.playerId != player->getGUID()) { + return; + } + + if (offer.type == MARKETACTION_BUY) { + player->bankBalance += offer.price * offer.amount; + player->sendMarketEnter(player->getLastDepotId()); + } + else { + const ItemType& it = Item::items[offer.itemId]; + if (it.id == 0) { + return; + } + + if (it.stackable) { + uint16_t tmpAmount = offer.amount; + while (tmpAmount > 0) { + int32_t stackCount = std::min(100, tmpAmount); + Item* item = Item::CreateItem(it.id, stackCount); + if (internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + + tmpAmount -= stackCount; + } + } + else { + int32_t subType; + if (it.charges != 0) { + subType = it.charges; + } + else { + subType = -1; + } + + for (uint16_t i = 0; i < offer.amount; ++i) { + Item* item = Item::CreateItem(it.id, subType); + if (internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + } + } + } + + IOMarket::moveOfferToHistory(offer.id, OFFERSTATE_CANCELLED); + offer.amount = 0; + offer.timestamp += g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + player->sendMarketCancelOffer(offer); + player->sendMarketEnter(player->getLastDepotId()); +} + +void Game::playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter, uint16_t amount) +{ + if (amount == 0 || amount > 64000) { + return; + } + + Player* player = getPlayerByID(playerId); + if (!player) { + return; + } + + if (!player->isInMarket()) { + return; + } + + MarketOfferEx offer = IOMarket::getOfferByCounter(timestamp, counter); + if (offer.id == 0) { + return; + } + + uint32_t offerAccountId = IOLoginData::getAccountIdByPlayerId(offer.playerId); + if (offerAccountId == player->getAccount()) { + player->sendTextMessage(MESSAGE_STATUS_DEFAULT, "You cannot accept your own offer."); + return; + } + + if (amount > offer.amount) { + return; + } + + const ItemType& it = Item::items[offer.itemId]; + if (it.id == 0) { + return; + } + + uint64_t totalPrice = offer.price * amount; + + if (offer.type == MARKETACTION_BUY) { + DepotLocker* depotLocker = player->getDepotLocker(player->getLastDepotId(), false); + if (!depotLocker) { + return; + } + + std::forward_list itemList = getMarketItemList(it.id, amount, depotLocker, player->getInbox()); + if (itemList.empty()) { + return; + } + + Player* buyerPlayer = getPlayerByGUID(offer.playerId); + if (!buyerPlayer) { + buyerPlayer = new Player(nullptr); + if (!IOLoginData::loadPlayerById(buyerPlayer, offer.playerId)) { + delete buyerPlayer; + return; + } + } + + if (it.stackable) { + uint16_t tmpAmount = amount; + for (Item* item : itemList) { + uint16_t removeCount = std::min(tmpAmount, item->getItemCount()); + tmpAmount -= removeCount; + internalRemoveItem(item, removeCount); + + if (tmpAmount == 0) { + break; + } + } + } + else { + for (Item* item : itemList) { + internalRemoveItem(item); + } + } + + player->bankBalance += totalPrice; + + if (it.stackable) { + uint16_t tmpAmount = amount; + while (tmpAmount > 0) { + uint16_t stackCount = std::min(100, tmpAmount); + Item* item = Item::CreateItem(it.id, stackCount); + if (internalAddItem(buyerPlayer->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + + tmpAmount -= stackCount; + } + } + else { + int32_t subType; + if (it.charges != 0) { + subType = it.charges; + } + else { + subType = -1; + } + + for (uint16_t i = 0; i < amount; ++i) { + Item* item = Item::CreateItem(it.id, subType); + if (internalAddItem(buyerPlayer->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + } + } + + if (buyerPlayer->isOffline()) { + IOLoginData::savePlayer(buyerPlayer); + delete buyerPlayer; + } + else { + buyerPlayer->onReceiveMail(); + } + } + else { + if (totalPrice > (player->getMoney() + player->bankBalance)) { + return; + } + + const auto debitCash = std::min(player->getMoney(), totalPrice); + const auto debitBank = totalPrice - debitCash; + removeMoney(player, debitCash); + player->bankBalance -= debitBank; + + if (it.stackable) { + uint16_t tmpAmount = amount; + while (tmpAmount > 0) { + uint16_t stackCount = std::min(100, tmpAmount); + Item* item = Item::CreateItem(it.id, stackCount); + if (internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + + tmpAmount -= stackCount; + } + } + else { + int32_t subType; + if (it.charges != 0) { + subType = it.charges; + } + else { + subType = -1; + } + + for (uint16_t i = 0; i < amount; ++i) { + Item* item = Item::CreateItem(it.id, subType); + if (internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + } + } + + Player* sellerPlayer = getPlayerByGUID(offer.playerId); + if (sellerPlayer) { + sellerPlayer->bankBalance += totalPrice; + } + else { + IOLoginData::increaseBankBalance(offer.playerId, totalPrice); + } + + player->onReceiveMail(); + } + + const int32_t marketOfferDuration = g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + IOMarket::appendHistory(player->getGUID(), (offer.type == MARKETACTION_BUY ? MARKETACTION_SELL : MARKETACTION_BUY), offer.itemId, amount, offer.price, offer.timestamp + marketOfferDuration, OFFERSTATE_ACCEPTEDEX); + + IOMarket::appendHistory(offer.playerId, offer.type, offer.itemId, amount, offer.price, offer.timestamp + marketOfferDuration, OFFERSTATE_ACCEPTED); + + offer.amount -= amount; + + if (offer.amount == 0) { + IOMarket::deleteOffer(offer.id); + } + else { + IOMarket::acceptOffer(offer.id, amount); + } + + player->sendMarketEnter(player->getLastDepotId()); + offer.timestamp += marketOfferDuration; + player->sendMarketAcceptOffer(offer); +} + +std::forward_list Game::getMarketItemList(uint16_t wareId, uint16_t sufficientCount, DepotLocker* depotLocker, Inbox* inbox) +{ + std::forward_list itemList; + uint16_t count = 0; + + std::list containers{ depotLocker, inbox }; + do { + Container* container = containers.front(); + containers.pop_front(); + + for (Item* item : container->getItemList()) { + Container* c = item->getContainer(); + if (c && !c->empty()) { + containers.push_back(c); + continue; + } + + const ItemType& itemType = Item::items[item->getID()]; + if (itemType.id != wareId) { + continue; + } + + if (c && (!itemType.isContainer() || c->capacity() != itemType.maxItems)) { + continue; + } + + if (!item->hasMarketAttributes()) { + continue; + } + + itemList.push_front(item); + + count += Item::countByType(item, -1); + if (count >= sufficientCount) { + return itemList; + } + } + } while (!containers.empty()); + return std::forward_list(); +} + void Game::parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer) { Player* player = getPlayerByID(playerId); diff --git a/src/game.h b/src/game.h index d47d04d..f6d7876 100644 --- a/src/game.h +++ b/src/game.h @@ -406,6 +406,15 @@ class Game void playerContinueRuleViolationReport(Player* player, const std::string& text); void parsePlayerExtendedOpcode(uint32_t playerId, uint8_t opcode, const std::string& buffer); + void playerLeaveMarket(uint32_t playerId); + void playerBrowseMarket(uint32_t playerId, uint16_t spriteId); + void playerBrowseMarketOwnOffers(uint32_t playerId); + void playerBrowseMarketOwnHistory(uint32_t playerId); + void playerCreateMarketOffer(uint32_t playerId, uint8_t type, uint16_t spriteId, uint16_t amount, uint64_t price, bool anonymous); + void playerCancelMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter); + void playerAcceptMarketOffer(uint32_t playerId, uint32_t timestamp, uint16_t counter, uint16_t amount); + std::forward_list getMarketItemList(uint16_t wareId, uint16_t sufficientCount, DepotLocker* depotLocker, Inbox* inbox); + void closeRuleViolationReport(Player* player); void cancelRuleViolationReport(Player* player); diff --git a/src/house.cpp b/src/house.cpp index 244f2a1..fcb8891 100644 --- a/src/house.cpp +++ b/src/house.cpp @@ -26,6 +26,7 @@ #include "game.h" #include "configmanager.h" #include "bed.h" +#include "inbox.h" extern ConfigManager g_config; extern Game g_game; diff --git a/src/inbox.cpp b/src/inbox.cpp new file mode 100644 index 0000000..40a2f17 --- /dev/null +++ b/src/inbox.cpp @@ -0,0 +1,57 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#include "otpch.h" + +#include "inbox.h" + +#include "tools.h" + +Inbox::Inbox(uint16_t type) : Container(type, 30) {} + +ReturnValue Inbox::queryAdd(int32_t, const Thing& thing, uint32_t, + uint32_t flags, Creature*) const +{ + if (!hasBitSet(FLAG_NOLIMIT, flags)) { + return RETURNVALUE_CONTAINERNOTENOUGHROOM; + } + + const Item* item = thing.getItem(); + if (!item) { + return RETURNVALUE_NOTPOSSIBLE; + } + + if (item == this) { + return RETURNVALUE_THISISIMPOSSIBLE; + } + + if (!item->isPickupable()) { + return RETURNVALUE_CANNOTPICKUP; + } + + return RETURNVALUE_NOERROR; +} + +void Inbox::postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t) +{ + Cylinder* parent = getParent(); + if (parent) { + parent->postAddNotification(thing, oldParent, index, LINK_PARENT); + } +} + +void Inbox::postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t) +{ + Cylinder* parent = getParent(); + if (parent) { + parent->postRemoveNotification(thing, newParent, index, LINK_PARENT); + } +} + +Cylinder* Inbox::getParent() const +{ + if (parent) { + return parent->getParent(); + } + return nullptr; +} diff --git a/src/inbox.h b/src/inbox.h new file mode 100644 index 0000000..640ff5e --- /dev/null +++ b/src/inbox.h @@ -0,0 +1,32 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#ifndef FS_INBOX_H +#define FS_INBOX_H + +#include "container.h" + +class Inbox final : public Container +{ +public: + explicit Inbox(uint16_t type); + + //cylinder implementations + ReturnValue queryAdd(int32_t index, const Thing& thing, uint32_t count, + uint32_t flags, Creature* actor = nullptr) const override; + + void postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + void postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + + //overrides + bool canRemove() const override { + return false; + } + + Cylinder* getParent() const override; + Cylinder* getRealParent() const override { + return parent; + } +}; + +#endif // FS_INBOX_H diff --git a/src/iologindata.cpp b/src/iologindata.cpp index ae1da42..03a3b47 100644 --- a/src/iologindata.cpp +++ b/src/iologindata.cpp @@ -22,6 +22,9 @@ #include "iologindata.h" #include "configmanager.h" #include "game.h" +#include "depotchest.h" +#include "inbox.h" +#include extern ConfigManager g_config; extern Game g_game; @@ -480,7 +483,8 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) } } } - } else { + } + else { ItemMap::const_iterator it2 = itemMap.find(pid); if (it2 == itemMap.end()) { continue; @@ -494,6 +498,35 @@ bool IOLoginData::loadPlayer(Player* player, DBResult_ptr result) } } + //load inbox items + itemMap.clear(); + + if ((result = db->storeQuery(fmt::format("SELECT `pid`, `sid`, `itemtype`, `count`, `attributes` FROM `player_inboxitems` WHERE `player_id` = {:d} ORDER BY `sid` DESC", player->getGUID())))) { + loadItems(itemMap, result); + + for (ItemMap::const_reverse_iterator it = itemMap.rbegin(), end = itemMap.rend(); it != end; ++it) { + const std::pair& pair = it->second; + Item* item = pair.first; + int32_t pid = pair.second; + + if (pid >= 0 && pid < 100) { + player->getInbox()->internalAddThing(item); + } + else { + ItemMap::const_iterator it2 = itemMap.find(pid); + + if (it2 == itemMap.end()) { + continue; + } + + Container* container = it2->second.first->getContainer(); + if (container) { + container->internalAddThing(item); + } + } + } + } + //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); @@ -761,22 +794,37 @@ bool IOLoginData::savePlayer(Player* player) return false; } - //save depot items - query.str(std::string()); - query << "DELETE FROM `player_depotitems` WHERE `player_id` = " << player->getGUID(); + if (player->lastDepotId != -1) { + //save depot items + if (!db->executeQuery(fmt::format("DELETE FROM `player_depotitems` WHERE `player_id` = {:d}", player->getGUID()))) { + return false; + } - if (!db->executeQuery(query.str())) { + DBInsert depotQuery("INSERT INTO `player_depotitems` (`player_id`, `pid`, `sid`, `itemtype`, `count`, `attributes`) VALUES "); + itemList.clear(); + + for (const auto& it : player->depotLockerMap) { + itemList.emplace_back(it.first, it.second); + } + + if (!saveItems(player, itemList, depotQuery, propWriteStream)) { + return false; + } + } + + //save inbox items + if (!db->executeQuery(fmt::format("DELETE FROM `player_inboxitems` WHERE `player_id` = {:d}", player->getGUID()))) { return false; } - DBInsert depotQuery("INSERT INTO `player_depotitems` (`player_id`, `pid`, `sid`, `itemtype`, `count`, `attributes`) VALUES "); + DBInsert inboxQuery("INSERT INTO `player_inboxitems` (`player_id`, `pid`, `sid`, `itemtype`, `count`, `attributes`) VALUES "); itemList.clear(); - for (const auto& it : player->depotLockerMap) { - itemList.emplace_back(it.first, it.second); + for (Item* item : player->getInbox()->getItemList()) { + itemList.emplace_back(0, item); } - if (!saveItems(player, itemList, depotQuery, propWriteStream)) { + if (!saveItems(player, itemList, inboxQuery, propWriteStream)) { return false; } @@ -985,3 +1033,14 @@ void IOLoginData::removePremiumDays(uint32_t accountId, int32_t removeDays) query << "UPDATE `accounts` SET `premdays` = `premdays` - " << removeDays << " WHERE `id` = " << accountId; Database::getInstance()->executeQuery(query.str()); } + +uint32_t IOLoginData::getAccountIdByPlayerId(uint32_t playerId) +{ + Database* db = Database::getInstance(); + + DBResult_ptr result = db->storeQuery(fmt::format("SELECT `account_id` FROM `players` WHERE `id` = {:d}", playerId)); + if (!result) { + return 0; + } + return result->getNumber("account_id"); +} \ No newline at end of file diff --git a/src/iologindata.h b/src/iologindata.h index 6bfbecd..a477de3 100644 --- a/src/iologindata.h +++ b/src/iologindata.h @@ -59,6 +59,7 @@ class IOLoginData static void addPremiumDays(uint32_t accountId, int32_t addDays); static void removePremiumDays(uint32_t accountId, int32_t removeDays); + static uint32_t getAccountIdByPlayerId(uint32_t playerId); protected: typedef std::map> ItemMap; diff --git a/src/iomarket.cpp b/src/iomarket.cpp new file mode 100644 index 0000000..562f240 --- /dev/null +++ b/src/iomarket.cpp @@ -0,0 +1,307 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#include "otpch.h" + +#include "iomarket.h" + +#include "configmanager.h" +#include "databasetasks.h" +#include "game.h" +#include "inbox.h" +#include "iologindata.h" +#include "scheduler.h" +#include + +extern ConfigManager g_config; +extern Game g_game; + +MarketOfferList IOMarket::getActiveOffers(MarketAction_t action, uint16_t itemId) +{ + MarketOfferList offerList; + + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT `id`, `amount`, `price`, `created`, `anonymous`, (SELECT `name` FROM `players` WHERE `id` = `player_id`) AS `player_name` FROM `market_offers` WHERE `sale` = {:d} AND `itemtype` = {:d}", action, itemId)); + if (!result) { + return offerList; + } + + const int32_t marketOfferDuration = g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + do { + MarketOffer offer; + offer.amount = result->getNumber("amount"); + offer.price = result->getNumber("price"); + offer.timestamp = result->getNumber("created") + marketOfferDuration; + offer.counter = result->getNumber("id") & 0xFFFF; + if (result->getNumber("anonymous") == 0) { + offer.playerName = result->getString("player_name"); + } + else { + offer.playerName = "Anonymous"; + } + offerList.push_back(offer); + } while (result->next()); + return offerList; +} + +MarketOfferList IOMarket::getOwnOffers(MarketAction_t action, uint32_t playerId) +{ + MarketOfferList offerList; + + const int32_t marketOfferDuration = g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT `id`, `amount`, `price`, `created`, `itemtype` FROM `market_offers` WHERE `player_id` = {:d} AND `sale` = {:d}", playerId, action)); + if (!result) { + return offerList; + } + + do { + MarketOffer offer; + offer.amount = result->getNumber("amount"); + offer.price = result->getNumber("price"); + offer.timestamp = result->getNumber("created") + marketOfferDuration; + offer.counter = result->getNumber("id") & 0xFFFF; + offer.itemId = result->getNumber("itemtype"); + offerList.push_back(offer); + } while (result->next()); + return offerList; +} + +HistoryMarketOfferList IOMarket::getOwnHistory(MarketAction_t action, uint32_t playerId) +{ + HistoryMarketOfferList offerList; + + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT `itemtype`, `amount`, `price`, `expires_at`, `state` FROM `market_history` WHERE `player_id` = {:d} AND `sale` = {:d}", playerId, action)); + if (!result) { + return offerList; + } + + do { + HistoryMarketOffer offer; + offer.itemId = result->getNumber("itemtype"); + offer.amount = result->getNumber("amount"); + offer.price = result->getNumber("price"); + offer.timestamp = result->getNumber("expires_at"); + + MarketOfferState_t offerState = static_cast(result->getNumber("state")); + if (offerState == OFFERSTATE_ACCEPTEDEX) { + offerState = OFFERSTATE_ACCEPTED; + } + + offer.state = offerState; + + offerList.push_back(offer); + } while (result->next()); + return offerList; +} + +void IOMarket::processExpiredOffers(DBResult_ptr result, bool) +{ + if (!result) { + return; + } + + do { + if (!IOMarket::moveOfferToHistory(result->getNumber("id"), OFFERSTATE_EXPIRED)) { + continue; + } + + const uint32_t playerId = result->getNumber("player_id"); + const uint16_t amount = result->getNumber("amount"); + if (result->getNumber("sale") == 1) { + const ItemType& itemType = Item::items[result->getNumber("itemtype")]; + if (itemType.id == 0) { + continue; + } + + Player* player = g_game.getPlayerByGUID(playerId); + if (!player) { + player = new Player(nullptr); + if (!IOLoginData::loadPlayerById(player, playerId)) { + delete player; + continue; + } + } + + if (itemType.stackable) { + uint16_t tmpAmount = amount; + while (tmpAmount > 0) { + uint16_t stackCount = std::min(100, tmpAmount); + Item* item = Item::CreateItem(itemType.id, stackCount); + if (g_game.internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + + tmpAmount -= stackCount; + } + } + else { + int32_t subType; + if (itemType.charges != 0) { + subType = itemType.charges; + } + else { + subType = -1; + } + + for (uint16_t i = 0; i < amount; ++i) { + Item* item = Item::CreateItem(itemType.id, subType); + if (g_game.internalAddItem(player->getInbox(), item, INDEX_WHEREEVER, FLAG_NOLIMIT) != RETURNVALUE_NOERROR) { + delete item; + break; + } + } + } + + if (player->isOffline()) { + IOLoginData::savePlayer(player); + delete player; + } + } + else { + uint64_t totalPrice = result->getNumber("price") * amount; + + Player* player = g_game.getPlayerByGUID(playerId); + if (player) { + player->setBankBalance(player->getBankBalance() + totalPrice); + } + else { + IOLoginData::increaseBankBalance(playerId, totalPrice); + } + } + } while (result->next()); +} + +void IOMarket::checkExpiredOffers() +{ + const time_t lastExpireDate = time(nullptr) - g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + g_databaseTasks.addTask(fmt::format("SELECT `id`, `amount`, `price`, `itemtype`, `player_id`, `sale` FROM `market_offers` WHERE `created` <= {:d}", lastExpireDate), IOMarket::processExpiredOffers, true); + + int32_t checkExpiredMarketOffersEachMinutes = g_config.getNumber(ConfigManager::CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES); + if (checkExpiredMarketOffersEachMinutes <= 0) { + return; + } + + g_scheduler.addEvent(createSchedulerTask(checkExpiredMarketOffersEachMinutes * 60 * 1000, &IOMarket::checkExpiredOffers)); +} + +uint32_t IOMarket::getPlayerOfferCount(uint32_t playerId) +{ + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT COUNT(*) AS `count` FROM `market_offers` WHERE `player_id` = {:d}", playerId)); + if (!result) { + return 0; + } + return result->getNumber("count"); +} + +MarketOfferEx IOMarket::getOfferByCounter(uint32_t timestamp, uint16_t counter) +{ + MarketOfferEx offer; + + const int32_t created = timestamp - g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT `id`, `sale`, `itemtype`, `amount`, `created`, `price`, `player_id`, `anonymous`, (SELECT `name` FROM `players` WHERE `id` = `player_id`) AS `player_name` FROM `market_offers` WHERE `created` = {:d} AND (`id` & 65535) = {:d} LIMIT 1", created, counter)); + if (!result) { + offer.id = 0; + offer.playerId = 0; + return offer; + } + + offer.id = result->getNumber("id"); + offer.type = static_cast(result->getNumber("sale")); + offer.amount = result->getNumber("amount"); + offer.counter = result->getNumber("id") & 0xFFFF; + offer.timestamp = result->getNumber("created"); + offer.price = result->getNumber("price"); + offer.itemId = result->getNumber("itemtype"); + offer.playerId = result->getNumber("player_id"); + if (result->getNumber("anonymous") == 0) { + offer.playerName = result->getString("player_name"); + } + else { + offer.playerName = "Anonymous"; + } + return offer; +} + +void IOMarket::createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price, bool anonymous) +{ + Database::getInstance()->executeQuery(fmt::format("INSERT INTO `market_offers` (`player_id`, `sale`, `itemtype`, `amount`, `price`, `created`, `anonymous`) VALUES ({:d}, {:d}, {:d}, {:d}, {:d}, {:d}, {:d})", playerId, action, itemId, amount, price, time(nullptr), anonymous)); +} + +void IOMarket::acceptOffer(uint32_t offerId, uint16_t amount) +{ + Database::getInstance()->executeQuery(fmt::format("UPDATE `market_offers` SET `amount` = `amount` - {:d} WHERE `id` = {:d}", amount, offerId)); +} + +void IOMarket::deleteOffer(uint32_t offerId) +{ + Database::getInstance()->executeQuery(fmt::format("DELETE FROM `market_offers` WHERE `id` = {:d}", offerId)); +} + +void IOMarket::appendHistory(uint32_t playerId, MarketAction_t type, uint16_t itemId, uint16_t amount, uint64_t price, time_t timestamp, MarketOfferState_t state) +{ + g_databaseTasks.addTask(fmt::format("INSERT INTO `market_history` (`player_id`, `sale`, `itemtype`, `amount`, `price`, `expires_at`, `inserted`, `state`) VALUES ({:d}, {:d}, {:d}, {:d}, {:d}, {:d}, {:d}, {:d})", playerId, type, itemId, amount, price, timestamp, time(nullptr), state)); +} + +bool IOMarket::moveOfferToHistory(uint32_t offerId, MarketOfferState_t state) +{ + const int32_t marketOfferDuration = g_config.getNumber(ConfigManager::MARKET_OFFER_DURATION); + + Database* db = Database::getInstance(); + + DBResult_ptr result = db->storeQuery(fmt::format("SELECT `player_id`, `sale`, `itemtype`, `amount`, `price`, `created` FROM `market_offers` WHERE `id` = {:d}", offerId)); + if (!result) { + return false; + } + + if (!db->executeQuery(fmt::format("DELETE FROM `market_offers` WHERE `id` = {:d}", offerId))) { + return false; + } + + appendHistory(result->getNumber("player_id"), static_cast(result->getNumber("sale")), result->getNumber("itemtype"), result->getNumber("amount"), result->getNumber("price"), result->getNumber("created") + marketOfferDuration, state); + return true; +} + +void IOMarket::updateStatistics() +{ + DBResult_ptr result = Database::getInstance()->storeQuery(fmt::format("SELECT `sale` AS `sale`, `itemtype` AS `itemtype`, COUNT(`price`) AS `num`, MIN(`price`) AS `min`, MAX(`price`) AS `max`, SUM(`price`) AS `sum` FROM `market_history` WHERE `state` = {:d} GROUP BY `itemtype`, `sale`", OFFERSTATE_ACCEPTED)); + if (!result) { + return; + } + + do { + MarketStatistics* statistics; + if (result->getNumber("sale") == MARKETACTION_BUY) { + statistics = &purchaseStatistics[result->getNumber("itemtype")]; + } + else { + statistics = &saleStatistics[result->getNumber("itemtype")]; + } + + statistics->numTransactions = result->getNumber("num"); + statistics->lowestPrice = result->getNumber("min"); + statistics->totalPrice = result->getNumber("sum"); + statistics->highestPrice = result->getNumber("max"); + } while (result->next()); +} + +MarketStatistics* IOMarket::getPurchaseStatistics(uint16_t itemId) +{ + auto it = purchaseStatistics.find(itemId); + if (it == purchaseStatistics.end()) { + return nullptr; + } + return &it->second; +} + +MarketStatistics* IOMarket::getSaleStatistics(uint16_t itemId) +{ + auto it = saleStatistics.find(itemId); + if (it == saleStatistics.end()) { + return nullptr; + } + return &it->second; +} diff --git a/src/iomarket.h b/src/iomarket.h new file mode 100644 index 0000000..181b651 --- /dev/null +++ b/src/iomarket.h @@ -0,0 +1,47 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#ifndef FS_IOMARKET_H +#define FS_IOMARKET_H + +#include "database.h" +#include "enums.h" + +class IOMarket +{ +public: + static IOMarket& getInstance() { + static IOMarket instance; + return instance; + } + + static MarketOfferList getActiveOffers(MarketAction_t action, uint16_t itemId); + static MarketOfferList getOwnOffers(MarketAction_t action, uint32_t playerId); + static HistoryMarketOfferList getOwnHistory(MarketAction_t action, uint32_t playerId); + + static void processExpiredOffers(DBResult_ptr result, bool); + static void checkExpiredOffers(); + + static uint32_t getPlayerOfferCount(uint32_t playerId); + static MarketOfferEx getOfferByCounter(uint32_t timestamp, uint16_t counter); + + static void createOffer(uint32_t playerId, MarketAction_t action, uint32_t itemId, uint16_t amount, uint64_t price, bool anonymous); + static void acceptOffer(uint32_t offerId, uint16_t amount); + static void deleteOffer(uint32_t offerId); + + static void appendHistory(uint32_t playerId, MarketAction_t type, uint16_t itemId, uint16_t amount, uint64_t price, time_t timestamp, MarketOfferState_t state); + static bool moveOfferToHistory(uint32_t offerId, MarketOfferState_t state); + + void updateStatistics(); + + MarketStatistics* getPurchaseStatistics(uint16_t itemId); + MarketStatistics* getSaleStatistics(uint16_t itemId); + +private: + IOMarket() = default; + + std::map purchaseStatistics; + std::map saleStatistics; +}; + +#endif // FS_IOMARKET_H diff --git a/src/item.cpp b/src/item.cpp index 929f22c..5a1c07c 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -1302,3 +1302,44 @@ void Item::startDecaying() { g_game.startDecay(this); } + +bool Item::hasMarketAttributes() const +{ + if (!attributes) { + return true; + } + + // discard items with custom boost and reflect + /* + TODO: find out if necessary + for (uint16_t i = 0; i < COMBAT_COUNT; ++i) { + if (getBoostPercent(indexToCombatType(i), false) > 0) { + return false; + } + + Reflect tmpReflect = getReflect(indexToCombatType(i), false); + if (tmpReflect.chance != 0 || tmpReflect.percent != 0) { + return false; + } + } + */ + // discard items with other modified attributes + for (const auto& attr : attributes->getList()) { + if (attr.type == ITEM_ATTRIBUTE_CHARGES) { + uint16_t charges = static_cast(attr.value.integer); + if (charges != items[id].charges) { + return false; + } + } + else if (attr.type == ITEM_ATTRIBUTE_DURATION) { + uint32_t duration = static_cast(attr.value.integer); + if (duration != getDefaultDuration()) { + return false; + } + } + else { + return false; + } + } + return true; +} \ No newline at end of file diff --git a/src/item.h b/src/item.h index 87b2a04..eac9d10 100644 --- a/src/item.h +++ b/src/item.h @@ -776,6 +776,8 @@ class Item : virtual public Thing virtual void startDecaying(); + bool hasMarketAttributes() const; + void setLoadedFromMap(bool value) { loadedFromMap = value; } diff --git a/src/items.h b/src/items.h index 6411e99..6b6d6e2 100644 --- a/src/items.h +++ b/src/items.h @@ -258,6 +258,7 @@ class ItemType bool useEvent = false; bool multiUseEvent = false; bool distUse = false; + bool storeItem = false; bool disguise = false; bool forceUse = false; bool changeUse = false; diff --git a/src/luascript.cpp b/src/luascript.cpp index c82f47d..124fed7 100644 --- a/src/luascript.cpp +++ b/src/luascript.cpp @@ -28,6 +28,7 @@ #include "protocolstatus.h" #include "spells.h" #include "iologindata.h" +#include "iomarket.h" #include "configmanager.h" #include "teleport.h" #include "databasemanager.h" @@ -35,6 +36,8 @@ #include "monster.h" #include "scheduler.h" #include "databasetasks.h" +#include "inbox.h" +#include "depotchest.h" extern Chat* g_chat; extern Game g_game; @@ -1629,6 +1632,7 @@ void LuaScriptInterface::registerFunctions() registerEnumIn("configKeys", ConfigManager::ALLOW_CLONES) registerEnumIn("configKeys", ConfigManager::BIND_ONLY_GLOBAL_ADDRESS) registerEnumIn("configKeys", ConfigManager::OPTIMIZE_DATABASE) + registerEnumIn("configKeys", ConfigManager::MARKET_PREMIUM) registerEnumIn("configKeys", ConfigManager::STAMINA_SYSTEM) registerEnumIn("configKeys", ConfigManager::WARN_UNSAFE_SCRIPTS) registerEnumIn("configKeys", ConfigManager::CONVERT_UNSAFE_SCRIPTS) @@ -1685,6 +1689,9 @@ void LuaScriptInterface::registerFunctions() registerEnumIn("configKeys", ConfigManager::LOGIN_PORT) registerEnumIn("configKeys", ConfigManager::STATUS_PORT) registerEnumIn("configKeys", ConfigManager::STAIRHOP_DELAY) + registerEnumIn("configKeys", ConfigManager::MARKET_OFFER_DURATION) + registerEnumIn("configKeys", ConfigManager::CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES) + registerEnumIn("configKeys", ConfigManager::MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER) registerEnumIn("configKeys", ConfigManager::EXP_FROM_PLAYERS_LEVEL_RANGE) registerEnumIn("configKeys", ConfigManager::MAX_PACKETS_PER_SECOND) registerEnumIn("configKeys", ConfigManager::NEWBIE_TOWN) @@ -1989,6 +1996,7 @@ void LuaScriptInterface::registerFunctions() registerMethod("Player", "getFreeCapacity", LuaScriptInterface::luaPlayerGetFreeCapacity); registerMethod("Player", "getDepotChest", LuaScriptInterface::luaPlayerGetDepotChest); + registerMethod("Player", "getInbox", LuaScriptInterface::luaPlayerGetInbox); registerMethod("Player", "getMurderTimestamps", LuaScriptInterface::luaPlayerGetMurderTimestamps); registerMethod("Player", "getPlayerKillerEnd", LuaScriptInterface::luaPlayerGetPlayerKillerEnd); @@ -2300,6 +2308,9 @@ void LuaScriptInterface::registerFunctions() registerMethod("ItemType", "getNutrition", LuaScriptInterface::luaItemTypeGetNutrition); registerMethod("ItemType", "getRequiredLevel", LuaScriptInterface::luaItemTypeGetRequiredLevel); + registerMethod("ItemType", "getMarketBuyStatistics", LuaScriptInterface::luaItemTypeGetMarketBuyStatistics); + registerMethod("ItemType", "getMarketSellStatistics", LuaScriptInterface::luaItemTypeGetMarketSellStatistics); + registerMethod("ItemType", "hasSubType", LuaScriptInterface::luaItemTypeHasSubType); // Combat @@ -7276,6 +7287,26 @@ int LuaScriptInterface::luaPlayerGetDepotChest(lua_State* L) return 1; } +int LuaScriptInterface::luaPlayerGetInbox(lua_State* L) +{ + // player:getInbox() + Player* player = getUserdata(L, 1); + if (!player) { + lua_pushnil(L); + return 1; + } + + Inbox* inbox = player->getInbox(); + if (inbox) { + pushUserdata(L, inbox); + setItemMetatable(L, -1, inbox); + } + else { + pushBoolean(L, false); + } + return 1; +} + int LuaScriptInterface::luaPlayerGetMurderTimestamps(lua_State * L) { // player:getMurderTimestamps() @@ -10656,6 +10687,52 @@ int LuaScriptInterface::luaItemTypeGetRequiredLevel(lua_State* L) return 1; } +int LuaScriptInterface::luaItemTypeGetMarketBuyStatistics(lua_State* L) +{ + // itemType:getMarketBuyStatistics() + const ItemType* itemType = getUserdata(L, 1); + if (itemType) { + MarketStatistics* statistics = IOMarket::getInstance().getPurchaseStatistics(itemType->id); + if (statistics) { + lua_createtable(L, 4, 0); + setField(L, "numTransactions", statistics->numTransactions); + setField(L, "totalPrice", statistics->totalPrice); + setField(L, "highestPrice", statistics->highestPrice); + setField(L, "lowestPrice", statistics->lowestPrice); + } + else { + lua_pushnil(L); + } + } + else { + lua_pushnil(L); + } + return 1; +} + +int LuaScriptInterface::luaItemTypeGetMarketSellStatistics(lua_State* L) +{ + // itemType:getMarketSellStatistics() + const ItemType* itemType = getUserdata(L, 1); + if (itemType) { + MarketStatistics* statistics = IOMarket::getInstance().getSaleStatistics(itemType->id); + if (statistics) { + lua_createtable(L, 4, 0); + setField(L, "numTransactions", statistics->numTransactions); + setField(L, "totalPrice", statistics->totalPrice); + setField(L, "highestPrice", statistics->highestPrice); + setField(L, "lowestPrice", statistics->lowestPrice); + } + else { + lua_pushnil(L); + } + } + else { + lua_pushnil(L); + } + return 1; +} + int LuaScriptInterface::luaItemTypeHasSubType(lua_State* L) { // itemType:hasSubType() diff --git a/src/luascript.h b/src/luascript.h index cbc7c4d..9f9c3d8 100644 --- a/src/luascript.h +++ b/src/luascript.h @@ -807,6 +807,7 @@ class LuaScriptInterface static int luaPlayerGetFreeCapacity(lua_State* L); static int luaPlayerGetDepotChest(lua_State* L); + static int luaPlayerGetInbox(lua_State* L); static int luaPlayerGetMurderTimestamps(lua_State* L); static int luaPlayerGetPlayerKillerEnd(lua_State* L); @@ -1110,6 +1111,9 @@ class LuaScriptInterface static int luaItemTypeGetNutrition(lua_State* L); static int luaItemTypeGetRequiredLevel(lua_State* L); + static int luaItemTypeGetMarketBuyStatistics(lua_State* L); + static int luaItemTypeGetMarketSellStatistics(lua_State* L); + static int luaItemTypeHasSubType(lua_State* L); // Combat diff --git a/src/mailbox.cpp b/src/mailbox.cpp index 31cd67f..d3ac5b9 100644 --- a/src/mailbox.cpp +++ b/src/mailbox.cpp @@ -24,6 +24,7 @@ #include "player.h" #include "iologindata.h" #include "town.h" +#include "inbox.h" extern Game g_game; @@ -94,50 +95,42 @@ bool Mailbox::sendItem(Item* item) const { std::string receiver; std::string townName; + townName = "thais"; if (!getDestination(item, receiver, townName)) { return false; } - if (receiver.empty() || townName.empty()) { - return false; - } - - Town* town = g_game.map.towns.getTown(townName); - if (!town) { + /**No need to continue if its still empty**/ + if (receiver.empty()) { return false; } Player* player = g_game.getPlayerByName(receiver); if (player) { - DepotLocker* depotLocker = player->getDepotLocker(town->getID(), true); - if (depotLocker) { - if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, - item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) { - g_game.transformItem(item, item->getID() + 1); - player->onReceiveMail(town->getID()); - return true; - } + if (g_game.internalMoveItem(item->getParent(), player->getInbox(), INDEX_WHEREEVER, + item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) { + g_game.transformItem(item, item->getID() + 1); + player->onReceiveMail(); + return true; } - } else { + } + else { Player tmpPlayer(nullptr); if (!IOLoginData::loadPlayerByName(&tmpPlayer, receiver)) { return false; } - DepotLocker* depotLocker = tmpPlayer.getDepotLocker(town->getID(), true); - if (depotLocker) { - if (g_game.internalMoveItem(item->getParent(), depotLocker, INDEX_WHEREEVER, - item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) { - g_game.transformItem(item, item->getID() + 1); - IOLoginData::savePlayer(&tmpPlayer); - return true; - } + if (g_game.internalMoveItem(item->getParent(), tmpPlayer.getInbox(), INDEX_WHEREEVER, + item, item->getItemCount(), nullptr, FLAG_NOLIMIT) == RETURNVALUE_NOERROR) { + g_game.transformItem(item, item->getID() + 1); + IOLoginData::savePlayer(&tmpPlayer); + return true; } } - return false; } + bool Mailbox::getDestination(Item* item, std::string& name, std::string& town) const { const Container* container = item->getContainer(); diff --git a/src/otserv.cpp b/src/otserv.cpp index f52bdf3..38a3c00 100644 --- a/src/otserv.cpp +++ b/src/otserv.cpp @@ -22,6 +22,7 @@ #include "server.h" #include "game.h" +#include "iomarket.h" #ifndef _WIN32 #include // for sigemptyset() @@ -305,6 +306,9 @@ void mainLoader(int, char*[], ServiceManager* services) g_game.map.houses.payHouses(rentPeriod); + IOMarket::checkExpiredOffers(); + IOMarket::getInstance().updateStatistics(); + std::cout << ">> Loaded all modules, server starting up..." << std::endl; #ifndef _WIN32 diff --git a/src/player.cpp b/src/player.cpp index 0d7a9c9..7540037 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -32,6 +32,8 @@ #include "monster.h" #include "movement.h" #include "scheduler.h" +#include "depotchest.h" +#include "inbox.h" extern ConfigManager g_config; extern Game g_game; @@ -46,8 +48,9 @@ MuteCountMap Player::muteCountMap; uint32_t Player::playerAutoID = 0x10000000; Player::Player(ProtocolGame_ptr p) : - Creature(), lastPing(OTSYS_TIME()), lastPong(lastPing), client(std::move(p)) + Creature(), lastPing(OTSYS_TIME()), lastPong(lastPing), client(std::move(p)), inbox(new Inbox(ITEM_INBOX)) { + inbox->incrementReferenceCounter(); } Player::~Player() @@ -60,9 +63,11 @@ Player::~Player() } for (const auto& it : depotLockerMap) { - it.second->decrementReferenceCounter(); + it.second->removeInbox(inbox); } + inbox->decrementReferenceCounter(); + setWriteItem(nullptr); setEditHouse(nullptr); } @@ -579,14 +584,14 @@ bool Player::canSeeCreature(const Creature* creature) const return true; } -void Player::onReceiveMail(uint32_t townId) const +void Player::onReceiveMail() const { - if (isNearDepotBox(townId)) { + if (isNearDepotBox()) { sendTextMessage(MESSAGE_EVENT_ADVANCE, "New mail has arrived."); } } -bool Player::isNearDepotBox(uint32_t townId) const +bool Player::isNearDepotBox() const { const Position& pos = getPosition(); for (int32_t cx = -1; cx <= 1; ++cx) { @@ -597,25 +602,43 @@ bool Player::isNearDepotBox(uint32_t townId) const } if (DepotLocker* depotLocker = tile->getDepotLocker()) { - if (depotLocker->getDepotId() == townId) { - return true; - } + return true; } } } return false; } +DepotChest* Player::getDepotChest(uint32_t depotId, bool autoCreate) +{ + auto it = depotChests.find(depotId); + if (it != depotChests.end()) { + return it->second; + } + + if (!autoCreate) { + return nullptr; + } + + it = depotChests.emplace(depotId, new DepotChest(ITEM_DEPOT)).first; + it->second->setMaxDepotItems(getMaxDepotItems()); + return it->second; +} + + DepotLocker* Player::getDepotLocker(uint32_t depotId, bool autoCreate) { auto it = depotLockerMap.find(depotId); if (it != depotLockerMap.end()) { + inbox->setParent(it->second); return it->second; } if (autoCreate) { DepotLocker* depotLocker = new DepotLocker(ITEM_LOCKER1); depotLocker->setDepotId(depotId); + depotLocker->internalAddThing(Item::CreateItem(ITEM_MARKET)); + depotLocker->internalAddThing(inbox); Item* depotItem = Item::CreateItem(ITEM_DEPOT); if (depotItem) { depotLocker->internalAddThing(depotItem); @@ -1006,6 +1029,11 @@ void Player::onCreatureMove(Creature* creature, const Tile* newTile, const Posit } } + // leave market + if (inMarket) { + inMarket = false; + } + if (party) { party->updateSharedExperience(); } diff --git a/src/player.h b/src/player.h index 08f4002..4d60e12 100644 --- a/src/player.h +++ b/src/player.h @@ -35,6 +35,7 @@ #include "town.h" class BehaviourDatabase; +class DepotChest; class House; class NetworkMessage; class Weapon; @@ -207,6 +208,10 @@ class Player final : public Creature, public Cylinder bool isInWar(const Player* player) const; bool isInWarList(uint32_t guild_id) const; + Inbox* getInbox() const { + return inbox; + } + uint16_t getClientIcons() const; const GuildWarList& getGuildWarList() const { @@ -306,6 +311,20 @@ class Player final : public Creature, public Cylinder return group; } + void setInMarket(bool value) { + inMarket = value; + } + bool isInMarket() const { + return inMarket; + } + + void setLastDepotId(int16_t newId) { + lastDepotId = newId; + } + int16_t getLastDepotId() const { + return lastDepotId; + } + void resetIdleTime() { idleTime = 0; resetLastWalkingTime(); @@ -454,9 +473,10 @@ class Player final : public Creature, public Cylinder void addConditionSuppressions(uint32_t conditions); void removeConditionSuppressions(uint32_t conditions); + DepotChest* getDepotChest(uint32_t depotId, bool autoCreate); DepotLocker* getDepotLocker(uint32_t depotId, bool autoCreate); - void onReceiveMail(uint32_t townId) const; - bool isNearDepotBox(uint32_t townId) const; + void onReceiveMail() const; + bool isNearDepotBox() const; bool canSee(const Position& pos) const final; bool canSeeCreature(const Creature* creature) const final; @@ -856,6 +876,42 @@ class Player final : public Creature, public Cylinder client->sendToChannel(creature, type, text, channelId); } } + void sendMarketEnter(uint32_t depotId) const { + if (client) { + client->sendMarketEnter(depotId); + } + } + void sendMarketLeave() { + inMarket = false; + if (client) { + client->sendMarketLeave(); + } + } + void sendMarketBrowseItem(uint16_t itemId, const MarketOfferList& buyOffers, const MarketOfferList& sellOffers) const { + if (client) { + client->sendMarketBrowseItem(itemId, buyOffers, sellOffers); + } + } + void sendMarketBrowseOwnOffers(const MarketOfferList& buyOffers, const MarketOfferList& sellOffers) const { + if (client) { + client->sendMarketBrowseOwnOffers(buyOffers, sellOffers); + } + } + void sendMarketBrowseOwnHistory(const HistoryMarketOfferList& buyOffers, const HistoryMarketOfferList& sellOffers) const { + if (client) { + client->sendMarketBrowseOwnHistory(buyOffers, sellOffers); + } + } + void sendMarketAcceptOffer(const MarketOfferEx& offer) const { + if (client) { + client->sendMarketAcceptOffer(offer); + } + } + void sendMarketCancelOffer(const MarketOfferEx& offer) const { + if (client) { + client->sendMarketCancelOffer(offer); + } + } void sendTradeItemRequest(const std::string& traderName, const Item* item, bool ack) const { if (client) { client->sendTradeItemRequest(traderName, item, ack); @@ -1023,6 +1079,7 @@ class Player final : public Creature, public Cylinder std::map openContainers; std::map depotLockerMap; + std::map depotChests; std::map storageMap; std::vector outfits; @@ -1061,6 +1118,7 @@ class Player final : public Creature, public Cylinder Guild* guild = nullptr; const GuildRank* guildRank = nullptr; Group* group = nullptr; + Inbox* inbox; Item* tradeItem = nullptr; Item* inventory[CONST_SLOT_LAST + 1] = {}; Item* writeItem = nullptr; @@ -1103,6 +1161,7 @@ class Player final : public Creature, public Cylinder uint16_t staminaMinutes = 3360; uint16_t maxWriteLen = 0; + int16_t lastDepotId = -1; uint8_t soul = 0; uint8_t blessings = 0; @@ -1118,6 +1177,7 @@ class Player final : public Creature, public Cylinder AccountType_t accountType = ACCOUNT_TYPE_NORMAL; bool secureMode = false; + bool inMarket = false; bool ghostMode = false; bool pzLocked = false; bool isConnecting = false; diff --git a/src/protocolgame.cpp b/src/protocolgame.cpp index ce46f0d..2404a77 100644 --- a/src/protocolgame.cpp +++ b/src/protocolgame.cpp @@ -30,10 +30,13 @@ #include "configmanager.h" #include "actions.h" #include "game.h" +#include "inbox.h" +#include "iomarket.h" #include "iologindata.h" #include "waitlist.h" #include "ban.h" #include "scheduler.h" +#include "depotchest.h" extern ConfigManager g_config; extern Actions actions; @@ -451,6 +454,11 @@ void ProtocolGame::parsePacket(NetworkMessage& msg) case 0xE8: parseDebugAssert(msg); break; case 0xF0: addGameTaskTimed(DISPATCHER_TASK_EXPIRATION, &Game::playerShowQuestLog, player->getID()); break; case 0xF1: parseQuestLine(msg); break; + case 0xF4: parseMarketLeave(); break; + case 0xF5: parseMarketBrowse(msg); break; + case 0xF6: parseMarketCreateOffer(msg); break; + case 0xF7: parseMarketCancelOffer(msg); break; + case 0xF8: parseMarketAcceptOffer(msg); break; default: std::cout << "Player: " << player->getName() << " sent an unknown packet header: 0x" << std::hex << static_cast(recvbyte) << std::dec << "!" << std::endl; break; @@ -997,6 +1005,61 @@ void ProtocolGame::parseQuestLine(NetworkMessage& msg) addGameTask(&Game::playerShowQuestLine, player->getID(), questId); } +void ProtocolGame::parseMarketLeave() +{ + addGameTask(&Game::playerLeaveMarket, player->getID()); +} + +void ProtocolGame::parseMarketBrowse(NetworkMessage& msg) +{ + uint8_t browseId = msg.get(); + if (browseId == MARKETREQUEST_OWN_OFFERS) { + addGameTask(&Game::playerBrowseMarketOwnOffers, player->getID()); + } + else if (browseId == MARKETREQUEST_OWN_HISTORY) { + addGameTask(&Game::playerBrowseMarketOwnHistory, player->getID()); + } + else { + uint16_t spriteID = msg.get(); + addGameTask(&Game::playerBrowseMarket, player->getID(), spriteID); + } +} + +void ProtocolGame::parseMarketCreateOffer(NetworkMessage& msg) +{ + uint8_t type = msg.getByte(); + uint16_t spriteId = msg.get(); + + const ItemType& it = Item::items[spriteId]; + if (it.id == 0) { + return; + } + // TODO: + //else if (it.classification > 0) { + // msg.getByte(); // item tier + //} + + uint16_t amount = msg.get(); + uint64_t price = msg.get(); + bool anonymous = (msg.getByte() != 0); + addGameTask(&Game::playerCreateMarketOffer, player->getID(), type, spriteId, amount, price, anonymous); +} + +void ProtocolGame::parseMarketCancelOffer(NetworkMessage& msg) +{ + uint32_t timestamp = msg.get(); + uint16_t counter = msg.get(); + addGameTask(&Game::playerCancelMarketOffer, player->getID(), timestamp, counter); +} + +void ProtocolGame::parseMarketAcceptOffer(NetworkMessage& msg) +{ + uint32_t timestamp = msg.get(); + uint16_t counter = msg.get(); + uint16_t amount = msg.get(); + addGameTask(&Game::playerAcceptMarketOffer, player->getID(), timestamp, counter, amount); +} + void ProtocolGame::parseSeekInContainer(NetworkMessage& msg) { uint8_t containerId = msg.getByte(); @@ -1251,6 +1314,259 @@ void ProtocolGame::sendContainer(uint8_t cid, const Container* container, bool h writeToOutputBuffer(msg); } +void ProtocolGame::sendMarketEnter(uint32_t depotId) +{ + NetworkMessage msg; + msg.addByte(0xF6); + msg.addByte(std::min(IOMarket::getPlayerOfferCount(player->getGUID()), std::numeric_limits::max())); + + DepotLocker* depotLocker = player->getDepotLocker(depotId, false); + if (!depotLocker) { + msg.add(0x00); + writeToOutputBuffer(msg); + return; + } + + player->setInMarket(true); + + msg.add(player->getBankBalance()); + + std::map depotItems; + std::forward_list containerList{ depotLocker, player->getInbox() }; + + do { + Container* container = containerList.front(); + containerList.pop_front(); + + for (Item* item : container->getItemList()) { + Container* c = item->getContainer(); + if (c && !c->empty()) { + containerList.push_front(c); + continue; + } + + const ItemType& itemType = Item::items[item->getID()]; + if (itemType.id == 0) { + continue; + } + + if (c && (!itemType.isContainer() || c->capacity() != itemType.maxItems)) { + continue; + } + + if (!item->hasMarketAttributes()) { + continue; + } + + depotItems[itemType.id] += Item::countByType(item, -1); + } + } while (!containerList.empty()); + + uint16_t itemsToSend = std::min(depotItems.size(), std::numeric_limits::max()); + uint16_t i = 0; + + msg.add(itemsToSend); + for (std::map::const_iterator it = depotItems.begin(); i < itemsToSend; ++it, ++i) { + const ItemType& itemType = Item::items[it->first]; + msg.add(itemType.id); + // TODO + //if (itemType.classification > 0) { + // msg.addByte(0); + //} + msg.add(std::min(0xFFFF, it->second)); + } + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketLeave() +{ + NetworkMessage msg; + msg.addByte(0xF7); + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketBrowseItem(uint16_t itemId, const MarketOfferList& buyOffers, const MarketOfferList& sellOffers) +{ + NetworkMessage msg; + msg.addByte(0xF9); + msg.addByte(MARKETREQUEST_ITEM); + msg.addItemId(itemId); + + // TODO + //if (Item::items[itemId].classification > 0) { + // msg.addByte(0); // item tier + //} + + msg.add(buyOffers.size()); + for (const MarketOffer& offer : buyOffers) { + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.add(offer.amount); + msg.add(offer.price); + msg.addString(offer.playerName); + } + + msg.add(sellOffers.size()); + for (const MarketOffer& offer : sellOffers) { + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.add(offer.amount); + msg.add(offer.price); + msg.addString(offer.playerName); + } + + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketAcceptOffer(const MarketOfferEx& offer) +{ + NetworkMessage msg; + msg.addByte(0xF9); + msg.addByte(MARKETREQUEST_ITEM); + msg.addItemId(offer.itemId); + // TODO + //if (Item::items[offer.itemId].classification > 0) { + // msg.addByte(0); + //} + + if (offer.type == MARKETACTION_BUY) { + msg.add(0x01); + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.add(offer.amount); + msg.add(offer.price); + msg.addString(offer.playerName); + msg.add(0x00); + } + else { + msg.add(0x00); + msg.add(0x01); + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.add(offer.amount); + msg.add(offer.price); + msg.addString(offer.playerName); + } + + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketBrowseOwnOffers(const MarketOfferList& buyOffers, const MarketOfferList& sellOffers) +{ + NetworkMessage msg; + msg.addByte(0xF9); + msg.addByte(MARKETREQUEST_OWN_OFFERS); + + msg.add(buyOffers.size()); + for (const MarketOffer& offer : buyOffers) { + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.addItemId(offer.itemId); + // TODO + //if (Item::items[offer.itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(offer.amount); + msg.add(offer.price); + } + + msg.add(sellOffers.size()); + for (const MarketOffer& offer : sellOffers) { + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.addItemId(offer.itemId); + // TODO + //if (Item::items[offer.itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(offer.amount); + msg.add(offer.price); + } + + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketCancelOffer(const MarketOfferEx& offer) +{ + NetworkMessage msg; + msg.addByte(0xF9); + msg.addByte(MARKETREQUEST_OWN_OFFERS); + + if (offer.type == MARKETACTION_BUY) { + msg.add(0x01); + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.addItemId(offer.itemId); + // TODO + //if (Item::items[offer.itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(offer.amount); + msg.add(offer.price); + msg.add(0x00); + } + else { + msg.add(0x00); + msg.add(0x01); + msg.add(offer.timestamp); + msg.add(offer.counter); + msg.addItemId(offer.itemId); + // TODO + //if (Item::items[offer.itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(offer.amount); + msg.add(offer.price); + } + + writeToOutputBuffer(msg); +} + +void ProtocolGame::sendMarketBrowseOwnHistory(const HistoryMarketOfferList& buyOffers, const HistoryMarketOfferList& sellOffers) +{ + uint32_t i = 0; + std::map counterMap; + uint32_t buyOffersToSend = std::min(buyOffers.size(), 810 + std::max(0, 810 - sellOffers.size())); + uint32_t sellOffersToSend = std::min(sellOffers.size(), 810 + std::max(0, 810 - buyOffers.size())); + + NetworkMessage msg; + msg.addByte(0xF9); + msg.addByte(MARKETREQUEST_OWN_HISTORY); + + msg.add(buyOffersToSend); + for (auto it = buyOffers.begin(); i < buyOffersToSend; ++it, ++i) { + msg.add(it->timestamp); + msg.add(counterMap[it->timestamp]++); + msg.addItemId(it->itemId); + // TODO + //if (Item::items[it->itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(it->amount); + msg.add(it->price); + msg.addByte(it->state); + } + + counterMap.clear(); + i = 0; + + msg.add(sellOffersToSend); + for (auto it = sellOffers.begin(); i < sellOffersToSend; ++it, ++i) { + msg.add(it->timestamp); + msg.add(counterMap[it->timestamp]++); + msg.addItemId(it->itemId); + // TODO + //if (Item::items[it->itemId].classification > 0) { + // msg.addByte(0); + //} + msg.add(it->amount); + msg.add(it->price); + msg.addByte(it->state); + } + + writeToOutputBuffer(msg); +} + void ProtocolGame::sendQuestLog() { NetworkMessage msg; diff --git a/src/protocolgame.h b/src/protocolgame.h index 03a2baa..c03bfbd 100644 --- a/src/protocolgame.h +++ b/src/protocolgame.h @@ -115,6 +115,13 @@ class ProtocolGame final : public Protocol void parseQuestLine(NetworkMessage& msg); + //market methods + void parseMarketLeave(); + void parseMarketBrowse(NetworkMessage& msg); + void parseMarketCreateOffer(NetworkMessage& msg); + void parseMarketCancelOffer(NetworkMessage& msg); + void parseMarketAcceptOffer(NetworkMessage& msg); + void parseInviteToParty(NetworkMessage& msg); void parseJoinParty(NetworkMessage& msg); void parseRevokePartyInvite(NetworkMessage& msg); @@ -160,6 +167,13 @@ class ProtocolGame final : public Protocol void sendCreatureTurn(const Creature* creature, uint32_t stackpos); void sendCreatureSay(const Creature* creature, SpeakClasses type, const std::string& text, const Position* pos = nullptr); + void sendMarketEnter(uint32_t depotId); + void sendMarketLeave(); + void sendMarketBrowseItem(uint16_t itemId, const MarketOfferList& buyOffers, const MarketOfferList& sellOffers); + void sendMarketAcceptOffer(const MarketOfferEx& offer); + void sendMarketBrowseOwnOffers(const MarketOfferList& buyOffers, const MarketOfferList& sellOffers); + void sendMarketCancelOffer(const MarketOfferEx& offer); + void sendMarketBrowseOwnHistory(const HistoryMarketOfferList& buyOffers, const HistoryMarketOfferList& sellOffers); void sendQuestLog(); void sendQuestLine(const Quest* quest); diff --git a/src/storeinbox.cpp b/src/storeinbox.cpp new file mode 100644 index 0000000..33e9a4b --- /dev/null +++ b/src/storeinbox.cpp @@ -0,0 +1,51 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#include "otpch.h" + +#include "storeinbox.h" + +StoreInbox::StoreInbox(uint16_t type) : Container(type, 20, true, true) {} + +ReturnValue StoreInbox::queryAdd(int32_t, const Thing& thing, uint32_t, uint32_t flags, Creature*) const +{ + const Item* item = thing.getItem(); + if (!item) { + return RETURNVALUE_NOTPOSSIBLE; + } + + if (item == this) { + return RETURNVALUE_THISISIMPOSSIBLE; + } + + if (!item->isPickupable()) { + return RETURNVALUE_CANNOTPICKUP; + } + + if (!hasBitSet(FLAG_NOLIMIT, flags)) { + if (!item->isStoreItem()) { + return RETURNVALUE_CANNOTMOVEITEMISNOTSTOREITEM; + } + + const Container* container = item->getContainer(); + if (container && !container->empty()) { + return RETURNVALUE_ITEMCANNOTBEMOVEDTHERE; + } + } + + return RETURNVALUE_NOERROR; +} + +void StoreInbox::postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t) +{ + if (parent) { + parent->postAddNotification(thing, oldParent, index, LINK_TOPPARENT); + } +} + +void StoreInbox::postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t) +{ + if (parent) { + parent->postRemoveNotification(thing, newParent, index, LINK_TOPPARENT); + } +} diff --git a/src/storeinbox.h b/src/storeinbox.h new file mode 100644 index 0000000..5d8efc4 --- /dev/null +++ b/src/storeinbox.h @@ -0,0 +1,33 @@ +// Copyright 2022 The Forgotten Server Authors. All rights reserved. +// Use of this source code is governed by the GPL-2.0 License that can be found in the LICENSE file. + +#ifndef FS_STOREINBOX_H +#define FS_STOREINBOX_H + +#include "container.h" + +class StoreInbox final : public Container +{ +public: + explicit StoreInbox(uint16_t type); + + StoreInbox* getStoreInbox() override { + return this; + } + const StoreInbox* getStoreInbox() const override { + return this; + } + + //cylinder implementations + ReturnValue queryAdd(int32_t index, const Thing& thing, uint32_t count, + uint32_t flags, Creature* actor = nullptr) const override; + + void postAddNotification(Thing* thing, const Cylinder* oldParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + void postRemoveNotification(Thing* thing, const Cylinder* newParent, int32_t index, cylinderlink_t link = LINK_OWNER) override; + + bool canRemove() const override { + return false; + } +}; + +#endif // FS_STOREINBOX_H diff --git a/src/tools.h b/src/tools.h index f4c71f2..134367d 100644 --- a/src/tools.h +++ b/src/tools.h @@ -48,7 +48,7 @@ typedef std::vector IntegerVec; StringVec explodeString(const std::string& inString, const std::string& separator, int32_t limit = -1); IntegerVec vectorAtoi(const StringVec& stringVector); -inline bool hasBitSet(uint32_t flag, uint32_t flags) { +constexpr bool hasBitSet(uint32_t flag, uint32_t flags) { return (flags & flag) != 0; } diff --git a/vc14/theforgottenserver.vcxproj b/vc14/theforgottenserver.vcxproj index b1c4e61..710214b 100644 --- a/vc14/theforgottenserver.vcxproj +++ b/vc14/theforgottenserver.vcxproj @@ -159,6 +159,7 @@ + @@ -168,6 +169,7 @@ + @@ -218,6 +220,7 @@ + @@ -240,6 +243,7 @@ + @@ -250,6 +254,7 @@ + @@ -297,6 +302,7 @@ +