// Tries to equip an item // if that fails it tries to put the item in the users backpack // if *that* fails it puts it at the characters feet // That works for NPCs as well void equipItem( P_CHAR wearer, P_ITEM item ) { tile_st tile = TileCache::instance()->getTile( item->id() ); // User cannot wear the item if( tile.layer == 0 ) { if( wearer->objectType() == enPlayer ) { P_PLAYER pp = dynamic_cast<P_PLAYER>(wearer); if( pp->socket() ) pp->socket()->sysMessage( tr( "You cannot wear that item.") ); } item->toBackpack( wearer ); return; } cBaseChar::ItemContainer container = wearer->content(); cBaseChar::ItemContainer::const_iterator it(container.begin()); for( ; it != container.end(); ++it ) { P_ITEM equip = *it; // Unequip the item and free the layer that way if( equip && ( equip->layer() == tile.layer ) ) equip->toBackpack( wearer ); wearer->removeItemBonus( equip ); } // *finally* equip the item wearer->addItem( static_cast<cBaseChar::enLayer>(item->layer()), item ); // Add the item bonuses wearer->giveItemBonus( item ); }
void cDragItems::equipItem( cUOSocket *socket, cUORxWearItem *packet ) { P_ITEM pItem = FindItemBySerial( packet->serial() ); P_CHAR pWearer = FindCharBySerial( packet->wearer() ); if( !pItem || !pWearer ) return; P_PLAYER pChar = socket->player(); // We're dead and can't do that if( pChar->isDead() ) { socket->clilocMessage( 0x7A4D5, "", 0x3b2 ); // You can't do that when you're dead. socket->bounceItem( pItem, BR_NO_REASON ); return; } // Our target is dead if( ( pWearer != pChar ) && pWearer->isDead() ) { socket->sysMessage( tr( "You can't equip dead players." ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Get our tile-information tile_st pTile = TileCache::instance()->getTile( pItem->id() ); // Is the item wearable ? ( layer == 0 | equip-flag not set ) // Multis are not wearable are they :o) if( pTile.layer == 0 || !( pTile.flag3 & 0x40 ) || pItem->isMulti() ) { socket->sysMessage( tr( "This item cannot be equipped." ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Required Strength if( pItem->st() > pWearer->strength() ) { if( pWearer == pChar ) socket->sysMessage( tr( "You cannot wear that item, you seem not strong enough" ) ); else socket->sysMessage( tr( "This person can't wear that item, it seems not strong enough" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Required Dexterity if( pItem->dx() > pWearer->dexterity() ) { if( pWearer == pChar ) socket->sysMessage( tr( "You cannot wear that item, you seem not agile enough" ) ); else socket->sysMessage( tr( "This person can't wear that item, it seems not agile enough" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Required Intelligence if( pItem->in() > pWearer->intelligence() ) { if( pWearer == pChar ) socket->sysMessage( tr( "You cannot wear that item, you seem not smart enough" ) ); else socket->sysMessage( tr( "This person can't wear that item, it seems not smart enough" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Males can't wear female armor if( ( pChar->bodyID() == 0x0190 ) && ( pItem->id() >= 0x1C00 ) && ( pItem->id() <= 0x1C0D ) ) { socket->sysMessage( tr( "You cannot wear female armor." ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // Needs a check (!) // Checks for equipment on the same layer // If there is any it tries to unequip it // If that fails it cancels // we also need to check if there is a twohanded weapon if we want to equip another weapon. UI08 layer = pTile.layer; bool twohanded = false; P_ITEM equippedLayerItem = pWearer->atLayer( static_cast<cBaseChar::enLayer>(layer) ); if ( equippedLayerItem ) twohanded = equippedLayerItem->twohanded(); if( twohanded && ( layer == 1 || layer == 2 ) ) { socket->sysMessage( tr("You can't hold another item while wearing a twohanded weapon!") ); socket->bounceItem( pItem, BR_NO_REASON ); return; } // we're equipping so we do the check if( equippedLayerItem ) { if( pChar->canPickUp( equippedLayerItem ) ) { equippedLayerItem->toBackpack( pWearer ); } else { socket->sysMessage( tr( "You can't wear another item there!" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } } // At this point we're certain that we can wear the item pWearer->addItem( static_cast<cBaseChar::enLayer>(pTile.layer), pItem ); // Apply the bonuses pWearer->giveItemBonus( pItem ); if( pWearer->objectType() == enPlayer ) { P_PLAYER pp = dynamic_cast<P_PLAYER>(pWearer); if( pp->socket() ) pp->socket()->sendStatWindow(); } // I don't think we need to remove the item // as it's only visible to the current char // And he looses contact anyway // Build our packets cUOTxCharEquipment wearItem; wearItem.fromItem( pItem ); cUOTxSoundEffect soundEffect; soundEffect.setSound( 0x57 ); soundEffect.setCoord( pWearer->pos() ); // Send to all sockets in range // ONLY the new equipped item and the sound-effect for( cUOSocket *mSock = cNetwork::instance()->first(); mSock; mSock = cNetwork::instance()->next() ) { if( mSock->player() && ( mSock->player()->dist( pWearer ) <= mSock->player()->visualRange() ) ) { mSock->send( &wearItem ); mSock->send( &soundEffect ); } } }