From: Remi B. <els...@us...> - 2004-07-26 11:50:08
|
Update of /cvsroot/once/oncecode/src/server In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21100/src/server Modified Files: ocareastate.cpp ocareastate.h ocentitystate.cpp ocentitystate.h ochdllogin.cpp ocplayerstate.cpp ocplayerstate.h ocserver.cpp ocserver.h Added Files: ocbl.cpp ocbl.h Log Message: New step towards cel. Look at history.txt for details. Sorry for ghost dirs/files. Index: ocserver.h =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocserver.h,v retrieving revision 1.30 retrieving revision 1.31 diff -C2 -d -r1.30 -r1.31 *** ocserver.h 24 Jul 2004 11:29:11 -0000 1.30 --- ocserver.h 26 Jul 2004 11:49:57 -0000 1.31 *************** *** 32,35 **** --- 32,39 ---- struct iConsoleInput; struct iObjectRegistry; + struct iVirtualClock; + struct iNetworkDriver; + struct iNetworkListener; + struct iNetworkConnection; class ocCommandSet; class ocWorld; *************** *** 43,61 **** class iocDatabase; class ocSettingsMgr; template<class T> class ocFactory; - struct iVirtualClock; - struct iNetworkDriver; - struct iNetworkListener; - struct iNetworkConnection; #include "ivaria/conin.h" #include "csutil/refarr.h" #include "csutil/stringarray.h" #include "common/ocidentifier.h" #include "common/ocapplication.h" ! #include "ocmsghandler.h" ! #include "ocNameGen.h" ! class ocServer; ! class ocLoader; /** --- 47,63 ---- class iocDatabase; class ocSettingsMgr; + class ocServer; + class ocLoader; template<class T> class ocFactory; #include "ivaria/conin.h" #include "csutil/refarr.h" #include "csutil/stringarray.h" + #include "common/ocidentifier.h" #include "common/ocapplication.h" ! #include "server/ocmsghandler.h" ! #include "server/ocNameGen.h" ! #include "server/ocbl.h" /** *************** *** 97,100 **** --- 99,104 ---- /// the database manager iocDatabase* dbmgr; + /// the behaviour layer + csRef<ocBehaviourLayer> bl; /// message of the day *************** *** 159,162 **** --- 163,168 ---- /** Get Network manager */ ocServerNetworkMgr* GetNetworkMgr() const { return networkmgr; } + /** Get Behaviour layer */ + ocBehaviourLayer* GetBehaviourLayer() const { return bl; } /// get the message of the day Index: ocareastate.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocareastate.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** ocareastate.cpp 25 Jul 2004 16:37:26 -0000 1.36 --- ocareastate.cpp 26 Jul 2004 11:49:57 -0000 1.37 *************** *** 181,185 **** serversys->GetVirtualClock()->Suspend(); ! if (!serversys->GetLoader()->LoadMap(area->GetID())) return false; --- 181,186 ---- serversys->GetVirtualClock()->Suspend(); ! if (!serversys->GetLoader()->LoadMap(area->GetID(), ! serversys->GetBehaviourLayer())) return false; *************** *** 217,221 **** { mesh = meshes->Next(); ! if (mesh == entity->GetMesh()->GetCSMesh()) continue; if (!csColliderWrapper::GetColliderWrapper(mesh->QueryObject())) --- 218,222 ---- { mesh = meshes->Next(); ! if (mesh == entity->GetCSMesh()) continue; if (!csColliderWrapper::GetColliderWrapper(mesh->QueryObject())) *************** *** 240,244 **** mesh = meshes->Next(); ! if (mesh == entity->GetMesh()->GetCSMesh()) continue; --- 241,245 ---- mesh = meshes->Next(); ! if (mesh == entity->GetCSMesh()) continue; *************** *** 376,382 **** } ! void ocAreaState::AddPlayerOnline(ocPlayerState* player_state) { ! player_state->Login(this); bool was_logged = players_online.Delete(player_state); --- 377,384 ---- } ! bool ocAreaState::AddPlayerOnline(ocPlayerState* player_state) { ! if (!player_state->Login(this)) ! return false; bool was_logged = players_online.Delete(player_state); *************** *** 388,392 **** // Subscribe to area content serversys->GetContentMgr()->SubscribePlayerToArea(area->GetID(), ! player_state); // first subscription to entities Resubscribe(player_state); --- 390,394 ---- // Subscribe to area content serversys->GetContentMgr()->SubscribePlayerToArea(area->GetID(), ! player_state); // first subscription to entities Resubscribe(player_state); --- NEW FILE: ocbl.cpp --- /* * ocbl.cpp * Copyright (C) 2003-2004 by The Once developement team * * 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 "config.h" #include "iutil/strset.h" #include "physicallayer/entity.h" #include "physicallayer/pl.h" #include "behaviourlayer/behave.h" #include "common/ocidentifier.h" #include "common/ocfactory.h" #include "server/behaviours/ocarea_bl.h" #include "server/behaviours/ocplayer_bl.h" #include "server/ocbl.h" /******************************* ocBehaviourBase *****************************/ SCF_IMPLEMENT_IBASE(ocBehaviourBase) SCF_IMPLEMENTS_INTERFACE(iCelBehaviour) SCF_IMPLEMENT_IBASE_END ocBehaviourBase::ocBehaviourBase(ocBehaviourLayer* _bl) { bl = _bl; pl = _bl->GetPhysicalLayer(); SCF_CONSTRUCT_IBASE(0); } ocBehaviourBase::~ocBehaviourBase() { SCF_DESTRUCT_IBASE(); } bool ocBehaviourBase::SendMessage(const char* msg, celData& ret, iCelParameterBlock* params, ...) { va_list arg; va_start(arg, params); bool res = SendMessageV(msg, ret, params, arg); va_end(arg); return res; } bool ocBehaviourBase::SendMessageV(const char* msg, celData& ret, iCelParameterBlock* params, va_list args) { csStringID msg_id = pl->FetchStringID(msg); return SendMessageID(msg_id, ret, params, args); } /*************************** ocBehaviourLayer ********************************/ SCF_IMPLEMENT_IBASE(ocBehaviourLayer) SCF_IMPLEMENTS_INTERFACE(iCelBlLayer) SCF_IMPLEMENT_IBASE_END ocBehaviourLayer::ocBehaviourLayer(iCelPlLayer* _pl) { SCF_CONSTRUCT_IBASE(0); pl = _pl; InitializeBehaviours(); } ocBehaviourLayer::~ocBehaviourLayer() { SCF_DESTRUCT_IBASE(); } void ocBehaviourLayer::InitializeBehaviours() { factory.RegClass<ocPlayerBehaviour>(); ocPlayerBehaviour::RegisterStringIDs(pl); factory.RegClass<ocAreaBehaviour>(); } iCelBehaviour* ocBehaviourLayer::CreateBehaviour(iCelEntity* entity, const char* name) { ocBehaviourBase* behaviour = factory.CreateInstance(name, this); CS_ASSERT(behaviour); entity->SetBehaviour(behaviour); return behaviour; } --- NEW FILE: ocbl.h --- /* * ocbl.h * Copyright (C) 2003-2004 by The Once developement team * * 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 */ #ifndef OCBL_H #define OCBL_H struct iCelPlLayer; class ocBehaviourLayer; class ocBehaviourBase; #include "behaviourlayer/bl.h" #include "behaviourlayer/behave.h" #include "common/ocfactory.h" class ocBehaviourLayer : public iCelBlLayer { private: /** The factory to create the behaviours. */ ocBehaviourFactory factory; /** The physical layer */ iCelPlLayer* pl; private: void InitializeBehaviours(); public: /** Constructor */ ocBehaviourLayer(iCelPlLayer* pl); /** Destructor */ virtual ~ocBehaviourLayer(); /* Declare iBase */ SCF_DECLARE_IBASE; /** Returns the name of this layer. */ virtual const char* GetName () const { return "OnceBehaviourLayer"; } /** Returns physical layer */ iCelPlLayer* GetPhysicalLayer() { return pl; } /** Create a behaviour class according to the name. */ virtual iCelBehaviour* CreateBehaviour(iCelEntity* entity, const char* name); }; class ocBehaviourBase : public iCelBehaviour { private: ocBehaviourLayer* bl; iCelPlLayer* pl; public: /** Contructor */ ocBehaviourBase(ocBehaviourLayer* layer); /** Destructor */ virtual ~ocBehaviourBase(); /** Declare iBase */ SCF_DECLARE_IBASE; /** Returns the behaviour layer */ virtual iCelBlLayer* GetBehaviourLayer() const { return bl; } /** Used when the entity receives a message. Wrapper of SendMessageV */ virtual bool SendMessage(const char* msg, celData& ret, iCelParameterBlock* params, ...); /** Used when the entity received a message. Wrapper of * SendMessageID that subclasses must define. */ virtual bool SendMessageV(const char* msg, celData& ret, iCelParameterBlock* params, va_list args); /** Sub classes must define this. All messages will come through this * function */ virtual bool SendMessageID(csStringID msg_id, celData& ret, iCelParameterBlock* params, va_list args) = 0; /** Returns ... something. No idea of what this function should do */ virtual void* GetInternalObject() { return 0; } }; #endif Index: ocareastate.h =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocareastate.h,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** ocareastate.h 12 Jul 2004 19:53:05 -0000 1.24 --- ocareastate.h 26 Jul 2004 11:49:57 -0000 1.25 *************** *** 80,84 **** /** Add a player online and call all the initialization procedures. This is * the function you must call to log a player */ ! void AddPlayerOnline(ocPlayerState* player_state); /** Remove a player online. This is the function you must call to logout * a player (or delete the area) */ --- 80,84 ---- /** Add a player online and call all the initialization procedures. This is * the function you must call to log a player */ ! bool AddPlayerOnline(ocPlayerState* player_state); /** Remove a player online. This is the function you must call to logout * a player (or delete the area) */ Index: ochdllogin.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ochdllogin.cpp,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** ochdllogin.cpp 24 Jul 2004 11:29:11 -0000 1.14 --- ochdllogin.cpp 26 Jul 2004 11:49:57 -0000 1.15 *************** *** 126,130 **** * procedures, including creating the avatar and add the player state * both to the area and world list */ ! area_state->AddPlayerOnline(pstate); /* Send reply packets */ --- 126,136 ---- * procedures, including creating the avatar and add the player state * both to the area and world list */ ! if (!area_state->AddPlayerOnline(pstate)) ! { ! serversys->PrintMessage("Unable to log player (internal server error)"); ! SendReply(conn, "Login failed (internal server error)"); ! delete pstate; ! return 0; ! } /* Send reply packets */ *************** *** 174,178 **** ocPlayerState* pstate = area_state->CreatePlayer(msg->username.GetData()); pstate->SetNetLink(conn); ! area_state->AddPlayerOnline(pstate); serversys->PrintMessage("Player %s created.\n", --- 180,190 ---- ocPlayerState* pstate = area_state->CreatePlayer(msg->username.GetData()); pstate->SetNetLink(conn); ! if (!area_state->AddPlayerOnline(pstate)) ! { ! serversys->PrintMessage("Unable to log player (internal server error)"); ! SendReply(conn, "Login failed (internal server error)"); ! delete pstate; ! return 0; ! } serversys->PrintMessage("Player %s created.\n", Index: ocentitystate.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocentitystate.cpp,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** ocentitystate.cpp 25 Jul 2004 16:37:26 -0000 1.13 --- ocentitystate.cpp 26 Jul 2004 11:49:57 -0000 1.14 *************** *** 27,31 **** #include "common/ocarea.h" #include "common/ocentity.h" - #include "common/ocentitymesh.h" #include "common/ocloader.h" #include "ocscript.h" --- 27,30 ---- *************** *** 116,137 **** } ! void ocEntityState::UpdateMesh() { csRef<iCollideSystem> colsys; colsys = entity->GetCurrentArea()->GetServerState()->GetCollideSystem(); ! entity->SetMesh(new ocEntityMesh(entity, serversys->GetLoader())); ! iMeshWrapper* mesh = entity->GetMesh()->GetCSMesh(); csColliderHelper::InitializeCollisionWrapper(colsys, mesh); } csRef<iCollider> ocEntityState::GetCollider() { - iocEntityMesh* mesh = entity->GetMesh(); - if (!mesh) - return 0; - csColliderWrapper* wrap; ! iObject* object = mesh->GetCSMesh()->QueryObject(); wrap = csColliderWrapper::GetColliderWrapper(object); --- 115,141 ---- } ! bool ocEntityState::UpdateMesh() { + ocLoader* loader = serversys->GetLoader(); + loader->UnloadEntity(entity); + if (!loader->LoadEntity(entity, serversys->GetBehaviourLayer())) + { + serversys->PrintMessage("Unable to create cel entity.\n"); + return false; + } + csRef<iCollideSystem> colsys; colsys = entity->GetCurrentArea()->GetServerState()->GetCollideSystem(); ! iMeshWrapper* mesh = entity->GetCSMesh(); csColliderHelper::InitializeCollisionWrapper(colsys, mesh); + + return true; } csRef<iCollider> ocEntityState::GetCollider() { csColliderWrapper* wrap; ! iObject* object = entity->GetCSMesh()->QueryObject(); wrap = csColliderWrapper::GetColliderWrapper(object); *************** *** 143,154 **** float ocEntityState::GetRadius() { ! CS_ASSERT(entity->GetMesh()); ! return entity->GetMesh()->GetRadius(); } bool ocEntityState::Initialize() { ! UpdateMesh(); return true; --- 147,162 ---- float ocEntityState::GetRadius() { ! iMeshWrapper* wrap = entity->GetCSMesh(); ! CS_ASSERT(wrap); ! csVector3 rad, cent; ! wrap->GetRadius(rad, cent); ! return rad.Norm(); } bool ocEntityState::Initialize() { ! if (!UpdateMesh()) ! return false; return true; Index: ocplayerstate.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocplayerstate.cpp,v retrieving revision 1.27 retrieving revision 1.28 diff -C2 -d -r1.27 -r1.28 *** ocplayerstate.cpp 25 Jul 2004 16:37:26 -0000 1.27 --- ocplayerstate.cpp 26 Jul 2004 11:49:57 -0000 1.28 *************** *** 71,79 **** } ! void ocPlayerState::Login(ocAreaState* area_state) { - serversys->GetWorld()->AddPlayer(this); - ocEntityState* avatar_state = area_state->CreateEntity(); avatar_state->SetType(ENTITY_TYPE_PLAYER); --- 71,78 ---- } ! bool ocPlayerState::Login(ocAreaState* area_state) { ocEntityState* avatar_state = area_state->CreateEntity(); + avatar_state->SetType(ENTITY_TYPE_PLAYER); *************** *** 87,97 **** avatar->SetSpeed(csVector3(0.0f, 0.0f, 0.0f)); ! area_state->AddEntity(avatar_state); player->SetAvatar(avatar_state->GetEntity()->GetID()); // subscribe player to 'main' objects: player->AddSubscriber(&subscriptionlist); player->GetCurrentArea()->AddSubscriber(&subscriptionlist); player->GetAvatar()->AddSubscriber(&subscriptionlist); } --- 86,105 ---- avatar->SetSpeed(csVector3(0.0f, 0.0f, 0.0f)); ! if (!area_state->AddEntity(avatar_state)) ! { ! serversys->PrintMessage("Failed initializing player avatar.\n"); ! return false; ! } ! player->SetAvatar(avatar_state->GetEntity()->GetID()); + serversys->GetWorld()->AddPlayer(this); + // subscribe player to 'main' objects: player->AddSubscriber(&subscriptionlist); player->GetCurrentArea()->AddSubscriber(&subscriptionlist); player->GetAvatar()->AddSubscriber(&subscriptionlist); + + return true; } Index: ocserver.cpp =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocserver.cpp,v retrieving revision 1.56 retrieving revision 1.57 diff -C2 -d -r1.56 -r1.57 *** ocserver.cpp 24 Jul 2004 20:38:47 -0000 1.56 --- ocserver.cpp 26 Jul 2004 11:49:57 -0000 1.57 *************** *** 185,188 **** --- 185,192 ---- RegisterServerCmd(cmdset); + // Initialize behaviour factories + bl = new ocBehaviourLayer(pl); + RegisterBehaviourLayer(bl); + // load MOTD LoadMOTD(); Index: ocplayerstate.h =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocplayerstate.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** ocplayerstate.h 30 Jun 2004 12:08:08 -0000 1.19 --- ocplayerstate.h 26 Jul 2004 11:49:57 -0000 1.20 *************** *** 103,107 **** * adding the pointer to the world list. * This is called in ocAreaState::AddPlayer. */ ! void Login(ocAreaState* area); /** Undo all the things made by Login. After this function the player * state should be deleted. */ --- 103,107 ---- * adding the pointer to the world list. * This is called in ocAreaState::AddPlayer. */ ! bool Login(ocAreaState* area); /** Undo all the things made by Login. After this function the player * state should be deleted. */ Index: ocentitystate.h =================================================================== RCS file: /cvsroot/once/oncecode/src/server/ocentitystate.h,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ocentitystate.h 25 Jul 2004 16:37:26 -0000 1.12 --- ocentitystate.h 26 Jul 2004 11:49:57 -0000 1.13 *************** *** 78,82 **** csRef<iCollider> GetCollider(); ! /// Get the radius of this entity float GetRadius(); --- 78,83 ---- csRef<iCollider> GetCollider(); ! /// Get the radius of this entity. @@@@ Inefficient function provided for ! /// compatibility. Must be removed float GetRadius(); *************** *** 93,101 **** /** Perform all the initialization routines. Must be called when the * different fields of the entity. ! * Return false of failure. You must delete the entity in that case*/ bool Initialize(); ! /** Update the mesh in the entity, the collider ... */ ! void UpdateMesh(); /** This functions must be used instead of the entity one on server side */ --- 94,102 ---- /** Perform all the initialization routines. Must be called when the * different fields of the entity. ! * Return false of failure. You must delete the entity in that case */ bool Initialize(); ! /** Update the mesh in the entity, the collider ... Returns success */ ! bool UpdateMesh(); /** This functions must be used instead of the entity one on server side */ |