void cAllSpawnRegions::reload() { // Save a list of all objects and their spawnregions // So the references can be recreated later. QMap<QString, QPtrList<cUObject> > objects; cItemIterator iItems; for ( P_ITEM pItem = iItems.first(); pItem; pItem = iItems.next() ) { cSpawnRegion *region = pItem->spawnregion(); if ( region ) { if ( !objects.contains( region->name() ) ) { objects[region->name()].setAutoDelete( false ); } objects[region->name()].append( pItem ); pItem->setSpawnregion( 0 ); // Remove from spawnregion before pointer gets invalid } } cCharIterator iChars; for ( P_CHAR pChar = iChars.first(); pChar; pChar = iChars.next() ) { cSpawnRegion *region = pChar->spawnregion(); if ( region ) { if ( !objects.contains( region->name() ) ) { objects[region->name()].setAutoDelete( false ); } objects[region->name()].append( pChar ); pChar->setSpawnregion( 0 ); // Remove from spawnregion before pointer gets invalid } } unload(); load(); QMap<QString, QPtrList<cUObject> >::iterator it; for ( it = objects.begin(); it != objects.end(); ++it ) { cSpawnRegion *region = this->region( it.key() ); if ( region ) { cUObject *object; QPtrList<cUObject> &list = it.data(); for ( object = list.first(); object; object = list.next() ) { object->setSpawnregion( region ); } } } }
void cSpawnRegion::spawnSingleItem() { Coord_cl pos; if ( findValidSpot( pos ) ) { QString ItemSect = this->itemSections_[RandomNum( 1, this->itemSections_.size() ) - 1]; P_ITEM pi = cItem::createFromScript( ItemSect ); if ( pi ) { pi->moveTo( pos, true ); pi->setSpawnregion( this ); pi->update(); onSpawn( pi ); } } }
// New Class implementation void DragAndDrop::grabItem( cUOSocket* socket, cUORxDragItem* packet ) { // Get our character P_PLAYER pChar = socket->player(); if ( !pChar ) return; float weight = pChar->weight(); // Fetch the grab information UI16 amount = packet->amount(); if ( !amount ) amount = 1; P_ITEM pItem = FindItemBySerial( packet->serial() ); // If it's an invalid pointer we can't even bounce if ( !pItem ) return; // Are we already dragging an item ? // Bounce it and reject the move // (Logged out while dragging an item) if ( socket->dragging() ) { socket->bounceItem( socket->dragging(), BR_ALREADY_DRAGGING ); return; } // Check if the item can be reached if (pItem->getOutmostChar() != pChar && !pChar->lineOfSight(pItem)) { socket->bounceItem( pItem, BR_OUT_OF_REACH ); return; } if ( pItem->onPickup( pChar ) ) return; if ( pChar->onPickup( pItem ) ) return; // Do we really want to let him break his meditation // When he picks up an item ? // Maybe a meditation check here ?!? pChar->disturbMed(); // Meditation P_CHAR itemOwner = pItem->getOutmostChar(); // Try to pick something out of another characters posessions if ( !pChar->isGM() && itemOwner && ( itemOwner != pChar ) && ( itemOwner->objectType() == enNPC && dynamic_cast<P_NPC>( itemOwner )->owner() != pChar ) ) { socket->bounceItem( pItem, BR_BELONGS_TO_SOMEONE_ELSE ); return; } // Check if the user can grab the item if ( !pChar->canPickUp( pItem ) ) { socket->bounceItem( pItem, BR_CANNOT_PICK_THAT_UP ); return; } // The user can't see the item // Basically thats impossible as the socket should deny moving the item // if it's not in line of sight but to prevent exploits /*if( !line_of_sight( socket->socket(), pChar->pos, pItem->pos, TREES_BUSHES|WALLS_CHIMNEYS|DOORS|ROOFING_SLANTED|FLOORS_FLAT_ROOFING|LAVA_WATER ) ) { socket->sysMessage( "You can't see the item." ); bounceItem( socket, pItem, true ); return; }*/ P_ITEM outmostCont = pItem->getOutmostItem(); // If the top-most container ( thats important ) is a corpse // and looting is a crime, flag the character criminal. if ( !pChar->isGM() && outmostCont && outmostCont->corpse() ) { // For each item we take out we loose carma // if the corpse is innocent and not in our guild bool sameGuild = true;//( GuildCompare( pChar, outmostCont->owner() ) != 0 ); if ( outmostCont->hasTag( "notoriety" ) && outmostCont->getTag( "notoriety" ).toInt() == 1 && !pChar->owns( outmostCont ) && !sameGuild ) { // pChar->karma -= 5; pChar->setKarma( pChar->karma() - 5 ); pChar->setCriminalTime( Server::instance()->time() + Config::instance()->crimtime() * MY_CLOCKS_PER_SEC ); socket->sysMessage( tr( "You lost some karma." ) ); } } // Check if the item is too heavy //if( !pc_currchar->isGMorCounselor() ) //{ //} << Deactivated (DarkStorm) // ==== Grabbing the Item is allowed here ==== // Send the user a pickup sound if we're picking it up // From a container/paperdoll if ( !pItem->isInWorld() ) socket->soundEffect( 0x57, pItem ); // If we're picking up a specific amount of what we got // Take that into account if ( amount < pItem->amount() ) { UI32 pickedAmount = QMIN( amount, pItem->amount() ); // We only have to split if we're not taking it all if ( pickedAmount != pItem->amount() ) { P_ITEM splitItem = pItem->dupe(); // Create a new item to pick that up splitItem->setAmount( pItem->amount() - pickedAmount ); // Add tags to the splitted item QStringList keys = pItem->getTags(); QStringList::const_iterator it = keys.begin(); for ( ; it != keys.end(); ++it ) { splitItem->setTag( *it, pItem->getTag( *it ) ); } P_ITEM pContainer = dynamic_cast<P_ITEM>( pItem->container() ); if ( pContainer ) pContainer->addItem( splitItem, false ); splitItem->SetOwnSerial( pItem->ownSerial() ); splitItem->setSpawnregion( pItem->spawnregion() ); // He needs to see the new item splitItem->update(); // If we're taking something out of a spawn-region it's spawning "flag" is removed isn't it? pItem->setAmount( pickedAmount ); } } // *normally* we should exclude the dragging socket here. but it works so as well. pItem->removeFromView( true ); // Remove from spawnregion pItem->setSpawnregion( 0 ); // Remove it from the World if it is in world, otherwise remove it from it's current container if ( pItem->isInWorld() ) MapObjects::instance()->remove( pItem ); else pItem->removeFromCont( true ); // Remove eventual item-bonusses if we're unequipping something if ( pItem->container() && pItem->container()->isChar() ) { P_CHAR wearer = dynamic_cast<P_CHAR>( pItem->container() ); // resend the stat window if ( wearer && wearer->objectType() == enPlayer ) { P_PLAYER pp = dynamic_cast<P_PLAYER>( wearer ); if ( pp->socket() ) pp->socket()->sendStatWindow(); } } pChar->addItem( cBaseChar::Dragging, pItem ); if ( weight != pChar->weight() ) { socket->sendStatWindow(); } }