From: Keith F. <ven...@us...> - 2002-05-28 06:02:37
|
Update of /cvsroot/planeshift/planeshift/src/server In directory usw-pr-cvs1:/tmp/cvs-serv10012 Modified Files: psdatabase.h psdatabase.cpp pscelserver.h pscelserver.cpp Log Message: Added functionality for texture items cursor, xml building, and refactored psCelServer a little to make it easier to follow, fixing a few mem leaks along the way. Index: psdatabase.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psdatabase.h,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** psdatabase.h 24 May 2002 06:53:08 -0000 1.17 --- psdatabase.h 28 May 2002 06:02:35 -0000 1.18 *************** *** 148,151 **** --- 148,154 ---- iResultSet *GetPlayerInventory(int playerID); + /// Returns a result set of all the equipped items with textures for the player + iResultSet *GetTextureParts(int playerID); + protected: iObjectRegistry *object_reg; Index: psdatabase.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psdatabase.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** psdatabase.cpp 24 May 2002 06:53:08 -0000 1.36 --- psdatabase.cpp 28 May 2002 06:02:35 -0000 1.37 *************** *** 963,964 **** --- 963,983 ---- } + iResultSet *psDatabase::GetTextureParts(int playerID) + { + iResultSet *rs = mysql->Select("select i.texture_name texture," + " i.texture_part part" + " from items i," + " player_items pi" + " where pi.player_id=%d" + " and pi.equipped_ind='Y'" + " and pi.item_id=i.id" + " and i.texture_name is not NULL",playerID); + + if (!rs) + { + lasterror = GetLastSQLError(); + } + + return rs; + } + Index: pscelserver.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.h,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** pscelserver.h 18 May 2002 07:00:53 -0000 1.16 --- pscelserver.h 28 May 2002 06:02:35 -0000 1.17 *************** *** 30,33 **** --- 30,36 ---- class psDatabase; class psServer; + struct iPcLinearMovement; + struct iPcCharacterData; + /// Manages CEL entities on the server *************** *** 40,45 **** bool Initialize(iObjectRegistry* object_reg, MsgHandler* msghandler, ! ClientConnectionSet* clients, psDatabase* database, ! UserManager *usermanager, psServer* psserver); bool LoadMap (const char* mapname); --- 43,48 ---- bool Initialize(iObjectRegistry* object_reg, MsgHandler* msghandler, ! ClientConnectionSet* clients, psDatabase* database, ! UserManager *usermanager, psServer* psserver); bool LoadMap (const char* mapname); *************** *** 57,61 **** protected: iCelEntity* CreateRoom (const char* name, const char* mapfile); ! iCelEntity* CreateActor (const char* factname, const csVector3& pos); MsgHandler* msghandler; --- 60,70 ---- protected: iCelEntity* CreateRoom (const char* name, const char* mapfile); ! iCelEntity* CreateActor (const char* factname, const csVector3& pos,int playerID); ! ! bool InitMesh(iPcMesh *pcmesh,const char* factname,const csVector3& pos); ! bool InitLinMove(iPcLinearMovement *pcmove); ! bool InitCharData(iPcCharacterData *pcdata,int playerID); ! ! void MakeTexturePartsStr(int playerID,csString& texparts); MsgHandler* msghandler; Index: pscelserver.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.cpp,v retrieving revision 1.57 retrieving revision 1.58 diff -C2 -d -r1.57 -r1.58 *** pscelserver.cpp 18 May 2002 16:48:48 -0000 1.57 --- pscelserver.cpp 28 May 2002 06:02:35 -0000 1.58 *************** *** 63,66 **** --- 63,68 ---- #include "psprop/pc/pspclinmove.h" + #include "psprop/pc/pspcchar.h" + SCF_IMPLEMENT_IBASE(psCelServer) *************** *** 97,102 **** return false; ! database = db; ! usermanager=umanager; psCelServer::msghandler = msghandler; --- 99,104 ---- return false; ! database = db; ! usermanager = umanager; psCelServer::msghandler = msghandler; *************** *** 180,184 **** } ! iCelEntity* entity = CreateActor(factname, FindSpawnPosition(client)); if (!entity) { --- 182,188 ---- } ! iCelEntity* entity = CreateActor(factname, ! FindSpawnPosition(client), ! client->GetPlayerID()); if (!entity) { *************** *** 288,300 **** } ! iCelEntity* psCelServer::CreateActor (const char* factname, const csVector3& pos) { ! iCelPropertyClass* pc; ! iCelEntity* entity = pl->CreateEntity(); ! ! pc = pl->CreatePropertyClass (entity, "pcmesh"); ! if (!pc) return NULL; ! iPcMesh* pcmesh = SCF_QUERY_INTERFACE_FAST (pc, iPcMesh); ! if (!pcmesh) return NULL; char buf[150]; cs_snprintf (buf, 150, "/planeshift/models/%s.spr", factname); --- 292,298 ---- } ! bool psCelServer::InitMesh(iPcMesh *pcmesh,const char* factname,const csVector3& pos) { ! // Now that the mesh is created, initialize it by loading the sprite file. char buf[150]; cs_snprintf (buf, 150, "/planeshift/models/%s.spr", factname); *************** *** 302,313 **** if (!pcmesh->GetMesh() ) { ! // fallback (mostly for dummy plugin ! pcmesh->SetMesh ("stoneb", "/planeshift/models/stoneb.spr"); ! if (!pcmesh->GetMesh()) ! { ! pcmesh->DecRef(); ! entity->DecRef(); ! return NULL; ! } } psWorld* psworld = psWorld::GetPSWorld(GetWorldEntity()); --- 300,307 ---- if (!pcmesh->GetMesh() ) { ! // fallback (mostly for dummy plugin ! pcmesh->SetMesh ("stoneb", "/planeshift/models/stoneb.spr"); ! if (!pcmesh->GetMesh()) ! return false; } psWorld* psworld = psWorld::GetPSWorld(GetWorldEntity()); *************** *** 316,323 **** iMeshWrapper* mesh = pcmesh->GetMesh(); if (!mesh) ! { ! entity->DecRef(); ! return NULL; ! } csVector3 newpos(pos); csBox3 box; --- 310,315 ---- iMeshWrapper* mesh = pcmesh->GetMesh(); if (!mesh) ! return false; ! csVector3 newpos(pos); csBox3 box; *************** *** 329,332 **** --- 321,420 ---- pcmesh->DecRef(); + return true; + } + + bool psCelServer::InitLinMove(iPcLinearMovement *pcmove) + { + csVector3 top(0.9,0.5,0.5); + csVector3 bottom(0.8,1,0.4); + + pcmove->InitCD(top, bottom); + pcmove->DecRef(); + + return true; // right now this func never fail, but might later. + } + + bool psCelServer::InitCharData(iPcCharacterData *pcdata,int playerID) + { + csString texparts; + + MakeTexturePartsStr(playerID,texparts); + pcdata->SetTextureParts(texparts); + + pcdata->DecRef(); + + return true; // right now this func never fail, but might later. + } + + /** + * MakeTexturePartsStr: Returns a string in XML format enumerating + * how the texture for the player should be composited. + * + * get cursor/recordset for required texture parts + * initialize string + * cycle through and add items for each part + * terminate string + */ + void psCelServer::MakeTexturePartsStr(int playerID,csString& texparts) + { + // get cursor/recordset for required texture parts + iResultSet *rs = database->GetTextureParts(playerID); + + if (!rs) + { + printf("DB Error in MakeTexturePartsStr: %s\n",database->GetLastError() ); + texparts = ""; // clear to indicate failure + return; + } + + // initialize string + texparts = "<texpartlist>"; + + // cycle through and add items for each part + for (int i=0; i<rs->Count(); i++) + { + char buff[100]; + sprintf(buff,"<texpart name=\"%s\" texture=\"%s\"/>", + (*rs)[i]["part"], + (*rs)[i]["texture"] ); + texparts.Append(buff); + } + + // terminate string + texparts.Append("</texpartlist>"); + + printf("Got: %s\n", (const char *)texparts ); + + rs->Release(); + } + + + iCelEntity* psCelServer::CreateActor (const char* factname, const csVector3& pos,int playerID) + { + iCelPropertyClass* pc; + iCelEntity* entity = pl->CreateEntity(); + + // Create, attach and initialize each property class for the new entity + + // First the mesh, which is the actual 3d grid thing. + pc = pl->CreatePropertyClass (entity, "pcmesh"); + if (!pc) + { + entity->DecRef(); + return NULL; + } + iPcMesh* pcmesh = SCF_QUERY_INTERFACE_FAST (pc, iPcMesh); + if (!pcmesh) + { + entity->DecRef(); + return NULL; + } + if (!InitMesh(pcmesh,factname,pos)) + { + pcmesh->DecRef(); + entity->DecRef(); + return NULL; + } + pc = pl->CreatePropertyClass(entity, "pclinearmovement"); if ( !pc ) *************** *** 337,347 **** iPcLinearMovement *pcmove = SCF_QUERY_INTERFACE(pc, iPcLinearMovement); ! csVector3 top(0.9,0.5,0.5); ! csVector3 bottom(0.8,1,0.4); ! ! pcmove->InitCD(top, bottom); ! pcmove->DecRef(); pc = pl->CreatePropertyClass(entity, "pccharacterdata"); iCelBehaviour* behaviour = bl->CreateBehaviour (entity, "actor"); --- 425,449 ---- iPcLinearMovement *pcmove = SCF_QUERY_INTERFACE(pc, iPcLinearMovement); ! if (!InitLinMove(pcmove)) ! { ! pcmove->DecRef(); ! entity->DecRef(); ! return NULL; ! } pc = pl->CreatePropertyClass(entity, "pccharacterdata"); + if ( !pc ) + { + entity->DecRef(); + return NULL; + } + iPcCharacterData *pcdata = SCF_QUERY_INTERFACE(pc, iPcCharacterData); + + if (!InitCharData(pcdata,playerID)) + { + pcdata->DecRef(); + entity->DecRef(); + return NULL; + } iCelBehaviour* behaviour = bl->CreateBehaviour (entity, "actor"); |