Files
2025-03-05 08:37:43 +01:00

303 lines
7.2 KiB
C

/*
* 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 "client.H"
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <iostream.h>
#include <netinet/in.h>
#include "socket.H"
#include "clisrvmanager.H"
#include "msgsrvcli.H"
#include "pvvmudclient.H"
#include "glgeometry.H"
#include "glmaterial.H"
#include "gltexture.H"
CCliSrvManager::CCliSrvManager(CCliSrvProtocol * protocol,CTimeKeeper * timeKeeper):CManager(protocol){
m_timeKeeper = timeKeeper;
getProtocol()->setName("Server");
getProtocol()->setManager(this);
m_world = new CCliWorld();
m_viewpoint = new CCliViewpoint(m_world);
m_cligos = NULL;
m_worldsrv = NULL;
}
CCliSrvManager::~CCliSrvManager(){
if (m_world != NULL) delete m_world;
if (m_viewpoint != NULL) delete m_viewpoint;
#ifndef TEXTURECACHE_USEFILE
if (m_cligos != NULL) delete m_cligos;
#endif
}
void CCliSrvManager::setClient(CPvvmudClient * client) {
m_client = client;
}
CPvvmudClient * CCliSrvManager::getClient() {
return m_client;
}
COption * CCliSrvManager::getOption() {
return m_client->getOption();
}
void CCliSrvManager::communicate(){
getProtocol()->readyToRead();
getProtocol()->readyToWrite();
}
void CCliSrvManager::init(){
cdebug << "Client manager init\n";
// createStartFrame();
}
void CCliSrvManager::hello(){
getProtocol()->login(getOption()->getString("username"),
getOption()->getString("passwd"),
FALSE); // This is not a new user!
}
void CCliSrvManager::serverInfo(CInetAddress * worldSrvAddress,CInetAddress * gosAddress){
#ifndef TEXTURECACHE_USEFILE
try {
m_cligos = new CCliGOS(this,m_timeKeeper, gosAddress);
cdebug << "Client GOS manager connected.\n";
} catch (CSocketException * e){
cdebug << "Failed to connect to GOS\n";
m_cligos = NULL;
}
#endif
try {
CClientSocket * socket =
new CClientSocket(worldSrvAddress->getAddress(),worldSrvAddress->getPort());
socket->setNonBlocking();
cdebug << "Client World manager connected.\n";
m_worldsrv =
new CCliWorldManager(this, new CCliWorldProtocol(socket,m_timeKeeper));
} catch (CSocketException * e){
cdebug << "Failed to connect to world server\n";
m_worldsrv = NULL;
}
if (m_cligos != NULL && m_worldsrv != NULL){
// getProtocol()->sendGetWorld();
// deleteStartFrame();
getProtocol()->sendOnline();
} else {
quit();
}
}
void CCliSrvManager::quit(){
getProtocol()->bye();
}
void CCliSrvManager::exit(){
::exit(0);
}
void CCliSrvManager::changeMasterCellId(DWORD newMasterCellId){
m_worldsrv->getProtocol()->sendChangeMasterCell(newMasterCellId);
}
void CCliSrvManager::createStartFrame(){
double trans[3];
trans[0] = 0; trans[1] = 80; trans[2] = 0;
double rot[3];
rot[0] = 90; rot[1] = 0; rot[2] = 0;
// world->addObject(-1,0,0,trans,rot);
}
void CCliSrvManager::deleteStartFrame(){
clearWorld();
}
void CCliSrvManager::animate(){
m_world->animate();
}
void CCliSrvManager::draw(CRenderer * renderer){
m_world->draw(renderer);
}
void CCliSrvManager::updateViewpoint( const CPosition & position,
const CDirection & direction,DWORD targetId ){
m_viewpoint->setPosition( position );
m_viewpoint->setDirection( direction );
m_viewpoint->setTargetId( targetId );
cdebug << "Viewpoint: Target: " << targetId << " Pos: " << position
<< " Dir: " << direction << "\n";
}
void CCliSrvManager::playerMove( int move ){
getProtocol()->sendCommand( move);
}
void CCliSrvManager::playerLook( int look ){
getProtocol()->sendCommand( look);
}
void CCliSrvManager::userCommand(int num){
if ((num >= USERCOMMAND_1) && (num <= USERCOMMAND_5)){
doAction(num - USERCOMMAND_1);
} else {
getProtocol()->sendCommand( num);
}
}
void CCliSrvManager::selection(int objectId){
getProtocol()->sendSelection( objectId );
}
void CCliSrvManager::sendMsg( const char * msg ){
getProtocol()->sendMsg( msg );
}
void CCliSrvManager::sendPing(){
if (m_worldsrv != NULL) m_worldsrv->sendPing();
}
void CCliSrvManager::clearWorld(){
m_world->clearWorld();
}
void CCliSrvManager::doAction(int actionNum){
cdebug << "Do action " << actionNum+1 << " on object "
<< actionObjectId[actionNum] << "\n";
getProtocol()->sendAction(actionObjectId[actionNum],actionNum+1);
}
void CCliSrvManager::addAction(int objectId, CAction * action){
actionObjectId[action->getId()-1] = objectId;
}
int CCliSrvManager::request(int requestType,int requestId){
cdebug << "Request("<<requestType<<") for : " << requestId << "\n";
if (m_cligos != NULL) {
m_cligos->request(requestType,requestId);
return TRUE;
}
return FALSE;
}
void CCliSrvManager::addGeometry(CGeometry * geometry){
CGeometry * geo = getClient()->getGeometryCache()->add(geometry);
if (geo != NULL) delete geo;
cdebug << "Geometry " << geometry->getId() << " loaded\n";
#ifdef USE_LOCAL_FILE_CACHE
DIR * dir = opendir("goscache");
if (dir != NULL){
closedir(dir);
} else {
mkdir("goscache",S_IRWXU);
}
char fileName[256];
sprintf(fileName,"goscache/%i.bog",geometry->getId());
geometry->save(fileName);
#endif // USE_LOCAL_FILE_CACHE
}
void CCliSrvManager::addMaterial(CMaterial * material){
CMaterial * mat = getClient()->getMaterialCache()->add(material);
if (mat != NULL) delete mat;
cdebug << "Material " << material->getId() << " loaded\n";
#ifdef USE_LOCAL_FILE_CACHE
DIR * dir = opendir("goscache");
if (dir != NULL){
closedir(dir);
} else {
mkdir("goscache",S_IRWXU);
}
char fileName[256];
sprintf(fileName,"goscache/%i.bmat",material->getId());
material->save(fileName);
#endif // USE_LOCAL_FILE_CACHE
}
void CCliSrvManager::addTexture(CTexture * texture){
CTexture * tex = getClient()->getTextureCache()->add(texture);
if (tex != NULL) delete tex;
cdebug << "Texture " << texture->getId() << " loaded\n";
#ifdef USE_LOCAL_FILE_CACHE
DIR * dir = opendir("goscache");
if (dir != NULL){
closedir(dir);
} else {
mkdir("goscache",S_IRWXU);
}
char fileName[256];
sprintf(fileName,"goscache/%i.tex",texture->getId());
texture->save(fileName);
#endif // USE_LOCAL_FILE_CACHE
}
void CCliSrvManager::dump(){
m_world->dump();
}
CGeometry * CCliSrvManager::newGeometry(int geometryId){
return new CGLGeometry(geometryId);
}
CMaterial * CCliSrvManager::newMaterial(int materialId){
return new CGLMaterial(materialId);
}
CTexture * CCliSrvManager::newTexture(int textureId){
return new CGLTexture(textureId);
}