本文整理汇总了C++中P_CHAR::canPickUp方法的典型用法代码示例。如果您正苦于以下问题:C++ P_CHAR::canPickUp方法的具体用法?C++ P_CHAR::canPickUp怎么用?C++ P_CHAR::canPickUp使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类P_CHAR
的用法示例。
在下文中一共展示了P_CHAR::canPickUp方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: dropOnGround
void cDragItems::dropOnGround( P_CLIENT client, P_ITEM pItem, const Coord_cl &pos )
{
P_CHAR pChar = client->player();
// Check if the destination is in line of sight
if( !line_of_sight( client->socket(), pChar->pos, pos, TREES_BUSHES|WALLS_CHIMNEYS|DOORS|ROOFING_SLANTED|FLOORS_FLAT_ROOFING|LAVA_WATER ) )
{
client->sysMessage( "You cannot see the target." );
bounceItem( client, pItem );
return;
}
if( !pChar->canPickUp( pItem ) )
{
bounceItem( client, pItem );
return;
}
pItem->setContSerial( INVALID_SERIAL );
pItem->moveTo( pos );
pItem->setLayer( 0 );
RefreshItem( pItem ); // Send it to all clients in range
pChar->weight -= pItem->getWeight();
statwindow( client->socket(), pChar ); // Update our weight-stats
if( pItem->glow != INVALID_SERIAL )
{
pChar->removeHalo( pItem );
pChar->glowHalo( pItem );
}
// Multi handling (Hm i don't like that...)
if( pChar->multis > 0 )
{
P_ITEM pMulti = FindItemBySerial( pChar->multis );
if( pMulti != NULL )
{
pMulti = findmulti( pItem->pos );
if( pItem != NULL )
pItem->SetMultiSerial( pMulti->serial );
}
}
}
示例2: grabItem
// New Class implementation
void cDragItems::grabItem( P_CLIENT client )
{
// Get our character
P_CHAR pChar = client->player();
if( pChar == NULL )
return;
// Fetch the grab information
SERIAL iSerial = LongFromCharPtr( &buffer[ client->socket() ][ 1 ] );
UI16 amount = ShortFromCharPtr( &buffer[ client->socket() ][ 5 ] );
P_ITEM pItem = FindItemBySerial( iSerial );
if( !pItem )
return;
// Are we already dragging an item ?
// Bounce it and reject the move
// (Logged out while dragging an item)
if( client->dragging() )
{
bounceItem( client, client->dragging() );
bounceItem( client, pItem, true );
return;
}
// Do we really want to let him break his meditation
// When he picks up an item ?
// Maybe a meditation check here ?!?
pChar->disturbMed( client->socket() ); // Meditation
P_CHAR itemOwner = GetPackOwner( pItem, 64 );
// Try to pick something out of another characters posessions
if( itemOwner && ( itemOwner != pChar ) && ( !pChar->Owns( itemOwner ) ) )
{
client->sysMessage( QString( "You have to steal the %1 out of %2's posessions." ).arg( pItem->getName() ).arg( itemOwner->name.c_str() ) );
bounceItem( client, pItem, true );
return;
}
// Check if the user can grab the item
if( !pChar->canPickUp( pItem ) )
{
client->sysMessage( "You cannot pick that up." );
bounceItem( client, pItem, true );
return;
}
// The user can't see the item
// Basically thats impossible as the client should deny moving the item
// if it's not in line of sight but to prevent exploits
if( !line_of_sight( client->socket(), pChar->pos, pItem->pos, TREES_BUSHES|WALLS_CHIMNEYS|DOORS|ROOFING_SLANTED|FLOORS_FLAT_ROOFING|LAVA_WATER ) )
{
client->sysMessage( "You can't see the item." );
bounceItem( client, pItem, true );
return;
}
P_ITEM outmostCont = GetOutmostCont( pItem, 64 );
// If it's a trade-window, reset the ack-status
if( outmostCont && ( outmostCont->contserial == pChar->serial ) && ( outmostCont->layer() == 0 ) && ( outmostCont->id() == 0x1E5E ) )
{
// Get the other sides tradewindow
P_ITEM tradeWindow = FindItemBySerial( calcserial( outmostCont->moreb1(), outmostCont->moreb2(), outmostCont->moreb3(), outmostCont->moreb4() ) );
// If one of the trade-windows has the ack-status reset it
if( tradeWindow && ( tradeWindow->morez || outmostCont->morez ) )
{
tradeWindow->morez = 0;
outmostCont->morez = 0;
sendtradestatus( tradeWindow, outmostCont );
}
}
// If the top-most container ( thats important ) is a corpse
// and looting is a crime, flag the character criminal.
if( outmostCont && outmostCont->corpse() )
{
// For each item we take out we loose carma
// if the corpse is innocent and not in our guild
bool sameGuild = ( GuildCompare( pChar, FindCharBySerial( outmostCont->ownserial ) ) != 0 );
if( ( outmostCont->more2 == 1 ) && !pChar->Owns( outmostCont ) && !sameGuild )
{
pChar->karma -= 5;
criminal( pChar );
client->sysMessage( "You lost some karma." );
}
}
// Check if the item is too heavy
//if( !pc_currchar->isGMorCounselor() )
//{
//} << Deactivated (DarkStorm)
// ==== Grabbing the Item is allowed here ====
//.........这里部分代码省略.........
示例3: dropOnItem
void cDragItems::dropOnItem( P_CLIENT client, P_ITEM pItem, P_ITEM pCont, const Coord_cl &dropPos )
{
P_CHAR pChar = client->player();
if( pItem->isMulti() )
{
client->sysMessage( "You cannot put houses in containers" );
bounceItem( client, pItem );
return;
}
// If the target belongs to another character
// It needs to be our vendor or else it's denied
P_CHAR packOwner = GetPackOwner( pCont );
if( ( packOwner != NULL ) && ( packOwner != pChar ) )
{
// For each item someone puts into there
// He needs to do a snoop-check
if( pChar->canSnoop() )
{
if( !Skills->CheckSkill( pChar, SNOOPING, 0, 1000 ) )
{
client->sysMessage( QString( "You fail to put that into %1's pack" ).arg( packOwner->name.c_str() ) );
bounceItem( client, pItem );
return;
}
}
if( !packOwner->isNpc() || ( packOwner->npcaitype() != 17 ) || !pChar->Owns( packOwner ) )
{
client->sysMessage( "You cannot put that into the belongings of another player" );
bounceItem( client, pItem );
return;
}
}
// If we put the item into a trade-window
// Reset the trade-status for both players
if( pCont->layer() == 0 && pCont->id() == 0x1E5E && pChar->Wears( pCont ) )
{
// Trade window???
P_ITEM tradeWindow = FindItemBySerial( calcserial( pCont->moreb1(), pCont->moreb2(), pCont->moreb3(), pCont->moreb4() ) );
// If it *IS* a trade-window, replace the status
if( tradeWindow && ( pCont->morez || tradeWindow->morez ) )
{
tradeWindow->morez = 0;
pCont->morez = 0;
sendtradestatus( tradeWindow, pCont );
}
}
if( !pChar->canPickUp( pItem ) )
{
bounceItem( client, pItem );
return;
}
// Trash can
if( pCont->type()==87 )
{
Items->DeleItem( pItem );
client->sysMessage( "As you let go of the item it disappears." );
return;
}
// Spell Book
if( pCont->type() == 9 )
{
UI08 spellId = Magic->calcSpellId( pItem->id() );
if( spellId < 0 )
{
client->sysMessage( "You can only put scrolls into a spellbook" );
bounceItem( client, pItem );
return;
}
if( Magic->hasSpell( pCont, spellId ) )
{
client->sysMessage( "That spellbook already contains this spell" );
bounceItem( client, pItem );
return;
}
}
// We drop something on the belongings of one of our playervendors
if( ( packOwner != NULL ) && ( packOwner->npcaitype() == 17 ) && pChar->Owns( packOwner ) )
{
client->sysMessage( "You drop something into your playervendor" );
bounceItem( client, pItem );
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 ) ) )
{
//.........这里部分代码省略.........
示例4: equipItem
//.........这里部分代码省略.........
// Males can't wear female armor
if( ( pChar->id() == 0x0190 ) && ( pItem->id() >= 0x1C00 ) && ( pItem->id() <= 0x1C0D ) )
{
client->sysMessage( "You cannot wear female armor." );
bounceItem( client, pItem );
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
UI08 layer = pItem->layer();
vector< SERIAL > equipment = contsp.getData( pWearer->serial );
for( UI32 i = 0; i < equipment.size(); i++ )
{
P_ITEM pEquip = FindItemBySerial( equipment[ i ] );
if( pEquip )
continue;
// We found an item which is on the same layer (!)
// Unequip it if we can
bool twoHanded = false;
if( pEquip->twohanded() && ( layer == 1 || layer == 2 ) )
twoHanded = true;
if( pItem->twohanded() && ( pEquip->layer() == 1 || pEquip->layer() == 2 ) )
twoHanded = true;
if( ( pEquip->layer() == layer ) || twoHanded )
{
if( pChar->canPickUp( pEquip ) ) // we're equipping so we do the check
pEquip->toBackpack( pWearer );
// If it's still on the char: cancel equipment
if( pEquip->contserial == pWearer->serial )
{
client->sysMessage( "You already have an item on that layer." );
bounceItem( client, pItem );
return;
}
}
}
// At this point we're certain that we can wear the item
pItem->setContSerial( playerId );
pItem->setLayer( pTile.layer ); // Don't trust the user input on this one
// Handle the weight if the item is leaving our "body"
if( pWearer != pChar )
{
pChar->weight -= pItem->getWeight();
pWearer->weight += pItem->getWeight();
// Update the status-windows
statwindow( client->socket(), pChar );
statwindow( calcSocketFromChar( pWearer ), pWearer );
}
if( pTile.layer == 0x19 )
pWearer->setOnHorse( true );
// Apply the bonuses
pWearer->st += pItem->st2;
pWearer->chgDex( pItem->dx2 );
pWearer->in += pItem->in2;
// Show debug information if requested
if( showlayer )
clConsole.send( QString( "Item (%1) equipped on layer %2" ).arg( pItem->name() ).arg( pItem->layer() ) );
// I don't think we need to remove the item
// as it's only visible to the current char
// And he looses contact anyway
// SndRemoveitem( pi->serial );
// Build our packets
cWornItems wearItem( pWearer->serial, pItem->serial, pItem->layer(), pItem->id(), pItem->color() );
cSoundEffect soundEffect( 0x57, pWearer->pos );
// Send to all sockets in range
// ONLY the new equipped item and the sound-effect
for( UOXSOCKET s = 0; s < now; s++ )
if( perm[s] && inrange1p( pWearer, currchar[s] ) )
{
soundEffect.send( s );
wearItem.send( s );
}
// Lord Binaries Glow stuff
if( pItem->glow != INVALID_SERIAL )
{
pChar->removeHalo( pItem );
pWearer->addHalo( pItem );
pWearer->glowHalo( pItem );
}
}