From: Andrew C. <ac...@us...> - 2004-05-22 01:22:01
|
Update of /cvsroot/planeshift/planeshift/src/server In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1925/src/server Modified Files: psserverchar.cpp psserverchar.h Log Message: Fixed some more container issues. Index: psserverchar.cpp =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psserverchar.cpp,v retrieving revision 1.176 retrieving revision 1.177 diff -C2 -d -r1.176 -r1.177 *** psserverchar.cpp 21 May 2004 16:48:43 -0000 1.176 --- psserverchar.cpp 22 May 2004 01:21:19 -0000 1.177 *************** *** 1463,1721 **** holdingSlotID = mesg.fromSlot; holdingContainerID = mesg.fromContainer; ! switch ( mesg.fromContainer ) ! { ! case CONTAINER_INVENTORY_MONEY: ! { ! holdingItem = new psItem(); ! csString type("Tria"); ! ! switch( mesg.fromSlot ) ! { ! case MONEY_TRIAS: type="Tria"; break; ! case MONEY_HEXAS: type="Hexa"; break; ! case MONEY_OCTAS: type="Octa"; break; ! case MONEY_CIRCLES: type="Circle"; break; ! default: ! Error2("Could not locate fromSlot: %d", mesg.fromSlot ); ! break; ! } ! ! psMoney money = charData->GetMoney(); ! int count = money.Get( mesg.fromSlot ) - mesg.stackCount; ! if ( count < 0 ) ! { ! Error2("Client %s is trying to cheat by grabbing too much money", fromClient->GetName() ); ! return; ! } ! money.Adjust( mesg.fromSlot, -mesg.stackCount); ! charData->SetMoney( money ); ! charData->SaveMoney(); ! ! psItemStats * stat = psServer::cachemanager.GetBasicItemStatsByName(type); ! if ( !stat ) ! Error2("Could not load basic item stat for %s", type.GetData() ); ! else ! { ! holdingItem->SetBaseStats(stat); ! holdingItem->SetStackCount( mesg.stackCount ); ! } ! ! break; ! } ! ! case CONTAINER_INVENTORY_BULK: ! { ! holdingItem = charData->RemoveItemInBulk( mesg.fromSlot, mesg.stackCount ); ! break; ! } ! ! case CONTAINER_INVENTORY_EQUIPMENT: ! { ! holdingItem = charData->RemoveItemInSlot( mesg.fromSlot ); ! break; ! } ! ! case CONTAINER_EXCHANGE_OFFERING: ! { ! int dummy; ! Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); ! holdingItem = exchange->RemoveItem( fromClient, holdingSlotID, mesg.stackCount, dummy ); ! break; ! } ! ! /// Assume it is from a generic container object. ! default: ! { ! holdingContainer = FindContainer( mesg.fromContainer ); ! if ( holdingContainer ) ! { ! holdingItem = holdingContainer->RemoveItemsInContainer( mesg.fromSlot, mesg.stackCount ); ! } ! break; ! } ! } ! // Did we actually find an item to move? if ( holdingItem == NULL ) ! return; ! ! ! if ( mesg.fromContainer == CONTAINER_INVENTORY_EQUIPMENT) ! { ! csString itemSound( holdingItem->GetSound() ); ! itemSound.Append(".unequip"); ! ! psserver->GetCharManager()->SendOutPlaySoundMessage(fromClient, itemSound ); ! if ( holdingItem ) ! psserver->GetCharManager()->SendOutEquipmentMessages( fromClient, mesg.fromSlot, holdingItem, psEquipmentMessage::DEEQUIP); ! } ! ! //------------------------------------------------------------------------------------- ! ! switch ( mesg.toContainer ) ! { ! case CONTAINER_INVENTORY_MONEY: ! { ! if ( mesg.fromContainer == CONTAINER_INVENTORY_MONEY || ! mesg.fromContainer == CONTAINER_OFFERING_MONEY ) ! { ! psMoney money = charData->GetMoney(); ! money.Adjust( mesg.fromSlot, mesg.stackCount); ! charData->SetMoney( money ); ! charData->SaveMoney(); ! psserver->GetCharManager()->UpdateItemViews(clientNum); ! /// We need to remove this item since it no longer exists. ! delete holdingItem; ! } ! } ! case CONTAINER_OFFERING_MONEY: ! { ! if ( mesg.fromContainer == CONTAINER_INVENTORY_MONEY || ! mesg.fromContainer == CONTAINER_OFFERING_MONEY ) ! { ! Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); ! if ( !exchange ) ! { ! Error1( "Client tried to drop to non existant exchange" ); ! return; ! } ! else ! { ! exchange->AdjustMoney(fromClient, mesg.fromSlot, mesg.stackCount); ! } ! } ! /// Delete the money item since it has been placed in the exchange area. ! delete holdingItem; ! break; ! } ! case CONTAINER_EXCHANGE_OFFERING: ! { ! Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); ! if ( !exchange ) ! { ! Error1( "Client tried to drop to non existant exchange" ); ! return; ! } ! else ! { ! exchange->AddItem( fromClient, holdingItem, mesg.toSlot); ! } ! break; ! } ! ! ! case CONTAINER_WORLD: ! { ! printf("Dropping item\n"); ! ! charData->DropItem( holdingItem ); ! ! if ( holdingItem ) ! { ! printf("Found item: %s\n", holdingItem->GetName() ); ! psserver->GetEntityManager()->CreateItem(holdingItem); ! ! // Save the item's state as in the world (and not on the player) ! holdingItem->Save(); ! ! ! csString itemSound( holdingItem->GetSound() ); ! itemSound.Append(".drop"); ! psserver->GetCharManager()->SendOutPlaySoundMessage( fromClient, itemSound ); ! ! time_t curtime = time(NULL); ! struct tm *loctime; ! loctime = localtime (&curtime); ! csString strTime(asctime(loctime)); ! strTime.Truncate(strTime.Length()-1); ! csString buf; ! buf.Format("%s, %s, %s, %s, \"%s\", %d, %d\n", strTime.GetData(), fromClient->GetName(), "World", "Drop", holdingItem->GetName(), 0, 0); ! psserver->GetCharManager()->WriteLog(buf.GetData()); ! ! // Update all client views ! printf("Updating Views\n"); ! psserver->GetCharManager()->UpdateItemViews(clientNum); ! } ! ! break; ! } ! ! case CONTAINER_INVENTORY_BULK: ! { ! if ( !charData->PutItemInBulk( mesg.toSlot, holdingItem ) ) ! { ! ReplaceHolding(); ! } ! break; ! } ! ! case CONTAINER_INVENTORY_EQUIPMENT: ! { ! psItem* toItem = charData->GetItemInSlot( mesg.toSlot ); ! // If there is an item already here then this is not allowed for equipment. ! // The better thing would be to do a swap but that is more complex and ! // will be a future item. ! if ( toItem ) ! { ! ReplaceHolding(); ! } ! else ! { ! if ( holdingItem->FitsInSlots(psServer::cachemanager.slotMap[mesg.toSlot]) ) ! { ! charData->EquipItemInSlot(mesg.toSlot, holdingItem); ! psserver->GetCharManager()->SendOutEquipmentMessages( fromClient, mesg.toSlot, holdingItem, psEquipmentMessage::EQUIP); ! ! if ( mesg.toSlot == PSCHARACTER_SLOT_MIND ) ! psserver->SendSystemInfo(fromClient->GetClientNum(), "You are now envisioning %s.",(const char*)holdingItem->GetName()); ! ! csString itemSound( holdingItem->GetSound() ); ! itemSound.Append(".equip"); ! ! psserver->GetCharManager()->SendOutPlaySoundMessage(fromClient, itemSound); ! ! } ! else ! { ! ReplaceHolding(); ! } ! } ! break; ! } ! ! // We assume that the incomming ID is for a generic container and try to ! // put an item in that. ! default: ! { ! psItem* toContainer = FindContainer( mesg.toContainer ); ! ! if ( !toContainer ) ! { ! ReplaceHolding(); ! } ! else ! { ! // Update the container and resend contents to player. ! if ( toContainer->PutItemsInContainer( mesg.toSlot, holdingItem ) ) ! { ! psserver->GetCharManager()->SendItemContents( fromClient, toContainer ); ! ! // check to see if this container will start an auto transform of item(s) ! if( toContainer->GetCanTransform() ) ! { ! psserver->GetWorkManager()->StartAutoWork( ! fromClient, toContainer, holdingItem, holdingItem->GetStackCount()); ! } ! } ! else ! { ! ReplaceHolding(); ! } ! } ! break; ! } ! } psserver->GetCharManager()->SendInventory(me->clientnum); } --- 1463,1476 ---- holdingSlotID = mesg.fromSlot; holdingContainerID = mesg.fromContainer; + holdingParentContainerID = mesg.fromParentContainer; ! holdingItem = FindHoldingItem( fromClient, mesg ); ! // Did we actually find an item to move? if ( holdingItem == NULL ) ! return; ! PlaceHoldingItem(mesg); ! psserver->GetCharManager()->SendInventory(me->clientnum); } *************** *** 1808,1813 **** } ! psItem* SlotManager::FindContainer( int containerID ) { gemObject* object = psserver->GetEntityManager()->GetGEM()->FindObject( containerID ); psItem* container = 0; --- 1563,1578 ---- } ! psItem* SlotManager::FindContainer( Client* client, int containerID, int parentContainerID ) { + if ( parentContainerID == CONTAINER_INVENTORY_BULK ) + { + psCharacter* charData = client->GetCharacterData(); + psItem* item = charData->GetItemInBulk( containerID ); + if ( item ) + { + return item; + } + } + gemObject* object = psserver->GetEntityManager()->GetGEM()->FindObject( containerID ); psItem* container = 0; *************** *** 1839,1840 **** --- 1604,1894 ---- } } + + + psItem* SlotManager::FindHoldingItem( Client* fromClient, psSlotMovementMsg& mesg ) + { + psItem* holdingItem; + // Check to see if this is from a container in the inventory. + if ( mesg.fromParentContainer == CONTAINER_INVENTORY_BULK ) + { + holdingContainer = FindContainer( fromClient, mesg.fromContainer, mesg.fromParentContainer ); + if ( holdingContainer ) + { + holdingItem = holdingContainer->RemoveItemsInContainer( mesg.fromSlot, mesg.stackCount ); + } + } + // The item came from elsewhere so figure out where. + else + { + switch ( mesg.fromContainer ) + { + case CONTAINER_INVENTORY_MONEY: + { + holdingItem = FindFromMoney( mesg.fromSlot, mesg.stackCount ); + break; + } + + case CONTAINER_INVENTORY_BULK: + { + holdingItem = charData->RemoveItemInBulk( mesg.fromSlot, mesg.stackCount ); + break; + } + + case CONTAINER_INVENTORY_EQUIPMENT: + { + holdingItem = charData->RemoveItemInSlot( mesg.fromSlot ); + break; + } + + case CONTAINER_EXCHANGE_OFFERING: + { + int dummy; + Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); + holdingItem = exchange->RemoveItem( fromClient, mesg.fromSlot, mesg.stackCount, dummy ); + break; + } + + default: + { + holdingContainer = FindContainer( fromClient, mesg.fromContainer, mesg.fromParentContainer ); + if ( holdingContainer ) + { + holdingItem = holdingContainer->RemoveItemsInContainer( mesg.fromSlot, mesg.stackCount ); + } + break; + } + } + } + + return holdingItem; + } + + + psItem* SlotManager::FindFromMoney( int slot, int stackCount ) + { + psItem* holdingItem = new psItem(); + csString type("Tria"); + + switch( slot ) + { + case MONEY_TRIAS: type="Tria"; break; + case MONEY_HEXAS: type="Hexa"; break; + case MONEY_OCTAS: type="Octa"; break; + case MONEY_CIRCLES: type="Circle"; break; + default: + Error2("Could not locate fromSlot: %d", slot ); + break; + } + + psMoney money = charData->GetMoney(); + int count = money.Get( slot ) - stackCount; + if ( count < 0 ) + { + Error2("Client %s is trying to cheat by grabbing too much money", charData->GetCharName() ); + return NULL; + } + money.Adjust( slot, -stackCount); + charData->SetMoney( money ); + charData->SaveMoney(); + + psItemStats * stat = psServer::cachemanager.GetBasicItemStatsByName(type); + if ( !stat ) + { + Error2("Could not load basic item stat for %s", type.GetData() ); + } + else + { + holdingItem->SetBaseStats(stat); + holdingItem->SetStackCount( stackCount ); + } + + return holdingItem; + } + + void SlotManager::PlaceHoldingItem( psSlotMovementMsg& mesg ) + { + if ( mesg.fromContainer == CONTAINER_INVENTORY_EQUIPMENT) + { + csString itemSound( holdingItem->GetSound() ); + itemSound.Append(".unequip"); + + psserver->GetCharManager()->SendOutPlaySoundMessage(fromClient, itemSound ); + if ( holdingItem ) + psserver->GetCharManager()->SendOutEquipmentMessages( fromClient, mesg.fromSlot, holdingItem, psEquipmentMessage::DEEQUIP); + } + + + if ( mesg.toParentContainer == CONTAINER_INVENTORY_BULK ) + { + psItem* container = FindContainer( fromClient, mesg.toContainer, mesg.toParentContainer ); + if ( container ) + { + container->PutItemsInContainer( mesg.toSlot, holdingItem ); + psserver->GetCharManager()->SendItemContents( fromClient, container, true, mesg.toContainer ); + } + } + else + { + switch ( mesg.toContainer ) + { + case CONTAINER_INVENTORY_MONEY: + { + if ( mesg.fromContainer == CONTAINER_INVENTORY_MONEY || + mesg.fromContainer == CONTAINER_OFFERING_MONEY ) + { + psMoney money = charData->GetMoney(); + money.Adjust( mesg.fromSlot, mesg.stackCount); + charData->SetMoney( money ); + charData->SaveMoney(); + psserver->GetCharManager()->UpdateItemViews(clientNum); + /// We need to remove this item since it no longer exists. + delete holdingItem; + } + } + + case CONTAINER_OFFERING_MONEY: + { + if ( mesg.fromContainer == CONTAINER_INVENTORY_MONEY || + mesg.fromContainer == CONTAINER_OFFERING_MONEY ) + { + Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); + if ( !exchange ) + { + Error1( "Client tried to drop to non existant exchange" ); + return; + } + else + { + exchange->AdjustMoney(fromClient, mesg.fromSlot, mesg.stackCount); + } + } + /// Delete the money item since it has been placed in the exchange area. + delete holdingItem; + break; + } + case CONTAINER_EXCHANGE_OFFERING: + { + Exchange* exchange = psserver->exchangemanager->GetExchange( fromClient->ExchangeID() ); + if ( !exchange ) + { + Error1( "Client tried to drop to non existant exchange" ); + return; + } + else + { + exchange->AddItem( fromClient, holdingItem, mesg.toSlot); + } + break; + } + + + case CONTAINER_WORLD: + { + charData->DropItem( holdingItem ); + + if ( holdingItem ) + { + psserver->GetEntityManager()->CreateItem(holdingItem); + + // Save the item's state as in the world (and not on the player) + holdingItem->Save(); + + + csString itemSound( holdingItem->GetSound() ); + itemSound.Append(".drop"); + psserver->GetCharManager()->SendOutPlaySoundMessage( fromClient, itemSound ); + + time_t curtime = time(NULL); + struct tm *loctime; + loctime = localtime (&curtime); + csString strTime(asctime(loctime)); + strTime.Truncate(strTime.Length()-1); + csString buf; + buf.Format("%s, %s, %s, %s, \"%s\", %d, %d\n", strTime.GetData(), fromClient->GetName(), "World", "Drop", holdingItem->GetName(), 0, 0); + psserver->GetCharManager()->WriteLog(buf.GetData()); + + // Update all client views + psserver->GetCharManager()->UpdateItemViews(clientNum); + } + + break; + } + + case CONTAINER_INVENTORY_BULK: + { + if ( !charData->PutItemInBulk( mesg.toSlot, holdingItem ) ) + { + ReplaceHolding(); + } + break; + } + + case CONTAINER_INVENTORY_EQUIPMENT: + { + psItem* toItem = charData->GetItemInSlot( mesg.toSlot ); + // If there is an item already here then this is not allowed for equipment. + // The better thing would be to do a swap but that is more complex and + // will be a future item. + if ( toItem ) + { + ReplaceHolding(); + } + else + { + if ( holdingItem->FitsInSlots(psServer::cachemanager.slotMap[mesg.toSlot]) ) + { + charData->EquipItemInSlot(mesg.toSlot, holdingItem); + psserver->GetCharManager()->SendOutEquipmentMessages( fromClient, mesg.toSlot, holdingItem, psEquipmentMessage::EQUIP); + + if ( mesg.toSlot == PSCHARACTER_SLOT_MIND ) + psserver->SendSystemInfo(fromClient->GetClientNum(), "You are now envisioning %s.",(const char*)holdingItem->GetName()); + + csString itemSound( holdingItem->GetSound() ); + itemSound.Append(".equip"); + + psserver->GetCharManager()->SendOutPlaySoundMessage(fromClient, itemSound); + + } + else + { + ReplaceHolding(); + } + } + break; + } + + // We assume that the incomming ID is for a generic container and try to + // put an item in that. + default: + { + psItem* toContainer = FindContainer( fromClient, mesg.toContainer, mesg.toParentContainer ); + + if ( !toContainer ) + { + ReplaceHolding(); + } + else + { + // Update the container and resend contents to player. + if ( toContainer->PutItemsInContainer( mesg.toSlot, holdingItem ) ) + { + psserver->GetCharManager()->SendItemContents( fromClient, toContainer ); + + // check to see if this container will start an auto transform of item(s) + if( toContainer->GetCanTransform() ) + { + psserver->GetWorkManager()->StartAutoWork( + fromClient, toContainer, holdingItem, holdingItem->GetStackCount()); + } + } + else + { + ReplaceHolding(); + } + } + + break; + } + } + } + } Index: psserverchar.h =================================================================== RCS file: /cvsroot/planeshift/planeshift/src/server/psserverchar.h,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** psserverchar.h 19 May 2004 01:10:00 -0000 1.34 --- psserverchar.h 22 May 2004 01:21:19 -0000 1.35 *************** *** 61,66 **** * This uses the gem idea of the gemItem object to find the psItem. */ ! psItem* FindContainer( int containerID ); ! MsgHandler* msghandler; --- 61,90 ---- * This uses the gem idea of the gemItem object to find the psItem. */ ! psItem* FindContainer( Client* client, int containerID, int parentContainerID ); ! ! /** This creates a money item from the player bank account. ! * This assumes that charData is the valid character. ! * ! * @param slot One of the four money slots. ! * @param stackCount The amount to take from that slot. ! * @return A new psItem object. ! */ ! psItem* FindFromMoney( int slot, int stackCount ); ! ! /** Finds the particular item the client dragged/dropped. ! * @param fromClient The client the message came from. ! * @param mesg The slot movement message that has the drag/drop details. ! * ! * @return A psItem object that the player is manipulating. ! */ ! psItem* FindHoldingItem( Client* fromClient, psSlotMovementMsg& mesg ); ! ! /** Places the item that is being dragged into it's destination slot. ! * ! * @param mesg The slot movement message that has the drag/drop details. ! */ ! void PlaceHoldingItem( psSlotMovementMsg& mesg ); ! ! MsgHandler* msghandler; *************** *** 70,73 **** --- 94,98 ---- int holdingSlotID; int holdingContainerID; + int holdingParentContainerID; int clientNum; |