/* part of Crimson2 */ /* Written by B. Cameron Lesiuk, 1997 */ /* Written for use with Crimson2 MUD (written/copyright Ryan Haksi 1995). * This source is proprietary. Use of this code without permission from * Ryan Haksi or Cam Lesiuk is strictly prohibited. * * (clesiuk@engr.uvic.ca) */ /* MOLE related commands */ #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <time.h> #ifndef WIN32 #include <unistd.h> #endif #include "crimson2.h" #include "macro.h" #include "log.h" #include "str.h" #include "queue.h" #include "send.h" #include "ini.h" #include "extra.h" #include "property.h" #include "file.h" #include "thing.h" #include "index.h" #include "edit.h" #include "history.h" #include "mem.h" #include "socket.h" #include "site.h" #include "exit.h" #include "world.h" #include "base.h" #include "object.h" #include "char.h" #include "affect.h" #include "fight.h" #include "mobile.h" #include "skill.h" #include "player.h" #include "parse.h" #include "area.h" #include "code.h" #include "reset.h" #include "moledefs.h" #include "mole.h" #include "mole_msc.h" CMDMOLEPROC(CmdMOLErlrq) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */ BYTE buf[MOLE_PKT_MAX]; LWORD i=0; WORD area; LWORD k; if (pktID<MOLE_PKID_START) return; MOLEWriteULWORD(sock,pktID,buf,&i); /* Check security */ /* we can't use regular "rshow" kuz it doesn't take a vnum arg */ if (!MOLECommandCheck(sock,"wlist",virtual)) { MOLEWriteULWORD(sock,MOLE_NACK_AUTHORIZATION,buf,&i); MOLESend(sock,buf,i,MOLE_CMD_NACK); MOLEFlushQ(sock); return; } /* first, we need to find the specified area */ area=AreaOf(virtual); if (area>=0) { MOLEWriteULWORD(sock,virtual,buf,&i); MOLEWriteULWORD(sock,areaList[area].aResetNum,buf,&i); for (k=0;k<areaList[area].aResetNum;k++) { MOLEWriteULWORD(sock,areaList[area].aResetList[k].rCmd,buf,&i); MOLEWriteULWORD(sock,areaList[area].aResetList[k].rIf,buf,&i); switch ((areaList[area].aResetList)[k].rCmd) { case 'O': /* Object to room */ case 'o': /* Object to room */ MOLEWriteULWORD(sock, (areaList[area].aResetList)[k].rArg1.rObj->oVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,Wld((areaList[area].aResetList)[k].rArg3.rWld)->wVirtual,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'M': /* Mobile to room */ case 'm': /* Mobile to room */ MOLEWriteULWORD(sock, (areaList[area].aResetList)[k].rArg1.rMob->mVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,Wld((areaList[area].aResetList)[k].rArg3.rWld)->wVirtual,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'G': /* give object to last mobile */ case 'g': /* give object to last mobile */ MOLEWriteULWORD(sock, (areaList[area].aResetList)[k].rArg1.rObj->oVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'P': /* put object inside object */ case 'p': /* put object inside object */ MOLEWriteULWORD(sock, (areaList[area].aResetList)[k].rArg1.rObj->oVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'E': /* equip mobile with an object */ case 'e': /* equip mobile with an object */ MOLEWriteULWORD(sock, (areaList[area].aResetList)[k].rArg1.rObj->oVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'D': /* set door state */ case 'd': /* set door state */ MOLEWriteULWORD(sock, Wld((areaList[area].aResetList)[k].rArg1.rWld)->wVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case 'R': /* remove object from room */ case 'r': /* remove object from room */ MOLEWriteULWORD(sock, Wld((areaList[area].aResetList)[k].rArg1.rWld)->wVirtual, buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg2.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg3.rNum,buf,&i); MOLEWriteULWORD(sock,(areaList[area].aResetList)[k].rArg4.rNum,buf,&i); break; case '*': /* comment */ default: MOLEWriteULWORD(sock,0L,buf,&i); MOLEWriteULWORD(sock,0L,buf,&i); MOLEWriteULWORD(sock,0L,buf,&i); MOLEWriteULWORD(sock,0L,buf,&i); break; } } MOLESend(sock,buf,i,MOLE_CMD_RLST); } else { /* didn't find specified area - return nack */ MOLEWriteULWORD(sock,MOLE_NACK_NODATA,buf,&i); MOLESend(sock,buf,i,MOLE_CMD_NACK); } } CMDMOLEPROC(CmdMOLErlst) { /* CmdMOLEProc( SOCK *sock, ULWORD *pktID, LWORD virtual) */ BYTE buf[MOLE_PKT_MAX]; LWORD i=0; RESETLIST reset; LWORD rc; /* return code */ ULWORD data; ULWORD dataCmd; ULWORD dataIf; ULWORD dataArg[4]; LWORD counter; WORD resetGood; WORD area; if (pktID<MOLE_PKID_START) return; MOLEWriteULWORD(sock,pktID,buf,&i); /* Check security */ /* we can't use regular "rupdate" kuz it doesn't take a vnum arg */ if (!MOLECommandCheck(sock,"wdesc",virtual)) { MOLEWriteULWORD(sock,MOLE_NACK_AUTHORIZATION,buf,&i); MOLESend(sock,buf,i,MOLE_CMD_NACK); MOLEFlushQ(sock); return; } /* first, we need to find the specified area */ area=AreaOf(virtual); if (area>=0) { /* first, mark area as changed */ BITSET(areaList[area].aSystem,AS_RSTUNSAVED); /* delete all previous reset commands */ areaList[area].aResetNum=0; /* Ok, let's read in our new RST stats */ if ((!(rc=MOLEGetQULWORD(sock,&data)))) counter=data; /* counter=# reset entries */ while((counter>0)&&(!rc)) { if (!rc) rc=MOLEGetQULWORD(sock,&dataCmd); if (!rc) rc=MOLEGetQULWORD(sock,&dataIf); if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[0]); if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[1]); if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[2]); if (!rc) rc=MOLEGetQULWORD(sock,&dataArg[3]); /* now let's look at this sucker and see if we can make * * a valid reset from it. If we can't, we just turf the * * whole thing. */ reset.rCmd=dataCmd; reset.rIf=dataIf; resetGood=0; switch (dataCmd) { case 'M': if (!(reset.rArg1.rMob=MobileOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; if (!(reset.rArg3.rWld=WorldOf(dataArg[2]))) break; reset.rArg4.rNum=dataArg[3]; resetGood=1; break; case 'O': if (!(reset.rArg1.rObj=ObjectOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; if (!(reset.rArg3.rWld=WorldOf(dataArg[2]))) break; reset.rArg4.rNum=dataArg[3]; resetGood=1; break; case 'G': if (!(reset.rArg1.rObj=ObjectOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; reset.rArg3.rNum=0; /* zero out extra params */ reset.rArg4.rNum=0; /* zero out extra params */ resetGood=1; break; case 'P': if (!(reset.rArg1.rObj=ObjectOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; reset.rArg3.rNum=dataArg[2]; reset.rArg4.rNum=0; /* zero out extra params */ resetGood=1; break; case 'E': if (!(reset.rArg1.rObj=ObjectOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; reset.rArg3.rNum=0; /* zero out extra params */ reset.rArg4.rNum=0; /* zero out extra params */ resetGood=1; break; case 'D': if (!(reset.rArg1.rWld=WorldOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; reset.rArg3.rNum=dataArg[2]; reset.rArg4.rNum=0; /* zero out extra params */ resetGood=1; break; case 'R': if (!(reset.rArg1.rWld=WorldOf(dataArg[0]))) break; reset.rArg2.rNum=dataArg[1]; reset.rArg3.rNum=0; /* zero out extra params */ reset.rArg4.rNum=0; /* zero out extra params */ resetGood=1; break; case '*': default: /* who knows... unsupported. Just ignore */ reset.rArg1.rNum=0; /* zero out extra params */ reset.rArg2.rNum=0; /* zero out extra params */ reset.rArg3.rNum=0; /* zero out extra params */ reset.rArg4.rNum=0; /* zero out extra params */ break; } if (resetGood) { /* let's create this reset! */ REALLOC("MOLEReset(mole_rst.c): resetList reallocation\n", areaList[area].aResetList,RESETLIST,areaList[area].aResetNum+1, areaList[area].aResetByte); memcpy((void*)&(areaList[area].aResetList[areaList[area].aResetNum]),(void*)&reset,sizeof(RESETLIST)); areaList[area].aResetNum++; } counter--; } MOLESend(sock,buf,i,MOLE_CMD_ACKP); } else { /* didn't find specified area - return nack */ MOLEWriteULWORD(sock,MOLE_NACK_NODATA,buf,&i); MOLESend(sock,buf,i,MOLE_CMD_NACK); } }