Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1:/tmp/cvs-serv13259/src/server Modified Files: client.cpp command.cpp groupmanager.cpp pscel.cpp pscelserver.cpp pscelserver.h usermanager.cpp usermanager.h Log Message: - Added a psStatDRMessage to send, DR data for Hitpoints,Mana and Fatigue. - Handle the static update of the StatDR message in client and update both group window and status bar. - Added a timer in the server to update stat values - Added server command to adjust players stats (for test, until integrated with the combat system). Index: client.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/client.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** client.cpp 18 Apr 2003 21:07:48 -0000 1.24 --- client.cpp 19 Apr 2003 04:49:08 -0000 1.25 *************** *** 99,103 **** csPtr<iPcCharacterData> Client::GetCharacterData() { ! return csPtr<iPcCharacterData>(actor->GetCharacterData()); } --- 99,103 ---- csPtr<iPcCharacterData> Client::GetCharacterData() { ! return csPtr<iPcCharacterData>(actor?actor->GetCharacterData():NULL); } Index: command.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/command.cpp,v retrieving revision 1.69 retrieving revision 1.70 diff -C2 -d -r1.69 -r1.70 *** command.cpp 18 Apr 2003 17:00:36 -0000 1.69 --- command.cpp 19 Apr 2003 04:49:08 -0000 1.70 *************** *** 31,34 **** --- 31,35 ---- #include "spawnmanager.h" #include "psprop/pc/pspcproxlist.h" + #include "psprop/pc/pspcchar.h" #include "admin/adminmessage.h" #include "adminmanager.h" *************** *** 731,734 **** --- 732,801 ---- } + int com_setstats(char *line) + { + + if (!line) + { + CPrintf("Please specify: PlayerName HP HP_rate Mana Mana_rate Fatigue Fatigue_rat.\n"); + return 0; + } + + csString str(line); + csString player(GetWordNumber(str,1)); + float hitPoints = atof(GetWordNumber(str,2)); + float hitPoints_rate = atof(GetWordNumber(str,3)); + float mana = atof(GetWordNumber(str,4)); + float mana_rate = atof(GetWordNumber(str,5)); + float fatigue = atof(GetWordNumber(str,6)); + float fatigue_rate = atof(GetWordNumber(str,7)); + + int playerID = psserver->GetDatabase()->GetPlayerID(player); + + if (playerID==-1) + { + CPrintf("Player name %s is not found. Sorry.\n",player.GetData()); + return 0; + } + + iCelEntity *world = psserver->GetCelServer()->GetActors(); + + if (world) + { + csRef<iPcInventory> pcinv = CEL_QUERY_PROPCLASS(world->GetPropertyClassList(), iPcInventory); + if (!pcinv) + return 0; + + for (int i=0; i<pcinv->GetEntityCount(); i++) + { + iCelEntity *candidate = pcinv->GetEntity(i); + csRef<iPcCharacterData> charData = CEL_QUERY_PROPCLASS(candidate->GetPropertyClassList(), iPcCharacterData); + if (charData) + { + CPrintf("Checking %s %d == %d\n",charData->GetCharName().GetData(), + charData->GetPlayerID(),playerID); + + if (charData->GetPlayerID() == playerID) + { + CPrintf("Seting %s: %f %f %f %f %f %f\n",player.GetData(), + hitPoints,hitPoints_rate,mana,mana_rate,fatigue,fatigue_rate); + charData->AdjustHitPoints(hitPoints); + charData->AdjustMana(mana); + charData->AdjustFatigue(fatigue); + return 0; + } + } + } + Error1("No candiate"); + } + else + { + Error1("Faild to find world"); + } + + + + return 0; + } + /* add all new commands here */ *************** *** 758,761 **** --- 825,829 ---- { "list", com_list, "Display all entities' names, #'s, and positions" }, { "sectors", com_sectors, "Display all sectors" }, + { "setstats", com_setstats, "Set playerID's HP HP_rate Mana Mana_rate Fatigue Fatigue_rate" }, { 0, 0, 0 } }; Index: groupmanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/groupmanager.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** groupmanager.cpp 18 Apr 2003 21:07:49 -0000 1.2 --- groupmanager.cpp 19 Apr 2003 04:49:09 -0000 1.3 *************** *** 141,145 **** sprintf(buff,"<M N=\"%s\" H=\"%.2f\" M=\"%.2f\" F=\"%.2f\"/>", members[n]->GetName(),charData->AdjustHitPoints(0.0), ! 0.0,0.0); list.Append(buff); } --- 141,146 ---- sprintf(buff,"<M N=\"%s\" H=\"%.2f\" M=\"%.2f\" F=\"%.2f\"/>", members[n]->GetName(),charData->AdjustHitPoints(0.0), ! members[n]->GetName(),charData->AdjustMana(0.0), ! members[n]->GetName(),charData->AdjustFatigue(0.0)); list.Append(buff); } Index: pscel.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscel.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pscel.cpp 18 Apr 2003 21:07:49 -0000 1.3 --- pscel.cpp 19 Apr 2003 04:49:09 -0000 1.4 *************** *** 407,411 **** int objID, int pID) ! : celPSObject(cel,name,factname,filename,room,pos,rotangle,clientnum,objID) { if (!InitLinMove(pos,rotangle,sector)) --- 407,412 ---- int objID, int pID) ! : celPSObject(cel,name,factname,filename,room,pos,rotangle,clientnum,objID), ! playerID(pID) { if (!InitLinMove(pos,rotangle,sector)) *************** *** 432,437 **** entity->SetBehaviour (behaviour); - playerID = pID; - printf("Successfully created actor %s at %1.2f,%1.2f,%1.2f in sector %s.\n", factname,pos.x,pos.y,pos.z,sector->QueryObject()->GetName() ); --- 433,436 ---- *************** *** 488,492 **** pcdata = SCF_QUERY_INTERFACE(pc, iPcCharacterData); if (pcdata) ! return true; // right now this func never fail, but might later. else return false; --- 487,494 ---- pcdata = SCF_QUERY_INTERFACE(pc, iPcCharacterData); if (pcdata) ! { ! pcdata->SetPlayerID(playerID); ! return true; ! } else return false; Index: pscelserver.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.cpp,v retrieving revision 1.131 retrieving revision 1.132 diff -C2 -d -r1.131 -r1.132 *** pscelserver.cpp 18 Apr 2003 17:00:37 -0000 1.131 --- pscelserver.cpp 19 Apr 2003 04:49:09 -0000 1.132 *************** *** 701,704 **** --- 701,714 ---- } + + void psCelServer::SetReady(bool flag) + { + ready = flag; + if (ready) + { + usermanager->Ready(); + } + } + Index: pscelserver.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/pscelserver.h,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** pscelserver.h 18 Apr 2003 06:33:14 -0000 1.39 --- pscelserver.h 19 Apr 2003 04:49:09 -0000 1.40 *************** *** 68,72 **** csPtr<iCelEntity> CreateEntity( const char* propclass ); ! void SetReady(bool flag) { ready = flag; } bool IsReady() { return ready; } --- 68,72 ---- csPtr<iCelEntity> CreateEntity( const char* propclass ); ! void SetReady(bool flag); bool IsReady() { return ready; } Index: usermanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/usermanager.cpp,v retrieving revision 1.53 retrieving revision 1.54 diff -C2 -d -r1.53 -r1.54 *** usermanager.cpp 18 Apr 2003 17:00:39 -0000 1.53 --- usermanager.cpp 19 Apr 2003 04:49:09 -0000 1.54 *************** *** 476,497 **** } ! /*---------------------------------------------------------------------*/ ! psTestGameEvent::psTestGameEvent(csTicks ticks,int offset,psSystemMessage *message,MsgHandler *mh) ! : psGameEvent(ticks,offset) { ! msg = message; ! msghandler = mh; } ! psTestGameEvent::~psTestGameEvent() { ! delete msg; } ! void psTestGameEvent::Trigger() { ! msghandler->SendMessage(msg->msg); } --- 476,524 ---- } + void UserManager::UserStatRegeneration() + { + // WARNING WARNING WARNING WARNING WARNING WARNING WARNING + // TODO: This is called from the event thread, accessing + // datastruct on in main thread. Need some sync or + // move this code in main thread. + ClientIterator i(*clients); + Client * p; + for (p = i.First(); p; p = i.Next()) + { + csRef<iPcCharacterData> charData = p->GetCharacterData(); + if (charData) + { + csRef<iDataBuffer> data = charData->GetStatDRData(); + psStatDRMessage msg(p->GetClientNum(),p->GetActor()->GetEntity()->GetID(),data); ! msghandler->SendMessage(msg.me); ! } ! } ! // WARNING WARNING WARNING WARNING WARNING WARNING WARNING ! // Push a new event ! psUserStatRegeneration* event; ! nextUserStatRegeneration += 1000; ! event = new psUserStatRegeneration(this,nextUserStatRegeneration); ! eventmanager->Push(event); ! } ! ! void UserManager::Ready() { ! nextUserStatRegeneration = csGetTicks(); ! UserStatRegeneration(); } ! /*---------------------------------------------------------------------*/ ! ! psUserStatRegeneration::psUserStatRegeneration(UserManager *mgr, csTicks ticks) ! : psGameEvent(ticks,0) { ! usermanager = mgr; } ! void psUserStatRegeneration::Trigger() { ! usermanager->UserStatRegeneration(); } Index: usermanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/usermanager.h,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** usermanager.h 18 Mar 2003 20:32:54 -0000 1.13 --- usermanager.h 19 Apr 2003 04:49:09 -0000 1.14 *************** *** 47,50 **** --- 47,53 ---- void SetAdminManager(AdminManager* manager) { adminmanager = manager; } + void UserStatRegeneration(); + void Ready(); + protected: *************** *** 64,67 **** --- 67,71 ---- void StopAttack(psUserCmdMessage& msg,Client *client,int clientnum); + MsgHandler* msghandler; ClientConnectionSet* clients; *************** *** 73,87 **** psServer *server; AdminManager *adminmanager; }; ! class psTestGameEvent : public psGameEvent { protected: ! psSystemMessage *msg; ! MsgHandler *msghandler; public: ! psTestGameEvent(csTicks ticks,int offset,psSystemMessage *message,MsgHandler *mh); ! virtual ~psTestGameEvent(); virtual void Trigger(); // Abstract event processing function --- 77,90 ---- psServer *server; AdminManager *adminmanager; + csTicks nextUserStatRegeneration; }; ! class psUserStatRegeneration : public psGameEvent { protected: ! UserManager * usermanager; public: ! psUserStatRegeneration(UserManager *mgr,csTicks ticks); virtual void Trigger(); // Abstract event processing function |