/* ....[@@@..[@@@..............[@.................. MUD++ is a written from ....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and ....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++. ....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing ....[@......[@..[@@@@@..[@@@@@.................. development project. All ................................................ contributions are welcome. ....Copyright(C).1995.Melvin.Smith.............. Enjoy. ------------------------------------------------------------------------------ Melvin Smith (aka Fusion) msmith@falcon.mercer.peachnet.edu MUD++ development mailing list mudpp-list@spice.com ------------------------------------------------------------------------------ editarea.cc */ #include "string.h" #include "llist.h" #include "index.h" #include "room.h" #include "indexable.h" #include "server.h" #include "area.h" #include "bit.h" #include "edit.h" #include "global.h" void AreaEditor::command( String & arg ) { Area *checkArea; Room *room; LList<PC> pcIterate; LList<Area> areaIterate; String str; String arg1; String arg2; arg.startArgs(); arg1 = arg.getArg(); arg2 = arg.getArgRest(); // remainder if( !arg1 ) { str << "\n\r" << "Name: " << area->getName() << "\n\r" << "Area: " << area->getKey() << "\n\r" << "File: " << area->getFile() << "\n\r" << "Security: " << area->getSecurity() << "\n\r" << "Repop: " << area->getRepopMessg() << "\n\r" << "\n\r"; } else if( arg1 == "reload" ) { // There will probably be a problem with someone reloading // an area after an index change but before a save. // Clean it up later. // Check for players in the area. PC *ch; bool save = false; pcIterate = pcs; pcIterate.reset(); while( ( ch = pcIterate.peek() ) ) { pcIterate.next(); if( ch->inRoom()->getArea() == area ) { if( ch == pc ) { save = true; continue; } pc->out( "Can't reload area. There are players in the zone.\n\r" ); return; } } String wasIn; if( save ) { wasIn = pc->inRoom()->getKey(); pc->inRoom()->rmCharInv( pc ); } area->reload(); if( save ) { if( !( room = area->lookupRoom( wasIn ) ) ) { // Add code to handle this without shutdown later. -MS pc->out( "Fatal error. The room you were in was not reloaded!\n\r" ); exit(0); } room->addCharInv( pc ); } pc->out( "Area reloaded from disk.\n\r" ); Area *pArea; areaIterate = areas; areaIterate.reset(); while( ( pArea = areaIterate.peek() ) ) { areaIterate.next(); pArea->hardLink(); } pc->out( "World relinked.\n\r" ); return; } else if( arg1.abbrev( "index" ) ) { if( !arg2 ) { pc->out( "Invalid argument.\n\r" ); return; } if( ( checkArea = lookupArea( arg2 ) ) ) { if( checkArea != area ) { pc->out( "There is already an area with that index.\n\r" ); return; } } area->setKey( arg2 ); arg2 += ".are"; area->setFile( arg2 ); pc->out( "Area index key set.\n\r" ); pc->out( "Filename is now : " ); pc->out( area->getFile() ); pc->out( "\n\r" ); area->setDirtyBit(); // Now set all objects, npcs, rooms, in the area to the new index scope. area->npcIndex.setScope( arg2 ); area->objIndex.setScope( arg2 ); return; } else if( arg1.abbrev( "name" ) ) { if( !arg2 ) { pc->out( "Invalid argument.\n\r" ); return; } area->setName( arg2 ); pc->out( "Area name set.\n\r" ); area->setDirtyBit(); return; } else if( arg1.abbrev( "save" ) ) { if( !area->getDirtyBit() ) { pc->out( "No modifications since last save.\n\r" ); return; } if( !area->getName() ) { pc->out( "This area needs a name key first.\n\r" ); return; } if( ( checkArea = lookupArea( area->getKey() ) ) ) { if( checkArea != area ) { pc->out( "There is already an area with that index.\n\r" ); return; } } else { areas.addTop( area ); } area->writeTo(); pc->out( "Area saved.\n\r" ); area->rmDirtyBit(); return; } pc->out( str ); }