Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1:/tmp/cvs-serv30739 Modified Files: usermanager.h usermanager.cpp spawnmanager.h spawnmanager.cpp netmanager.h netmanager.cpp entitymanager.h entitymanager.cpp Log Message: Added loot window, loot context menu for NPCs and loot button images. Adding the looted item to inventory doesn't work right now and I'm not sure why not. Index: usermanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/usermanager.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** usermanager.h 5 Oct 2003 17:31:03 -0000 1.18 --- usermanager.h 11 Oct 2003 16:31:23 -0000 1.19 *************** *** 75,80 **** enum { ! ALL_PLAYERS=0, ! PLAYER_BUDDIES=1 }; void RollDice(psUserCmdMessage& msg,Client *client,int clientnum); --- 75,80 ---- enum { ! ALL_PLAYERS=0, ! PLAYER_BUDDIES=1 }; void RollDice(psUserCmdMessage& msg,Client *client,int clientnum); *************** *** 83,86 **** --- 83,87 ---- void Attack(psUserCmdMessage& msg,Client *client,int clientnum); void StopAttack(psUserCmdMessage& msg,Client *client,int clientnum); + void HandleLoot(Client *client); /** Handles an /Assist command comming from the client. Index: usermanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/usermanager.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** usermanager.cpp 5 Oct 2003 17:31:03 -0000 1.74 --- usermanager.cpp 11 Oct 2003 16:31:23 -0000 1.75 *************** *** 1,4 **** /* ! * usermanager.h - Author: Keith Fulton * * Copyright (C) 2001 PlaneShift Team (in...@pl..., --- 1,4 ---- /* ! * usermanager.cpp - Author: Keith Fulton * * Copyright (C) 2001 PlaneShift Team (in...@pl..., *************** *** 174,177 **** --- 174,181 ---- adminmanager->Admin(client->GetPlayerID(), me->clientnum); } + else if ( msg.command == "/loot" ) + { + HandleLoot(client); + } else if (msg.command == "/greet" ) { *************** *** 826,829 **** --- 830,870 ---- UserStatRegeneration(); } + + /** + * Check target dead + * Check target lootable by this client + * Return lootable items list if present + */ + void UserManager::HandleLoot(Client *client) + { + // Check target dead + gemObject *target = client->GetTargetObject(); + if (target->IsAlive()) + return; + + // TODO: Check target lootable by this client + + // Return lootable items list if present + psCharacter *chr = target->GetCharacterData(); + if (chr) + { + psLootMessage loot; + int count = chr->GetLootItems(loot, + target->GetEntity()->GetID(), + client->GetClientNum() ); + if (count) + { + printf("Sending %d loot items to client %d.\n",count,client->GetClientNum() ); + msghandler->SendMessage(loot.msg); + } + else + { + printf("Mob doesn't have loot.\n"); + psSystemMessage none(client->GetClientNum(),MSG_INFO,"%s cannot be looted.",target->GetName() ); + msghandler->SendMessage(none.msg); + } + } + } + /*---------------------------------------------------------------------*/ Index: spawnmanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/spawnmanager.h,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** spawnmanager.h 9 Oct 2003 07:06:56 -0000 1.18 --- spawnmanager.h 11 Oct 2003 16:31:23 -0000 1.19 *************** *** 251,254 **** --- 251,256 ---- #endif + void HandleLootItem(MsgEntry *me); + public: SCF_DECLARE_IBASE; Index: spawnmanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/spawnmanager.cpp,v retrieving revision 1.36 retrieving revision 1.37 diff -C2 -d -r1.36 -r1.37 *** spawnmanager.cpp 9 Oct 2003 07:06:56 -0000 1.36 --- spawnmanager.cpp 11 Oct 2003 16:31:23 -0000 1.37 *************** *** 31,34 **** --- 31,35 ---- #include "psdatabase.h" #include "entitymanager.h" + #include "netmanager.h" #include "net/msghandler.h" #include "psprop/pc/pspcchar.h" *************** *** 41,44 **** --- 42,47 ---- #include "bulkobjects/pscharacter.h" #include "bulkobjects/pscharacterloader.h" + #include "bulkobjects/psitem.h" + #include "bulkobjects/psitemstats.h" SCF_IMPLEMENT_IBASE( psSpawnManager ) *************** *** 65,68 **** --- 68,72 ---- msghandler->Subscribe(this,MSGTYPESPAWN); + msghandler->Subscribe(this,MSGTYPELOOTITEM); } *************** *** 70,73 **** --- 74,78 ---- { msghandler->Unsubscribe(this,MSGTYPESPAWN); + msghandler->Unsubscribe(this,MSGTYPELOOTITEM); #ifdef PS_EGGHUNT *************** *** 305,308 **** --- 310,319 ---- void psSpawnManager::HandleMessage(MsgEntry *me) { + if (me->data->type == MSGTYPELOOTITEM) + { + HandleLootItem(me); + return; + } + psSpawnMessage spawn(me); if (!spawn.valid) *************** *** 411,420 **** // -itemID below is a hack to differentiate eggs from other spawns psRespawnGameEvent *newevent = new psRespawnGameEvent(this,delay, ! pos,angle, ! sector,-itemID); eventmanager->Push(newevent); Notify3(LOG_SPAWN,"Scheduled hidden crystal %d to be spawned in %1.1f seconds.\n",itemID,(float)delay/1000.0); #endif } --- 422,464 ---- // -itemID below is a hack to differentiate eggs from other spawns psRespawnGameEvent *newevent = new psRespawnGameEvent(this,delay, ! pos,angle, ! sector,-itemID); eventmanager->Push(newevent); Notify3(LOG_SPAWN,"Scheduled hidden crystal %d to be spawned in %1.1f seconds.\n",itemID,(float)delay/1000.0); #endif + } + + void psSpawnManager::HandleLootItem(MsgEntry *me) + { + psLootItemMessage msg(me); + + gemObject *obj = entitymanager->GetGEM()->FindObject(msg.entity); + if (!obj) + { + Error2("LootItem Message specified erroneous entity id of %d.\n",msg.entity); + return; + } + psCharacter *chr = obj->GetCharacterData(); + if (!chr) + { + Error2("LootItem Message specified non-character entity id of %d.\n",msg.entity); + return; + } + bool success = chr->RemoveLootItem(msg.lootitem); + if (!success) + { + Error2("LootItem Message specified bad item id of %d.\n",msg.lootitem); + return; + } + psItemStats *itemstat = psserver->cachemanager.GetBasicItemStatsByID(msg.lootitem); + psItem *item = psServer::CharacterLoader.InstantiateBasicItem(itemstat); + + entitymanager->MoveItemToInventory(chr,item); + + Client *client = psserver->GetNetManager()->GetClient(me->clientnum); + psSystemMessage loot(me->clientnum,MSG_INFO,"%s has looted a %s.",client->GetName(),item->GetName() ); + msghandler->SendMessage(loot.msg); + // TODO: Send to group } Index: netmanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/netmanager.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** netmanager.h 1 Sep 2003 04:24:41 -0000 1.3 --- netmanager.h 11 Oct 2003 16:31:23 -0000 1.4 *************** *** 102,105 **** --- 102,110 ---- ClientConnectionSet* GetConnections() { return &clients; } + /** Gets a client with the specified id. + * + * @return Returns a pointer to the specified client or NULL if not found. + */ + Client *GetClient(int cnum); /** Sends the given message to the client listed in the message. Index: netmanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/netmanager.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** netmanager.cpp 4 Oct 2003 21:12:43 -0000 1.6 --- netmanager.cpp 11 Oct 2003 16:31:23 -0000 1.7 *************** *** 310,313 **** --- 310,319 ---- } + Client *NetManager::GetClient(int cnum) + { + return clients.Find(cnum); + } + + void NetManager::Multicast (MsgEntry* me, const PublishVector& multi, int except, float range) { Index: entitymanager.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/entitymanager.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** entitymanager.h 1 Sep 2003 04:24:41 -0000 1.1 --- entitymanager.h 11 Oct 2003 16:31:23 -0000 1.2 *************** *** 58,61 **** --- 58,62 ---- bool CreateItem(psItem *iteminstance); bool MoveItemToInventory(gemActor* player, gemObject* item); + bool MoveItemToInventory(psCharacter* chardata, psItem* itemdata); virtual void HandleMessage(MsgEntry* me); Index: entitymanager.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/entitymanager.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** entitymanager.cpp 8 Oct 2003 20:08:33 -0000 1.9 --- entitymanager.cpp 11 Oct 2003 16:31:23 -0000 1.10 *************** *** 589,606 **** } ! bool EntityManager::MoveItemToInventory(gemActor* player, gemObject* item) { - // TODO: dynamic_cast<>() here? or find another way. dynamic_cast adds a good bit of runtime overhead to the whole program - gemItem *gemitem=(gemItem *)item; - if (gemitem==NULL) - return false; - psItem *itemdata=gemitem->GetItem(); - if (itemdata==NULL) - return false; - - psCharacter *chardata=player->GetCharacterData(); - if (chardata==NULL) - return false; - // Find a free bulk slot unsigned int freeslot; --- 589,594 ---- } ! bool EntityManager::MoveItemToInventory(psCharacter* chardata, psItem* itemdata) { // Find a free bulk slot unsigned int freeslot; *************** *** 641,644 **** --- 629,649 ---- return true; + } + + bool EntityManager::MoveItemToInventory(gemActor* player, gemObject* item) + { + // TODO: dynamic_cast<>() here? or find another way. dynamic_cast adds a good bit of runtime overhead to the whole program + gemItem *gemitem=(gemItem *)item; + if (gemitem==NULL) + return false; + psItem *itemdata=gemitem->GetItem(); + if (itemdata==NULL) + return false; + + psCharacter *chardata=player->GetCharacterData(); + if (chardata==NULL) + return false; + + return MoveItemToInventory(chardata,itemdata); } |