void DragAndDrop::dropOnBeggar( cUOSocket* socket, P_ITEM pItem, P_CHAR pBeggar ) { int tempint; if( ( pBeggar->hunger() < 6 ) && pItem->type() == 14 ) { pBeggar->talk( tr("*cough* Thank thee!") ); pBeggar->soundEffect( 0x3A + RandomNum( 1, 3 ) ); // *You see Snowwhite eating some poisoned apples* // Color: 0x0026 pBeggar->emote( tr( "*You see %1 eating %2*" ).arg( pBeggar->name() ).arg( pItem->getName() ) ); // We try to feed it more than it needs if( pBeggar->hunger() + pItem->amount() > 6 ) { // client->player()->karma += ( 6 - pBeggar->hunger() ) * 10; tempint = ( 6 - pBeggar->hunger() ) * 10; socket->player()->setKarma( socket->player()->karma() + tempint ); pItem->setAmount( pItem->amount() - ( 6 - pBeggar->hunger() ) ); pBeggar->setHunger( 6 ); // Pack the rest into his backpack bounceItem( socket, pItem ); return; } pBeggar->setHunger( pBeggar->hunger() + pItem->amount() ); // client->player()->karma += pItem->amount() * 10; tempint = pItem->amount() * 10; socket->player()->setKarma( socket->player()->karma() + tempint ); pItem->remove(); return; } // No Food? Then it has to be Gold if( pItem->id() != 0xEED ) { pBeggar->talk( tr("Sorry, but i can only use gold.") ); bounceItem( socket, pItem ); return; } pBeggar->talk( tr( "Thank you %1 for the %2 gold!" ).arg( socket->player()->name() ).arg( pItem->amount() ) ); socket->sysMessage( tr("You have gained some karma!") ); if( pItem->amount() <= 100 ) socket->player()->setKarma( socket->player()->karma() + 10 ); else socket->player()->setKarma( socket->player()->karma() + 50 ); pItem->remove(); }
static void playerRegisterAfterLoading( P_PLAYER pc ) { if ( pc->account() == 0 ) { // We need to remove the equipment here. cBaseChar::ItemContainer container( pc->content() ); cBaseChar::ItemContainer::const_iterator it( container.begin() ); cBaseChar::ItemContainer::const_iterator end( container.end() ); for ( ; it != end; ++it ) { P_ITEM pItem = *it; if ( !pItem ) continue; pItem->remove(); } pc->del(); return; } /* else { pc->setBody(0x0190); Console::instance()->send("player: %s with bugged body-value detected, restored to male shape\n",pc->name().latin1()); }*/ }
bool cRemoveTarget::responsed( cUOSocket* socket, cUORxTarget* target ) { P_CHAR pChar = FindCharBySerial( target->serial() ); P_ITEM pItem = FindItemBySerial( target->serial() ); if ( pChar ) { pChar->remove(); } else if ( pItem ) { pItem->remove(); } else socket->sysMessage( tr( "You need to select either an item or a character" ) ); return true; }
void DragAndDrop::dropOnBroker( cUOSocket* socket, P_ITEM pItem, P_CHAR pBroker ) { // For House and Boat deeds we should pay back 75% of the value if ( pItem->id() == 0x14EF ) { if ( !pItem->sellprice() ) { pBroker->talk( tr( "I can only accept deeds with value!" ) ); bounceItem( socket, pItem ); return; } socket->player()->giveGold( pItem->sellprice(), true ); pBroker->talk( tr( "Here you have your %1 gold, %2" ).arg( pItem->sellprice() ).arg( socket->player()->name() ) ); pItem->remove(); return; } bounceItem( socket, pItem ); }
P_NPC cPlayer::unmount() { P_ITEM pi = atLayer( Mount ); if ( pi && !pi->free ) { P_NPC pMount = dynamic_cast<P_NPC>( FindCharBySerial( pi->getTag( "pet" ).toInt() ) ); if ( pMount && !pMount->free ) { pMount->setWanderType( enHalt ); pMount->setStablemasterSerial( INVALID_SERIAL ); pMount->moveTo( pos() ); pMount->setDirection( direction_ ); pMount->resend( false ); pMount->bark( Bark_Idle ); } pi->remove(); resend( false ); return pMount; } return NULL; }
void cPlayer::applyStartItemDefinition( const cElement* element ) { for ( unsigned int i = 0; i < element->childCount(); ++i ) { const cElement* node = element->getChild( i ); // Apply another startitem definition if ( node->name() == "inherit" ) { const cElement* inheritNode = Definitions::instance()->getDefinition( WPDT_STARTITEMS, node->getAttribute( "id" ) ); if ( inheritNode ) { applyStartItemDefinition( inheritNode ); } } // Item related nodes else { P_ITEM pItem = 0; if ( node->hasAttribute( "id" ) && node->getAttribute( "id" ) != QString::null ) { pItem = cItem::createFromScript( node->getAttribute( "id" ) ); } else if ( node->hasAttribute( "list" ) && node->getAttribute( "list" ) != QString::null ) { pItem = cItem::createFromList( node->getAttribute( "list" ) ); } else if ( node->hasAttribute( "randomlist" ) && node->getAttribute( "randomlist" ) != QString::null ) { QStringList RandValues = node->getAttribute( "randomlist" ).split( "," ); pItem = cItem::createFromList( RandValues[RandomNum( 0, RandValues.size() - 1 )] ); } if ( !pItem ) { Console::instance()->log( LOG_ERROR, tr( "Invalid item tag without id or list in startitem definition '%1'" ).arg( element->getAttribute( "id" ) ) ); } else { pItem->applyDefinition( node ); if ( node->name() == "item" ) { pItem->toBackpack( this ); } else if ( node->name() == "bankitem" ) { getBackpack()->addItem( pItem ); } else if ( node->name() == "equipment" ) { unsigned char layer = pItem->layer(); pItem->setLayer( 0 ); if ( !layer ) { tile_st tile = TileCache::instance()->getTile( pItem->id() ); layer = tile.layer; } if ( layer ) { // Check if there is sth there already. // Could happen due to inherit. P_ITEM existing = atLayer( static_cast<cBaseChar::enLayer>( layer ) ); if ( existing ) existing->remove(); addItem( static_cast<cBaseChar::enLayer>( layer ), pItem ); } else { Console::instance()->log( LOG_ERROR, tr( "Trying to equip invalid item (%1) in startitem definition '%2'" ).arg( pItem->id(), 0, 16 ).arg( element->getAttribute( "id" ) ) ); } } else { pItem->remove(); Console::instance()->log( LOG_ERROR, tr( "Unrecognized startitem tag '%1' in definition '%2'." ).arg( QString(node->name()) ).arg( element->getAttribute( "id" ) ) ); } } } } }
void DragAndDrop::dropOnItem( cUOSocket* socket, P_ITEM pItem, P_ITEM pCont, const Coord_cl& dropPos ) { P_PLAYER pChar = socket->player(); if ( pItem->isMulti() ) { socket->sysMessage( tr( "You cannot put houses in containers" ) ); cUOTxBounceItem bounce; bounce.setReason( BR_NO_REASON ); socket->send( &bounce ); pItem->remove(); return; } if ( pItem->onDropOnItem( pCont ) ) { if ( pItem->free ) return; if ( socket->dragging() ) socket->bounceItem( socket->dragging(), BR_NO_REASON ); return; } else if ( pCont->onDropOnItem( pItem ) ) { if ( pItem->free ) return; if ( socket->dragging() ) socket->bounceItem( socket->dragging(), BR_NO_REASON ); return; } // If the target belongs to another character // It needs to be our vendor or else it's denied P_CHAR packOwner = pCont->getOutmostChar(); if ( ( packOwner ) && ( packOwner != pChar ) && !pChar->isGM() ) { // For each item someone puts into there // He needs to do a snoop-check if ( pChar->maySnoop() ) { if ( !pChar->checkSkill( SNOOPING, 0, 1000 ) ) { socket->sysMessage( tr( "You fail to put that into %1's pack" ).arg( packOwner->name() ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } } if ( packOwner->objectType() == enPlayer || ( packOwner->objectType() == enNPC && dynamic_cast<P_NPC>( packOwner )->owner() != pChar ) ) { socket->sysMessage( tr( "You cannot put that into the belongings of another player" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; } } if ( !pChar->canPickUp( pItem ) ) { socket->bounceItem( pItem, BR_CANNOT_PICK_THAT_UP ); return; } // We drop something on the belongings of one of our playervendors /* if( ( packOwner != NULL ) && ( packOwner->npcaitype() == 17 ) && packOwner->owner() == pChar ) { socket->sysMessage( tr( "You drop something into your playervendor (unimplemented)" ) ); socket->bounceItem( pItem, BR_NO_REASON ); return; }*/ // Playervendors (chest equipped by the vendor - opened to the client) /*if( !( pCont->pileable() && pItem->pileable() && pCont->id() == pItem->id() || ( pCont->type() != 1 && pCont->type() != 9 ) ) ) { P_CHAR pc_j = GetPackOwner(pCont); if (pc_j != NULL) { if (pc_j->npcaitype() == 17 && pc_j->isNpc() && pChar->Owns(pc_j)) { pChar->inputitem = pItem->serial; pChar->inputmode = cChar::enPricing; sysmessage(s, "Set a price for this item."); } } */ // We may also drop into *any* locked chest // So we can have post-boxes ;o) if ( pCont->type() == 1 ) { // If we're dropping it onto the closed container if ( dropPos.x == 0xFFFF && dropPos.y == 0xFFFF ) { pCont->addItem( pItem ); } else { pCont->addItem( pItem, false ); pItem->setPos( dropPos ); } // Dropped on another Container/in another Container pChar->soundEffect( 0x57 ); pItem->update(); return; } else if ( pCont->canStack( pItem ) ) { if ( pCont->amount() + pItem->amount() <= 65535 ) { pCont->setAmount( pCont->amount() + pItem->amount() ); pItem->remove(); pCont->update(); // Need to update the amount pCont->resendTooltip(); return; } else { // The delta between 65535 and pCont->amount() sub our Amount is the // new amount pItem->setAmount( pItem->amount() - ( 65535 - pCont->amount() ) ); pItem->resendTooltip(); pCont->setAmount( 65535 ); // Max out the amount pCont->update(); pCont->resendTooltip(); } } // We dropped the item NOT on a container // And were *un*able to stack it (!) // >> Set it to the location of the item we dropped it on and stack it up by 2 if ( pCont->container() ) { P_ITEM pNewCont = dynamic_cast<P_ITEM>( pCont->container() ); if ( pNewCont ) { pNewCont->addItem( pItem, false ); pItem->setPos( pCont->pos() + Coord_cl( 0, 0, 2 ) ); } else { pChar->getBackpack()->addItem( pItem ); } } else { pItem->removeFromCont(); pItem->moveTo( pCont->pos() + Coord_cl( 0, 0, 2 ) ); } pItem->update(); }