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 ); } } }
void cDragItems::dropOnChar( cUOSocket *socket, P_ITEM pItem, P_CHAR pOtherChar ) { // Three possibilities: // If we're dropping it on ourself: packintobackpack // If we're dropping it on some other player: trade-window // If we're dropping it on some NPC: checkBehaviours // If not handeled: Equip the item if the NPC is owned by us // To prevent bad effects remove it from the clients view first cUOTxRemoveObject rObject; rObject.setSerial( pItem->serial() ); socket->send( &rObject ); P_CHAR pChar = socket->player(); if( pItem->onDropOnChar( pOtherChar ) ) { // Still dragging? Bounce! if( socket->dragging() == pItem ) socket->bounceItem( pItem, BR_NO_REASON ); return; } if( pOtherChar->onDropOnChar( pItem ) ) { // Still dragging? Bounce! if( socket->dragging() == pItem ) socket->bounceItem( pItem, BR_NO_REASON ); return; } // Dropped on ourself if( pChar == pOtherChar ) { pItem->toBackpack( pChar ); return; } // Are we in range of our target if( !inrange1p( pChar, pOtherChar ) ) { socket->bounceItem( pItem, BR_OUT_OF_REACH ); return; } // Can wee see our target if( !lineOfSight( pChar->pos(), pOtherChar->pos(), TREES_BUSHES|WALLS_CHIMNEYS|DOORS|ROOFING_SLANTED|FLOORS_FLAT_ROOFING|LAVA_WATER ) ) { socket->bounceItem( pItem, BR_OUT_OF_SIGHT ); return; } // Open a secure trading window if( pOtherChar->objectType() == enPlayer && dynamic_cast<P_PLAYER>(pOtherChar)->socket() ) { // Check if we're already trading, // if not create a new window P_ITEM tradeWindow = pChar->atLayer( cBaseChar::TradeWindow ); //if( !tradeWindow ) // tradeWindow = Trade->tradestart( client->socket(), pOtherChar ); socket->bounceItem( pItem, BR_NO_REASON ); socket->sysMessage( "Trading is disabled" ); return; tradeWindow->addItem( pItem, false, false ); pItem->setPos( Coord_cl(rand() % 60, rand() % 60, 9) ); pItem->removeFromView( false ); pItem->update(); return; } // Dropping based on AI Type /*switch( pOtherChar->npcaitype() ) { case 4: dropOnGuard( client, pItem, pOtherChar ); break; case 5: dropOnBeggar( client, pItem, pOtherChar ); break; case 8: dropOnBanker( client, pItem, pOtherChar ); break; case 19: dropOnBroker( client, pItem, pOtherChar ); break; }; // Try to train - works for any NPC if( pOtherChar->cantrain() ) if( pChar->trainer() == pOtherChar->serial ) dropOnTrainer( client, pItem, pOtherChar ); else pOtherChar->talk( "You need to tell me what you want to learn first" );*/ // Finally lets check if it is simple food if( pItem->type() == 14 ) { dropFoodOnChar( socket, pItem, pOtherChar ); return; } socket->sysMessage( tr("The character does not seem to want the item.") ); socket->bounceItem( pItem, BR_NO_REASON ); return; }
void DragAndDrop::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; } // No Special Layer Equipping if ( ( packet->layer() > cBaseChar::InnerLegs || packet->layer() <= cBaseChar::TradeWindow ) && !pChar->isGM() ) { socket->sysMessage( tr( "You can't equip on that layer." ) ); 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; } // Only GM's can equip other People if ( pWearer != pChar && !pChar->isGM() ) { P_NPC pNpc = dynamic_cast<P_NPC>( pWearer ); // But we are allowed to equip our own humans if ( !pNpc || ( pNpc->owner() != pChar && pWearer->isHuman() ) ) socket->sysMessage( tr( "You can't equip other 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; } // Check the Script for it if ( pItem->onWearItem( pChar, pWearer, packet->layer() ) ) { socket->bounceItem( pItem, BR_NO_REASON ); return; } // Males can't wear female armor if ( ( pChar->body() == 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; P_ITEM equippedLayerItem = pWearer->atLayer( static_cast<cBaseChar::enLayer>( layer ) ); // 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; } } // Check other layers if neccesary bool occupied = false; if ( pItem->twohanded() && layer == 1 ) { occupied = pWearer->leftHandItem() != 0; // Twohanded weapon on layer 1 forbids item on layer 2 } else if ( pItem->twohanded() && layer == 2 ) { occupied = pWearer->rightHandItem() != 0; // Twohanded weapon on layer 2 forbids item on layer 1 } else if ( layer == 1 ) { P_ITEM lefthand = pWearer->leftHandItem(); occupied = lefthand && lefthand->twohanded(); } else if ( layer == 2 ) { P_ITEM righthand = pWearer->rightHandItem(); occupied = righthand && righthand->twohanded(); } if ( occupied ) { socket->sysMessage( tr( "You can't hold another item while wearing a twohanded item!" ) ); 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 ); 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 = Network::instance()->first(); mSock; mSock = Network::instance()->next() ) { if ( mSock->player() && ( mSock->player()->dist( pWearer ) <= mSock->player()->visualRange() ) ) { mSock->send( &wearItem ); mSock->send( &soundEffect ); } } }