/* * PVVMUD a 3D MUD * Copyright (C) 1998-1999 Programvareverkstedet (pvv@pvv.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <string.h> #include <stdlib.h> #include "pvvmud.H" #include "mud.H" #include "srvclimanager.H" CSrvCliCmdParser::CSrvCliCmdParser(CMud * mud, CClientManager * manager): CCommandParser() { m_mud = mud; m_manager = manager; addCommand("help",(CommandFunc_t)&commandHelp); addCommand("create",(CommandFunc_t)&commandCreate); addCommand("delete",(CommandFunc_t)&commandDelete); addCommand("move",(CommandFunc_t)&commandMove); addCommand("rotate",(CommandFunc_t)&commandRotate); } CSrvCliCmdParser::~CSrvCliCmdParser(){ } void CSrvCliCmdParser::commandUnknown(const string & commandString){ m_manager->sendMsg("Unkown command!\n"); } /////////////////////////////////////////////////////////////////////////////// // commandHelp // Syntax: /help [command] /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandHelp(argv_t & argv){ if (argv.size() == 2){ if (argv[1] == "help"){ m_manager->sendMsg( "help [<command>]\n" " Use this command to get help.\n" ); } else if (argv[1] == "create"){ m_manager->sendMsg( "create object <geometryId> <parentId> <pos> [<dir>]\n" " Add geometry to the world.\n" ); } else if (argv[1] == "delete"){ m_manager->sendMsg( "delete <objectId>\n" " Delete a object from the world.\n" ); } else if (argv[1] == "move"){ m_manager->sendMsg( "move <objectId> <position>\n" " Move a object to the given position.\n" ); } else if (argv[1] == "rotate"){ m_manager->sendMsg( "rotate <objectId> <direction> [<time>]\n" " Rotate a object to the given direction.\n" ); } else { m_manager->sendMsg( "Unkown kommand\n" ); } } else { m_manager->sendMsg( "Help\n" " Commands start with '/' everything else is chat messages\n" " Commands:\n" " /help\n" " /create\n" " /delete\n" " /move\n" " /rotate\n" " Use /help <command> for help about a command\n" ); } } /////////////////////////////////////////////////////////////////////////////// // commandChat /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandChat(const string & chatMessage){ string msg = string("<") + m_manager->getName() + "> " + chatMessage + "\n"; m_mud->chatMessage(msg.c_str()); } /////////////////////////////////////////////////////////////////////////////// // commandCreate // Syntax: /create <objectType> <objectArgs> <parentId> <pos> [<dir>] // Eks : /create object geometry/common/plants/Tree_1 cell4 20.5 23.2 0.0 /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandCreate(argv_t & argv){ for (int i = 0; i < argv.size(); i++){ cout << ":" << argv[i]; } cout << ":" << endl; if (argv.size() < 6){ m_manager->sendMsg("Wrong arguments!\n"); return; } if (argv[1] == "object"){ // Object char * objectType = (char*)argv[1].c_str(); int geometryId = atoi(argv[2].c_str()); int parentId = atoi(argv[3].c_str()); float posx = atof(argv[4].c_str()); float posy = atof(argv[5].c_str()); float posz = atof(argv[6].c_str()); float heading = 0.0,roll = 0.0,pitch = 0.0; if (argv.size() >= 9){ heading = atof(argv[7].c_str()); roll = atof(argv[8].c_str()); pitch = atof(argv[9].c_str()); } CPosition pos = CPosition(posx,posy,posz); CDirection dir = CDirection(heading,roll,pitch); DWORD objectId = m_mud->getWorld()->getNewObjectId(); m_mud->getWorld()->createObject(parentId,objectType,objectId,geometryId,pos,dir); } else { m_manager->sendMsg("Unknown objecType!\n"); } } /////////////////////////////////////////////////////////////////////////////// // commandDelete // Syntax: /delete <objectId> /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandDelete(argv_t & argv){ if (argv.size() != 2){ m_manager->sendMsg("Wrong number of arguments!\n"); return; } int objectId = atoi(argv[1].c_str()); CSrvObject * object = (CSrvObject*)m_mud->getWorld()->getObject(objectId); if (object != NULL) m_mud->getWorld()->removeObject(objectId,object->getParentId()); } /////////////////////////////////////////////////////////////////////////////// // commandMove // Syntax: /move <objectId> <position> /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandMove(argv_t & argv){ if (argv.size() != 5){ m_manager->sendMsg("Wrong number of arguments!\n"); return; } int objectId = atoi(argv[1].c_str()); float posx = atof(argv[2].c_str()); float posy = atof(argv[3].c_str()); float posz = atof(argv[4].c_str()); CPosition position = CPosition(posx,posy,posz); m_mud->getWorld()->updatePosition(objectId,position); } /////////////////////////////////////////////////////////////////////////////// // commandDelete // Syntax: /rotate <objectId> <direction> [<time>] /////////////////////////////////////////////////////////////////////////////// void CSrvCliCmdParser::commandRotate(argv_t & argv){ if (argv.size() < 5 || argv.size() > 6){ m_manager->sendMsg("Wrong number of arguments!\n"); return; } int objectId = atoi(argv[1].c_str()); float heading = atof(argv[2].c_str()); float roll = atof(argv[3].c_str()); float pitch = atof(argv[4].c_str()); if (argv.size() == 6){ float time = atof(argv[5].c_str()); if (time == 0.0) time = 1.0; CDirection angleSpeed = CDirection(heading/time,roll/time,pitch/time); cdebug << "Angle: " << angleSpeed << endl; m_mud->getWorld()->rotate(objectId,angleSpeed); } else { CDirection direction = CDirection(heading,roll,pitch); m_mud->getWorld()->updateDirection(objectId,direction); } }