本文整理汇总了C++中Item::DeleteMe方法的典型用法代码示例。如果您正苦于以下问题:C++ Item::DeleteMe方法的具体用法?C++ Item::DeleteMe怎么用?C++ Item::DeleteMe使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Item
的用法示例。
在下文中一共展示了Item::DeleteMe方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: HandleQuestgiverAcceptQuestOpcode
//.........这里部分代码省略.........
{
SystemMessage("You cannot accept this quest at this time.");
return;
}
// Check the player hasn't already taken this quest, or
// it isn't available.
uint32 status = sQuestMgr.CalcQuestStatus(qst_giver, _player,qst,3, bSkipLevelCheck);
if((!sQuestMgr.IsQuestRepeatable(qst) && _player->HasFinishedQuest(qst->id)) || ( status != QMGR_QUEST_AVAILABLE && status != QMGR_QUEST_REPEATABLE && status != QMGR_QUEST_CHAT )
|| !hasquest)
{
// We've got a hacker. Disconnect them.
//sCheatLog.writefromsession(this, "tried to accept incompatible quest %u from %u.", qst->id, qst_giver->GetEntry());
//Disconnect();
return;
}
int32 log_slot = GetPlayer()->GetOpenQuestSlot();
if (log_slot == -1)
{
sQuestMgr.SendQuestLogFull(GetPlayer());
return;
}
//FIXME
/*if(Player Has Timed quest && qst->HasFlag(QUEST_FLAG_TIMED))
sQuestMgr.SendQuestInvalid(INVALID_REASON_HAVE_TIMED_QUEST);*/
if(qst->count_receiveitems || qst->srcitem)
{
uint32 slots_required = qst->count_receiveitems;
if(GetPlayer()->GetItemInterface()->CalculateFreeSlots(NULL) < slots_required)
{
GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_BAG_FULL);
sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, qst, GetPlayer());
return;
}
}
/* if(qst_giver->GetTypeId() == TYPEID_UNIT && !ScriptSystem->OnQuestRequireEvent(qst, static_cast< Creature* >( qst_giver ), _player, QUEST_EVENT_CAN_ACCEPT))
return;*/
QuestLogEntry *qle = new QuestLogEntry();
qle->Init(qst, _player, log_slot);
qle->UpdatePlayerFields();
// If the quest should give any items on begin, give them the items.
for(uint32 i = 0; i < 4; ++i)
{
if(qst->receive_items[i])
{
Item *item = objmgr.CreateItem( qst->receive_items[i], GetPlayer());
if(item == NULL)
continue;
if(!GetPlayer()->GetItemInterface()->AddItemToFreeSlot(item))
{
item->DeleteMe();
}
else
SendItemPushResult(item, false, true, false, true,
_player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(),
1);
}
}
if(qst->srcitem && qst->srcitem != qst->receive_items[0])
{
Item * item = objmgr.CreateItem( qst->srcitem, _player );
if(item)
{
item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, qst->srcitemcount ? qst->srcitemcount : 1);
if(!_player->GetItemInterface()->AddItemToFreeSlot(item))
item->DeleteMe();
}
}
// Timed quest handler.
if(qst->time > 0)
{
//Start Quest Timer Event Here
//sEventMgr.AddEvent(GetPlayer(), &Player::EventTimedQuestExpire, qst, qle, static_cast<uint32>(log_slot), EVENT_TIMED_QUEST_EXPIRE, qst->time * 1000, 1);
//uint32 qtime = static_cast<uint32>(time(NULL) + qst->time);
//GetPlayer()->SetUInt32Value(log_slot+2, qtime);
//GetPlayer()->SetUInt32Value(PLAYER_QUEST_LOG_1_01 + (log_slot * 3), qtime);
//GetPlayer()->timed_quest_slot = log_slot;
}
if(qst->count_required_item || qst_giver->GetTypeId() == TYPEID_GAMEOBJECT) // gameobject quests deactivate
GetPlayer()->UpdateNearbyGameObjects();
//ScriptSystem->OnQuestEvent(qst, static_cast< Creature* >( qst_giver ), _player, QUEST_EVENT_ON_ACCEPT);
sQuestMgr.OnQuestAccepted(_player,qst,qst_giver);
sLog.outDebug("WORLD: Added new QLE.");
sHookInterface.OnQuestAccept(_player, qst, qst_giver);
}
示例2: HandleCharterBuy
//.........这里部分代码省略.........
if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < costs[arena_type])
return; // error message needed here
ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(item_ids[arena_type]);
ASSERT(ip);
SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip);
if(res.Result == 0)
{
_player->GetItemInterface()->BuildInventoryChangeError(0, 0, INV_ERR_INVENTORY_FULL);
return;
}
error = _player->GetItemInterface()->CanReceiveItem(ip,1);
if(error)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error);
}
else
{
// Create the item and charter
Item * i = objmgr.CreateItem(item_ids[arena_type], _player);
Charter * c = objmgr.CreateCharter(_player->GetLowGUID(), (CharterTypes)arena_index);
c->GuildName = name;
c->ItemGuid = i->GetGUID();
i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1);
i->SetUInt32Value(ITEM_FIELD_FLAGS, 1);
i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, c->GetID());
i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883);
if( !_player->GetItemInterface()->AddItemToFreeSlot(i) )
{
c->Destroy();
i->DeleteMe();
return;
}
c->SaveToDB();
/*WorldPacket data(45);
BuildItemPushResult(&data, _player->GetGUID(), ITEM_PUSH_TYPE_RECEIVE, 1, item_ids[arena_type], 0);
SendPacket(&data);*/
SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1);
_player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)costs[arena_type]);
_player->m_charters[arena_index] = c;
_player->SaveToDB(false);
}
}
else
{
Guild * g = objmgr.GetGuildByGuildName(name);
Charter * c = objmgr.GetCharterByName(name, CHARTER_TYPE_GUILD);
if(g != 0 || c != 0)
{
SendNotification(_player->GetSession()->LocalizedWorldSrv(74));
return;
}
if(_player->m_charters[CHARTER_TYPE_GUILD])
{
SendNotification(_player->GetSession()->LocalizedWorldSrv(75));
return;
}
ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER);
assert(ip);
示例3: HandleCharterBuy
//.........这里部分代码省略.........
return; // error message needed here
}
ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(item_ids[arena_type]);
ASSERT(ip);
SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip);
if(res.Result == 0)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM, INV_ERR_INVENTORY_FULL);
return;
}
error = _player->GetItemInterface()->CanReceiveItem(ip,1, NULL);
if(error)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM,error);
}
else
{
// Create the item and charter
Item* i = objmgr.CreateItem(item_ids[arena_type], _player);
Charter * c = objmgr.CreateCharter(_player->GetLowGUID(), (CharterTypes)arena_index);
c->GuildName = name;
c->ItemGuid = i->GetGUID();
i->Bind(ITEM_BIND_ON_PICKUP);
i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1);
i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, c->GetID());
i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883);
if( !_player->GetItemInterface()->AddItemToFreeSlot(i) )
{
c->Destroy();
c = NULL;
i->DeleteMe();
i = NULL;
return;
}
c->SaveToDB();
SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1);
_player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)costs[arena_type]);
_player->m_playerInfo->charterId[arena_index] = c->GetID();
_player->SaveToDB(false);
}
}
else
{
if( _player->GetUInt32Value(PLAYER_FIELD_COINAGE) < 1000)
{
SendNotification("You don't have enough money.");
return;
}
if(_player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] != 0)
{
SendNotification("You already have a guild charter.");
return;
}
if(!sWorld.VerifyName(name.c_str(), name.length()))
{
SendNotification("That name is invalid or contains invalid characters.");
return;
}
Guild * g = objmgr.GetGuildByGuildName(name);
Charter * c = objmgr.GetCharterByName(name, CHARTER_TYPE_GUILD);
示例4: Finalize
//.........这里部分代码省略.........
/* item can now be looted by anyone :) */
pLoot->items.at(_slotid).passed = true;
delete this;
return;
}
pLoot->items.at(_slotid).roll = 0;
data.Initialize(SMSG_LOOT_ROLL_WON);
data << _guid << _slotid << _itemid << _randomsuffixid << _randompropertyid;
data << _player->GetGUID() << uint8(highest) << uint8(hightype);
if(_player->InGroup())
_player->GetGroup()->SendPacketToAll(&data);
else
_player->GetSession()->SendPacket(&data);
if(hightype == DISENCHANT)
{
//generate Disenchantingloot
Item * pItem = objmgr.CreateItem( itemid, _player);
lootmgr.FillItemLoot(&pItem->m_loot, pItem->GetEntry(), _player->GetTeam());
//add loot
for(std::vector<__LootItem>::iterator iter=pItem->m_loot.items.begin();iter != pItem->m_loot.items.end();iter++)
{
itemid =iter->item.itemproto->ItemId;
Item * Titem = objmgr.CreateItem( itemid, _player);
if( Titem == NULLITEM )
continue;
if( !_player->GetItemInterface()->AddItemToFreeSlot(Titem) )
{
_player->GetSession()->SendNotification("No free slots were found in your inventory, item has been mailed.");
sMailSystem.DeliverMessage(MAILTYPE_NORMAL, _player->GetGUID(), _player->GetGUID(), "Loot Roll", "Here is your reward.", 0, 0, itemid, 1, true);
}
Titem->DeleteMe();
Titem = NULLITEM;
}
pItem->DeleteMe();
pItem = NULLITEM;
// Set a looter, doesn't matter who.
pLoot->items.at(_slotid).has_looted.insert(_player->GetLowGUID());
//Send "finish" packet
data.Initialize(SMSG_LOOT_REMOVED);
data << uint8(_slotid);
Player* plr;
for(LooterSet::iterator itr = pLoot->looters.begin(); itr != pLoot->looters.end(); itr++)
{
if((plr = _player->GetMapMgr()->GetPlayer(*itr)))
plr->GetSession()->SendPacket(&data);
}
delete this; //end here and skip the rest
return;
}
ItemPrototype* it = ItemPrototypeStorage.LookupEntry(itemid);
int8 error;
if((error = _player->GetItemInterface()->CanReceiveItem(it, 1, NULL)))
{
_player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM, error);
return;
}
Item* add = _player->GetItemInterface()->FindItemLessMax(itemid, amt, false);
示例5: HandleAcceptTrade
//.........这里部分代码省略.........
else
{
if(GetPermissionCount()>0)
{
sGMLog.writefromsession(this, "traded item %s to %s", _player->mTradeItems[Index]->GetProto()->Name1, pTarget->GetName());
}
pItem = _player->m_ItemInterface->SafeRemoveAndRetreiveItemByGuid(Guid, true);
}
}
Guid = pTarget->mTradeItems[Index] ? pTarget->mTradeItems[Index]->GetGUID() : 0;
if(Guid != 0)
{
if( pTarget->mTradeItems[Index]->GetProto()->Bonding == ITEM_BIND_ON_PICKUP ||
pTarget->mTradeItems[Index]->GetProto()->Bonding >= ITEM_BIND_QUEST )
{
pTarget->mTradeItems[Index] = NULL;
}
else
{
pTarget->m_ItemInterface->SafeRemoveAndRetreiveItemByGuid(Guid, true);
}
}
}
// Dump all items back into the opposite players inventory
for(uint32 Index = 0; Index < 6; ++Index)
{
pItem = _player->mTradeItems[Index];
if( pItem != NULL )
{
pItem->SetOwner(pTarget); // crash fixed.
if( !pTarget->m_ItemInterface->AddItemToFreeSlot(pItem) )
pItem->DeleteMe();
}
pItem = pTarget->mTradeItems[Index];
if( pItem != NULL )
{
pItem->SetOwner(_player);
if( !_player->m_ItemInterface->AddItemToFreeSlot(pItem) )
pItem->DeleteMe();
}
}
// Trade Gold
if(pTarget->mTradeGold)
{
// Check they don't have more than the max gold
if(sWorld.GoldCapEnabled && (_player->GetUInt32Value(PLAYER_FIELD_COINAGE) + pTarget->mTradeGold) > sWorld.GoldLimit)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_TOO_MUCH_GOLD);
}
else
{
_player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, pTarget->mTradeGold);
pTarget->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)pTarget->mTradeGold);
}
}
if(_player->mTradeGold)
{
// Check they don't have more than the max gold
if(sWorld.GoldCapEnabled && (pTarget->GetUInt32Value(PLAYER_FIELD_COINAGE) + _player->mTradeGold) > sWorld.GoldLimit)
{
pTarget->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_TOO_MUCH_GOLD);
示例6: HandleTakeItem
void WorldSession::HandleTakeItem(WorldPacket & recv_data )
{
uint64 mailbox;
uint32 message_id;
uint32 lowguid;
vector< uint64 >::iterator itr;
recv_data >> mailbox >> message_id >> lowguid;
WorldPacket data(SMSG_SEND_MAIL_RESULT, 12);
data << message_id << uint32(MAIL_RES_ITEM_TAKEN);
MailMessage * message = _player->m_mailBox.GetMessage(message_id);
if(message == 0 || message->items.empty())
{
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
for( itr = message->items.begin( ); itr != message->items.end( ); ++itr )
{
if ( (*itr) == lowguid )
break;
}
if( itr == message->items.end( ) )
{
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
// check for cod credit
if(message->cod > 0)
{
if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < message->cod)
{
data << uint32(MAIL_ERR_NOT_ENOUGH_MONEY);
SendPacket(&data);
return;
}
}
// grab the item
Item * item = objmgr.LoadItem( *itr );
if(item == 0)
{
// doesn't exist
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
// find a free bag slot
SlotResult result = _player->GetItemInterface()->FindFreeInventorySlot(item->GetProto());
if(result.Result == 0)
{
// no free slots left!
data << uint32(MAIL_ERR_BAG_FULL);
SendPacket(&data);
item->DeleteMe();
return;
}
// all is good
// delete the item (so when its resaved it'll have an association)
item->DeleteFromDB();
// add the item to their backpack
item->m_isDirty = true;
// send complete packet
data << uint32(MAIL_OK);
data << item->GetUInt32Value(OBJECT_FIELD_GUID);
data << item->GetUInt32Value(ITEM_FIELD_STACK_COUNT);
if( !_player->GetItemInterface()->AddItemToFreeSlot(item) )
item->DeleteMe();
message->items.erase( itr );
// re-save (update the items field)
sMailSystem.SaveMessageToSQL( message);
SendPacket(&data);
if( message->cod > 0 )
{
_player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -int32(message->cod));
string subject = "COD Payment: ";
subject += message->subject;
sMailSystem.SendAutomatedMessage(NORMAL, message->player_guid, message->sender_guid, subject, "", message->cod, 0, 0, 1);
message->cod = 0;
CharacterDatabase.Execute("UPDATE mailbox SET cod = 0 WHERE message_id = %u", message->message_id);
}
//.........这里部分代码省略.........
示例7: HandleSendMail
//.........这里部分代码省略.........
}
// Check we're sending to the same faction (disable this for testing)
if (player->team != _player->GetTeam() && !interfaction)
{
SendMailError(MAIL_ERR_NOT_YOUR_ALLIANCE);
return;
}
// Check if we're sending mail to ourselves
if (strcmp(player->name, _player->GetName()) == 0 && !GetPermissionCount())
{
SendMailError(MAIL_ERR_CANNOT_SEND_TO_SELF);
return;
}
if (msg.stationery == MAIL_STATIONERY_GM && !HasGMPermissions())
{
SendMailError(MAIL_ERR_INTERNAL_ERROR);
return;
}
// Instant delivery time by default.
msg.delivery_time = (uint32)UNIXTIME;
// Set up the cost
uint32 cost = items_count ? 30 * items_count : 30; // price hardcoded in client
uint64 reqmoney = cost + money;
if (!sMailSystem.MailOption(MAIL_FLAG_DISABLE_POSTAGE_COSTS) && !(GetPermissionCount() && sMailSystem.MailOption(MAIL_FLAG_NO_COST_FOR_GM)))
{
cost += 30;
}
// check that we have enough in our backpack
if (!_player->HasGold(cost))
{
SendMailError(MAIL_ERR_NOT_ENOUGH_MONEY);
return;
}
// Check for the item, and required item.
if (!items.empty())
{
for (itr = items.begin(); itr != items.end(); ++itr)
{
pItem = *itr;
if (_player->GetItemInterface()->SafeRemoveAndRetreiveItemByGuid(pItem->GetGUID(), false) != pItem)
continue; // should never be hit.
pItem->RemoveFromWorld();
pItem->SetOwner(NULL);
pItem->SaveToDB(INVENTORY_SLOT_NOT_SET, 0, true, NULL);
msg.items.push_back(pItem->GetLowGUID());
if (GetPermissionCount() > 0)
{
/* log the message */
sGMLog.writefromsession(this, "sent mail with item entry %u to %s, with gold %u.", pItem->GetEntry(), player->name, money);
}
pItem->DeleteMe();
}
}
if (money != 0 || COD != 0 || (!items.size() && player->acct != _player->GetSession()->GetAccountId()))
{
if (!sMailSystem.MailOption(MAIL_FLAG_DISABLE_HOUR_DELAY_FOR_ITEMS))
msg.delivery_time += 3600; // 1hr
}
// take the money
_player->ModGold(-cost);
// Fill in the rest of the info
msg.player_guid = player->guid;
msg.sender_guid = _player->GetGUID();
msg.money = money;
msg.cod = COD;
msg.subject = subject;
msg.body = body;
// 30 day expiry time for unread mail
if (!sMailSystem.MailOption(MAIL_FLAG_NO_EXPIRY))
msg.expire_time = (uint32)UNIXTIME + (TIME_DAY * MAIL_DEFAULT_EXPIRATION_TIME);
else
msg.expire_time = 0;
msg.deleted_flag = false;
msg.message_type = 0;
msg.checked_flag = msg.body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY;
// Great, all our info is filled in. Now we can add it to the other players mailbox.
sMailSystem.DeliverMessage(player->guid, &msg);
// Save/Update character's gold if they've received gold that is. This prevents a rollback.
CharacterDatabase.Execute("UPDATE characters SET gold = %u WHERE guid = %u", _player->GetGold(), _player->m_playerInfo->guid);
// Success packet :)
SendMailError(MAIL_OK);
}
示例8: HandleSetTradeItem
void WorldSession::HandleSetTradeItem(WorldPacket & recv_data)
{
#ifdef FORCED_GM_TRAINEE_MODE
if( CanUseCommand('k') && !HasGMPermissions() )
{
GetPlayer()->BroadcastMessage( "You are not allowed to use this feature" );
return;
}
#endif
if(_player->mTradeTarget == 0)
{
sLog.outDebug("HandleSetTradeItem: missing trade target\n");
return;
}
if(!_player->IsInWorld())
{
sLog.outDebug("HandleSetTradeItem: not in world\n");
return;
}
CHECK_PACKET_SIZE(recv_data, 3);
uint8 TradeSlot = recv_data.contents()[1];
uint8 SourceSlot = recv_data.contents()[2];
uint8 SourceBag = recv_data.contents()[0];
Player * pTarget = _player->GetTradeTarget();
Item * pItem = _player->GetItemInterface()->GetInventoryItem(SourceBag, SourceSlot);
if( pTarget == NULL || pItem == 0 || TradeSlot >= TRADE_TOTAL_TRADE_SLOTS || ( TradeSlot < TRADE_MAX_TRADABLE_ITEMS && pItem->IsSoulbound() ) )
{
sLog.outDebug("HandleSetTradeItem: target missing or incorect item/slot. target(%u),item(%u),slot(%u))\n",pTarget != NULL,pItem != 0,TradeSlot );
return;
}
if( TradeSlot < TRADE_MAX_TRADABLE_ITEMS && pItem->IsAccountbound() )
{
PlayerInfo* pinfo = ObjectMgr::getSingleton().GetPlayerInfo(_player->mTradeTarget);
if(pinfo == NULL || GetAccountId() != pinfo->acct) // can't trade account-based items
{
sLog.outDebug("HandleSetTradeItem: item is account bound\n");
return;
}
}
/* if( pItem->IsContainer() )
{
if(_player->GetItemInterface()->IsBagSlot(SourceSlot))
return;*/
packetSMSG_TRADE_STATUS data;
memset( &data, 0, sizeof( data ) );
// data.trade_status = TRADE_STATUS_STATE_CHANGED;
// OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
// pTarget->m_session->OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
pTarget->mTradeStatus = TRADE_STATUS_STATE_CHANGED;
_player->mTradeStatus = TRADE_STATUS_STATE_CHANGED;
if( pItem->IsContainer() )
{
if( SafeContainerCast(pItem)->HasItems() )
{
_player->GetItemInterface()->BuildInventoryChangeError(pItem,0, INV_ERR_CAN_ONLY_DO_WITH_EMPTY_BAGS);
//--trade cancel
data.trade_status = TRADE_STATUS_CANCELLED;
OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
Player * plr = _player->GetTradeTarget();
if(plr)
{
if(plr->m_session && plr->m_session->GetSocket())
plr->m_session->OutPacket(SMSG_TRADE_STATUS,sizeof( packetSMSG_TRADE_STATUS ), &data);
plr->ResetTradeVariables();
}
_player->ResetTradeVariables();
sLog.outDebug("HandleSetTradeItem: Container with items cannot be traded\n");
return;
}
}
//well that covers all slots i think (MAX_TRADE_TRADABLE_ITEMS is temporal slot)
if(TradeSlot < TRADE_MAX_TRADABLE_ITEMS)
{
if(pItem->IsSoulbound())
{
sCheatLog.writefromsession(this, "tried to cheat trade a soulbound item");
sLog.outDebug("HandleSetTradeItem: Cannot trade soulbound item\n");
Item *ti = _player->GetItemInterface()->SafeRemoveAndRetreiveItemFromSlot(SourceBag, SourceSlot, false);
if( ti )
{
ti->DeleteFromDB();
ti->DeleteMe();
ti = NULL;
}
string sReason = "Soulboundtrade 1";
uint32 uBanTime = (uint32)UNIXTIME + 60*60; //60 minutes ban
//.........这里部分代码省略.........
示例9: HandleTakeItem
void WorldSession::HandleTakeItem(WorldPacket & recv_data )
{
uint64 mailbox;
uint32 message_id;
uint32 lowguid;
vector< uint64 >::iterator itr;
recv_data >> mailbox >> message_id >> lowguid;
WorldPacket data(SMSG_SEND_MAIL_RESULT, 12);
data << message_id << uint32(MAIL_RES_ITEM_TAKEN);
MailMessage * message = _player->m_mailBox->GetMessage(message_id);
if(message == 0 || message->Expired() || message->items.empty())
{
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
for( itr = message->items.begin( ); itr != message->items.end( ); itr++ )
{
if ( (*itr) == lowguid )
break;
}
if( itr == message->items.end( ) )
{
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
// check for cod credit
if(message->cod > 0)
{
if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < message->cod)
{
data << uint32(MAIL_ERR_NOT_ENOUGH_MONEY);
SendPacket(&data);
return;
}
}
// grab the item
Item* item = objmgr.LoadItem( *itr );
if(item == 0)
{
// doesn't exist
data << uint32(MAIL_ERR_INTERNAL_ERROR);
SendPacket(&data);
return;
}
// find a free bag slot
SlotResult result = _player->GetItemInterface()->FindFreeInventorySlot(item->GetProto());
if(result.Result == 0)
{
// no free slots left!
data << uint32(MAIL_ERR_BAG_FULL);
SendPacket(&data);
item->DeleteMe();
item = NULLITEM;
return;
}
item->m_isDirty = true;
if( !_player->GetItemInterface()->SafeAddItem(item, result.ContainerSlot, result.Slot) )
{
if( !_player->GetItemInterface()->AddItemToFreeSlot(item) )
{
// no free slots left!
data << uint32(MAIL_ERR_BAG_FULL);
SendPacket(&data);
item->DeleteMe();
item = NULLITEM;
return;
}
}
else // true so it waitexecute's
item->SaveToDB(result.ContainerSlot, result.Slot, true, NULL);
// send complete packet
data << uint32(MAIL_OK);
data << item->GetUInt32Value(OBJECT_FIELD_GUID);
data << item->GetUInt32Value(ITEM_FIELD_STACK_COUNT);
message->items.erase( itr );
if ((message->items.size() == 0) && (message->money == 0))
{
// mail now has a 3 day expiry time
if(!sMailSystem.MailOption(MAIL_FLAG_NO_EXPIRY))
message->expire_time = (uint32)UNIXTIME + (TIME_DAY * 3);
}
//.........这里部分代码省略.........
示例10: GivePoints
bool EyeOfTheStorm::GivePoints(uint32 team, uint32 points)
{
uint32 honor;
//printf("EOTS: Give team %u %u points.\n", team, points);
m_points[team] += points;
if( m_points[team] >= 2000 )
{
m_points[team] = 2000;
m_ended = true;
m_winningteam = team;
m_nextPvPUpdateTime = 0;
sEventMgr.RemoveEvents(this);
sEventMgr.AddEvent(((CBattleground*)this), &CBattleground::Close, EVENT_BATTLEGROUND_CLOSE, 120000, 1,0);
/* add the marks of honor to all players */
m_mainLock.Acquire();
for(uint32 i = 0; i < 2; ++i)
{
for(set<Player*>::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
{
(*itr)->Root();
if ( (*itr)==NULL )// never happen?
continue;
/* Winning team will gain 2000 / 12 = 166.6 extra honor points */
/* On weekend 2000 / 8 = 250 (guessing) */
/* Losing team will also gain the honor from already earned points */
honor = m_points[i] / extraHonorDiv;
(*itr)->m_bgScore.BonusHonor += honor;
HonorHandler::AddHonorPointsToPlayer((*itr), honor);
if(i == m_winningteam)
{
Item *item;
item = objmgr.CreateItem( 29024 , *itr);
item->SetUInt32Value(ITEM_FIELD_STACK_COUNT,3);
item->SoulBind();
if(!(*itr)->GetItemInterface()->AddItemToFreeSlot(item))
{
(*itr)->GetSession()->SendNotification("No free slots were found in your inventory!");
item->DeleteMe();
}
else
{
SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult();
(*itr)->GetSession()->SendItemPushResult(item,false,true,false,true,lr->ContainerSlot,lr->Slot,3);
}
}
else
{
Item *item;
item = objmgr.CreateItem( 29024 , *itr);
item->SetUInt32Value(ITEM_FIELD_STACK_COUNT,1);
item->SoulBind();
if(!(*itr)->GetItemInterface()->AddItemToFreeSlot(item))
{
(*itr)->GetSession()->SendNotification("No free slots were found in your inventory!");
item->DeleteMe();
}
else
{
SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult();
(*itr)->GetSession()->SendItemPushResult(item,false,true,false,true,lr->ContainerSlot,lr->Slot,1);
}
}
}
}
m_mainLock.Release();
SetWorldState( EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS + team, m_points[team] );
UpdatePvPData();
return true;
}
SetWorldState( EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS + team, m_points[team] );
return false;
}
示例11: HandleSendMail
//.........这里部分代码省略.........
return;
}
// Check stationary
if(msg.stationary != STATIONERY_GM && HasGMPermissions())
{
msg.stationary = STATIONERY_GM; // GM mail always has GM Stationary.
}
if( msg.stationary == STATIONERY_GM && !HasGMPermissions())
{
msg.stationary = STATIONERY_NORMAL; // Send stationary as normal instead.
}
// Set up the cost
int32 cost = 0;
if( !sMailSystem.MailOption( MAIL_FLAG_DISABLE_POSTAGE_COSTS ) && !( GetPermissionCount() && sMailSystem.MailOption( MAIL_FLAG_NO_COST_FOR_GM ) ) )
{
cost = 30;
}
// Check for attached money
if( msg.money > 0 )
cost += msg.money;
if( cost < 0 )
{
SendMailError(MAIL_ERR_INTERNAL_ERROR);
return;
}
// check that we have enough in our backpack
if( (int32)_player->GetUInt32Value( PLAYER_FIELD_COINAGE ) < cost )
{
SendMailError( MAIL_ERR_NOT_ENOUGH_MONEY );
return;
}
// Check we're sending to the same faction (disable this for testing)
bool interfaction = (sMailSystem.MailOption( MAIL_FLAG_CAN_SEND_TO_OPPOSITE_FACTION ) || (HasGMPermissions() && sMailSystem.MailOption( MAIL_FLAG_CAN_SEND_TO_OPPOSITE_FACTION_GM ) ));
if(!interfaction)
{
if(player->team != _player->GetTeam())
{
SendMailError( MAIL_ERR_NOT_YOUR_ALLIANCE );
return;
}
}
msg.message_id = 0;
msg.message_type = 0;
msg.copy_made = false;
msg.read_flag = false;
msg.deleted_flag = false;
msg.returned_flag = false;
msg.delivery_time = (uint32)UNIXTIME;
if(msg.money != 0 || msg.cod != 0 || !items.size() && player->acct != _player->GetSession()->GetAccountId())
{
if(!sMailSystem.MailOption(MAIL_FLAG_DISABLE_HOUR_DELAY_FOR_ITEMS))
msg.delivery_time += 3600; // +1hr
}
msg.expire_time = 0;
if(!sMailSystem.MailOption(MAIL_FLAG_NO_EXPIRY))
{
msg.expire_time = (uint32)UNIXTIME + (TIME_DAY * 30);
}
if (items.empty() && msg.money != 0 && HasGMPermissions())
sWorld.LogGM(this, "sent mail with %u gold to %s (Acct: %u, Charid: %u).", msg.money, player->name, player->acct, player->guid);
// Sending Message
// take the money
_player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -cost);
// Check for the item, and required item.
if( !items.empty( ) )
{
for( itr = items.begin(); itr != items.end(); itr++ )
{
pItem = *itr;
if( _player->GetItemInterface()->SafeRemoveAndRetreiveItemByGuid(pItem->GetGUID(), false) != pItem )
continue; // should never be hit.
pItem->RemoveFromWorld();
pItem->SetOwner( NULLPLR );
pItem->SaveToDB( INVENTORY_SLOT_NOT_SET, 0, true, NULL );
msg.items.push_back( pItem->GetUInt32Value(OBJECT_FIELD_GUID) );
if( HasGMPermissions() )
sWorld.LogGM(this, "sent mail with item entry %u to %s, with gold %u.", pItem->GetEntry(), player->name, msg.money);
pItem->DeleteMe();
pItem = NULLITEM;
}
}
// Great, all our info is filled in. Now we can add it to the other players mailbox.
sMailSystem.DeliverMessage(&msg);
// Success packet :)
SendMailError(MAIL_OK);
}
示例12: AddMessageToListingPacket
bool Mailbox::AddMessageToListingPacket(WorldPacket& data,MailMessage *msg)
{
uint8 i = 0;
uint32 j;
size_t pos;
vector<uint64>::iterator itr;
Item* pItem;
// add stuff
if(msg->deleted_flag || msg->Expired() || (uint32)UNIXTIME < msg->delivery_time)
return false;
uint8 guidsize;
if( msg->message_type )
guidsize = 4;
else
guidsize = 8;
size_t msize = 2 + 4 + 1 + guidsize + 7 * 4 + ( msg->subject.size() + 1 ) + ( msg->body.size() + 1 ) + 1 + ( msg->items.size() * ( 1 + 2*4 + 7 * ( 3*4 ) + 6*4 + 1 ) );
data << uint16(msize);
data << msg->message_id;
data << uint8(msg->message_type);
if(msg->message_type)
data << uint32(msg->sender_guid);
else
data << msg->sender_guid;
data << msg->cod;
data << uint32(0);
data << msg->stationary;
data << msg->money; // money
data << uint32(0x10);
data << float((msg->expire_time - uint32(UNIXTIME)) / 86400.0f);
data << uint32( 0 ); // mail template
data << msg->subject;
data << msg->body; // subjectbody
pos = data.wpos();
data << uint8(0); // item count
if( !msg->items.empty( ) )
{
for( itr = msg->items.begin( ); itr != msg->items.end( ); itr++ )
{
pItem = objmgr.LoadItem( *itr );
if( pItem == NULL )
continue;
data << uint8(i++);
data << pItem->GetLowGUID();
data << pItem->GetEntry();
for( j = 0; j < 7; ++j )
{
data << pItem->GetUInt32Value( ITEM_FIELD_ENCHANTMENT_1_1 + ( j * 3 ) );
data << pItem->GetUInt32Value( (ITEM_FIELD_ENCHANTMENT_1_1 + 1) + ( j * 3 ) );
data << pItem->GetUInt32Value( ITEM_FIELD_ENCHANTMENT_1_3 + ( j * 3 ) );
}
data << pItem->GetUInt32Value( ITEM_FIELD_RANDOM_PROPERTIES_ID );
if( ( (int32)pItem->GetUInt32Value( ITEM_FIELD_RANDOM_PROPERTIES_ID ) ) < 0 )
data << pItem->GetItemRandomSuffixFactor();
else
data << uint32( 0 );
data << uint32( pItem->GetUInt32Value(ITEM_FIELD_STACK_COUNT) );
data << uint32( pItem->GetChargesLeft() );
data << pItem->GetUInt32Value( ITEM_FIELD_MAXDURABILITY );
data << pItem->GetUInt32Value( ITEM_FIELD_DURABILITY );
data << uint8(0);
pItem->DeleteMe();
pItem = NULLITEM;
}
data.put< uint8 >( pos, i );
}
return true;
}
示例13: Finalize
//.........这里部分代码省略.........
while(_player == NULL && pitr != m_passRolls.end())
_player = _mgr->GetPlayer((*(pitr++)));
if(_player != NULL)
{
if(_player->InGroup())
_player->GetGroup()->SendPacketToAll(&data);
else
_player->GetSession()->SendPacket(&data);
}
/* item can now be looted by anyone :) */
pLoot->items.at(_slotid).passed = true;
delete this;
return;
}
pLoot->items.at(_slotid).roll = 0;
data.Initialize(SMSG_LOOT_ROLL_WON);
data << _guid << _slotid << _itemid << _randomsuffixid << _randompropertyid;
data << _player->GetGUID() << uint8(highest) << uint8(hightype);
if(_player->InGroup())
_player->GetGroup()->SendPacketToAll(&data);
else
_player->GetSession()->SendPacket(&data);
ItemPrototype* it = ItemPrototypeStorage.LookupEntry(itemid);
int8 error;
if((error = _player->GetItemInterface()->CanReceiveItem(it, 1)) != 0)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, error);
return;
}
Item* add = _player->GetItemInterface()->FindItemLessMax(itemid, amt, false);
if(!add)
{
SlotResult slotresult = _player->GetItemInterface()->FindFreeInventorySlot(it);
if(!slotresult.Result)
{
_player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_INVENTORY_FULL);
return;
}
LOG_DEBUG("AutoLootItem MISC");
Item* item = objmgr.CreateItem(itemid, _player);
if(item == NULL)
return;
item->SetStackCount(amt);
if(pLoot->items.at(_slotid).iRandomProperty != NULL)
{
item->SetItemRandomPropertyId(pLoot->items.at(_slotid).iRandomProperty->ID);
item->ApplyRandomProperties(false);
}
else if(pLoot->items.at(_slotid).iRandomSuffix != NULL)
{
item->SetRandomSuffix(pLoot->items.at(_slotid).iRandomSuffix->id);
item->ApplyRandomProperties(false);
}
if(_player->GetItemInterface()->SafeAddItem(item, slotresult.ContainerSlot, slotresult.Slot))
{
_player->SendItemPushResult(false, true, true, true, slotresult.ContainerSlot, slotresult.Slot, 1, item->GetEntry(), item->GetItemRandomSuffixFactor(), item->GetItemRandomPropertyId(), item->GetStackCount());
sQuestMgr.OnPlayerItemPickup(_player, item);
#ifdef ENABLE_ACHIEVEMENTS
_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->GetEntry(), 1, 0);
#endif
}
else
item->DeleteMe();
}
else
{
add->SetStackCount(add->GetStackCount() + amt);
add->m_isDirty = true;
sQuestMgr.OnPlayerItemPickup(_player, add);
_player->SendItemPushResult(false, true, true, false, (uint8)_player->GetItemInterface()->GetBagSlotByGuid(add->GetGUID()), 0xFFFFFFFF, 1, add->GetEntry(), add->GetItemRandomSuffixFactor(), add->GetItemRandomPropertyId(), add->GetStackCount());
#ifdef ENABLE_ACHIEVEMENTS
_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, add->GetEntry(), 1, 0);
#endif
}
pLoot->items.at(_slotid).iItemsCount = 0;
// this gets sent to all looters
data.Initialize(SMSG_LOOT_REMOVED);
data << uint8(_slotid);
Player* plr;
for(LooterSet::iterator itr = pLoot->looters.begin(); itr != pLoot->looters.end(); ++itr)
{
if((plr = _player->GetMapMgr()->GetPlayer(*itr)) != 0)
plr->GetSession()->SendPacket(&data);
}
delete this;
}
示例14: HandleQuestStartCommand
bool ChatHandler::HandleQuestStartCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
Player *plr = getSelectedChar(m_session, true);
if(!plr)
{
plr = m_session->GetPlayer();
SystemMessage(m_session, "Auto-targeting self.");
}
uint32 quest_id = atol(args);
if(quest_id== 0)
{
quest_id = GetQuestIDFromLink(args);
if(quest_id== 0)
return false;
}
std::string recout = "|cff00ff00";
Quest * qst = QuestStorage.LookupEntry(quest_id);
if(qst)
{
if (plr->HasFinishedQuest(quest_id))
recout += "Player has already completed that quest.";
else
{
QuestLogEntry * IsPlrOnQuest = plr->GetQuestLogForEntry(quest_id);
if (IsPlrOnQuest)
recout += "Player is currently on that quest.";
else
{
int32 open_slot = plr->GetOpenQuestSlot();
if (open_slot == -1)
{
sQuestMgr.SendQuestLogFull(plr);
recout += "Player's quest log is full.";
}
else
{
sGMLog.writefromsession( m_session, "started quest %u [%s] for player %s", qst->id, qst->title, plr->GetName() );
QuestLogEntry *qle = new QuestLogEntry();
qle->Init(qst, plr, (uint32)open_slot);
qle->UpdatePlayerFields();
// If the quest should give any items on begin, give them the items.
for(uint32 i = 0; i < 4; ++i)
{
if(qst->receive_items[i])
{
Item *item = objmgr.CreateItem( qst->receive_items[i], plr);
if(item== NULL)
return false;
if(!plr->GetItemInterface()->AddItemToFreeSlot(item))
item->DeleteMe();
}
}
if(qst->srcitem && qst->srcitem != qst->receive_items[0])
{
Item * item = objmgr.CreateItem( qst->srcitem, plr);
if(item)
{
item->SetStackCount( qst->srcitemcount ? qst->srcitemcount : 1);
if(!plr->GetItemInterface()->AddItemToFreeSlot(item))
item->DeleteMe();
}
}
//if(qst->count_required_item || qst_giver->GetTypeId() == TYPEID_GAMEOBJECT) // gameobject quests deactivate
// plr->UpdateNearbyGameObjects();
//ScriptSystem->OnQuestEvent(qst, static_cast< Creature* >( qst_giver ), _player, QUEST_EVENT_ON_ACCEPT);
sHookInterface.OnQuestAccept( plr, qst, NULL );
recout += "Quest has been added to the player's quest log.";
}
}
}
}
else
{
recout += "Quest Id [";
recout += args;
recout += "] was not found and unable to add it to the player's quest log.";
}
recout += "\n\n";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
示例15: GivePoints
bool EyeOfTheStorm::GivePoints(uint32 team, uint32 points)
{
//printf("EOTS: Give team %u %u points.\n", team, points);
m_points[team] += points;
if((m_points[team] - m_lastHonorGainPoints[team]) >= resourcesToGainBH)
{
uint32 honorToAdd = m_honorPerKill;
m_mainLock.Acquire();
for(set<Player*>::iterator itr = m_players[team].begin(); itr != m_players[team].end(); ++itr)
{
(*itr)->m_bgScore.BonusHonor += honorToAdd;
HonorHandler::AddHonorPointsToPlayer((*itr), honorToAdd);
}
UpdatePvPData();
m_mainLock.Release();
m_lastHonorGainPoints[team] += resourcesToGainBH;
}
if( m_points[team] >= 2000 )
{
m_points[team] = 2000;
m_ended = true;
m_winningteam = static_cast<uint8>( team );
m_nextPvPUpdateTime = 0;
sEventMgr.RemoveEvents(this);
sEventMgr.AddEvent(((CBattleground*)this), &CBattleground::Close, EVENT_BATTLEGROUND_CLOSE, 120000, 1,0);
/* add the marks of honor to all players */
uint32 lostHonorToAdd = m_honorPerKill;
uint32 winHonorToAdd = 2 * lostHonorToAdd;
m_mainLock.Acquire();
for(uint32 i = 0; i < 2; ++i)
{
for(set<Player*>::iterator itr = m_players[i].begin(); itr != m_players[i].end(); ++itr)
{
(*itr)->Root();
if ( (*itr)== NULL )
continue;
if(i == m_winningteam)
{
(*itr)->m_bgScore.BonusHonor += winHonorToAdd;
HonorHandler::AddHonorPointsToPlayer((*itr), winHonorToAdd);
Item *item = objmgr.CreateItem( 29024 , *itr );
if( item != NULL )
{
item->SetUInt32Value( ITEM_FIELD_STACK_COUNT, 3 );
item->SoulBind();
if( !(*itr)->GetItemInterface()->AddItemToFreeSlot( item ) )
{
(*itr)->GetSession()->SendNotification("No free slots were found in your inventory!");
item->DeleteMe();
}
else
{
(*itr)->m_bgScore.BonusHonor += lostHonorToAdd;
HonorHandler::AddHonorPointsToPlayer( (*itr), lostHonorToAdd );
SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult();
(*itr)->GetSession()->SendItemPushResult( item, false, true, false, true, lr->ContainerSlot, lr->Slot, 3 );
}
}
if(i && (*itr)->GetQuestLogForEntry(11341))
(*itr)->GetQuestLogForEntry(11341)->SendQuestComplete();
else if((*itr)->GetQuestLogForEntry(11337))
(*itr)->GetQuestLogForEntry(11337)->SendQuestComplete();
}
else
{
Item *item = objmgr.CreateItem( 29024 , *itr );
if( item != NULL )
{
item->SetUInt32Value( ITEM_FIELD_STACK_COUNT, 1 );
item->SoulBind();
if( !(*itr)->GetItemInterface()->AddItemToFreeSlot( item ) )
{
(*itr)->GetSession()->SendNotification("No free slots were found in your inventory!");
item->DeleteMe();
}
else
{
SlotResult *lr = (*itr)->GetItemInterface()->LastSearchResult();
(*itr)->GetSession()->SendItemPushResult( item, false, true, false, true, lr->ContainerSlot, lr->Slot, 1 );
}
}
}
}
}
m_mainLock.Release();
SetWorldState( EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS + team, m_points[team] );
UpdatePvPData();
return true;
}
SetWorldState( EOTS_WORLDSTATE_ALLIANCE_VICTORYPOINTS + team, m_points[team] );
//.........这里部分代码省略.........