void WorldSession::HandlePetAction(WorldPacket & recv_data) { if(!_player->IsInWorld()) return; WorldPacket data; uint64 petGuid = 0; uint16 misc = 0; uint16 action = 0; uint64 targetguid = 0; recv_data >> petGuid >> misc >> action; //recv_data.hexlike(); //printf("Pet_Action: 0x%.4X 0x%.4X\n", misc, action); if(UINT32_LOPART(GUID_HIPART(petGuid)) == HIGHGUID_UNIT) { Creature *pCharm = GetPlayer()->GetMapMgr()->GetCreature(petGuid); if(!pCharm) return; // must be a mind controled creature.. if(action == PET_ACTION_ACTION) { recv_data >> targetguid; switch(misc) { case PET_ACTION_ATTACK: { if(!sEventMgr.HasEvent(_player, EVENT_PLAYER_CHARM_ATTACK)) { uint32 timer = pCharm->GetUInt32Value(UNIT_FIELD_BASEATTACKTIME); if(!timer) timer = 2000; sEventMgr.AddEvent(_player, &Player::_EventCharmAttack, EVENT_PLAYER_CHARM_ATTACK, timer, 0); _player->_EventCharmAttack(); } }break; } }
void WorldSession::HandleQuestGiverQueryQuestOpcode( WorldPacket & recv_data ) { sLog.outDebug( "WORLD: Recieved CMSG_QUESTGIVER_QUERY_QUEST." ); WorldPacket data; uint64 guid; uint32 quest_id; uint32 status = 0; recv_data >> guid; recv_data >> quest_id; Object *qst_giver = NULL; bool bValid = false; Quest* qst = sQuestMgr.FindQuest(quest_id); if (!qst) { sLog.outDebug("WORLD: Invalid quest ID."); return; } if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_UNIT) { Creature *quest_giver = sObjHolder.GetObject<Creature>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, quest_giver->GetQuestRelation(qst->id)); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_GAMEOBJECT) { GameObject *quest_giver = sObjHolder.GetObject<GameObject>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, quest_giver->GetQuestRelation(qst->id)); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_ITEM) { Item *quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = true; status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, 1); } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } /*if (!qst_giver->FindQuest(quest_id, QUESTGIVER_QUEST_START | QUESTGIVER_QUEST_END)) { sLog.outDebug("WORLD: QuestGiver doesn't have that quest."); return; }*/ // bleh.. not needed.. maybe for antihack later on would be a good idea though if ((status == QMGR_QUEST_AVAILABLE) || (status == QMGR_QUEST_REPEATABLE)) { sQuestMgr.BuildQuestDetails(&data, qst,qst_giver,1); // 0 because we want goodbye to function SendPacket(&data); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS." ); } /*else if (status == QMGR_QUEST_FINISHED) { sQuestMgr.BuildOfferReward(&data, qst, qst_giver, 1); SendPacket(&data); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD." ); }*/ else if (status == QMGR_QUEST_NOT_FINISHED || status == QMGR_QUEST_FINISHED) { sQuestMgr.BuildRequestItems(&data, qst, qst_giver, 1); SendPacket(&data); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } }
void WorldSession::HandleQuestgiverCompleteQuestOpcode( WorldPacket & recvPacket ) { sLog.outDebug( "WORLD: Recieved CMSG_QUESTGIVER_COMPLETE_QUEST." ); WorldPacket data; uint64 guid; uint32 quest_id; recvPacket >> guid; recvPacket >> quest_id; bool bValid = false; Quest *qst = NULL; Object *qst_giver = NULL; uint32 status = 0; if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_UNIT) { Creature *quest_giver = sObjHolder.GetObject<Creature>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_START); if(!qst) sQuestMgr.FindQuest(quest_id); if(!qst) { sLog.outError("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, quest_giver->GetQuestRelation(qst->id)); } } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_GAMEOBJECT) { GameObject *quest_giver = sObjHolder.GetObject<GameObject>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; // oops.. bValid = quest_giver->isQuestGiver(); if(bValid) { qst = quest_giver->FindQuest(quest_id, QUESTGIVER_QUEST_START); if(!qst) sQuestMgr.FindQuest(quest_id); if(!qst) { sLog.outError("WARNING: Cannot complete quest, as it doesnt exist."); return; } status = sQuestMgr.CalcQuestStatus(qst_giver, GetPlayer(), qst, quest_giver->GetQuestRelation(qst->id)); } } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } if (status == QMGR_QUEST_NOT_FINISHED) { sQuestMgr.BuildRequestItems(&data, qst, qst_giver, 1); SendPacket(&data); sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS." ); } }
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPacket& recvPacket) { sLog.outDebug( "WORLD: Recieved CMSG_QUESTGIVER_CHOOSE_REWARD." ); WorldPacket data; uint64 guid; uint32 quest_id; uint32 reward_slot; recvPacket >> guid; recvPacket >> quest_id; recvPacket >> reward_slot; bool bValid = false; Quest *qst = NULL; Object *qst_giver = NULL; if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_UNIT) { Creature *quest_giver = sObjHolder.GetObject<Creature>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_GAMEOBJECT) { GameObject *quest_giver = sObjHolder.GetObject<GameObject>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } //FIXME: Some Quest givers talk in the end of the quest. // qst_giver->SendChatMessage(CHAT_MSG_MONSTER_SAY,LANG_UNIVERSAL,qst->GetQuestEndMessage().c_str()); QuestLogEntry *qle = _player->GetQuestLogForEntry(quest_id); if (!qle) { sLog.outDebug("WORLD: QuestLogEntry not found."); return; } if (!qle->CanBeFinished()) { sLog.outDebug("WORLD: Quest not finished."); return; } // remove icon if(qst_giver->GetTypeId() == TYPEID_UNIT) { qst_giver->BuildFieldUpdatePacket(GetPlayer(), UNIT_DYNAMIC_FLAGS, qst_giver->GetUInt32Value(UNIT_DYNAMIC_FLAGS)); } //check for room in inventory for all items sQuestMgr.OnQuestFinished(GetPlayer(), qst, qst_giver, reward_slot); //if(qst_giver->GetTypeId() == TYPEID_UNIT) qst->LUA_SendEvent(((Creature*)qst_giver),GetPlayer(),ON_QUEST_COMPLETEQUEST); if(qst->next_quest_id) { data.Initialize(CMSG_QUESTGIVER_QUERY_QUEST); data << guid; data << qst->next_quest_id; HandleQuestGiverQueryQuestOpcode(data); } if(qst->time > 0) { GetPlayer()->timed_quest_slot = 0; } }
void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data ) { sLog.outDebug( "WORLD: Recieved CMSG_QUESTGIVER_ACCEPT_QUEST" ); WorldPacket data; uint64 guid; uint32 quest_id; recv_data >> guid; recv_data >> quest_id; bool bValid = false; bool hasquest = true; Quest *qst = NULL; Object *qst_giver = NULL; if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_UNIT) { Creature *quest_giver = sObjHolder.GetObject<Creature>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); hasquest = quest_giver->HasQuest(quest_id, 1); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_GAMEOBJECT) { GameObject *quest_giver = sObjHolder.GetObject<GameObject>(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = quest_giver->isQuestGiver(); if(bValid) qst = sQuestMgr.FindQuest(quest_id); } else if(UINT32_LOPART(GUID_HIPART(guid))==HIGHGUID_ITEM) { Item *quest_giver = GetPlayer()->GetItemInterface()->GetItemByGUID(guid); if(quest_giver) qst_giver = (Object*)quest_giver; else return; bValid = true; qst = sQuestMgr.FindQuest(quest_id); } if (!qst_giver) { sLog.outDebug("WORLD: Invalid questgiver GUID."); return; } if (!bValid || qst == NULL) { sLog.outDebug("WORLD: Creature is not a questgiver."); return; } if(_player->GetQuestLogForEntry(qst->id)) return; // Check the player hasn't already taken this quest, or // it isn't available. uint32 status = sQuestMgr.CalcStatus(qst_giver, _player); if((!sQuestMgr.IsQuestRepeatable(qst) && _player->HasFinishedQuest(qst->id)) || ( status != QMGR_QUEST_AVAILABLE && status != QMGR_QUEST_REPEATABLE ) || !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) { if(GetPlayer()->GetItemInterface()->CalculateFreeSlots(NULL) < qst->count_receiveitems) { GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_BAG_FULL); sQuestMgr.SendQuestFailed(FAILED_REASON_INV_FULL, GetPlayer()); 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(!GetPlayer()->GetItemInterface()->AddItemToFreeSlot(item)) { delete item; } } } // 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()->timed_quest_slot = (log_slot - (PLAYER_QUEST_LOG_1_1) / 3); } if(qst->count_required_item || qst_giver->GetTypeId() == TYPEID_GAMEOBJECT) // gameobject quests deactivate GetPlayer()->UpdateNearbyGameObjects(); sLog.outDebug("WORLD: Added new QLE."); }
void WorldSession::HandleLootReleaseOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) return; uint64 guid; recv_data >> guid; WorldPacket data(SMSG_LOOT_RELEASE_RESPONSE, 9); data << guid << uint8( 1 ); SendPacket( &data ); _player->SetLootGUID(0); _player->RemoveFlag(UNIT_FIELD_FLAGS, U_FIELD_ANIMATION_LOOTING); _player->m_currentLoot = 0; if(UINT32_LOPART(GUID_HIPART(guid)) == HIGHGUID_UNIT) { Creature* pCreature = _player->GetMapMgr()->GetCreature(guid); if(!pCreature) return; // remove from looter set pCreature->loot.looters.erase(_player->GetGUID()); if(!pCreature->loot.gold) { for(std::vector<__LootItem>::iterator i=pCreature->loot.items.begin();i!=pCreature->loot.items.end();i++) if(i->iItemsCount) { ItemPrototype *proto=ItemPrototypeStorage.LookupEntry(i->item.itemid); if(proto->Class != 12) return; if(_player->HasQuestForItem(i->item.itemid)) return; } pCreature->BuildFieldUpdatePacket(_player, UNIT_DYNAMIC_FLAGS, 0); if(!pCreature->Skinned) { if(lootmgr.IsSkinnable(pCreature->GetEntry())) { pCreature->BuildFieldUpdatePacket(_player, UNIT_FIELD_FLAGS, U_FIELD_FLAG_SKINNABLE); } } } } else if(UINT32_LOPART(GUID_HIPART(guid)) == HIGHGUID_GAMEOBJECT) { GameObject* pGO = _player->GetMapMgr()->GetGameObject(guid); if(!pGO) return; pGO->loot.looters.erase(_player->GetGUID()); //GO MUST DISAPPEAR AFTER LOOTING, //FIX ME: respawn time of GO must be added,15 minutes by default //if this is not fishing bobber despawn it if(pGO->GetUInt32Value(GAMEOBJECT_TYPE_ID)==GAMEOBJECT_TYPE_FISHINGNODE) { if(pGO->IsInWorld()) { pGO->RemoveFromWorld(); } delete pGO; } else { uint32 DespawnTime = 0; if(sQuestMgr.GetGameObjectLootQuest(pGO->GetEntry())) DespawnTime = 120000; // 5 min for quest GO, else { DespawnTime = 900000; // 15 for else } pGO->Despawn(DespawnTime); } } else if(UINT32_LOPART(GUID_HIPART(guid)) == HIGHGUID_CORPSE) { Corpse *pCorpse = objmgr.GetCorpse(guid); if(pCorpse) pCorpse->SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, 0); } else if(UINT32_LOPART(GUID_HIPART(guid)) == HIGHGUID_PLAYER) { Player *plr = objmgr.GetPlayer(guid); if(plr) { plr->bShouldHaveLootableOnCorpse = false; plr->RemoveFlag(UNIT_DYNAMIC_FLAGS, U_DYN_FLAG_LOOTABLE); } } else if(UINT32_LOPART(GUID_HIPART(guid))) { // suicide! _player->GetItemInterface()->SafeFullRemoveItemByGuid(guid); } }
void WorldSession::HandleAutostoreLootItemOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) return; // uint8 slot = 0; uint32 itemid = 0; uint32 amt = 1; uint8 lootSlot = 0; uint8 error = 0; SlotResult slotresult; Item *add; Loot *pLoot = NULL; if(_player->isCasting()) _player->InterruptSpell(); GameObject * pGO = NULL; Creature * pCreature = NULL; if(UINT32_LOPART(GUID_HIPART(GetPlayer()->GetLootGUID())) == HIGHGUID_UNIT) { pCreature = _player->GetMapMgr()->GetCreature((uint32)GetPlayer()->GetLootGUID()); if (!pCreature)return; pLoot=&pCreature->loot; } else if(UINT32_LOPART(GUID_HIPART(_player->GetLootGUID())) == HIGHGUID_GAMEOBJECT) { pGO = _player->GetMapMgr()->GetGameObject((uint32)GetPlayer()->GetLootGUID()); if(!pGO)return; pLoot=&pGO->loot; }else if( (UINT32_LOPART(GUID_HIPART(_player->GetLootGUID())) == HIGHGUID_ITEM) ) { Item *pItem = _player->GetItemInterface()->GetItemByGUID(_player->GetLootGUID()); if(!pItem) return; pLoot = pItem->loot; } if(!pLoot) return; recv_data >> lootSlot; if (lootSlot >= pLoot->items.size()) { sLog.outDebug("AutoLootItem: Player %s might be using a hack! (slot %d, size %d)", GetPlayer()->GetName(), lootSlot, pLoot->items.size()); return; } amt = pLoot->items.at(lootSlot).iItemsCount; if (!amt)//Test for party loot { GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL,INV_ERR_ALREADY_LOOTED); return; } itemid = pLoot->items.at(lootSlot).item.itemid; ItemPrototype* it = ItemPrototypeStorage.LookupEntry(itemid); if((error = _player->GetItemInterface()->CanReceiveItem(it, 1))) { _player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, error); return; } if(pGO) CALL_GO_SCRIPT_EVENT(pGO, OnLootTaken)(_player, it); else if(pCreature) CALL_SCRIPT_EVENT(pCreature, OnLootTaken)(_player, it); add = GetPlayer()->GetItemInterface()->FindItemLessMax(itemid, amt, false); sHookInterface.OnLoot(_player, pCreature, 0, itemid); if (!add) { slotresult = GetPlayer()->GetItemInterface()->FindFreeInventorySlot(it); if(!slotresult.Result) { GetPlayer()->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_INVENTORY_FULL); return; } sLog.outDebug("AutoLootItem MISC"); Item *item = objmgr.CreateItem( itemid, GetPlayer()); item->SetUInt32Value(ITEM_FIELD_STACK_COUNT,amt); uint32 rndprop=pLoot->items.at(lootSlot).iRandomProperty; if(rndprop) item->SetUInt32Value(ITEM_FIELD_RANDOM_PROPERTIES_ID,rndprop); item->ApplyRandomProperties(); GetPlayer()->GetItemInterface()->SafeAddItem(item,slotresult.ContainerSlot, slotresult.Slot); if (it->Class == 12) // Quest item sQuestMgr.OnPlayerItemPickup(GetPlayer(),item); } else { add->SetCount(add->GetUInt32Value(ITEM_FIELD_STACK_COUNT) + amt); add->m_isDirty = true; if (it->Class == 12) // Quest item sQuestMgr.OnPlayerItemPickup(GetPlayer(),add); } pLoot->items.at(lootSlot).iItemsCount=0; // this gets sent to all looters WorldPacket data(1); data.SetOpcode(SMSG_LOOT_REMOVED); data << lootSlot; Player * plr; for(LooterSet::iterator itr = pLoot->looters.begin(); itr != pLoot->looters.end(); ++itr) { if((plr = _player->GetMapMgr()->GetPlayer(*itr))) plr->GetSession()->SendPacket(&data); } WorldPacket idata; if(it->Class == ITEM_CLASS_QUEST) { uint32 pcount = _player->GetItemInterface()->GetItemCount(it->ItemId, true); BuildItemPushResult(&idata, _player->GetGUID(), ITEM_PUSH_TYPE_LOOT, amt, itemid, pLoot->items.at(lootSlot).iRandomProperty,0xFF,0,0xFFFFFFFF,pcount); } else BuildItemPushResult(&idata, _player->GetGUID(), ITEM_PUSH_TYPE_LOOT, amt, itemid, pLoot->items.at(lootSlot).iRandomProperty); if(_player->InGroup()) _player->GetGroup()->SendPacketToAll(&idata); else SendPacket(&idata); }
void WorldSession::HandleLootMoneyOpcode( WorldPacket & recv_data ) { if(!_player->IsInWorld()) return; Loot * pLoot = NULL; uint64 lootguid=GetPlayer()->GetLootGUID(); if(!lootguid) return; // duno why this happens if(_player->isCasting()) _player->InterruptSpell(); WorldPacket pkt; Unit * pt = 0; if(UINT32_LOPART(GUID_HIPART(lootguid)) == HIGHGUID_UNIT) { Creature* pCreature = _player->GetMapMgr()->GetCreature(lootguid); if(!pCreature)return; pLoot=&pCreature->loot; pt = pCreature; } else if(UINT32_LOPART(GUID_HIPART(lootguid)) == HIGHGUID_GAMEOBJECT) { GameObject* pGO = _player->GetMapMgr()->GetGameObject(lootguid); if(!pGO)return; pLoot=&pGO->loot; } else if(UINT32_LOPART(GUID_HIPART(lootguid)) == HIGHGUID_CORPSE) { Corpse *pCorpse = objmgr.GetCorpse((uint32)lootguid); if(!pCorpse)return; pLoot=&pCorpse->loot; } else if(UINT32_LOPART(GUID_HIPART(lootguid)) == HIGHGUID_PLAYER) { Player * pPlayer = _player->GetMapMgr()->GetPlayer(lootguid); if(!pPlayer) return; pLoot = &pPlayer->loot; pPlayer->bShouldHaveLootableOnCorpse = false; pt = pPlayer; } else if( (UINT32_LOPART(GUID_HIPART(lootguid)) == HIGHGUID_ITEM) ) { Item *pItem = _player->GetItemInterface()->GetItemByGUID(lootguid); if(!pItem) return; pLoot = pItem->loot; } if (!pLoot) { //bitch about cheating maybe? return; } uint32 money = pLoot->gold; pLoot->gold=0; WorldPacket data(1); data.SetOpcode(SMSG_LOOT_CLEAR_MONEY); // send to all looters Player * plr; for(LooterSet::iterator itr = pLoot->looters.begin(); itr != pLoot->looters.end(); ++itr) { if((plr = _player->GetMapMgr()->GetPlayer(*itr))) plr->GetSession()->SendPacket(&data); } if(!_player->InGroup()) { if(money) { GetPlayer()->ModUInt32Value( PLAYER_FIELD_COINAGE , money); sHookInterface.OnLoot(_player, pt, money, 0); } } else { //this code is wrong mustbe party not raid! Group* party = _player->GetGroup(); if(party) { /*uint32 share = money/party->MemberCount();*/ vector<Player*> targets; targets.reserve(party->MemberCount()); GroupMembersSet::iterator itr; SubGroup * sgrp; for(uint32 i = 0; i < party->GetSubGroupCount(); i++) { sgrp = party->GetSubGroup(i); for(itr = sgrp->GetGroupMembersBegin(); itr != sgrp->GetGroupMembersEnd(); ++itr) { if((*itr)->GetZoneId() == _player->GetZoneId() && _player->GetInstanceID() == (*itr)->GetInstanceID()) targets.push_back((*itr)); } } if(!targets.size()) return; uint32 share = money / targets.size(); pkt.SetOpcode(SMSG_LOOT_MONEY_NOTIFY); pkt << share; for(vector<Player*>::iterator itr = targets.begin(); itr != targets.end(); ++itr) { (*itr)->ModUInt32Value(PLAYER_FIELD_COINAGE, share); (*itr)->GetSession()->SendPacket(&pkt); } } } }
void ScriptMgr::LoadScripts() { if(!HookInterface::getSingletonPtr()) new HookInterface; sLog.outString("Loading External Script Libraries..."); sLog.outString(""); string start_path = Config.MainConfig.GetStringDefault("Script", "BinaryLocation", "script_bin") + "\\"; string search_path = start_path + "*."; /* Loading system for win32 */ #ifdef WIN32 search_path += "dll"; WIN32_FIND_DATA data; uint32 count = 0; HANDLE find_handle = FindFirstFile(search_path.c_str(), &data); if(find_handle == INVALID_HANDLE_VALUE) sLog.outError(" No external scripts found! Server will continue to function with limited functionality."); else { do { string full_path = start_path + data.cFileName; HMODULE mod = LoadLibrary(full_path.c_str()); printf(" %s : 0x%.08X : ", data.cFileName, ((uint32)mod)); if(mod == 0) printf("error!\n"); else { // find version import exp_get_version vcall = (exp_get_version)GetProcAddress(mod, "_exp_get_version"); exp_script_register rcall = (exp_script_register)GetProcAddress(mod, "_exp_script_register"); if(vcall == 0 || rcall == 0) { printf("version functions not found!\n"); FreeLibrary(mod); } else { uint32 version = vcall(); if(UINT32_LOPART(version) == SCRIPTLIB_VERSION_MINOR && UINT32_HIPART(version) == SCRIPTLIB_VERSION_MAJOR) { _handles.push_back(((SCRIPT_MODULE)mod)); printf("v%u.%u : ", UINT32_HIPART(version), UINT32_LOPART(version)); rcall(this); printf("loaded.\n"); ++count; } else { FreeLibrary(mod); printf("version mismatch!\n"); } } } } while(FindNextFile(find_handle, &data)); FindClose(find_handle); sLog.outString(""); sLog.outString("Loaded %u external libraries.", count); sLog.outString(""); } #else /* Loading system for *nix */ struct dirent ** list; int filecount = scandir(PREFIX "/lib/", &list, 0, 0); uint32 count = 0; if(!filecount || !list || filecount < 0) sLog.outError(" No external scripts found! Server will continue to function with limited functionality."); else { char *ext; while(filecount--) { ext = strrchr(list[filecount]->d_name, '.'); if (ext != NULL && !strcmp(ext, ".so")) { string full_path = "../lib/" + string(list[filecount]->d_name); SCRIPT_MODULE mod = dlopen(full_path.c_str(), RTLD_NOW); printf(" %s : 0x%08X : ", list[filecount]->d_name, (unsigned int)mod); if(mod == 0) printf("error! [%s]\n", dlerror()); else { // find version import exp_get_version vcall = (exp_get_version)dlsym(mod, "_exp_get_version"); exp_script_register rcall = (exp_script_register)dlsym(mod, "_exp_script_register"); if(vcall == 0 || rcall == 0) { printf("version functions not found!\n"); dlclose(mod); } else { uint32 version = vcall(); if(UINT32_LOPART(version) == SCRIPTLIB_VERSION_MINOR && UINT32_HIPART(version) == SCRIPTLIB_VERSION_MAJOR) { _handles.push_back(((SCRIPT_MODULE)mod)); printf("v%u.%u : ", UINT32_HIPART(version), UINT32_LOPART(version)); rcall(this); printf("loaded.\n"); ++count; } else { dlclose(mod); printf("version mismatch!\n"); } } } } free(list[filecount]); } free(list); sLog.outString(""); sLog.outString("Loaded %u external libraries.", count); sLog.outString(""); } #endif }