/*
 * 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 "pvvmud.H"
#include <iostream.h>
#include "cliworldmessage.H"
#include "cliworldmanager.H"

CMsgCliWorldHello::CMsgCliWorldHello():CMsgHello(){
}

CMsgCliWorldHello * CMsgCliWorldHello::createMsg(){
  return new CMsgCliWorldHello();
}


int CMsgCliWorldHello::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  if (getVersion() != PROTOCOL_VERSION){
    cdebug << "ERROR: Wrong protocol version!\n";
    exit(2);
  }
  manager->hello(); 
  return TRUE;
}

/*
///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldCell
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldCell::CMsgCliWorldCell():CMsgCell(){
}

CMsgCliWorldCell * CMsgCliWorldCell::createMsg(){
  return new CMsgCliWorldCell();
}

int CMsgCliWorldCell::executeMsg(){
  cdebug << "Cell " << getCellId() << " with geometry " << getGeometryId()
       << " with position " << getPosition() <<"\n";
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  CWorldObject * cell = manager->getWorld()->addCell(getCellId(),getGeometryId());
  cell->setPosition(getPosition());
  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldRemoveCell
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldRemoveCell::CMsgCliWorldRemoveCell():CMsgRemoveCell(){
}

CMsgCliWorldRemoveCell * CMsgCliWorldRemoveCell::createMsg(){
  return new CMsgCliWorldRemoveCell();
}

int CMsgCliWorldRemoveCell::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->getWorld()->removeCell(getCellId());
  return TRUE;
}
*/


///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldObject
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldObject::CMsgCliWorldObject():CMsgObject(){
}

CMsgCliWorldObject * CMsgCliWorldObject::createMsg(){
  return new CMsgCliWorldObject();
}

int CMsgCliWorldObject::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  cdebug << "Object " << getObjectId() << " with parent " << getParentId() << " with geometry " << getGeometryId()
       << " with position " << getPosition() <<" with direction " << getDirection() << "\n";
  if (manager->getWorld()->createObject(getParentId(),"object",getObjectId(),
                                        getGeometryId(),getPosition(),
                                        getDirection())==NULL){
    cdebug << "Failed to create object " << getObjectId() << "\n";
  }
  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldRemoveObject
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldRemoveObject::CMsgCliWorldRemoveObject():CMsgRemoveObject(){
}

CMsgCliWorldRemoveObject * CMsgCliWorldRemoveObject::createMsg(){
  return new CMsgCliWorldRemoveObject();
}

int CMsgCliWorldRemoveObject::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  cdebug << "REMOVE : Object: " << getObjectId() << " Parent: " << getParentId() << "\n";
  manager->getWorld()->removeObject(getObjectId(),getParentId());
  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldUpdatePosition
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldUpdatePosition::CMsgCliWorldUpdatePosition():CMsgUpdatePosition(){
}

CMsgCliWorldUpdatePosition * CMsgCliWorldUpdatePosition::createMsg(){
  return new CMsgCliWorldUpdatePosition();
}

int CMsgCliWorldUpdatePosition::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->getWorld()->updatePosition(getObjectId(),getPosition());
  return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldUpdateDirection
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldUpdateDirection::CMsgCliWorldUpdateDirection():CMsgUpdateDirection(){
}

CMsgCliWorldUpdateDirection * CMsgCliWorldUpdateDirection::createMsg(){
  return new CMsgCliWorldUpdateDirection();
}

int CMsgCliWorldUpdateDirection::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->getWorld()->updateDirection(getObjectId(),getDirection());
  return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldUpdateHierarchy
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldUpdateHierarchy::CMsgCliWorldUpdateHierarchy():CMsgUpdateHierarchy(){
}

CMsgCliWorldUpdateHierarchy * CMsgCliWorldUpdateHierarchy::createMsg(){
  return new CMsgCliWorldUpdateHierarchy();
}

int CMsgCliWorldUpdateHierarchy::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->getWorld()->updateHierarchy(getObjectId(),getParentId());
  return TRUE;
}


///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldPong
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldPong::CMsgCliWorldPong():CMsgPong(){
}

CMsgCliWorldPong * CMsgCliWorldPong::createMsg(){
  return new CMsgCliWorldPong();
}

int CMsgCliWorldPong::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->pong(getSequenceNumber(),getServerTime());
  return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
//
// CMsgCliWorldRotate
//
///////////////////////////////////////////////////////////////////////////////

CMsgCliWorldRotate::CMsgCliWorldRotate():CMsgRotate(){
}

CMsgCliWorldRotate * CMsgCliWorldRotate::createMsg(){
  return new CMsgCliWorldRotate();
}

int CMsgCliWorldRotate::executeMsg(){
  CCliWorldManager * manager = (CCliWorldManager*)getManager();
  manager->getWorld()->rotate(getObjectId(),getAngleSpeed());
  return TRUE;
}