From ca675fdb670805de23090980361eaf2aede27577 Mon Sep 17 00:00:00 2001 From: JamDog Date: Sat, 31 Jan 2009 13:24:41 +0000 Subject: [PATCH] Added room login trig types --Jamdog --- changelog | 2 + doc/UnixShellAdminGuide.odt | Bin 73062 -> 76237 bytes src/constants.c | 76 +++++++------- src/dg_scripts.h | 29 +++--- src/dg_triggers.c | 27 ++++- src/interpreter.c | 195 ++++++++++++++++++------------------ 6 files changed, 178 insertions(+), 151 deletions(-) diff --git a/changelog b/changelog index 36941ca..155e6cf 100644 --- a/changelog +++ b/changelog @@ -35,6 +35,8 @@ export (QQ's a zone into a tarball)t Xlist (mlist, olist, rlist, zlist, slist, tlist, qlist) (lots of major bugfixes too) tbaMUD 3.59 +[Jan 31 2009] - Jamdog + Added room login trig types, to catch players logging in to a particular room [Jan 29 2009] - Rumble Corrected zcheck MAX_OBJ_GOLD_ALLOWED to compare against Val 0, not Val 1. (thanks Tails) Created new MAX_OBJ_GOLD_ALLOWED define for zcheck. (thanks Tails) diff --git a/doc/UnixShellAdminGuide.odt b/doc/UnixShellAdminGuide.odt index f5c50b236d246c15325483adbad536f623b76003..1768cec43de609a513e71b88d023a16fcf93e7fd 100755 GIT binary patch delta 24730 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 delta 21597 zcmX`Sb9CQL&^{cyQDd{QoqS`nv6IHO)qG;xX>8lJZKtu(pfP^EpZ9s*-Lq$Bui4!* zf6eZhxn^ns>Zl#+i=r$f6b9IT4X%JE{)-IczbTOzoHX7W<3BMzLG^!-cyQ801aS2K z)pGpLtO3sTzdE-6f6vMP?s*62{SRy4h4|b3KT6g^`jw2%# z{nSXpmAZ6MlrFYfS3ey-cYN1B5+>xp{*pw-=4)bH&Uuw|Xaz%{hl_Q`Kb`jo@HF3y z1}b`7ElGFG@v^j9d!;x~X;A&R@-0RA{_%GTc&*?fLQMRjosG-42}GY2A4~jc0sqml zTjb;IiVk~KG$Mkg-#)p!YigqJCE)&7BXw;#l|97=UBcP>e5TCt;XF)Ge8V@&*76%Vui1Y9c-h*_$aXWaV6fZI3-D#a9C0J?2r8Xc6b-5c>RYCasWqGBG*^6m zX3J(KM#f+FoZzc~-1@VlfePJ(jZ?`r)1(%xyXcdox-bl6r zPe7r$IBaALVKGew%SIl5k-Mi;&-(T7QhUvw5KCU8a;)|lO@E%4Sg^1Wm3t#5*w(p} z6>`^}Uw)1Ewd>duzVyj|GZ)IPWa*6K@LKMCZT+Z0NDKswvU9C)a;4jT!+FdkD-`Z< z`>MV8OrBsV@)Q>4Fa(=b?32ZgT$QZ%ITK54H$~&Fxvptrr;BZe!@@Nr=NDP)RQzt% z`;#dQeK4xUJgrtc%LK!EGQlv{bTyag?1?lw`7$q@uOU3g$JvN_IAixAE0OD0lWaX) z##kUr?b8d8mfmUSxPbioP0eoZppFzE-_f8F>`QBLHa}RSg0Yd@8b^BoJ=V8%XYg_U zC0J%W5$#^Pe~-q74S*e{5}-TT*E#aubx-HK?F)}TN8ebc+C20J>vsi3!rE1bGm(9L zc+dnnTJHxz(bFNDz9H>&(D`dyv_Kp9pV`A#OJV_V7^)dU9U*4o6-7BUM7){d%s$hz z#6~KbldYz97Cw&9rT9LSW(ezc{#g!05}TgLQN;GqvHct++cKjGSg`(*wtmTc`_Bbj z8n!-vGl$TSFyI>$-YE$DKXm;t+ij@!X@sPI^3MI3t7#_&Ye66bA7mn)2?`Fl%Xbtw z`2_~lFSeyIeCw^X5r~1CpX|-Zwa~@x2S*4b#PDx zxcgv?+q@u5P%w6Itb?Rj88T7kYO`g6fQYR(i0YEf(VADb+=!=^%xdnC6xS_B%-FserL7jyWk!( z`hMG$`g>)lpZJLf%mT!hs5Me1@b`K2D=2>9w!tsb7G{_gmwjhMRLYU&i2U=a=DL9W zP_LFE_F)At4&|iY3YffGh9ISU^N8j(9E(H;!_GyXz@CAJ6O@&52=8mM!nk3dSZlp!|u7zhi15>2Wukta7@Kvh0o1x zY1!vG}g_O{-hEwU{J8?2E29RWfKmo)^!iDWO92MN#6QaJS4 zmlmw;v4dO*vjAK$H|Efs*dC6v@o)ILw!shWRf2-^)Q+X4P85D2lx%a zpIP+e4A><=+1eIEsEz?`@?~bnAzVN5K+$S~7!%nJrx`qT%BX#;;sKx@GT5Tsl6;+5 zM8_XXIlg%eLcpxNG}M_Fq6@7;I^sG7f)N`8G5^>}Lsp{mLGOk-J!!28<02(TJ8Uvo z=FRla#h7#!#$Ta?1@gpQr?Af-E9po`BscV9QEKqe*$l08keRN9x42g(9cfz+y|HPn zdzq+D-=y#dc&|w_p#k1qI&QF6fi7N$T&mYv_*O$Jd^HX{P33q^#%qDCn5Z2w>IxHM zY0&#D=MTfsW_`Yc%k`0E^aeA~20inyv-+7GrW%U^%};#<-0l`%Vs@aVuIO!DLJT_c@TnFb@~;V&XZ& zzsHog=K34ak$I-C^>A!&!*2uHFrW-OtcJO7^EipLdo#BcRuT%FQ6z!Ea=pKY7rqrY zt68qZ?BIi&kL3^2?;=9J{vl&Q4XP@^3UdzvRs+K%PYegTJ8N`@D>L8N3+~tVARgoa z1KDE9+}L)9L|}lI)=8czc;H*-)$=6AT;~oOsL{z4{VeTu-f4kml)W`m#|eR@<^EbnMdIhn z%x5a9yxBd{)@Yv(C^HulR5k2rFC_{6Co6Ca(gx~B88CRSUXV&rT$7<5F72-GJAXMm zB>tJ3c-8$@*b%Kz<2)<<_z&%pu=jBMC;srAe;@XAcbJt%`G*D$57m0lO6T;v6^2Gn z8yLn`OkC1_#Y@h-A7Mu5 zgaxYAj6l}3Ig3qQ`6vWR=XJHVTb!PXGwU|Sr}BN4-;>#jR!(M5rJ)T`JN{bWdE7wF zs6tME`(w{_vo!^#s5rJDk$#AGlN)pW({AbOp@5j*S+j#!qlpy3>g4MBDrrXUOi&d!7+b+){@$w*PcW@smo*FI1h z!_(&~^A$!apX6x$5cBr8(N%FWQws5THa*%4XU0kwcYW~0xy2NnH0z|< zpfsqWflse!-?J-M_e&gnCc+j=J4rFcv0;qKyVp2H{Zob zhYkH=aVm+_Zid!)zllPWSiON^%yUsSB<0K6m1wG)Xd-vt&R&ePch8x2Hm8=yIs z{h=N9?U_5@^M+=RX1&c`j+dlc3l(rq#WygxjuyztvqaIh;=Nz_yS2UOE;D2OdTMiV zJmp=9Xg1)b5Y>haE5U9=+|xM$-kAscEMQdN5^H;>RYI@aoHjXAcfKcgKp{lb?^C>q z6G;NqOiSSF=jlq9w(`3(9S!gd8A`XE6l3Q|v+k==0EWKQL)TaiH#B9YAss2c*%-@ntY1r&w$e>{{-=@;b-xZ zBzmhHd+j#TQ8GnRay#6Dwj1{&&26!I$uXLqAdn_$5oZBrQw^);C5BN`175{3f`+Zw zvcs%G+>(Ti>jwNoHg6#qlJ~K6qQbhEG4q@X>K{Gn0yXaNhcjuU7LqS6T-D^!>c&FL zD+1Dxcs`DXlCl!6wtzphN%t|joA zgiM%^UF;Cz^b>?M><}len)&nBNGtkarK=!udq`a9_+bt-Fc6*C4{VaidIV;t^BX%q zoyWsxkcfF_0<~@QoU3?WCA7uTW!n6lsG9MLkJ-7thU*gB=+?5V4$nlF9Xm80;!_UY zX508PH1|<4DKF+@nhPTPVHjM7c^T3KZ5BAe%EiepCWY8Kr*c#0VPFw?jD_JlN+k_% z`OtY0hO&r8WY$ZPw43x5C5{;E!+l^Vh49*S{UVj(0pvLG@2h*x12px(%#MbdgAJrg z&sGc3YL;>5K1#q@y2@oTL- znex{v1a8o_$v6deqG#xn!U8tBD@m%DaykRi!S_LYBsLL^I@qXY)P141u;Ywp6Brd3 zcD8+NMfy%HO=7gK4E=6IVE&0TW&w03aD?co@<8IS4H=)6U5#6d!nTjKtpQ8{j&u%yx=a=f2fEIUD+2m%vtAR)_F zNdhV)JcVtpi@P2Xn;t)`sEqB$#?pR~u6f7`o|{ZsTwO}M=4T#lpV|qbdy)8S$wdp= z&OppIaEEWz^q0IR9mbvUJ;#SP+uuzAIJG;&3;V03*9Ko~$QObZk-{#lLnerZpg6>a z)@^2z%0nLD^QOZ$Yl=YzX|zOtn8lQ+!hw{h0`m=`_IF_ysn0>0dC0B|XCFya@EIXW z*FkwKS!okFh{ea7EVv>VsPbasEIlGRzBOzO?e(|f^|xMjbk8T@Ru%-YdTb}8QA6h> zkHRcEEQ|m@7LalSa}38o^;l?nWjdBA2YJ*KjT-{%pX2kK*bMh$4~B*?rad`y4j@qV zJ53sDyf(Ax7hy}8N=1X*Je-*#vKYdzQ?lXQ&;-%kjV#G*R7KBKTD^Y`qV>krD!Jwu zy$!goK&1hEE%^0ehTzV29K7!db2;T{4SKxljc5tTYt zce7g;%@xxXbDkjs4-vLYmW|THyg-1hsrIm8xX)Li=x>@$#w_81dT*5*7V6>MK`@qN z+{!l-RS+Ab;0TzsPlSVZR$2_}lP6WOf^qJw{(An^0{57dxJ(C!xU%99T@VHrfjl`+ zo~Av9<&+j9B&QzV?$)GMAyi80jb&G*+zb7!VT!_w7u2(rVdFzku_aKBs*QHlT#x8|(}Zg!l05;!PO!(hb< zn0du%VV`~pGkJ>?P`!nxga9=8u!eREA!#3)LcOxeG+EzTZLbuI;zuj-wTHA(QO1gE z3*}VdWNuA%r2VM+=CXwAsd{83vQx$J{t63o;^IX`rDKCC9iT(d&S2N&6W18oWA?#w z$;|{5AN4s0Pnn;nJ6ak+gQ;cQ5)9zKFBmD^zfxm|Vo@8Iq{y>WDgwFe9$IwKDJr*nhRSl{^MPq#RXF(h-XB*&{x!SU7NmlxJl(^L+y zdC4}co3xdch#OX8rWZdB2Y)V958-%*$_P|S=OiI1&9X(r> zho3sRo%Qri4`k4265*{1#w)`mLDC{^$vba0dU94g1o8!AsBE743$rdXsim-HXN!mh ztT4ZCs>}QFQE8llhroEz>S7pS*A`1KJR7mO;oJt9LWfk~<$zsK;m<56Lz@|IX3bxG zJFwZ|SI{y~yLMsapi|uNdNPqBwbJiS>pVzW>&o^6QIxtxldgUPx4MjM*yHUm%s=v= zf=FDNoP|zB5JyFPAuOme&ut>=nV%)ER_w8<&pD`=9lT3*>)J((snH%t=1XTtnoDXWR*NsG z$E{AcPx*fk2W5H$Pm+6ON=yl86nNhaYaGtrBOh*k)PZi2OkJc%>Y}ao3lv6g+W`!J z%bGs}UCdZs*w{mfdeXSTKS;3J-|b4^5C6fYCN$;w7tlEU|Vo{tG5&<<&4_$$1a1ofnR2oiGe=|J!c{k}F^A)RBy zU!F}xqBjSA$O(3XAmT0Vh*YQZ$34*8=-`;O9PrIz(M~v+J)FsG^TX@)eMS%;xzY4% z_TQ$_(Jz6Kwn|T#B^&-leRM6neBnQW{9I-)`5MU{F&{p_YMT&?=6mVKa#ZpF@fwT zOvT#a*A=CW)GX4oQsVoz1tGa_gO>i<-~L73qDE)eRjZh-4Jht9*nN9#$%+Oh5p61P zp%cwIzyaEL|3gxLsjrR+%~t5Ww=|YJNdO7s%s=Nr$-I0CeFyp7!Vn7<<^mY(_le8% zNoulqH01C;EJ86(Uep+)1@cxAQftyM3t=4`!A$zV<8sk?>CdJn!=Kv6DXukOI>l*?2Mvi#5W4D2tBiZcBY^t zKu^*^(p5iTxG+!dG(UgE3XZE_1ey@>u_?yLN-n;7zOjpKB=tYbFv!PulNG%Fr1+|l z!0s@auNWt_pP&qwP})RNson3RXP_f(x@Je*?K=7 z8bXDn{{Zo#S;4Y!q{D%iBjHaGZOEveR^nQv&VrRTb8$GkT~yEpeHf<=8Q^{juZSx; z8@t}J*(~bX30 zy@$0Jjit$2C2Y`+g1>aXGXM`VQ5$Q7`aJXLx-xoQV0VC_R((ZLr9HSvpHL1O;{3w5 zZ`&diWfD;hW8~6J2zKGbE%;Iore__TCsj@TI4v_0Pal4Hj_RoJ#W%qT+^Y2=KSnC|RZmueV73!#=oJ+V`q+3B-1hz4?^%k{5pWc; zlZvG^71Dr^JP(&)1saqp+y#jKD76IB+T%cTTJV*a*NavC3hAk#p{&hWl(Q87N~wm!$Fjaa3dNr^0#FVTY(+=lv3tGA2&f?k ziphGjvxpoE3j-hPTS!dMiyi_;9FT`jigzaqx(208G2Ks&jJ2R8)8!36_^tdmtru~YTX{Z2 zDeKj}0n+baZGcH1Kl8oH(<{R6MV5P&!Zi|4Cr4XOKURz9EHhKbyNusCJ-GYap4Lv> zGq?*D0LFEJ;(gq;%xcpm15x$c1=|4Mo%=doT#R(bn-0}u_}XP}i;Y(qjyXo#hnbhy zVC%P#9O_A=x;ZzVjK-B(g+zQ{gG;9&m#i|u=m$+(R6cH*h zjMTNcoY><*7Q4b}jko=MtZ8A1L;rwG?*)?*AO_4zFjK1X?p~^jip7FwyLITng94#F zLW(&GG2&@f&E~=&F-q=dyak&@eV3F*MZm)in!J`SGVdr`HDlv(;i9kRT#Yh$RWJV# zu~AgNc$Tgg)!?onl<%UeX6X~>p)<~6d%7yjS#?{vxATO(3|N7+YeHEJhJ1q%TOv^a zw3u0H*7YcEeS09aWtct1%IzO@jzO>n_Dc-JGo~{Pfd`_1L6ZgF_U{5vE7iuEzKG}K zp0lw1n|Yk}*2nxB2`DiM-_w;=ol<6n3^Y)0UI^Bp_4K(q=sKt^d7U5EtZ(M2|8+vY z<9{CZ|6T>2bvqe8*PHrZSw2}f0A~RK|IgSsH{Wv9+)4%}O#a=rk&Mh#-R**UygOe& z4G;Fc;VKZMo}@kk`RZ-rOr_#<7S3}rE{WaKP1-koK)*Hz+ z8&Wmc`&m_=O@8&%YMu9~;_uthlbIEwgqq<21&d@7DL(lmJLPd76by)F;B~QlIJucM zX0LuUcsX>l3|E3tKqI`$g9nHrZxkrJcH)8dTOW-x-*XBW3a#XZ8+=JeQ?!Ju2LPeeSvc%KXmlf)3I_TXgHL z*mfB6Tp9*{qXx@HQmG+#4qk(r>k?>&U;V5`7j6tR3$*Kz$@J<14rz5Y{iX>{7kDTCOWReNK2z9`&~S8=ebZZD=gx|;gD-0q5sM>g*xm&2r){h(vh!>ZfU&u zC!A4jlQ|S&EKEOEu;zcjYvhzns%qfg)M1al65WeW*JxOF0&aKfQw<$A!%Bn|0*5p8 z>Q@7u>TQdoSOlBv#h1YZu{l^ukG}8!6%RvWl8oF&NTGv#I^TS62G4vUk~jSx z9n5$nqTz6Egk0cJf5ln8Y8w2zwe^|-L-9b96ngrCu0$e8(6<~>JQB|j+ zLM0*c5k{$?_&V%q`~{ERjAh|#pEHFEU3!W?yQ;RoC_q@>dsDpm;L3p>fIC=ZJ~Bes zA~!9kTqgsjW6(725|Cb6n5#*zemZX`dk+(Ud0YgpU=ubn4t{CVKi@HQI%LlRDsGh3 zEI(|Dg%DwH`gN-F!^u6|?=Lx#r`LNrXdYK!_E<#kc0jk@u--x0tASOc_SGWP$}ChT z!5T7g9ykhtO?sy8-Bfm^jqm>Jw(xL(Lx-6ArImgx?FPzieV|Cy`JgD2>THdDXTKuR zzWQf-@7tJ12ehj62E<_9)C<0RfSoamu?zZjUG8adogk|gL@Hxl(6VJry~G>IMHw zZ(szn+0x#-pA+nBGd6=msm=59F^l` zQU6E8uPXiGea~Qob8VAqFz_-p6H?>MFD-cRpIZV-GfvE-Ty5Xazrmr7=&iLo%2RsC z`T&2LFJQSMiJ`V_@?hx)8}UTaD!E`1<9{fB__KBhl|j>ISL)P%jAgi&333*MG9vpj zJNTx1xft7&Ua=uQLM=`?`+3Rg8Zl5zHJxj?3G;P8Y$V!Ts=x5rgCei3m2wc#`_V6K zIdUMUeuMEmbbg>EEtm0sW>ub<8@;F^c>q78HX%Whb=lWxeur9XF2*ZfELH=LJ4k_}HP37E4S^Q>vku8Kfa`##Em;XqL#$=f9rSjPpztl# z5F^y$%gGrPXGPJaRWpY-9hktgHU>yR2u{Ea1@u8if6^JRdL#4sC6}tc9|b1F!48l_zAOiL9F6|6 z@HnWBt^6M8XKK~y?-dKN*&W6;FH$&jsl~eL<}qlzenUaO+_;oU>@CfRHP+4dZnJu< ziu9_`yS~SNLeJ)+gX6kn`tDT1+gQ7%G39ZcxaAbuwXJcpK9zEO=hQNStIE<-NL|F= z)75G{fp@3_Fmrp7iwlpDCItX0SJPDt%{RmGV@AETXu&C}@dApbbo6N54$OZ2b- zNwIAcqvKz+e5HkXmbAjvm>BdqSqp~L%Igr;#?p+X!O~2Vi}iSQX++wY5V^qS)@W!Q zU8;rxBbV-Rw8j6pLD4>HN$>~iEe*WJ;p+NACwfDO#2<6T9RF zZ;J=hApHfeR@e8v>Ep)uoe+A55KC!?dvHSZ0aq;3sk#@jX)l=B<$80i(w2&8HxNwxPx1 z&Eb)!4N3C2n!>e$O}u#k?wuhma$p#QjWBKQH7a(sDKPrN-{1HJcx(3z&5m*Zd{DTR z$bpo)a=XgxSM)96PRf~mgln!G2!LIa@l8G;*3Gez3zJX8tS+1VWZ1$iP`Lqyt<~GC zv9emZ19k*$2>3RA1N~NeX_U`=l~L*Dv}LX$ciqZM2#Z}k4{yK;1n6;kE`~Ruz(_|* zQ)vxrJstwA*vP*C`_SetxJYgKgBqu7%~(sne&*W#NHR>B^~5lh66m?>O2*zOM3Nbt zXAn>OixsOZ12(+dK<(XQhl^&UJ>0)Ul2J^L_$)h9)h)Yb?h-`_U0(SEwf9NzP?g7% zOQ`e?JUm(UnEBSjRoC|z!Yu=fl5(_5BP6ss3l^-CoiO1A=yfX|aI;|jQmrzT*!=gz4!Pv4OvVO~6uiMjTwdoCMHdJ6mL)lNtc9XVYOhPhD$46Z)_CxP zlzV_H2pY7HYXu%KuF0{Mb<%$iaJlTJwlv?TL$Fg? z`IVtMlZ$|!clOB2S2`i?&Sj4{zuE>SYheqr@2#nn!J88dnwWlT5VZ$uW8E1ekF!YQ z9p4Fbv{{HJz5g4&DL+MhB-jI(moDz#=i^5&KVDlYzbWkv+SdtLa{Wqu=-J1O)9Zhh zlr0B}sDcJ%s0>%h9ItZN?b(u{#;eg!XS!?M+Ss|GK$H1%g9S%zLiR6JwNWZK$Mk@o z*@)=mAxWL*`|EF(mFhl%2TY6a+hsBIiHs(aDwq{M zrEG4<#gjYi2UW-68p7aZ3}f1N4BU;`;n%FS|D%u;tJ z70Ul2mfvMUTv}a0E=&U}Qn3^}=`Z6-FQj$NV|U3dM^Q6qxnw_VuP}rZw?BebFYN?G z`3n4FgA=3F_e7fy2k{V`8a%UL>**E^vEPe0iMqB%UgV06kWc9i z;(7^(2f;8<$8|5!INYP`{4&<3DwqdKl5xStn@C0|kAs{fDAd7GgG?y8!M=#xU`&xZ zmP0$LjZ=R&?lm3#$LMrAQ9+U&NmX;3s*kxJFe)wuA?G%P%BL)^YL`|}LJ~J~#cwKv za{lz>VE%3eeZU5CIyQ&y_-s22l_eK+wEJcGi3?34kn?CQ3rcyUKtu z)Fd9u$o)j)GZ8%Cw3Ao**1k{l1hSN56xuz~hG4YM@2&o1(xMW<=JCLSR=q+pJ{)JF zth8gHQs9j$4~I74a%Y^aT$TW!#A{V^C;A^~+snX)VNly5g{f3q8?P8-zK!pIZZ9A8g&usAi+;4L&;*AF5Ja9?oXi;{v>1LYdSmFycTFpW+xNkCH17 zyN@XG%E4(-y*|`0IYM*MF4U$gftH0$t+-nU7j3Ke@h=&y=pxkj2?Hf$@aCP zbUDam6P$Tvej9oHVIjPS(rac3hAA#J$&;>g0Rg+G;$^q;AdLCuFfx2dcf+JJh$43f zE#1U^REaV9Kf=oLuE#)S>;M|p@^8~3Y1tuR)o^+=0d{#oJKoJcFj`mX3Ur6gfW%A{ zY9=L2?_Je^EVIhfsarqm+>R84Jr73D9KWAp9$`$0ht>0pEIAOdcQ-p|U0#+;>~A1% z1+ID8*r-@V?DmJ4H#|LR7YtrGSR6+MRD)97_u;k#erdXlSVO=Z1o64(S@7q~hk(_^!t5j4Ht(hI6CCx-(S!ZdLxiimIvS~PTgbb@2gFb>+ zKOt<98(sIw@hr5L$(HLx*{5$_6v zKu?$A3wC>3Z@vj6lqZWxoeQ53W?(E1I1@FRvw5S_T@@7(v9PM_usKVQ^(JB^sTT7s zLsKPLBWUntghsVQ=#bNpNPUkRdl+l`R7|6>Nl-67V+W8X!2(64XjCno&|wcIl}jK- zS2%{`kS!;`!ZZgHI+!%>YkSg5qGVdh(M!oVt-3u+8ki3J@2LIcJ6q)}BmD0J^C9v< z`D2tn$E~?<^Wjvw4n#)BOH_A67^#{6czx&#wzbuP^F~@&lGjLxwx7j)LvBHh)hEC* zUQK6lTmr(-lxPw$94ILZ}3H8B$VzRd{} z(oIsNQku6iQ@cb&*$Tb*1<-SZkEc{4FTi!wd4oQ

W@)AkWr63M17F&|MbNf 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 E1874S6951J diff --git a/src/constants.c b/src/constants.c index 25f8b57..a346db0 100644 --- a/src/constants.c +++ b/src/constants.c @@ -1,14 +1,14 @@ /** * @file constants.c * Numeric and string contants used by the MUD. -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. -* -* All rights reserved. See license for complete information. -* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University -* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. -* +* +* All rights reserved. See license for complete information. +* Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University +* CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991. +* * @todo Come up with a standard for descriptive arrays. Either all end with * newlines or all of them don not. */ @@ -21,7 +21,7 @@ /** Current tbaMUD version. * @todo defined with _TBAMUD so we don't have multiple constants to change. - * @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word + * @todo cpp_extern isn't needed here (or anywhere) as the extern reserved word * works correctly with C compilers (at least in my Experience) * Jeremy Osborne 1/28/2008 */ cpp_extern const char *tbamud_version = "tbaMUD 3.58"; @@ -29,8 +29,8 @@ cpp_extern const char *tbamud_version = "tbaMUD 3.58"; /* strings corresponding to ordinals/bitvectors in structs.h */ /* (Note: strings for class definitions in class.c instead of here) */ -/** Description of cardinal directions. - * @pre Must be in the same order as the defines. +/** Description of cardinal directions. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *dirs[] = { @@ -40,11 +40,11 @@ const char *dirs[] = "west", "up", "down", - "\n" + "\n" }; /** Room flag descriptions. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *room_bits[] = { "DARK", @@ -64,11 +64,11 @@ const char *room_bits[] = { "OLC", "*", /* The BFS Mark. */ "WORLDMAP", - "\n" + "\n" }; /** Exit bits for doors. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *exit_bits[] = { "DOOR", @@ -79,7 +79,7 @@ const char *exit_bits[] = { }; /** Description of the room sector type. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *sector_types[] = { "Inside", @@ -96,7 +96,7 @@ const char *sector_types[] = { }; /** PC and NPC sex. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *genders[] = { @@ -107,7 +107,7 @@ const char *genders[] = }; /** Character positions. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *position_types[] = { "Dead", @@ -123,7 +123,7 @@ const char *position_types[] = { }; /** Player flags. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *player_bits[] = { "KILLER", @@ -152,7 +152,7 @@ const char *player_bits[] = { }; /** Mob action flags. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *action_bits[] = { "SPEC", @@ -178,7 +178,7 @@ const char *action_bits[] = { }; /** PC Preference flags. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *preference_bits[] = { "BRIEF", @@ -217,7 +217,7 @@ const char *preference_bits[] = { }; /** Affected bits. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *affected_bits[] = { @@ -248,7 +248,7 @@ const char *affected_bits[] = }; /** Connection type descriptions. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *connected_types[] = { "Playing", @@ -284,7 +284,7 @@ const char *connected_types[] = { }; /** Describes the position in the equipment listing. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Not used in sprinttype() so no \n. */ const char *wear_where[] = { " ", @@ -308,7 +308,7 @@ const char *wear_where[] = { }; /* Describes where an item can be worn. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *equipment_types[] = { "Used as light", @@ -333,7 +333,7 @@ const char *equipment_types[] = { }; /** Describes the type of object. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *item_types[] = { "UNDEFINED", @@ -364,7 +364,7 @@ const char *item_types[] = { }; /** Describes the wear flags set on an item. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *wear_bits[] = { "TAKE", @@ -386,7 +386,7 @@ const char *wear_bits[] = { }; /** Describes the extra flags applied to an item. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *extra_bits[] = { "GLOW", @@ -411,7 +411,7 @@ const char *extra_bits[] = { }; /** Describes the apply types. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *apply_types[] = { "NONE", @@ -443,7 +443,7 @@ const char *apply_types[] = { }; /** Describes the closure mechanism for a container. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *container_bits[] = { "CLOSEABLE", @@ -454,7 +454,7 @@ const char *container_bits[] = { }; /** Describes the liquid description. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *drinks[] = { @@ -478,7 +478,7 @@ const char *drinks[] = }; /** Describes a one word alias for each type of liquid. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *drinknames[] = { @@ -502,7 +502,7 @@ const char *drinknames[] = }; /** Define the effect of liquids on hunger, thirst, and drunkenness, in that - * order. See values.doc for more information. + * order. See values.doc for more information. * @pre Must be in the same order as the defines. */ int drink_aff[][3] = { {0, 1, 10}, @@ -524,7 +524,7 @@ int drink_aff[][3] = { }; /** Describes the color of the various drinks. - * @pre Must be in the same order as the defines. + * @pre Must be in the same order as the defines. * Must end array with a single newline. */ const char *color_liquid[] = { @@ -547,7 +547,7 @@ const char *color_liquid[] = "\n" }; -/** Used to describe the level of fullness of a drink container. Not used in +/** Used to describe the level of fullness of a drink container. Not used in * sprinttype() so no \n. */ const char *fullness[] = { @@ -877,17 +877,17 @@ const char *wtrig_types[] = { "Cast", "Leave", "Door", - "UNUSED", + "Login", "Time", "\n" }; -/** The names of the different channels that history is stored for. +/** The names of the different channels that history is stored for. * @todo Only referenced by do_history at the moment. Should be moved local * to that function. */ const char *history_types[] = { - "all", - "say", + "all", + "say", "gossip", "wiznet", "tell", @@ -895,7 +895,7 @@ const char *history_types[] = { "grats", "holler", "auction", - "\n" + "\n" }; /* --- End of constants arrays. --- */ diff --git a/src/dg_scripts.h b/src/dg_scripts.h index 4be8433..cbf73aa 100644 --- a/src/dg_scripts.h +++ b/src/dg_scripts.h @@ -1,16 +1,16 @@ /** * @file dg_scripts.h -* Header file for script structures, constants, and function prototypes for +* Header file for script structures, constants, and function prototypes for * dg_scripts.c -* +* * Part of the core tbaMUD source code distribution, which is a derivative * of, and continuation of, CircleMUD. -* +* * This source code, which was not part of the CircleMUD legacy code, -* was created by the following people: -* $Author: Mark A. Heilpern/egreen/Welcor $ -* $Date: 2004/10/11 12:07:00$ -* $Revision: 1.0.14 $ +* was created by the following people: +* $Author: Mark A. Heilpern/egreen/Welcor $ +* $Date: 2004/10/11 12:07:00$ +* $Revision: 1.0.14 $ */ #ifndef _DG_SCRIPTS_H_ #define _DG_SCRIPTS_H_ @@ -26,15 +26,15 @@ /* spells cast by objects and rooms use this level */ #define DG_SPELL_LEVEL 25 -/* Define this if you don't want wear/remove triggers to fire when a player +/* Define this if you don't want wear/remove triggers to fire when a player * is saved. */ #define NO_EXTRANEOUS_TRIGGERS /* %actor.room% behaviour : - * Until pl 7 %actor.room% returned a room vnum. Working with this number in - * scripts was unnecessarily hard, especially in those situations one needed + * Until pl 7 %actor.room% returned a room vnum. Working with this number in + * scripts was unnecessarily hard, especially in those situations one needed * the id of the room, the items in it, etc. As a result of this, the output - * has been changed (as of pl 8) to a room variable.i This means old scripts + * has been changed (as of pl 8) to a room variable.i This means old scripts * will need a minor adjustment; * * Before: @@ -105,8 +105,9 @@ #define WTRIG_CAST (1 << 15) /* spell cast in room */ #define WTRIG_LEAVE (1 << 16) /* character leaves the room */ #define WTRIG_DOOR (1 << 17) /* door manipulated in room */ - +#define WTRIG_LOGIN (1 << 18) /* character logs into MUD */ #define WTRIG_TIME (1 << 19) /* trigger based on game hour */ + /* obj command trigger types */ #define OCMD_EQUIP (1 << 0) /* obj must be in char's equip */ #define OCMD_INVEN (1 << 1) /* obj must be in char's inven */ @@ -120,7 +121,7 @@ #define TRIG_NEW 0 /* trigger starts from top */ #define TRIG_RESTART 1 /* trigger restarting */ -/* These are slightly off of PULSE_MOBILE so everything isnt happening at the +/* These are slightly off of PULSE_MOBILE so everything isnt happening at the * same time. */ #define PULSE_DG_SCRIPT (13 RL_SEC) @@ -260,6 +261,8 @@ void time_mtrigger(char_data *ch); void time_otrigger(obj_data *obj); void time_wtrigger(room_data *room); +int login_wtrigger(struct room_data *room, char_data *actor); + /* function prototypes from dg_scripts.c */ ACMD(do_attach) ; ACMD(do_detach); diff --git a/src/dg_triggers.c b/src/dg_triggers.c index 1ff8d14..467f50c 100644 --- a/src/dg_triggers.c +++ b/src/dg_triggers.c @@ -88,8 +88,8 @@ int is_substring(char *sub, char *string) return 0; } -/* Return 1 if str contains a word or phrase from wordlist. Phrases are in - * double quotes ("). if wrdlist is NULL, then return 1, if str is NULL, +/* Return 1 if str contains a word or phrase from wordlist. Phrases are in + * double quotes ("). if wrdlist is NULL, then return 1, if str is NULL, * return 0. */ int word_check(char *str, char *wordlist) { @@ -674,7 +674,7 @@ int get_otrigger(obj_data *obj, char_data *actor) if (TRIGGER_CHECK(t, OTRIG_GET) && (rand_number(1, 100) <= GET_TRIG_NARG(t))) { ADD_UID_VAR(buf, t, actor, "actor", 0); ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW); - /* Don't allow a get to take place, if the actor is killed (the mud + /* Don't allow a get to take place, if the actor is killed (the mud * would choke on obj_to_char) or the object is purged. */ if (DEAD(actor) || !obj) return 0; @@ -837,7 +837,7 @@ int give_otrigger(obj_data *obj, char_data *actor, char_data *victim) ADD_UID_VAR(buf, t, actor, "actor", 0); ADD_UID_VAR(buf, t, victim, "victim", 0); ret_val = script_driver(&obj, t, OBJ_TRIGGER, TRIG_NEW); - /* Don't allow a give to take place, if the object is purged or the + /* Don't allow a give to take place, if the object is purged or the * object is not carried by the giver. */ if (!obj || obj->carried_by != actor) return 0; @@ -1237,3 +1237,22 @@ void time_wtrigger(struct room_data *room) } } } + +int login_wtrigger(struct room_data *room, char_data *actor) +{ + trig_data *t; + char buf[MAX_INPUT_LENGTH]; + + if (!SCRIPT_CHECK(room, WTRIG_LOGIN)) + return 1; + + for (t = TRIGGERS(SCRIPT(room)); t; t = t->next) { + if (TRIGGER_CHECK(t, WTRIG_LOGIN) && + (rand_number(1, 100) <= GET_TRIG_NARG(t))) { + ADD_UID_VAR(buf, t, actor, "actor", 0); + return script_driver(&room, t, WLD_TRIGGER, TRIG_NEW); + } + } + + return 1; +} diff --git a/src/interpreter.c b/src/interpreter.c index b8baf54..e2f3001 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -51,12 +51,12 @@ int *cmd_sort_info = NULL; struct command_info *complete_cmd_info; -/* This is the Master Command List. You can put new commands in, take commands - * out, change the order they appear in, etc. You can adjust the "priority" +/* This is the Master Command List. You can put new commands in, take commands + * out, change the order they appear in, etc. You can adjust the "priority" * of commands simply by changing the order they appear in the command list. - * (For example, if you want "as" to mean "assist" instead of "ask", just put - * "assist" above "ask" in the Master Command List. In general, utility - * commands such as "at" should have high priority; infrequently used and + * (For example, if you want "as" to mean "assist" instead of "ask", just put + * "assist" above "ask" in the Master Command List. In general, utility + * commands such as "at" should have high priority; infrequently used and * dangerously destructive commands should have low priority. */ cpp_extern const struct command_info cmd_info[] = { @@ -333,61 +333,61 @@ cpp_extern const struct command_info cmd_info[] = { { "zcheck" , "zcheck" , POS_DEAD , do_zcheck , LVL_GOD, 0 }, { "zpurge" , "zpurge" , POS_DEAD , do_zpurge , LVL_BUILDER, 0 }, - { "\n", "zzzzzzz", 0, 0, 0, 0 } }; /* this must be last */ - - - /* Thanks to Melzaren for this change to allow DG Scripts to be attachable - *to player's while still disallowing them to manually use the DG-Commands. */ - const struct mob_script_command_t mob_script_commands[] = { + { "\n", "zzzzzzz", 0, 0, 0, 0 } }; /* this must be last */ + + + /* Thanks to Melzaren for this change to allow DG Scripts to be attachable + *to player's while still disallowing them to manually use the DG-Commands. */ + const struct mob_script_command_t mob_script_commands[] = { /* DG trigger commands. minimum_level should be set to -1. */ - { "masound" , do_masound , 0 }, - { "mkill" , do_mkill , 0 }, - { "mjunk" , do_mjunk , 0 }, - { "mdamage" , do_mdamage , 0 }, - { "mdoor" , do_mdoor , 0 }, - { "mecho" , do_mecho , 0 }, - { "mrecho" , do_mrecho , 0 }, - { "mechoaround", do_mechoaround , 0 }, - { "msend" , do_msend , 0 }, - { "mload" , do_mload , 0 }, - { "mpurge" , do_mpurge , 0 }, - { "mgoto" , do_mgoto , 0 }, - { "mat" , do_mat , 0 }, - { "mteleport", do_mteleport, 0 }, - { "mforce" , do_mforce , 0 }, - { "mhunt" , do_mhunt , 0 }, - { "mremember", do_mremember, 0 }, - { "mforget" , do_mforget , 0 }, - { "mtransform", do_mtransform , 0 }, - { "mzoneecho", do_mzoneecho, 0 }, - { "mfollow" , do_mfollow , 0 }, + { "masound" , do_masound , 0 }, + { "mkill" , do_mkill , 0 }, + { "mjunk" , do_mjunk , 0 }, + { "mdamage" , do_mdamage , 0 }, + { "mdoor" , do_mdoor , 0 }, + { "mecho" , do_mecho , 0 }, + { "mrecho" , do_mrecho , 0 }, + { "mechoaround", do_mechoaround , 0 }, + { "msend" , do_msend , 0 }, + { "mload" , do_mload , 0 }, + { "mpurge" , do_mpurge , 0 }, + { "mgoto" , do_mgoto , 0 }, + { "mat" , do_mat , 0 }, + { "mteleport", do_mteleport, 0 }, + { "mforce" , do_mforce , 0 }, + { "mhunt" , do_mhunt , 0 }, + { "mremember", do_mremember, 0 }, + { "mforget" , do_mforget , 0 }, + { "mtransform", do_mtransform , 0 }, + { "mzoneecho", do_mzoneecho, 0 }, + { "mfollow" , do_mfollow , 0 }, { "\n" , do_not_here , 0 } }; -int script_command_interpreter(struct char_data *ch, char *arg) { - /* DG trigger commands */ - - int i; - char first_arg[MAX_INPUT_LENGTH]; - char *line; - - skip_spaces(&arg); - if (!*arg) - return 0; - - line = any_one_arg(arg, first_arg); - - for (i = 0; *mob_script_commands[i].command_name != '\n'; i++) - if (!str_cmp(first_arg, mob_script_commands[i].command_name)) - break; // NB - only allow full matches. - - if (*mob_script_commands[i].command_name == '\n') - return 0; // no matching commands. - - /* Poiner to the command? */ - ((*mob_script_commands[i].command_pointer) (ch, line, 0, - mob_script_commands[i].subcmd)); - return 1; // We took care of execution. Let caller know. +int script_command_interpreter(struct char_data *ch, char *arg) { + /* DG trigger commands */ + + int i; + char first_arg[MAX_INPUT_LENGTH]; + char *line; + + skip_spaces(&arg); + if (!*arg) + return 0; + + line = any_one_arg(arg, first_arg); + + for (i = 0; *mob_script_commands[i].command_name != '\n'; i++) + if (!str_cmp(first_arg, mob_script_commands[i].command_name)) + break; // NB - only allow full matches. + + if (*mob_script_commands[i].command_name == '\n') + return 0; // no matching commands. + + /* Poiner to the command? */ + ((*mob_script_commands[i].command_pointer) (ch, line, 0, + mob_script_commands[i].subcmd)); + return 1; // We took care of execution. Let caller know. } const char *fill[] = @@ -456,7 +456,7 @@ void command_interpreter(struct char_data *ch, char *argument) return; /* special case to handle one-character, non-alphanumeric commands; requested - * by many people so "'hi" or ";godnet test" is possible. Patch sent by Eric + * by many people so "'hi" or ";godnet test" is possible. Patch sent by Eric * Green and Stefan Wasilewski. */ if (!isalpha(*argument)) { arg[0] = argument[0]; @@ -475,11 +475,11 @@ void command_interpreter(struct char_data *ch, char *argument) if (cont) return; /* yes, command trigger took over */ } - /* Allow IMPLs to switch into mobs to test the commands. */ - if (IS_NPC(ch) && ch->desc && GET_LEVEL(ch->desc->original) >= LVL_IMPL) { - if (script_command_interpreter(ch, argument)) - return; - } + /* Allow IMPLs to switch into mobs to test the commands. */ + if (IS_NPC(ch) && ch->desc && GET_LEVEL(ch->desc->original) >= LVL_IMPL) { + if (script_command_interpreter(ch, argument)) + return; + } for (length = strlen(arg), cmd = 0; *complete_cmd_info[cmd].command != '\n'; cmd++) if(complete_cmd_info[cmd].command_pointer != do_action && @@ -500,17 +500,17 @@ void command_interpreter(struct char_data *ch, char *argument) int found = 0; send_to_char(ch, "Huh!?!\r\n"); - for (cmd = 0; *cmd_info[cmd].command != '\n'; cmd++) + for (cmd = 0; *cmd_info[cmd].command != '\n'; cmd++) { if (*arg != *cmd_info[cmd].command || cmd_info[cmd].minimum_level > GET_LEVEL(ch)) continue; /* Only apply levenshtein counts if the command is not a trigger command. */ if ( (levenshtein_distance(arg, cmd_info[cmd].command) <= 2) && - (cmd_info[cmd].minimum_level >= 0) ) + (cmd_info[cmd].minimum_level >= 0) ) { - if (!found) - { + if (!found) + { send_to_char(ch, "\r\nDid you mean:\r\n"); found = 1; } @@ -631,8 +631,8 @@ ACMD(do_alias) } /* Valid numeric replacements are only $1 .. $9 (makes parsing a little easier, - * and it's not that much of a limitation anyway.) Also valid is "$*", which - * stands for the entire original line after the alias. ";" is used to delimit + * and it's not that much of a limitation anyway.) Also valid is "$*", which + * stands for the entire original line after the alias. ";" is used to delimit * commands. */ #define NUM_TOKENS 9 @@ -730,8 +730,8 @@ int perform_alias(struct descriptor_data *d, char *orig, size_t maxlen) /* Various other parsing utilities. */ /* Searches an array of strings for a target string. "exact" can be 0 or non-0, - * depending on whether or not the match must be exact for it to be returned. - * Returns -1 if not found; 0..n otherwise. Array must be terminated with a + * depending on whether or not the match must be exact for it to be returned. + * Returns -1 if not found; 0..n otherwise. Array must be terminated with a * '\n' so it knows to stop searching. */ int search_block(char *arg, const char **list, int exact) { @@ -784,13 +784,13 @@ void skip_spaces(char **string) for (; **string && isspace(**string); (*string)++); } -/* Given a string, change all instances of double dollar signs ($$) to single - * dollar signs ($). When strings come in, all $'s are changed to $$'s to - * avoid having users be able to crash the system if the inputted string is - * eventually sent to act(). If you are using user input to produce screen - * output AND YOU ARE SURE IT WILL NOT BE SENT THROUGH THE act() FUNCTION - * (i.e., do_gecho, do_title, but NOT do_say), you can call - * delete_doubledollar() to make the output look correct. +/* Given a string, change all instances of double dollar signs ($$) to single + * dollar signs ($). When strings come in, all $'s are changed to $$'s to + * avoid having users be able to crash the system if the inputted string is + * eventually sent to act(). If you are using user input to produce screen + * output AND YOU ARE SURE IT WILL NOT BE SENT THROUGH THE act() FUNCTION + * (i.e., do_gecho, do_title, but NOT do_say), you can call + * delete_doubledollar() to make the output look correct. * Modifies the string in-place. */ char *delete_doubledollar(char *string) { @@ -851,7 +851,7 @@ char *one_argument(char *argument, char *first_arg) return (argument); } -/* one_word is like any_one_arg, except that words in quotes ("") are +/* one_word is like any_one_arg, except that words in quotes ("") are * considered one word. No longer ignores fill words. -dak */ char *one_word(char *argument, char *first_arg) { @@ -1049,11 +1049,11 @@ static int perform_dupe_check(struct descriptor_data *d) } } - /* Now, go through the character list, deleting all characters that are not - * already marked for deletion from the above step (i.e., in the CON_HANGUP + /* Now, go through the character list, deleting all characters that are not + * already marked for deletion from the above step (i.e., in the CON_HANGUP * state), and have not already been selected as a target for switching into. - * In addition, if we haven't already found a target, choose one if one is - * available (while still deleting the other duplicates, though theoretically + * In addition, if we haven't already found a target, choose one if one is + * available (while still deleting the other duplicates, though theoretically * none should be able to exist). */ for (ch = character_list; ch; ch = next_ch) { next_ch = ch->next; @@ -1088,9 +1088,9 @@ static int perform_dupe_check(struct descriptor_data *d) /* no target for switching into was found - allow login to continue */ if (!target) { - GET_PREF(d->character) = rand_number(1, 128000); - if (GET_HOST(d->character)) - free(GET_HOST(d->character)); + GET_PREF(d->character) = rand_number(1, 128000); + if (GET_HOST(d->character)) + free(GET_HOST(d->character)); GET_HOST(d->character) = strdup(d->host); return 0; } @@ -1169,8 +1169,8 @@ int enter_player_game (struct descriptor_data *d) /* find_char helper */ add_to_lookup_table(GET_ID(d->character), (void *)d->character); - /* After moving saving of variables to the player file, this should only - * be called in case nothing was found in the pfile. If something was + /* After moving saving of variables to the player file, this should only + * be called in case nothing was found in the pfile. If something was * found, SCRIPT(ch) will be set. */ if (!SCRIPT(d->character)) read_saved_vars(d->character); @@ -1181,6 +1181,9 @@ int enter_player_game (struct descriptor_data *d) load_result = Crash_load(d->character); save_char(d->character); + /* Check for a login trigger in the players' start room */ + login_wtrigger(&world[IN_ROOM(d->character)], d->character); + return load_result; } @@ -1242,7 +1245,7 @@ void nanny(struct descriptor_data *d, char *arg) GET_PFILEPOS(d->character) = player_i; if (PLR_FLAGGED(d->character, PLR_DELETED)) { - /* Make sure old files are removed so the new player doesn't get the + /* Make sure old files are removed so the new player doesn't get the * deleted player's equipment. */ if ((player_i = get_ptable_by_name(tmp_name)) >= 0) remove_player(player_i); @@ -1324,12 +1327,12 @@ void nanny(struct descriptor_data *d, char *arg) break; case CON_PASSWORD: /* get pwd for known player */ - /* To really prevent duping correctly, the player's record should be reloaded - * from disk at this point (after the password has been typed). However I'm - * afraid that trying to load a character over an already loaded character is - * going to cause some problem down the road that I can't see at the moment. - * So to compensate, I'm going to (1) add a 15 or 20-second time limit for - * entering a password, and (2) re-add the code to cut off duplicates when a + /* To really prevent duping correctly, the player's record should be reloaded + * from disk at this point (after the password has been typed). However I'm + * afraid that trying to load a character over an already loaded character is + * going to cause some problem down the road that I can't see at the moment. + * So to compensate, I'm going to (1) add a 15 or 20-second time limit for + * entering a password, and (2) re-add the code to cut off duplicates when a * player quits. JE 6 Feb 96 */ echo_on(d); /* turn echo back on */ @@ -1534,7 +1537,7 @@ void nanny(struct descriptor_data *d, char *arg) case '2': if (d->character->player.description) { write_to_output(d, "Current description:\r\n%s", d->character->player.description); - /* Don't free this now... so that the old description gets loaded as the + /* Don't free this now... so that the old description gets loaded as the * current buffer in the editor. Do setup the ABORT buffer here, however. */ d->backstr = strdup(d->character->player.description); } @@ -1605,7 +1608,7 @@ void nanny(struct descriptor_data *d, char *arg) SET_BIT_AR(PLR_FLAGS(d->character), PLR_DELETED); save_char(d->character); Crash_delete_file(GET_NAME(d->character)); - /* If the selfdelete_fastwipe flag is set (in config.c), remove all the + /* If the selfdelete_fastwipe flag is set (in config.c), remove all the * player's immediately. */ if (selfdelete_fastwipe) if ((player_i = get_ptable_by_name(GET_NAME(d->character))) >= 0) {