//---------------------------------------------------------------------------- void CR2GiveItem::giveItemGranted( TDataSetRow creatureRowId, uint32 actionId ) { TPendingRequest::iterator it = _PendingRequest.find( creatureRowId ); if( it != _PendingRequest.end() ) { TCreatureItemRequest &vec = (*it).second; for( uint32 i = 0; i < vec.size(); ++ i) { if( vec[i].ActionId == actionId ) { CCharacter *c = PlayerManager.getChar( vec[i].CharacterRowId ); nlassert(c); CCreature *e = CreatureManager.getCreature(creatureRowId); CMirrorPropValueRO<TYPE_SHEET> sheetInMirror( TheDataset, creatureRowId, DSPropertySHEET ); NLMISC::CSheetId sheetId(sheetInMirror()); const CStaticCreatures *clientCreatureForm = CSheets::getCreaturesForm( sheetId ); if(e == NULL) return; sint32 dx = c->getX() - e->getX(); sint32 dy = c->getY() - e->getY(); sint32 sqrDist = dx*dx + dy*dy; sint32 squareCreatureColRadius = 0; if(clientCreatureForm != 0) { squareCreatureColRadius = (sint32)(1000.0f * max(clientCreatureForm->getColRadius(), max(clientCreatureForm->getColWidth(),clientCreatureForm->getColLength()))); squareCreatureColRadius= squareCreatureColRadius * squareCreatureColRadius; } if (sqrDist > (MaxTalkingDistSquare * 1000 * 1000 + squareCreatureColRadius)) { CCharacter::sendDynamicSystemMessage( vec[i].CharacterRowId, "BS_TARGET_TOO_FAR"); return; } CUserEventMsg eventMsg; eventMsg.InstanceNumber = vec[i].InstanceId; eventMsg.GrpAlias = vec[i].GroupAlias; // add the character and npc as parameter of the event eventMsg.Params.push_back(c->getId().toString()); eventMsg.Params.push_back(e->getId().toString()); if( vec[i].IsGiveItem ) { if( _ValidateGiveItemRequest( vec[i] ) ) { CR2MissionItem::getInstance().destroyMissionItem( c->getId(), vec[i].ItemsRequest ); eventMsg.EventId = 3; CWorldInstances::instance().msgToAIInstance(eventMsg.InstanceNumber, eventMsg); } } else { CR2MissionItem::getInstance().giveMissionItem( c->getId(), c->currentSessionId(), vec[i].ItemsRequest ); eventMsg.EventId = 1; CWorldInstances::instance().msgToAIInstance(eventMsg.InstanceNumber, eventMsg); } vec[i] = vec.back(); vec.pop_back(); _SetClientDBAll( c, vec ); if( vec.size() == 0 ) _PendingRequest.erase( it ); return; } } } }