/*! \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; }
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 ); }
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 ); } }
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; }
/*! \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) ) drop[curindex++]= DEREF_P_ITEM(pj); } if (pi->itmhand == 3) { if ((pj->itmhand == 2) || pj->itmhand == 3) drop[curindex++]= DEREF_P_ITEM(pj); } if ((pi->itmhand == 1) && ((pj->itmhand == 2) || (pj->itmhand == 1))) drop[curindex++]= DEREF_P_ITEM(pj); } else // not a weapon { if (pj->layer == item.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->UnEquip( p_drop ); } } } pc->playSFX( itemsfx(pi->getId()) ); pc->Equip( pi ); } else { if (drop[0] == -1) { pc->playSFX( itemsfx(pi->getId()) ); pc->Equip( pi ); } } return; } } // </Anthalir> //<Luxor>: Circle of transparency bug fix P_ITEM pCont; Location dst; pCont = pi->getOutMostCont(); if(pCont->isInWorld()) { dst = pCont->getPosition(); } else { P_CHAR pg_dst = pointers::findCharBySerial( pCont->getContSerial() ); VALIDATEPC(pg_dst); dst = pg_dst->getPosition(); } Location charPos = pc->getPosition(); charPos.z = dst.z; charPos.dispz = dst.dispz; if ( !pc->IsGM() && !lineOfSight( charPos, dst ) && !(pc->nxwflags[0] & cChar::flagSpellTelekinesys) ) { pc->sysmsg( TRANSLATE( "You cannot reach the item" ) ); return; } //</Luxor> P_CHAR itmowner = pi->getPackOwner(); if(!pi->isInWorld()) { if (isItemSerial(pi->getContSerial()) && pi->type != ITYPE_CONTAINER) {// Cant use stuff that isn't in your pack. if ( ISVALIDPC(itmowner) && (itmowner->getSerial32()!=pc->getSerial32()) ) return; } else if (isCharSerial(pi->getContSerial()) && pi->type!=(UI32)INVALID) {// in a character. P_CHAR wearedby = pointers::findCharBySerial(pi->getContSerial()); if (ISVALIDPC(wearedby)) if (wearedby->getSerial32()!=pc->getSerial32() && pi->layer!=LAYER_UNUSED_BP && pi->type!=ITYPE_CONTAINER) return; } } if ((pi->magic==4) && (pi->secureIt==1)) { if (!pc->isOwnerOf(pi) || !pc->IsGMorCounselor()) { pc->sysmsg( TRANSLATE("That is a secured chest!")); return; } } if (pi->magic == 4) { pc->sysmsg( TRANSLATE("That item is locked down.")); return; } if (pc->dead && pi->type!=ITYPE_RESURRECT) // if you are dead and it's not an ankh, FORGET IT! { pc->sysmsg(TRANSLATE("You may not do that as a ghost.")); return; } else if (!pc->IsGMorCounselor() && pi->layer!=0 && !pc->IsWearing(pi)) {// can't use other people's things! if (!(pi->layer==LAYER_BACKPACK && SrvParms->rogue==1)) // bugfix for snooping not working, LB { pc->sysmsg(TRANSLATE("You cannot use items equipped by other players.")); return; } } // Begin checking objects that we force an object delay for (std objects) // start trigger stuff if (pi->trigger > 0) { if (pi->trigtype == 0) { if ( TIMEOUT( pi->disabled ) ) // changed by Magius(CHE) § { triggerItem(s, pi, TRIGTYPE_DBLCLICK); // if players uses trigger return; } else { if ( pi->disabledmsg!=NULL ) pc->sysmsg("%s", pi->disabledmsg->c_str()); else pc->sysmsg(TRANSLATE("That doesnt seem to work right now.")); return; } } else { pc->sysmsg( TRANSLATE("You are not close enough to use that.")); return; } } // check this on trigger in the event that the .trigger property is not set on the item // trigger code. Check to see if item is envokable by id else if (checkenvoke( pi->getId() )) { pc->envokeitem = pi->getSerial32(); pc->envokeid = pi->getId(); P_TARGET targ = clientInfo[s]->newTarget( new cObjectTarget() ); targ->code_callback=target_envoke; targ->send( ps ); ps->sysmsg( TRANSLATE("What will you use this on?")); return; } // end trigger stuff // BEGIN Check items by type int los = 0; BYTE map1[20] = "\x90\x40\x01\x02\x03\x13\x9D\x00\x00\x00\x00\x13\xFF\x0F\xFF\x01\x90\x01\x90"; BYTE map2[12] = "\x56\x40\x01\x02\x03\x05\x00\x00\x00\x00\x00"; // By Polygon: This one is needed to show the location on treasure maps BYTE map3[12] = "\x56\x40\x01\x02\x03\x01\x00\x00\x00\x00\x00"; P_TARGET targ = NULL; switch (pi->type) { case ITYPE_RESURRECT: // Check for 'resurrect item type' this is the ONLY type one can use if dead. if (pc->dead) { pc->resurrect(); pc->sysmsg(TRANSLATE("You have been resurrected.")); return; } else { pc->sysmsg(TRANSLATE("You are already living!")); return; } case ITYPE_BOATS:// backpacks - snooping a la Zippy - add check for SrvParms->rogue later- Morrolan if (pi->type2 == 3) { switch( pi->getId() & 0xFF ) { case 0x84: case 0xD5: case 0xD4: case 0x89: Boats->PlankStuff(pc, pi); break; default: pc->sysmsg( TRANSLATE("That is locked.")); break; } return; } case ITYPE_CONTAINER: // bugfix for snooping not working, lb case ITYPE_UNLOCKED_CONTAINER: // Wintermute: GMs or Counselors should be able to open trapped containers always if (pi->moreb1 > 0 && !pc->IsGMorCounselor()) { magic::castAreaAttackSpell(pi->getPosition("x"), pi->getPosition("y"), magic::SPELL_EXPLOSION); pi->moreb1--; } //Magic->MagicTrap(currchar[s], pi); // added by AntiChrist // only 1 and 63 can be trapped, so pleaz leave it here :) - Anti case ITYPE_NODECAY_ITEM_SPAWNER: // nodecay item spawner..Ripper case ITYPE_DECAYING_ITEM_SPAWNER: // decaying item spawner..Ripper if (pi->isInWorld() || (pc->IsGMorCounselor()) || // Backpack in world - free access to everyone ( isCharSerial(pi->getContSerial()) && pi->getContSerial()==pc->getSerial32())) // primary pack { pc->showContainer(pi); pc->objectdelay=0; return; } else if( isItemSerial(pi->getContSerial()) ) { P_ITEM pio = pi->getOutMostCont(); if (pio->getContSerial()==pc->getSerial32() || pio->isInWorld() ) { pc->showContainer(pi); pc->objectdelay=0; return; } } if(ISVALIDPC(itmowner)) snooping(pc, pi ); return; case ITYPE_TELEPORTRUNE: targ = clientInfo[s]->newTarget( new cLocationTarget() ); targ->code_callback = target_tele; targ->send( ps ); ps->sysmsg( TRANSLATE("Select teleport target.")); return; case ITYPE_KEY: targ = clientInfo[s]->newTarget( new cItemTarget() ); targ->code_callback = target_key; targ->buffer[0]= pi->more1; targ->buffer[1]= pi->more2; targ->buffer[2]= pi->more3; targ->buffer[3]= pi->more4; targ->send( ps ); ps->sysmsg( TRANSLATE("Select item to use the key on.")); return; case ITYPE_LOCKED_ITEM_SPAWNER: case ITYPE_LOCKED_CONTAINER: // Added traps effects by AntiChrist // Wintermute: GMs or Counselors should be able to open locked containers always if ( !pc->IsGMorCounselor() ) { if (pi->moreb1 > 0 ) { magic::castAreaAttackSpell(pi->getPosition().x, pi->getPosition().y, magic::SPELL_EXPLOSION); pi->moreb1--; } pc->sysmsg(TRANSLATE("This item is locked.")); return; } else { pc->showContainer(pi); return; } case ITYPE_SPELLBOOK: if (ISVALIDPI(pack)) // morrolan if(pi->getContSerial()==pack->getSerial32() || pc->IsWearing(pi)) ps->sendSpellBook(pi); else pc->sysmsg(TRANSLATE("If you wish to open a spellbook, it must be equipped or in your main backpack.")); return; case ITYPE_MAP: LongToCharPtr(pi->getSerial32(), map1 +1); map2[1] = map1[1]; map2[2] = map1[2]; map2[3] = map1[3]; map2[4] = map1[4]; /* By Polygon: Assign areas and map size before sending */ map1[7] = pi->more1; // Assign topleft x map1[8] = pi->more2; map1[9] = pi->more3; // Assign topleft y map1[10] = pi->more4; map1[11] = pi->moreb1; // Assign lowright x map1[12] = pi->moreb2; map1[13] = pi->moreb3; // Assign lowright y map1[14] = pi->moreb4; int width, height; // Tempoary storage for w and h; width = 134 + (134 * pi->morez); // Calculate new w and h height = 134 + (134 * pi->morez); ShortToCharPtr(width, map1 +15); ShortToCharPtr(height, map1 +17); // END OF: By Polygon Xsend(s, map1, 19); //AoS/ Network->FlushBuffer(s); Xsend(s, map2, 11); //AoS/ Network->FlushBuffer(s); return; case ITYPE_BOOK: Books::DoubleClickBook(s, pi); return; case ITYPE_DOOR: dooruse(s, pi); return; case ITYPE_LOCKED_DOOR: // Wintermute: GMs or Counselors should be able to open locked doors always if ( pc->IsGMorCounselor()) { dooruse(s, pi); return; } if (ISVALIDPI(pack)) { NxwItemWrapper si; si.fillItemsInContainer( pack ); for( si.rewind(); !si.isEmpty(); si++ ) { P_ITEM pj = si.getItem(); if (ISVALIDPI(pj) && pj->type==ITYPE_KEY) if (((pj->more1 == pi->more1) && (pj->more2 == pi->more2) && (pj->more3 == pi->more3) && (pj->more4 == pi->more4)) ) { pc->sysmsg(TRANSLATE("You quickly unlock, use, and then relock the door.")); dooruse(s, pi); return; } } } pc->sysmsg(TRANSLATE("This door is locked.")); return; case ITYPE_FOOD: if (pc->hunger >= 6) { pc->sysmsg( TRANSLATE("You are simply too full to eat any more!")); return; } else { switch (RandomNum(0, 2)) { case 0: pc->playSFX(0x3A); break; case 1: pc->playSFX(0x3B); break; case 2: pc->playSFX(0x3C); break; } switch (pc->hunger) { case 0: pc->sysmsg( TRANSLATE("You eat the food, but are still extremely hungry.")); break; case 1: pc->sysmsg( TRANSLATE("You eat the food, but are still extremely hungry.")); break; case 2: pc->sysmsg( TRANSLATE("After eating the food, you feel much less hungry.")); break; case 3: pc->sysmsg( TRANSLATE("You eat the food, and begin to feel more satiated.")); break; case 4: pc->sysmsg( TRANSLATE("You feel quite full after consuming the food.")); break; case 5: pc->sysmsg( TRANSLATE("You are nearly stuffed, but manage to eat the food.")); break; default: pc->sysmsg( TRANSLATE("You are simply too full to eat any more!")); break; } if (pi->poisoned) { pc->sysmsg(TRANSLATE("The food was poisoned!")); pc->applyPoison(PoisonType(pi->poisoned)); } pi->ReduceAmount(1); pc->hunger++; } return; case ITYPE_WAND: // -Fraz- Modified and tuned up, Wands must now be equipped or in pack case ITYPE_MANAREQ_WAND: // magic items requiring mana (xan) if (ISVALIDPI(pack)) { if (pi->getContSerial() == pack->getSerial32() || pc->IsWearing(pi)) { if (pi->morez != 0) { pi->morez--; if (magic::beginCasting( static_cast<magic::SpellId>((8*(pi->morex - 1)) + pi->morey - 1), ps, (pi->type==ITYPE_WAND) ? magic::CASTINGTYPE_ITEM : magic::CASTINGTYPE_NOMANAITEM)) { if (pi->morez == 0) { pi->type = pi->type2; pi->morex = 0; pi->morey = 0; pi->offspell = 0; } } } } else { pc->sysmsg(TRANSLATE("If you wish to use this, it must be equipped or in your backpack.")); } } return; // case 15 (magic items) /*////////////////////REMOVE///////////////////////////////////// case 18: // crystal ball? switch (RandomNum(0, 9)) { case 0: itemmessage(s, TRANSLATE("Seek out the mystic llama herder."), pi->getSerial32()); break; case 1: itemmessage(s, TRANSLATE("Wherever you go, there you are."), pi->getSerial32()); break; case 4: itemmessage(s, TRANSLATE("The message appears to be too cloudy to make anything out of it."), pi->getSerial32()); break; case 5: itemmessage(s, TRANSLATE("You have just lost five strength.. not!"), pi->getSerial32()); break; case 6: itemmessage(s, TRANSLATE("You're really playing a game you know"), pi->getSerial32()); break; case 7: itemmessage(s, TRANSLATE("You will be successful in all you do."), pi->getSerial32()); break; case 8: itemmessage(s, TRANSLATE("You are a person of culture."), pi->getSerial32()); break; default: itemmessage(s, TRANSLATE("Give me a break! How much good fortune do you expect!"), pi->getSerial32()); break; }// switch soundeffect2(pc_currchar, 0x01EC); return;// case 18 (crystal ball?) */////////////////////ENDREMOVE///////////////////////////////////// case ITYPE_POTION: // potions if (pi->morey != 3) pc->drink(pi); //Luxor: delayed potions drinking else //explosion potion usepotion(pc, pi); return; case ITYPE_RUNE: if (pi->morex==0 && pi->morey==0 && pi->morez==0) { pc->sysmsg( TRANSLATE("That rune is not yet marked!")); } else { pc->runeserial = pi->getSerial32(); pc->sysmsg( TRANSLATE("Enter new rune name.")); } return; case ITYPE_SMOKE: pc->smoketimer = pi->morex*MY_CLOCKS_PER_SEC + getclock(); pi->ReduceAmount(1); return; case ITYPE_RENAME_DEED: pc->namedeedserial = pi->getSerial32(); pc->sysmsg( TRANSLATE("Enter your new name.")); pi->ReduceAmount(1); return; case ITYPE_POLYMORPH: pc->setId( pi->morex ); pc->teleport(); pi->type = ITYPE_POLYMORPH_BACK; return; case ITYPE_POLYMORPH_BACK: pc->setId( pc->getOldId() ); pc->teleport(); pi->type = ITYPE_POLYMORPH; return; case ITYPE_ARMY_ENLIST: enlist(s, pi->morex); pi->Delete(); return; case ITYPE_TELEPORT: pc->MoveTo( pi->morex,pi->morey,pi->morez ); pc->teleport(); return; case ITYPE_DRINK: switch (rand()%2) { case 0: pc->playSFX(0x0031); break; case 1: pc->playSFX(0x0030); break; } pi->ReduceAmount(1); pc->sysmsg( TRANSLATE("Gulp !")); return; case ITYPE_GUILDSTONE: if ( pi->getId() == 0x14F0 || pi->getId() == 0x1869 ) // Check for Deed/Teleporter + Guild Type { pc->fx1 = DEREF_P_ITEM(pi); Guilds->StonePlacement(s); return; } else if (pi->getId() == 0x0ED5) // Check for Guildstone + Guild Type { pc->fx1 = DEREF_P_ITEM(pi); Guilds->Menu(s, 1); return; } else WarnOut("Unhandled guild item type named: %s with ID of: %X\n", pi->getCurrentNameC(), pi->getId()); return; case ITYPE_PLAYER_VENDOR_DEED: // PlayerVendors deed { P_CHAR vendor = npcs::AddNPCxyz(-1, 2117, charpos.x, charpos.y, charpos.z); if ( !ISVALIDPC(vendor) ) { WarnOut("npc-script couldnt find vendor !\n"); return; } los = 0; vendor->npcaitype = NPCAI_PLAYERVENDOR; vendor->MakeInvulnerable(); vendor->unHide(); vendor->stealth=INVALID; vendor->dir = pc->dir; vendor->npcWander = WANDER_NOMOVE; vendor->SetInnocent(); vendor->setOwnerSerial32( pc->getSerial32() ); vendor->tamed = false; pi->Delete(); vendor->teleport(); char temp[TEMP_STR_SIZE]; //xan -> this overrides the global temp var sprintf( temp, TRANSLATE("Hello sir! My name is %s and i will be working for you."), vendor->getCurrentNameC()); vendor->talk(s, temp, 0); return; } case ITYPE_TREASURE_MAP: Skills::Decipher(pi, s); return; case ITYPE_DECIPHERED_MAP: map1[ 1] = map2[1] = map3[1] = pi->getSerial().ser1; map1[ 2] = map2[2] = map3[2] = pi->getSerial().ser2; map1[ 3] = map2[3] = map3[3] = pi->getSerial().ser3; map1[ 4] = map2[4] = map3[4] = pi->getSerial().ser4; map1[ 7] = pi->more1; // Assign topleft x map1[ 8] = pi->more2; map1[ 9] = pi->more3; // Assign topleft y map1[10] = pi->more4; map1[11] = pi->moreb1; // Assign lowright x map1[12] = pi->moreb2; map1[13] = pi->moreb3; // Assign lowright y map1[14] = pi->moreb4; ShortToCharPtr(0x0100, map1 +15); // Let width and height be 256 ShortToCharPtr(0x0100, map1 +17); Xsend(s, map1, 19); //AoS/ Network->FlushBuffer(s); Xsend(s, map2, 11); //AoS/ Network->FlushBuffer(s); // Generate message to add a map point SI16 posx, posy; // tempoary storage for map point SI16 tlx, tly, lrx, lry; // tempoary storage for map extends tlx = (pi->more1 << 8) | pi->more2; tly = (pi->more3 << 8) | pi->more4; lrx = (pi->moreb1 << 8) | pi->moreb2; lry = (pi->moreb3 << 8) | pi->moreb4; posx = (256 * (pi->morex - tlx)) / (lrx - tlx); // Generate location for point posy = (256 * (pi->morey - tly)) / (lry - tly); ShortToCharPtr(posx, map3 +7); // Store the point position ShortToCharPtr(posy, map3 +9); Xsend(s, map3, 11); // Fire data to client :D //AoS/ Network->FlushBuffer(s); return; default: break; } ///END IDENTIFICATION BY TYPE /////////////////READ UP :D//////////////////////////////// ///BEGIN IDENTIFICATION BY ID if (pi->IsSpellScroll()) { if (ISVALIDPI(pack)) if( pi->getContSerial()==pack->getSerial32()) { magic::SpellId spn = magic::spellNumberFromScrollId(pi->getId()); // avoid reactive armor glitch if ((spn>=0)&&(magic::beginCasting(spn, ps, magic::CASTINGTYPE_SCROLL))) pi->ReduceAmount(1); // remove scroll if successful } else pc->sysmsg(TRANSLATE("The scroll must be in your backpack to envoke its magic.")); } CASE(IsAnvil) { targ = clientInfo[s]->newTarget( new cItemTarget() ); targ->code_callback=Skills::target_repair; targ->send( ps ); ps->sysmsg( TRANSLATE("Select item to be repaired.")); } CASE(IsAxe) { targ = clientInfo[s]->newTarget( new cTarget() ); targ->code_callback=target_axe; targ->buffer[0]=pi->getSerial32(); targ->send( ps ); ps->sysmsg( TRANSLATE("What would you like to use that on ?")); } CASEOR(IsFeather, IsShaft) { targ = clientInfo[s]->newTarget( new cItemTarget() ); targ->buffer[0]= pi->getSerial32(); targ->code_callback=Skills::target_fletching; targ->send( ps ); ps->sysmsg( TRANSLATE("What would you like to use this with?")); }
/*! \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; victim->amxevents[EVENT_CHR_ONSTOLEN]->Call(victim->getSerial32(), thief->getSerial32()); if (g_bByPass==true) return; } /* victim->runAmxEvent( EVENT_CHR_ONSTOLEN, victim->getSerial32(), s); if (g_bByPass==true) return; */ P_ITEM thiefpack = thief->getBackpack(); VALIDATEPI(thiefpack); pi->setContSerial( thiefpack->getSerial32() ); thief->sysmsg(TRANSLATE("... and you succeed.")); pi->Refresh(); //all_items(s); } } else thief->sysmsg(TRANSLATE(".. and fail because you're not good enough.")); if ( thief->skill[STEALING] < rand()%1001 ) { thief->unHide(); thief->sysmsg(TRANSLATE("You have been caught!")); thief->IncreaseKarma( ServerScp::g_nStealKarmaLoss); thief->modifyFame( ServerScp::g_nStealFameLoss); if (victim->IsInnocent() && thief->attackerserial!=victim->getSerial32() && Guilds->Compare(thief,victim)==0)//AntiChrist setCrimGrey(thief, ServerScp::g_nStealWillCriminal);//Blue and not attacker and not guild std::string itmname = ""; if ( pi->getCurrentName() != "#" ) itmname = pi->getCurrentName(); else { pi->getName( temp ); itmname = temp; } sprintf(temp,TRANSLATE("You notice %s trying to steal %s from you!"), thief->getCurrentNameC(), itmname.c_str()); sprintf(temp2,TRANSLATE("You notice %s trying to steal %s from %s!"), thief->getCurrentNameC(), itmname.c_str(), victim->getCurrentNameC()); if ( victim->npc) victim->talkAll(TRANSLATE( "Guards!! A thief is amoung us!"),0); else victim->sysmsg(temp); //send to all player temp2 = thief are stealing victim if are more intelligent and a bonus of luck :D // // NxwSocketWrapper sw; sw.fillOnline( thief, true ); for( sw.rewind(); !sw.isEmpty(); sw++ ) { NXWCLIENT ps_i=sw.getClient(); if( ps_i==NULL ) continue; P_CHAR pc_i=ps_i->currChar(); if ( ISVALIDPC(pc_i) ) if( (rand()%10+10==17) || ( (rand()%2==1) && (pc_i->in>=thief->in))) sysmessage(ps_i->toInt(),temp2); } } } else { thief->sysmsg( TRANSLATE("... and realise you're too far away.")); } }
/*! \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); pi->setContSerial( pack->getSerial32() ); thief->sysmsg(TRANSLATE("You successfully steal the item.")); pi->Refresh(); result=+200; //all_items(s); why all item? } else { thief->sysmsg( TRANSLATE("You failed to steal the item.")); result=-200; //Only onhide when player is caught! } if ( rand()%1000 > ( thief->skill[STEALING] + result ) ) { thief->unHide(); thief->sysmsg(TRANSLATE("You have been caught!")); thief->IncreaseKarma(ServerScp::g_nStealKarmaLoss); thief->modifyFame(ServerScp::g_nStealFameLoss); if ( victim->IsInnocent() && thief->attackerserial != victim->getSerial32() && Guilds->Compare(thief,victim)==0) setCrimGrey(thief, ServerScp::g_nStealWillCriminal); //Blue and not attacker and not same guild std::string itmname ( "" ); char temp[TEMP_STR_SIZE]; //xan -> this overrides the global temp var char temp2[TEMP_STR_SIZE]; //xan -> this overrides the global temp var if ( pi->getCurrentName() != "#" ) itmname = pi->getCurrentName(); else { pi->getName( temp ); itmname = temp; } sprintf(temp,TRANSLATE("You notice %s trying to steal %s from you!"), thief->getCurrentNameC(), itmname.c_str()); sprintf(temp2,TRANSLATE("You notice %s trying to steal %s from %s!"), thief->getCurrentNameC(), itmname.c_str(), victim->getCurrentNameC()); if ( victim->npc ) if( victim->HasHumanBody() ) victim->talkAll(TRANSLATE( "Guards!! A thief is amoung us!"),0); else victim->sysmsg(temp); //send to all player temp2 = thief are stealing victim if are more intelligent and a bonus of luck :D NxwSocketWrapper sw; sw.fillOnline( thief, true ); for( sw.rewind(); !sw.isEmpty(); sw++ ) { NXWCLIENT ps_i=sw.getClient(); if(ps_i==NULL ) continue; P_CHAR pc_i=ps_i->currChar(); if ( ISVALIDPC(pc_i) ) if( (rand()%10+10==17) || ( (rand()%2==1) && (pc_i->in>=thief->in))) pc_i->sysmsg(temp2); } } } else { thief->sysmsg(TRANSLATE("You are too far away to steal that item.")); } AMXEXECSVTARGET( thief->getSerial32(),AMXT_SKITARGS,STEALING,AMX_AFTER); }
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 ); } }
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 { socket->sysMessage( tr( "You fail to steal the item." ) ); // 1 in 5 Chance if we failed caught = RandomNum( 1, 5 ) == 1; } // Did we get caught? if ( caught ) { socket->sysMessage( tr( "You have been cought!" ) ); // Human non red NPCs need special handling if ( pVictim->objectType() == enNPC && pVictim->isInnocent() && pVictim->isHuman() ) { P_NPC pn = dynamic_cast<P_NPC>( pVictim ); pVictim->talk( tr( "Guards! A thief is amoung us!" ), 0xFFFF, 0x09 ); if ( pVictim->region() && pVictim->region()->isGuarded() ) pn->callGuards(); } if ( pVictim->notoriety( pChar ) == 0x01 ) pChar->makeCriminal(); // Our Victim always notices it. if ( pVictim->objectType() == enPlayer ) { P_PLAYER pp = dynamic_cast<P_PLAYER>( pVictim ); if ( pp->socket() ) pp->socket()->showSpeech( pChar, tr( "You notice %1 trying to steal %2 from you." ).arg( pChar->name() ).arg( pToSteal->getName( true ) ) ); } QString message = tr( "You notice %1 trying to steal %2 from %3." ).arg( pChar->name() ).arg( pItem->getName() ).arg( pVictim->name() ); for ( cUOSocket*mSock = Network::instance()->first(); mSock; mSock = Network::instance()->next() ) { // Everyone within 7 Tiles notices us if ( mSock != socket && mSock->player() && mSock->player()->serial() != pVictim->serial() && mSock->player()->inRange( pChar, 7 ) ) mSock->showSpeech( pChar, message ); } } }
/*! 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; }
/*! \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 { ps->sysmsg(TRANSLATE("You failed")); } }
void wear_item(NXWCLIENT ps) // Item is dropped on paperdoll { if ( ps == NULL ) return; NXWSOCKET s = ps->toInt(); if (s < 0) return; P_CHAR pc=ps->currChar(); VALIDATEPC( pc ); P_CHAR pck = pointers::findCharBySerPtr(buffer[s]+6); VALIDATEPC( pck ); if( pck->dead ) //Exploit fix: Dead ppl can't equip anything. return; P_ITEM pi=pointers::findItemBySerPtr(buffer[s]+1); VALIDATEPI(pi); bool resetDragging = false; if( (pi->getId()>>8) >= 0x40) // LB, client crashfix if multi-objects are moved to PD resetDragging = true; tile_st tile; int serial/*, letsbounce=0*/; // AntiChrist (5) - new ITEMHAND system data::seekTile(pi->getId(), tile); if( ( clientDimension[s]==3 ) && (tile.quality==0) ) { ps->sysmsg(TRANSLATE("You can't wear that")); resetDragging = true; } else { P_ITEM outmost = pi->getOutMostCont(); P_CHAR vendor = pointers::findCharBySerial( outmost->getContSerial() ); if( ISVALIDPC( vendor ) && ( vendor->getOwnerSerial32() != pc->getSerial32() ) ) { resetDragging = true; } } if( resetDragging ) { Sndbounce5(s); if (ps->isDragging()) { ps->resetDragging(); item_bounce4(s,pi); UpdateStatusWindow(s,pi); } return; } if ( pck->getSerial32() == pc->getSerial32() || pc->IsGM() ) { if ( !pc->IsGM() && pi->st > pck->getStrength() && !pi->isNewbie() ) // now you can equip anything if it's newbie { ps->sysmsg(TRANSLATE("You are not strong enough to use that.")); resetDragging = true; } else if ( !pc->IsGM() && !checkItemUsability(pc, pi, ITEM_USE_WEAR) ) { resetDragging = true; } else if ( (pc->getId() == BODY_MALE) && ( pi->getId()==0x1c00 || pi->getId()==0x1c02 || pi->getId()==0x1c04 || pi->getId()==0x1c06 || pi->getId()==0x1c08 || pi->getId()==0x1c0a || pi->getId()==0x1c0c ) ) // Ripper...so males cant wear female armor { ps->sysmsg(TRANSLATE("You cant wear female armor!")); resetDragging = true; } else if ((((pi->magic==2)||((tile.weight==255)&&(pi->magic!=1))) && !pc->canAllMove()) || ( (pi->magic==3|| pi->magic==4) && !(pi->getOwnerSerial32()==pc->getSerial32()))) { resetDragging = true; } if( resetDragging ) { Sndbounce5(s); if (ps->isDragging()) { ps->resetDragging(); item_bounce4(s,pi); UpdateStatusWindow(s,pi); } return; } // - AntiChrist (4) - checks for new ITEMHAND system // - now you can't equip 2 hnd weapons with 1hnd weapons nor shields!! serial= pck->getSerial32(); //xan -> k not cc :) P_ITEM pj = NULL; P_CHAR pc_currchar= pck; // P_ITEM pack= pc_currchar->getBackpack(); //<Luxor> P_ITEM pW = pc_currchar->getWeapon(); if (tile.quality == 1 || tile.quality == 2) { //weapons layers if ( (pi->layer == LAYER_2HANDWEAPON && ISVALIDPI(pc_currchar->getShield())) ) { ps->sysmsg(TRANSLATE("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 (ISVALIDPI(pW)) { if (pi->itmhand != 3 && pi->lodamage != 0 && pi->itmhand == pW->itmhand) { ps->sysmsg(TRANSLATE("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; } } } //</Luxor> int drop[2]= {-1, -1}; // list of items to drop // there no reason for it to be larger int curindex= 0; NxwItemWrapper si; si.fillItemWeared( pc_currchar, false, true, true ); for( si.rewind(); !si.isEmpty(); si++ ) { // we CANNOT directly bounce the item, or the containersearch() function will not work // so we store the item ID in letsbounce, and at the end we bounce the item pj=si.getItem(); if(!ISVALIDPI(pj)) continue; if ((tile.quality == 1) || (tile.quality == 2))// 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) ) drop[curindex++]= DEREF_P_ITEM(pj); } if (pi->itmhand == 3) { if ((pj->itmhand == 2) || pj->itmhand == 3) drop[curindex++]= DEREF_P_ITEM(pj); } if ((pi->itmhand == 1) && ((pj->itmhand == 2) || (pj->itmhand == 1))) drop[curindex++]= DEREF_P_ITEM(pj); } else // not a weapon { 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; } } }
static bool ItemDroppedOnChar(NXWCLIENT ps, PKGx08 *pp, P_ITEM pi) { if (ps == NULL) return true; VALIDATEPIR(pi, false); NXWSOCKET s = ps->toInt(); // CHARACTER cc=ps->currCharIdx(); P_CHAR pTC = pointers::findCharBySerial(pp->Tserial); // the targeted character VALIDATEPCR(pTC, false); P_CHAR pc_currchar = ps->currChar(); //MAKE_CHAR_REF(cc); VALIDATEPCR(pc_currchar, false); Location charpos = pc_currchar->getPosition(); if (!pTC) return true; if (pi->amxevents[EVENT_IDROPONCHAR]!=NULL) { g_bByPass = false; pi->amxevents[EVENT_IDROPONCHAR]->Call( pi->getSerial32(), pc_currchar->getSerial32(), pTC->getSerial32() ); if (g_bByPass) { pi->Refresh(); return true; } } if (pc_currchar->getSerial32() != pTC->getSerial32() /*DEREF_P_CHAR(pTC)!=cc*/) { if (pTC->npc) { if(!pTC->HasHumanBody()) { ItemDroppedOnPet( ps, pp, pi); } else // Item dropped on a Human character { // Item dropped on a Guard (possible bounty quest) if( ( pTC->npc == 1 ) && ( pTC->npcaitype == NPCAI_TELEPORTGUARD ) ) { ItemDroppedOnGuard( ps, pp, pi); } if ( pTC->npcaitype == NPCAI_BEGGAR ) { ItemDroppedOnBeggar( ps, pp, pi); } //This crazy training stuff done by Anthracks ([email protected]) if(pc_currchar->isBeingTrained() ) { if ( pc_currchar->trainer != pTC->getSerial32()) { pTC->talk(s, TRANSLATE("Thank thee kindly, but I have done nothing to warrant a gift."),0); Sndbounce5(s); if (ps->isDragging()) { ps->resetDragging(); item_bounce5(s,pi); } 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; }