本文整理汇总了C++中P_CHAR::getBackpack方法的典型用法代码示例。如果您正苦于以下问题:C++ P_CHAR::getBackpack方法的具体用法?C++ P_CHAR::getBackpack怎么用?C++ P_CHAR::getBackpack使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类P_CHAR
的用法示例。
在下文中一共展示了P_CHAR::getBackpack方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: NewCalc
/*!
\brief Search player's paperdoll and then backpacks for items with weight then set the weight of the current player
\author Ison (02/20/99), rewrote by Tauriel (03/20/99)
\param pc the character
\note The called character's weight is first set to zero then re-calculated during the function.
*/
void weights::NewCalc(P_CHAR pc)
{
VALIDATEPC(pc);
double totalweight=0.0;
//get weight for items on players
NxwItemWrapper si;
si.fillItemWeared( pc, false, false, true );
for( si.rewind(); !si.isEmpty(); si++ )
{
P_ITEM pi=si.getItem();
// Wintermute: Exclude mounted layer (counts as worn item)
if (ISVALIDPI(pi) && pi->layer != LAYER_MOUNT)
{
totalweight+=(pi->getWeightActual()/100.0);
}
}
// Items in players pack
P_ITEM bp= pc->getBackpack();
if (bp!=NULL) totalweight+=RecursePacks(bp); //LB
pc->weight=(int)totalweight;
return;
}
示例2: UpdateStatusWindow
void UpdateStatusWindow(NXWSOCKET socket, P_ITEM pi)
{
P_CHAR pc = MAKE_CHAR_REF( currchar[socket] );
VALIDATEPC( pc );
VALIDATEPI( pi );
P_ITEM pack = pc->getBackpack();
VALIDATEPI( pack );
if( pi->getContSerial() != pack->getSerial32() || pi->getContSerial() == pc->getSerial32() )
statwindow( pc, pc );
}
示例3: hasSpell
bool cNewMagic::hasSpell( P_CHAR pMage, UINT8 spell )
{
// Check for SpellBooks
if( pMage->GetItemOnLayer(0x01) && cont_has_spell( pMage->GetItemOnLayer(0x01), spell ) )
{
return true;
}
else
{
return cont_has_spell( pMage->getBackpack(), spell );
}
}
示例4: ItemDroppedOnSelf
static bool ItemDroppedOnSelf(NXWCLIENT ps, PKGx08 *pp, P_ITEM pi)
{
if (ps == NULL) return false;
VALIDATEPIR(pi, false);
// NXWSOCKET s=ps->toInt();
// CHARACTER cc=ps->currCharIdx();
P_CHAR pc = ps->currChar(); // MAKE_CHAR_REF(cc);
VALIDATEPCR(pc, false);
Location charpos = pc->getPosition();
if (pi->getId() >= 0x4000 ) // crashfix , prevents putting multi-objects ni your backback
{
ps->sysmsg(TRANSLATE("Hey, putting houses in your pack crashes your back and client !"));
pi->MoveTo( charpos );
pi->Refresh();//AntiChrist
return true;
}
// if (pi->glow>0) // glowing items
// {
// pc->addHalo(pi);
// pc->glowHalo(pi);
// }
P_ITEM pack = pc->getBackpack();
if (pack==NULL) // if player has no pack, put it at its feet
{
pi->MoveTo( charpos );
pi->Refresh();
}
else
{
pack->AddItem(pi); // player has a pack, put it in there
weights::NewCalc(pc);//AntiChrist bugfixes
statwindow(pc,pc);
pc->playSFX( itemsfx(pi->getId()) );
}
return true;
}
示例5: doubleclick
/*!
\brief Double click
\author Ripper, rewrite by Endymion
\param ps client of player dbclick
\note Completely redone by Morrolan 20-07-99
\warning I use a define CASE for make more readable the code, if you change name of P_ITEM pi chage also the macro
\todo los
*/
void doubleclick(NXWCLIENT ps)
{
if(ps==NULL) return;
P_CHAR pc = ps->currChar();
VALIDATEPC( pc );
NXWSOCKET s = ps->toInt();
// the 0x80 bit in the first byte is used later for "keyboard" and should be ignored
SERIAL serial = LongFromCharPtr(buffer[s] +1) & 0x7FFFFFFF;
if (isCharSerial(serial))
{
P_CHAR pd=pointers::findCharBySerial(serial);
if(ISVALIDPC(pd))
dbl_click_character(ps, pd);
return;
}
P_ITEM pi = pointers::findItemBySerial(serial);
VALIDATEPI(pi);
if (pi->amxevents[EVENT_IONDBLCLICK]!=NULL) {
g_bByPass = false;
pi->amxevents[EVENT_IONDBLCLICK]->Call( pi->getSerial32(), pc->getSerial32() );
if (g_bByPass==true)
return;
}
/*
g_bByPass = false;
pi->runAmxEvent( EVENT_IONDBLCLICK, pi->getSerial32(), s );
if (g_bByPass==true)
return;
*/
if (!checkItemUsability(pc , pi, ITEM_USE_DBLCLICK))
return;
Location charpos= pc->getPosition();
if (pc->IsHiddenBySpell()) return; //Luxor: cannot use items if under invisible spell
if ( !pc->IsGM() && pc->objectdelay >= uiCurrentTime )
{
pc->sysmsg(TRANSLATE("You must wait to perform another action."));
return;
}
else
pc->objectdelay = SrvParms->objectdelay * MY_CLOCKS_PER_SEC + uiCurrentTime;
///MODIFY, CANT CLICK ITEM AT DISTANCE >2//////////////
if ( (pc->distFrom(pi)>2) && !pc->IsGM() && !(pc->nxwflags[0] & cChar::flagSpellTelekinesys) ) //Luxor: let's check also for the telekinesys spell
{
pc->sysmsg( TRANSLATE("Must be closer to use this!"));
pc->objectdelay=0;
return;
}
//<Anthalir> VARIAIBLI
tile_st item;
P_ITEM pack= pc->getBackpack();
VALIDATEPI( pack );
data::seekTile( pi->getId(), item );
//////FINEVARIABILI
if ( ServerScp::g_nEquipOnDclick )
{
// equip the item only if it is in the backpack of the player
if ((pi->getContSerial() == pack->getSerial32()) && (item.quality != 0) && (item.quality != LAYER_BACKPACK) && (item.quality != LAYER_MOUNT))
{
int drop[2]= {-1, -1}; // list of items to drop, there no reason for it to be larger
int curindex= 0;
NxwItemWrapper wea;
wea.fillItemWeared( pc, true, true, true );
for( wea.rewind(); !wea.isEmpty(); wea++ )
{
P_ITEM pj=wea.getItem();
if(!ISVALIDPI(pj))
continue;
if ((item.quality == LAYER_1HANDWEAPON) || (item.quality == LAYER_2HANDWEAPON))// weapons
{
if (pi->itmhand == 2) // two handed weapons or shield
{
if (pj->itmhand == 2)
drop[curindex++]= DEREF_P_ITEM(pj);
if ( (pj->itmhand == 1) || (pj->itmhand == 3) )
//.........这里部分代码省略.........
示例6: target_randomSteal
/*!
\brief Steal random
\author Unknow, updated by Endymion
\param ps the client
\todo add string because it's locked contanier into translate
*/
void Skills::target_randomSteal( NXWCLIENT ps, P_TARGET t )
{
P_CHAR thief=ps->currChar();
VALIDATEPC(thief);
P_CHAR victim = pointers::findCharBySerial( t->getClicked() );
VALIDATEPC(victim);
if (thief->getSerial32() == victim->getSerial32() || thief->getSerial32()==victim->getOwnerSerial32())
{
thief->sysmsg(TRANSLATE("You catch yourself red handed."));
return;
}
if (victim->npcaitype == NPCAI_PLAYERVENDOR)
{
thief->sysmsg(TRANSLATE("You cannot steal from player vendors."));
return;
}
if (victim->IsGMorCounselor() )
{
thief->sysmsg( TRANSLATE("You can't steal from gods."));
return;
}
P_ITEM pack= victim->getBackpack();
if ( !ISVALIDPI(pack))
{
thief->sysmsg(TRANSLATE("bad luck, your victim doesn't have a backpack"));
return;
}
char temp[TEMP_STR_SIZE]; //xan -> this overrides the global temp var
char temp2[TEMP_STR_SIZE]; //xan -> this overrides the global temp var
sprintf(temp, TRANSLATE("You reach into %s's pack to steal something ..."), victim->getCurrentNameC() );
thief->sysmsg(temp);
if ( char_inRange(thief,victim,1) )
{
P_ITEM pi = NULL;
NxwItemWrapper si;
si.fillItemsInContainer( pack, false );
if( si.size()>0 ) {
int ra=rand()%si.size();
int c=0;
for( si.rewind(); !si.isEmpty(); si++ ) {
c++;
if( c==ra ) {
pi=si.getItem();
break;
}
}
}
if( pi==NULL ) {
thief->sysmsg(TRANSLATE("... and discover your victim doesn't have any posessions"));
return;
}
//Endy can't be not valid after this -^ loop, else error
VALIDATEPI(pi);
if( pi->isNewbie() )
{//newbie
thief->sysmsg(TRANSLATE("... and fail because it is of no value to you."));
return;
}
if(pi->isSecureContainer())
{
thief->sysmsg(TRANSLATE("... and fail because it's a locked container."));
return;
}
if ( thief->checkSkill( STEALING,0,999) )
{
// 0 stealing 2 stones, 10 3 stones, 99.9 12 stones, 100 17 stones !!!
int cansteal = thief->skill[STEALING] > 999 ? 1700 : thief->skill[STEALING] + 200;
if ( ((pi->getWeightActual())>cansteal) && !pi->isContainer())//Containers
thief->sysmsg(TRANSLATE("... and fail because it is too heavy."));
else
if(pi->isContainer() && (weights::RecursePacks(pi)>cansteal))
thief->sysmsg(TRANSLATE("... and fail because it is too heavy."));
else
{
if (victim->amxevents[EVENT_CHR_ONSTOLEN])
{
g_bByPass = false;
//.........这里部分代码省略.........
示例7: target_stealing
/*!
\brief Steal something
\author Unknow, completly rewritten by Endymion
\param ps the client
*/
void Skills::target_stealing( NXWCLIENT ps, P_TARGET t )
{
P_CHAR thief = ps->currChar();
VALIDATEPC(thief);
SERIAL target_serial = t->getClicked();
AMXEXECSVTARGET( thief->getSerial32(),AMXT_SKITARGS,STEALING,AMX_BEFORE);
//steal a char
if ( isCharSerial(target_serial) )
{
Skills::target_randomSteal(ps,t);
return;
}
const P_ITEM pi = pointers::findItemBySerial( target_serial );
VALIDATEPI(pi);
//steal a pickpocket, a steal training dummy
if( pi->getId() == 0x1E2D || pi->getId() == 0x1E2C )
{
Skills::PickPocketTarget(ps);
return;
}
//no stealing for items on layers other than 0 (equipped!) , newbie items, and items not being in containers allowed !
if ( pi->layer!=0 || pi->isNewbie() || pi->isInWorld() )
{
thief->sysmsg(TRANSLATE("You cannot steal that."));
return;
}
P_CHAR victim = pi->getPackOwner();
VALIDATEPC(victim);
if (victim->npcaitype == NPCAI_PLAYERVENDOR)
{
thief->sysmsg(TRANSLATE("You cannot steal from player vendors."));
return;
}
if ( (thief->getSerial32() == victim->getSerial32()) || (thief->getSerial32()==victim->getOwnerSerial32()) )
{
thief->sysmsg(TRANSLATE("You catch yourself red handed."));
return;
}
if (thief->distFrom( victim ) == 1)
{
int result;
R32 we = pi->getWeightActual();
int bonus= (int)( (1800 - we)/5 );
if ( thief->checkSkill( STEALING,0,(1000-bonus)) )
{
// 0 stealing 2 stones, 10 3 stones, 99.9 12 stones, 100 17 stones !!!
int cansteal = thief->skill[STEALING] > 999 ? 1700 : thief->skill[STEALING] + 200;
if ( we > cansteal )
{
thief->sysmsg(TRANSLATE("That is too heavy."));
return;
}
if (pi->amxevents[EVENT_IONSTOLEN]!=NULL)
{
g_bByPass = false;
pi->amxevents[EVENT_IONSTOLEN]->Call(pi->getSerial32(), thief->getSerial32(), victim->getSerial32());
if (g_bByPass==true)
return;
}
if (victim->amxevents[EVENT_CHR_ONSTOLEN])
{
g_bByPass = false;
victim->amxevents[EVENT_CHR_ONSTOLEN]->Call(victim->getSerial32(), thief->getSerial32());
if (g_bByPass==true)
return;
}
/*
pi->runAmxEvent( EVENT_IONSTOLEN, pi->getSerial32(), s, victim->getSerial32() );
if (g_bByPass==true)
return;
victim->runAmxEvent( EVENT_CHR_ONSTOLEN, victim->getSerial32(), s );
if (g_bByPass==true)
return;
*/
P_ITEM pack= thief->getBackpack();
VALIDATEPI(pack);
//.........这里部分代码省略.........
示例8: newbieitems
void newbieitems(P_CHAR pc)
{
VALIDATEPC(pc);
NXWCLIENT ps=pc->getClient();
if(ps==NULL)
return;
int first, second, third, storeval, itemaddperskill, loopexit = 0;
char sect[512];
char whichsect[105];
cScpIterator* iter = NULL;
first = bestskill(pc);
second = nextbestskill(pc, first);
third = nextbestskill(pc, second);
if (pc->baseskill[third] < 190)
third = 46;
for (itemaddperskill = 1; itemaddperskill <= 5; itemaddperskill++)
{
switch (itemaddperskill)
{
// first of all the general section with the backpack, else where we put items?
case 1: strcpy(whichsect, "SECTION ALLNEWBIES"); break;
case 2:
if ( (pc->getId() == BODY_MALE) && (pc->getOldId() == BODY_MALE) )
strcpy(whichsect, "SECTION MALENEWBIES");
else
strcpy(whichsect, "SECTION FEMALENEWBIES");
break;
case 3: sprintf(whichsect, "SECTION BESTSKILL %i", first); break;
case 4: sprintf(whichsect, "SECTION BESTSKILL %i", second); break;
case 5: sprintf(whichsect, "SECTION BESTSKILL %i", third); break;
default:
ErrOut("Switch fallout. newbie.cpp, newbieitems()/n"); // Morrolan
}
sprintf(sect, whichsect);
char script1[1000], script2[1000];
safedelete(iter);
iter = Scripts::Newbie->getNewIterator(sect);
if (iter==NULL) return;
do
{
iter->parseLine(script1,script2);
if (script1[0] == '@') pc->loadEventFromScript(script1, script2); // Sparhawk: Huh loading character events
// from newbie item scripts????
if (script1[0] != '}')
{
if (!(strcmp("PACKITEM", script1)))
{
std::string itemnum, amount;
splitLine( script2, itemnum, amount );
int amt = ( amount != "" )? str2num( amount ) : INVALID; //ndEndy defined amount
P_ITEM pi_n = item::CreateFromScript( str2num( itemnum ), pc->getBackpack(), amt );
if (ISVALIDPI(pi_n)) {
pi_n->priv |= 0x02; // Mark as a newbie item
}
strcpy(script1, "DUMMY");
}
else if (!strcmp("BANKITEM", script1))
{
std::string itemnum, amount;
splitLine( script2, itemnum, amount );
int amt= (amount!="")? str2num( amount ) : INVALID;
P_ITEM pi = item::CreateFromScript( str2num( itemnum ), pc->GetBankBox(), amt );
if (ISVALIDPI(pi)) {
pi->priv |= 0x02; // Mark as a newbie item
}
strcpy(script1, "DUMMY");
}
else if (!strcmp("EQUIPITEM", script1))
{
P_ITEM pi = item::CreateFromScript( script2 );
if (ISVALIDPI(pi))
{
pi->priv |= 0x02; // Mark as a newbie item
pi->setCont(pc);
storeval = pi->getScriptID();
}
strcpy(script1, "DUMMY");
}
}
}
while ((script1[0] != '}') &&(++loopexit < MAXLOOPS));
safedelete(iter);
}
// Give the character some gold
if ( goldamount > 0 )
{
item::CreateFromScript( "$item_gold_coin", pc->getBackpack(), goldamount );
}
//.........这里部分代码省略.........
示例9: RandomSteal
void cSkills::RandomSteal( cUOSocket* socket, SERIAL victim )
{
P_PLAYER pChar = socket->player();
P_CHAR pVictim = FindCharBySerial( victim );
if ( !pVictim || !pChar )
return;
if ( pVictim->serial() == pChar->serial() )
{
socket->sysMessage( tr( "Why don't you simply take it?" ) );
return;
}
/* if( pVictim->npcaitype() == 17 )
{
socket->sysMessage( tr( "You cannot steal from Playervendors." ) );
return;
}
*/
if ( pVictim->objectType() == enPlayer )
{
P_PLAYER pp = dynamic_cast<P_PLAYER>( pVictim );
if ( pp->isGMorCounselor() )
socket->sysMessage( tr( "You can't steal from game masters." ) );
return;
}
if ( !pChar->inRange( pVictim, 1 ) )
{
socket->sysMessage( tr( "You are too far away to steal from that person." ) );
return;
}
P_ITEM pBackpack = pVictim->getBackpack();
if ( !pBackpack )
{
socket->sysMessage( tr( "Bad luck, your victim doesn't have a backpack." ) );
return;
}
float maxWeight = ( float ) QMIN( 1, pChar->skillValue( STEALING ) ); // We can steal max. 10 Stones when we are a GM
// 1000 Skill == 100 Weight == 10 Stones
QPtrList<cItem> containment = pBackpack->getContainment();
Q_UINT32 chance = containment.count();
P_ITEM pItem = containment.first();
P_ITEM pToSteal = 0;
bool sawOkItem = false;
while ( !pToSteal )
{
// We have nothing that could be stolen?
if ( !pItem && !sawOkItem )
{
socket->sysMessage( tr( "Your victim posesses nothing you could steal." ) );
return;
}
// Jump back to the beginning
else if ( !pItem && sawOkItem )
{
pItem = containment.first();
}
// Check if our chance becomes true (no spellbooks!)
if ( pItem->totalweight() <= maxWeight && !pItem->isLockedDown() && !pItem->newbie() && pItem->type() != 9 )
{
sawOkItem = true; // We have items that could be stolen (just in case we reach the end of our list)
// We have the chance of 1/chance that we reached our desired item
if ( RandomNum( 1, ( int )chance ) == ( int )chance )
{
pToSteal = pItem;
break;
}
}
pItem = containment.next();
}
socket->sysMessage( tr( "You reach into %1's backpack and try to steal something..." ).arg( pVictim->name() ) );
// The success of our Theft depends on the weight of the stolen item
bool success = pChar->checkSkill( STEALING, 0, ( long int )pToSteal->weight() );
bool caught = false;
if ( success )
{
socket->sysMessage( tr( "You successfully steal %1." ).arg( pToSteal->getName() ) );
P_ITEM pPack = pChar->getBackpack();
pPack->addItem( pToSteal );
// Update item onyl if still existent
if ( !pToSteal->free )
pToSteal->update();
caught = pChar->skillValue( STEALING ) < rand() % 1001;
}
else
//.........这里部分代码省略.........
示例10: checkReagents
/*!
Just like useReagents this function is checking
for required reagents on a characater to cast a
spell. But unlike useReagents it wont really
consume the reagents but just return false if
the required reagents are not present.
*/
bool cNewMagic::checkReagents( P_CHAR pMage, UINT8 spell )
{
// Check for each reagent.
// So we dont need to loop trough all items over and over again we'll use ONE loop (will be a bit less clean)
P_ITEM pPack = pMage->getBackpack();
stNewSpell *sInfo = findSpell( spell );
UINT8 ginseng = sInfo->reagents.ginseng;
UINT8 bloodmoss = sInfo->reagents.bloodmoss;
UINT8 mandrake = sInfo->reagents.mandrake;
UINT8 blackpearl = sInfo->reagents.blackpearl;
UINT8 spidersilk = sInfo->reagents.spidersilk;
UINT8 garlic = sInfo->reagents.garlic;
UINT8 nightshade = sInfo->reagents.nightshade;
UINT8 sulfurash = sInfo->reagents.sulfurash;
QPtrList< cItem > content = pPack->getContainment();
for( P_ITEM pItem = content.first(); pItem; pItem = content.next() )
{
checkReagent( blackpearl, 0xF7A )
else checkReagent( bloodmoss, 0xF7B )
else checkReagent( garlic, 0xF84 )
else checkReagent( ginseng, 0xF85 )
else checkReagent( mandrake, 0xF86 )
else checkReagent( nightshade, 0xF88 )
else checkReagent( sulfurash, 0xF8C )
else checkReagent( spidersilk, 0xF8D )
}
QStringList missing;
if( ginseng > 0 )
missing.append( tr( "Ginseng" ) );
if( bloodmoss > 0 )
missing.append( tr( "Bloodmoss" ) );
if( mandrake > 0 )
missing.append( tr( "Mandrake" ) );
if( blackpearl > 0 )
missing.append( tr( "Black Pearls" ) );
if( spidersilk > 0 )
missing.append( tr( "Spider's Silk" ) );
if( garlic > 0 )
missing.append( tr( "Garlic" ) );
if( nightshade > 0 )
missing.append( tr( "Nightshade" ) );
if( sulfurash > 0 )
missing.append( tr( "Sulfurous Ash" ) );
bool enoughReagents = true;
if( missing.count() > 0 )
{
if( pMage->objectType() == enPlayer )
{
P_PLAYER pp = dynamic_cast<P_PLAYER>(pMage);
if( pp->socket() )
{
pp->message( tr( "You don't have enough reagents." ) );
pp->socket()->sysMessage( tr( "You lack the following reagents: %1" ).arg( missing.join( ", ") ) );
}
}
enoughReagents = false;
}
return enoughReagents;
}
示例11: execMake
/*!
\brief executes a "MAKE" command
\author Xanathar
\param pc player who do make
\param n item number
*/
void cMakeMenu::execMake( NXWCLIENT ps, UI32 item )
{
P_CHAR pc = ps->currChar();
if( pc->dead ) {
pc->sysmsg(TRANSLATE("Ever thought an ethereal soul can't really do some actions ?"));
return;
}
cMakeItem* mi = makeItems[item];
if( ( mi==NULL ) || ( mi->command==NULL ) )
return;
if( mi->command->command=="MAKEMENU" ) {
Skills::MakeMenu( pc, str2num( mi->command->param ), skill, mat[0].id, mat[0].color, mat[1].id, mat[1].color );
return;
}
if( pc->IsGM() ) {
mi->command->execute( ps->toInt() );
return;
}
if( !mi->checkReq( pc ) )
return;
bool failed = false;
if( !pc->checkSkill((Skill)mi->skillToCheck, mi->minskill, mi->maxskill) ) {
failed = true;
}
for( int j=0; j<2; ++j ) {
cRawItem& raw = mi->reqitems[j];
if( raw.id!=0 ) {
UI16 matToDel = raw.number;
if( failed )
matToDel = ( matToDel/2>0 )? matToDel/2 : 1;
pc->delItems( raw.id, matToDel, raw.color );
}
}
switch( skill )
{
case MINING :
pc->playSFX(0x0054);
break;
case BLACKSMITHING :
pc->playSFX(0x002A);
break;
case CARPENTRY :
pc->playSFX(0x023D);
break;
case INSCRIPTION :
pc->playSFX(0x0249);
break;
case TAILORING :
pc->playSFX(0x0248);
break;
case TINKERING :
pc->playSFX(0x002A);
break;
case CARTOGRAPHY :
pc->playSFX(0x0249);
break;
}
pc->setObjectDelay();
std::string script;
std::string amount;
splitLine( mi->command->param, script, amount );
if( !failed ) {
P_ITEM pi = item::CreateFromScript( str2num( script ), pc->getBackpack(), (amount!="")? str2num( amount ) : INVALID );
VALIDATEPI(pi);
ps->sysmsg(TRANSLATE("You create the item and place it in your backpack."));
pi->magic = 1;
pi->creator = pc->getCurrentName(); // Memorize Name of the creator
if (pc->skill[skill]>950)
pi->madewith=skill+1; // Memorize Skill used
else
pi->madewith=0-skill-1; // Memorize Skill used ( negative not shown )
}
else {
//.........这里部分代码省略.........
示例12: wear_item
//.........这里部分代码省略.........
if (pj->layer == tile.quality)
drop[curindex++]= DEREF_P_ITEM(pj);
}
}
if (ServerScp::g_nUnequipOnReequip)
{
if (drop[0] > -1) // there is at least one item to drop
{
for (int i= 0; i< 2; i++)
{
if (drop[i] > -1)
{
P_ITEM p_drop=MAKE_ITEM_REF(drop[i]);
if(ISVALIDPI(p_drop))
pc_currchar->UnEquip( p_drop, 0);
}
}
}
pc->playSFX( itemsfx(pi->getId()) );
// pc_currchar->Equip(pi, 1); // Item is equipped twice ????
}
else
{
if (drop[0] == -1)
{
pc->playSFX( itemsfx(pi->getId()) );
// pc_currchar->Equip(pi, 1);// Item is equipped twice ????
}
else
{
ps->sysmsg("You cannot wear two weapons.");
Sndbounce5(s);
if (ps->isDragging())
{
ps->resetDragging();
UpdateStatusWindow(s,pi);
}
pi->setContSerial( pi->getContSerial(true) );
pi->setPosition( pi->getOldPosition() );
pi->layer = pi->oldlayer;
pi->Refresh();
return;
}
}
if (!(pc->IsGM())) //Ripper..players cant equip items on other players or npc`s paperdolls.
{
if ((pck->getSerial32() != pc->getSerial32())/*&&(chars[s].npc!=k)*/) //-> really don't understand this! :|, xan
{
ps->sysmsg(TRANSLATE("You can't put items on other people!"));
item_bounce6(ps,pi);
return;
}
}
NxwSocketWrapper sws;
sws.fillOnline( pi );
for( sws.rewind(); !sws.isEmpty(); sws++ )
SendDeleteObjectPkt( sws.getSocket(), pi->getSerial32() );
pi->layer=buffer[s][5];
pi->setContSerial(LongFromCharPtr(buffer[s] +6));
if (g_nShowLayers) InfoOut("Item equipped on layer %i.\n",pi->layer);
wearIt(s,pi);
NxwSocketWrapper sw;
sw.fillOnline( pck, false );
for( sw.rewind(); !sw.isEmpty(); sw++ )
{
NXWSOCKET j=sw.getSocket();
if( j!=INVALID )
wornitems(j, pck );
}
pc->playSFX( itemsfx(pi->getId()) );
weights::NewCalc(pc); // Ison 2-20-99
statwindow(pc_currchar,pc_currchar);
// if (pi->glow>0)
// {
// pc->removeHalo(pi); // if gm equips on differnt player it needs to be deleted out of the hashteble
// pck->addHalo(pi);
// pck->glowHalo(pi);
// }
if ( pck->Equip(pi, 1) == 2) // bypass called
{
P_ITEM pack = pck->getBackpack();
pc->playSFX( itemsfx(pi->getId()) );
pi->layer= 0;
pi->setContSerial( pack->getSerial32() );
sendbpitem(s, pi);
return;
}
}
}
示例13: ItemDroppedOnChar
//.........这里部分代码省略.........
return true;
}
else // The player is training from this NPC
{
ItemDroppedOnTrainer( ps, pp, pi);
}
}
if ( pTC->isHirable() )
{
// test if gold is enough
if ( pi->amount < pTC->getHireFee() )
{
pTC->talk(s, TRANSLATE("I need much more gold if i shall be working for you !"),0);
Sndbounce5(s);
if (ps->isDragging())
{
ps->resetDragging();
item_bounce5(s,pi);
}
return true;
}
else if ( pi->amount >= pTC->getHireFee() )
{
if ( pi->amount > pTC->getHireFee() )
{
pi->amount=(UI16)(pi->amount - pTC->getHireFee());
pTC->talk(s, TRANSLATE("Thank thee kindly, but this is more than i need for the day."),0);
Sndbounce5(s);
if (ps->isDragging())
{
ps->resetDragging();
item_bounce5(s,pi);
}
}
pTC->setOwner(pc_currchar);
tempfx::add(pTC,
pc_currchar,
tempfx::NPC_HIRECOST,
0,
0,
0,
0,
(UI16)(MY_CLOCKS_PER_SEC*secondsperuominute*60*24 )); // call callback every uo day
return true;
}
}
}//if human or not
}
else // dropped on another player
{
// By Polygon: Avoid starting the trade if GM drops item on logged on char (crash fix)
if ((pc_currchar->IsGM()) && !pTC->IsOnline())
{
// Drop the item in the players pack instead
// Get the pack
P_ITEM pack = pTC->getBackpack();
if (pack != NULL) // Valid pack?
{
pack->AddItem(pi); // Add it
weights::NewCalc(pTC);
}
else // No pack, give it back to the GM
{
pack = pc_currchar->getBackpack();
if (pack != NULL) // Valid pack?
{
pack->AddItem(pi); // Add it
weights::NewCalc(pc_currchar);
}
else // Even GM has no pack?
{
// Drop it to it's feet
pi->MoveTo( charpos );
pi->Refresh();
}
}
}
else
{
//<Luxor>: secure trade
P_ITEM tradeCont = tradestart(pc_currchar, pTC);
if (ISVALIDPI(tradeCont)) {
tradeCont->AddItem( pi, 30, 30 );
} else {
Sndbounce5(s);
if (ps->isDragging()) {
ps->resetDragging();
UpdateStatusWindow(s,pi);
}
}
//</Luxor>
}
}
}
else // dumping stuff to his own backpack !
{
ItemDroppedOnSelf( ps, pp, pi);
}
return true;
}