|
|
发表于 2018-9-4 23:50:49
|
显示全部楼层
大神能不能详细解说下这段代码怎么加入自己的源码内
//PVP杀人越货
class PlayerKillItem : public PlayerScript
{
public:
PlayerKillItem() : PlayerScript("PlayerKillItem") { }
void OnPVPKill(Player* killer, Player* killed)
{
if (!killer->IsInWorld() || !killed->IsInWorld())
return;
//自杀无效
if (killer->GetGUID() == killed->GetGUID())
return;
//不在指定的地图区域无效--积雪平原
if (killer->GetAreaId() != 268 || killed->GetAreaId() != 268)
return;
//炸尸无效
if (killed->IsAlive())
return;
//定义一个容器用来装物品数据
std::vector<Item*> m_itemlist;
//将数据存入容器 身上的装备
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (Item* pItem = killed->GetItemByPos(INVENTORY_SLOT_BAG_0, i))
m_itemlist.push_back(pItem);
//空
if (m_itemlist.empty())
{
ChatHandler(killer->GetSession()).PSendSysMessage("So easy...你击杀的玩家毫无战斗力.对方没有穿装备");
killer->GetSession()->SendAreaTriggerMessage("So easy...你击杀的玩家毫无战斗力.对方没有穿装备");
return;
}
//取一个随机值 第一个位置0起 否则找不到指针很严重...
uint8 n = urand(0, m_itemlist.size() - 1);
//获取到随机的装备并保证其存在
if (Item* kItem = m_itemlist[n])
{
//直接将装备转移 可以继承附魔及其他 只有击杀者获得
kItem->SetUInt64Value(ITEM_FIELD_OWNER, killer->GetGUID());
killed->MoveItemFromInventory(INVENTORY_SLOT_BAG_0, kItem->GetSlot(), true);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
kItem->DeleteFromInventoryDB(trans);
kItem->SaveToDB(trans);
killed->SaveInventoryAndGoldToDB(trans);
ItemPosCountVec dest;
uint8 Msg = killer->CanStoreItem(NULL_BAG, NULL_SLOT, dest, kItem, false);
if (Msg == EQUIP_ERR_OK)
killer->StoreItem(dest, kItem, true);
else
MailDraft("击杀爆装备奖励补发", "击杀爆装备奖励补发").AddItem(kItem).SendMailTo(trans, killer, MailSender(killed, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED);
CharacterDatabase.CommitTransaction(trans);
//插入掉落的新物品ID到箱子里 不能继承附魔及其他 击杀者或其他玩家可以开箱子获得
/*
//箱子ID
uint32 Go = 500001;
//持续时间 秒
uint32 DespawnTime = 20;
if (GameObject* go = killer->SummonGameObject(Go, killed->GetPositionX(), killed->GetPositionY(), killed->GetPositionZ(), killed->GetOrientation(), 0, 0, 0, 0, DespawnTime, false))
{
go->SetOwnerGUID(NULL);
go->loot.clear();
LootStoreItem storeItem = LootStoreItem(kItem->GetEntry(), 100, LOOT_MODE_DEFAULT, 0, 1, 1);
go->loot.AddItem(storeItem);
killed->DestroyItem(INVENTORY_SLOT_BAG_0, kItem->GetSlot(), true);
}
*/
ItemTemplate const* pProto = kItem->GetTemplate();
ChatHandler(killer->GetSession()).PSendSysMessage("恭喜你英勇杀敌.爆了 |Hplayer:%s|h[%s]|h 的装备 [%s] 请查看背包或邮箱", killed->GetName().c_str(), killed->GetName().c_str(), pProto->Name1.c_str());
}
m_itemlist.clear();
}
}; |
|