Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1:/tmp/cvs-serv4597 Modified Files: psserver.h pscelserver.h pscelserver.cpp pscel.h pscel.cpp npcmanager.h npcmanager.cpp client.h client.cpp Log Message: NPCClient now has a re-ordered messaging protocol. It loads the maps, then persists the entities from the server, then matches up its own npc definitions with the entity id's from the server to the iCelEntitys. Index: psserver.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psserver.h,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** psserver.h 5 May 2003 05:34:11 -0000 1.43 --- psserver.h 2 Jun 2003 07:14:50 -0000 1.44 *************** *** 132,135 **** --- 132,140 ---- */ ChatManager* GetChatManager() { return chatmanager; } + /** Returns the NPC Superclient manager. + * + * @return Returns a reference to the current npc manager. + */ + NPCManager* GetNPCManager() { return npcmanager; } /** Returns the database manager. * *************** *** 201,205 **** psRPGInfo* rpginfo; ExchangeManager* exchangemanager; ! NPCManager* npcmanager; csRef<iObjectRegistry> objreg; --- 206,210 ---- psRPGInfo* rpginfo; ExchangeManager* exchangemanager; ! NPCManager* npcmanager; csRef<iObjectRegistry> objreg; Index: pscelserver.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.h,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** pscelserver.h 24 Apr 2003 07:03:13 -0000 1.43 --- pscelserver.h 2 Jun 2003 07:14:50 -0000 1.44 *************** *** 73,77 **** protected: ! bool CreateRoom (const char* name, const char* mapfile); csPtr<iCelEntity> CreateActor(const char* factname, const csVector3& pos, --- 73,77 ---- protected: ! bool CreateRoom (const char* name, const char* mapfile); csPtr<iCelEntity> CreateActor(const char* factname, const csVector3& pos, *************** *** 87,91 **** void HandleUserAction(MsgEntry* me); void HandlePersistMessage(MsgEntry* me); ! bool SendActorList(uint32_t clientnum, uint32_t clientselfid); bool ready; --- 87,91 ---- void HandleUserAction(MsgEntry* me); void HandlePersistMessage(MsgEntry* me); ! bool SendActorList(Client *client); bool ready; Index: pscelserver.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.cpp,v retrieving revision 1.138 retrieving revision 1.139 diff -C2 -d -r1.138 -r1.139 *** pscelserver.cpp 1 May 2003 21:50:42 -0000 1.138 --- pscelserver.cpp 2 Jun 2003 07:14:50 -0000 1.139 *************** *** 68,71 **** --- 68,72 ---- #include "weathermanager.h" #include "groupmanager.h" + #include "npcmanager.h" #include "psprop/pc/pspclinmove.h" *************** *** 540,544 **** if (!actors) return; ! if (!client->GetActor()) { printf ("*** Client has no entity assigned yet!\n"); --- 541,545 ---- if (!actors) return; ! if (!client->IsSuperClient() && !client->GetActor()) { printf ("*** Client has no entity assigned yet!\n"); *************** *** 547,551 **** netpersist->Clear(); ! if (!SendActorList (me->clientnum, client->GetActor()->GetEntity()->GetID())) printf ("Error while sending actorlist!\n"); netpersist->Clear(); --- 548,552 ---- netpersist->Clear(); ! if (!SendActorList (client)) printf ("Error while sending actorlist!\n"); netpersist->Clear(); *************** *** 559,566 **** } ! bool psCelServer::SendActorList(uint32_t clientnum, uint32_t clientselfid) { ! csRef<iCelEntity> proxactors = cel->CreateProxActorList(clientnum, GetActors() ); ! return netpersist->SendActors(clientnum,clientselfid,proxactors); } --- 560,577 ---- } ! bool psCelServer::SendActorList(Client *client) { ! // Superclients get all actors in the world, while regular clients ! // get actors in proximity. ! if ( !client->IsSuperClient() ) ! { ! csRef<iCelEntity> proxactors = cel->CreateProxActorList(client->GetClientNum() , GetActors() ); ! return netpersist->SendActors(client->GetClientNum(),client->GetActor()->GetEntity()->GetID(),proxactors); ! } ! else ! { ! netpersist->SendActors(client->GetClientNum(), 0, GetActors() ); ! psserver->GetNPCManager()->SendNPCList(client); ! } } Index: pscel.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscel.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** pscel.h 25 Apr 2003 04:24:53 -0000 1.7 --- pscel.h 2 Jun 2003 07:14:51 -0000 1.8 *************** *** 53,58 **** csRef<iCelBlLayer> bl; psNetPersist *netpersist; ! psDatabase *database; ! MsgHandler *msghandler; public: --- 53,58 ---- csRef<iCelBlLayer> bl; psNetPersist *netpersist; ! psDatabase *database; ! MsgHandler *msghandler; public: *************** *** 65,73 **** csPtr<iCelEntity> CreateEntity(celPSObject *obj); ! void RemoveEntity(celPSObject *which); celPSObject *FindObject(CS_ID id); ! celPSObject *GetObjectFromEntityList(iCelEntityList *list,int i); ! csPtr<iCelEntity> CreateProxActorList(uint32_t clientnum,iCelEntity *all_actors); }; --- 65,74 ---- csPtr<iCelEntity> CreateEntity(celPSObject *obj); ! void RemoveEntity(celPSObject *which); celPSObject *FindObject(CS_ID id); ! celPSObject *GetObjectFromEntityList(iCelEntityList *list,int i); ! csPtr<iCelEntity> CreateProxActorList(uint32_t clientnum,iCelEntity *all_actors); ! int FindPlayerEntity(int player_id); }; Index: pscel.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscel.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** pscel.cpp 27 Apr 2003 03:14:52 -0000 1.8 --- pscel.cpp 2 Jun 2003 07:14:51 -0000 1.9 *************** *** 1,4 **** /* ! * pscel.h by Keith Fulton <ke...@pa...> * * Copyright (C) 2003 PlaneShift Team (in...@pl..., --- 1,4 ---- /* ! * pscel.cpp by Keith Fulton <ke...@pa...> * * Copyright (C) 2003 PlaneShift Team (in...@pl..., *************** *** 134,137 **** --- 134,150 ---- else return NULL; + } + + int psCel::FindPlayerEntity(int player_id) + { + csGlobalHashIterator iter(&entities); + + while (iter.HasNext()) + { + celPSObject *obj = (celPSObject *)iter.Next(); + if (obj->GetPlayerID() == player_id) + return obj->GetEntity()->GetID(); + } + return 0; } Index: npcmanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/npcmanager.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** npcmanager.h 31 May 2003 07:18:54 -0000 1.2 --- npcmanager.h 2 Jun 2003 07:14:51 -0000 1.3 *************** *** 38,44 **** NPCManager( MsgHandler *mh, ! ClientConnectionSet *pCCS, ! psCelServer *celserv, ! psDatabase *db); virtual ~NPCManager(); --- 38,44 ---- NPCManager( MsgHandler *mh, ! ClientConnectionSet *pCCS, ! psCelServer *celserv, ! psDatabase *db); virtual ~NPCManager(); *************** *** 46,53 **** virtual void HandleMessage(MsgEntry *pMsg); protected: void HandleAuthentRequest(MsgEntry *me); - void SendNPCList(Client *client); void SendMapList(Client *client); --- 46,54 ---- virtual void HandleMessage(MsgEntry *pMsg); + void SendNPCList(Client *client); + protected: void HandleAuthentRequest(MsgEntry *me); void SendMapList(Client *client); Index: npcmanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/npcmanager.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** npcmanager.cpp 31 May 2003 07:18:54 -0000 1.2 --- npcmanager.cpp 2 Jun 2003 07:14:51 -0000 1.3 *************** *** 149,152 **** --- 149,153 ---- client->SetAccountID( cid ); client->SetPlayerID( pid ); + client->SetSuperClient( true ); char addr[30]; *************** *** 161,165 **** superclients.Push(pd); - SendNPCList(client); SendMapList(client); } --- 162,165 ---- *************** *** 172,176 **** if (!rs) { ! Error3("Faild to get NPCs managed by %s: %s", client->GetName(),database->GetLastError()); return; --- 172,176 ---- if (!rs) { ! Error3("Failed to get NPCs managed by %s: %s", client->GetName(),database->GetLastError()); return; *************** *** 179,201 **** // TODO: Make this message binary instead of xml ! csString buff = "<npclist>"; for (unsigned int i=0; i<rs->Count(); i++) { ! char npc[1000]; ! sprintf(npc,"<npc id=\"%d\" name=\"%s\" master=\"%d\" x=\"%1.2f\" y=\"%1.2f\" z=\"%1.2f\" rot=\"%1.2f\" />", ! atoi((*rs)[i][0]), ! (*rs)[i][1], ! atoi((*rs)[i][2]), ! atof((*rs)[i][3]), ! atof((*rs)[i][4]), ! atof((*rs)[i][5]), ! atof((*rs)[i][6]) ); ! ! buff.Append(npc); } ! buff.Append("</npclist>"); rs->Release(); - psNPCListMessage newmsg(client->GetClientNum(),buff); msghandler->SendMessage(newmsg.msg); } --- 179,196 ---- // TODO: Make this message binary instead of xml ! // Note, building the internal message outside the msg ctor is very bad ! // but I am doing this to avoid sending database result sets to the msg ctor. ! psNPCListMessage newmsg(client->GetClientNum(),rs->Count() * 2 * sizeof(uint32_t) + sizeof(uint32_t)); ! newmsg.msg->Add( rs->Count() ); for (unsigned int i=0; i<rs->Count(); i++) { ! uint32_t pid = atoi((*rs)[i][0]); ! uint32_t entityid = celserver->GetCEL()->FindPlayerEntity(pid); ! newmsg.msg->Add(pid); ! newmsg.msg->Add(entityid); } ! rs->Release(); msghandler->SendMessage(newmsg.msg); } Index: client.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/client.h,v retrieving revision 1.28 retrieving revision 1.29 diff -C2 -d -r1.28 -r1.29 *** client.h 10 May 2003 20:28:56 -0000 1.28 --- client.h 2 Jun 2003 07:14:51 -0000 1.29 *************** *** 123,126 **** --- 123,132 ---- void SetLastResponse(int response) { lastResponse=response; } + /// Allow distinguishing superclients from regular player clients + bool IsSuperClient() + { return superclient; } + void SetSuperClient(bool flag) + { superclient = flag; } + long GetIPAddress(char *addr) { *************** *** 202,211 **** int securityLevel; int guildID; ! bool guild_is_secret; csString name; csString playerguild; csString playerguildlevel; bool tradingStopped; ! int lastResponse; --- 208,217 ---- int securityLevel; int guildID; ! bool guild_is_secret; csString name; csString playerguild; csString playerguildlevel; bool tradingStopped; ! bool superclient; int lastResponse; Index: client.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/client.cpp,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -d -r1.29 -r1.30 *** client.cpp 10 May 2003 20:28:56 -0000 1.29 --- client.cpp 2 Jun 2003 07:14:51 -0000 1.30 *************** *** 34,42 **** : ready(false), accountID(0), playerID(0), objectID(0), securityLevel(0), guildID(0), name(""), playerguild(""), playerguildlevel(""),tradingStopped(false),tradingStatus(Client::NOT_TRADING), ! group(0),guild_is_secret(false), lastResponse(-1) { ! actor = NULL; ! target = NULL; } --- 34,42 ---- : ready(false), accountID(0), playerID(0), objectID(0), securityLevel(0), guildID(0), name(""), playerguild(""), playerguildlevel(""),tradingStopped(false),tradingStatus(Client::NOT_TRADING), ! group(0),superclient(false),guild_is_secret(false), lastResponse(-1) { ! actor = NULL; ! target = NULL; } |