From 735b4181facad352f845dc15ed3ef3bdc786d241 Mon Sep 17 00:00:00 2001 From: SecretsOTheP Date: Fri, 15 Mar 2013 03:27:45 -0400 Subject: [PATCH] Test --- zone/client.cpp | 106 ++++++++++++++++++++++++----------------- zone/client_packet.cpp | 77 ++++++++++++++++-------------- zone/merc.cpp | 11 ++++- 3 files changed, 113 insertions(+), 81 deletions(-) diff --git a/zone/client.cpp b/zone/client.cpp index 155047aa6..70126a0a6 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -1472,7 +1472,7 @@ void Client::SendSound(){//Makes a sound. memset(&x[64],0xffffffff,sizeof(uint32)); memcpy(outapp->pBuffer,x,outapp->size); QueuePacket(outapp); - DumpPacket(outapp); + //DumpPacket(outapp); safe_delete(outapp); } @@ -7137,68 +7137,76 @@ void Client::SendMercPersonalInfo() if (GetClientVersion() >= EQClientRoF) { - MercenaryDataUpdate_Struct* mdus = new MercenaryDataUpdate_Struct; - MercTemplate *mercData = &zone->merc_templates[GetMercInfo().MercTemplateID]; if (mercData) { + int i = 0; + int stancecount = 0; + stancecount += zone->merc_stance_list[GetMercInfo().MercTemplateID].size(); + + if (mercCount > 0) + { + EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataUpdate, sizeof(MercenaryDataUpdate_Struct) + (mercTypeCount * sizeof(MercenaryData_Struct)) + stancecount * sizeof(MercenaryStance_Struct)); + MercenaryDataUpdate_Struct* mdus = (MercenaryDataUpdate_Struct*)outapp->pBuffer; mdus->MercStatus = 0; mdus->MercCount = mercCount; - if (mercCount > 0) + mdus->MercData = new MercenaryData_Struct[mercCount]; + mdus->MercData[i].MercID = mercData->MercTemplateID; + mdus->MercData[i].MercType = mercData->MercType; + mdus->MercData[i].MercSubType = mercData->MercSubType; + mdus->MercData[i].PurchaseCost = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), 0); + mdus->MercData[i].UpkeepCost = Merc::CalcUpkeepCost(mercData->MercTemplateID, GetLevel(), 0); + mdus->MercData[i].Status = 0; + mdus->MercData[i].AltCurrencyCost = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), altCurrentType); + mdus->MercData[i].AltCurrencyUpkeep = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), altCurrentType); + mdus->MercData[i].AltCurrencyType = altCurrentType; + mdus->MercData[i].MercUnk01 = 0; + mdus->MercData[i].TimeLeft = GetMercInfo().MercTimerRemaining; //GetMercTimer().GetRemainingTime(); + mdus->MercData[i].MerchantSlot = i + 1; + mdus->MercData[i].MercUnk02 = 1; + mdus->MercData[i].StanceCount = zone->merc_stance_list[mercData->MercTemplateID].size(); + mdus->MercData[i].MercUnk03 = 0; + mdus->MercData[i].MercUnk04 = 1; + strn0cpy(mdus->MercData[i].MercName, GetMercInfo().merc_name , sizeof(mdus->MercData[i].MercName)); + uint32 stanceindex = 0; + if (mdus->MercData[i].StanceCount != 0) { - mdus->MercData = new MercenaryData_Struct[mercCount]; - mdus->MercData[i].MercID = mercData->MercTemplateID; - mdus->MercData[i].MercType = mercData->MercType; - mdus->MercData[i].MercSubType = mercData->MercSubType; - mdus->MercData[i].PurchaseCost = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), 0); - mdus->MercData[i].UpkeepCost = Merc::CalcUpkeepCost(mercData->MercTemplateID, GetLevel(), 0); - mdus->MercData[i].Status = 0; - mdus->MercData[i].AltCurrencyCost = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), altCurrentType); - mdus->MercData[i].AltCurrencyUpkeep = Merc::CalcPurchaseCost(mercData->MercTemplateID, GetLevel(), altCurrentType); - mdus->MercData[i].AltCurrencyType = altCurrentType; - mdus->MercData[i].MercUnk01 = 0; - mdus->MercData[i].TimeLeft = GetMercInfo().MercTimerRemaining; //GetMercTimer().GetRemainingTime(); - mdus->MercData[i].MerchantSlot = i + 1; - mdus->MercData[i].MercUnk02 = 1; - mdus->MercData[i].StanceCount = zone->merc_stance_list[mercData->MercTemplateID].size(); - mdus->MercData[i].MercUnk03 = 0; - mdus->MercData[i].MercUnk04 = 1; - strn0cpy(mdus->MercData[i].MercName, GetMercInfo().merc_name , sizeof(mdus->MercData[i].MercName)); - uint32 stanceindex = 0; - if (mdus->MercData[i].StanceCount != 0) + mdus->MercData[i].Stances = new MercenaryStance_Struct[mdus->MercData[i].StanceCount]; + list::iterator iter = zone->merc_stance_list[mercData->MercTemplateID].begin(); + while(iter != zone->merc_stance_list[mercData->MercTemplateID].end()) { - mdus->MercData[i].Stances = new MercenaryStance_Struct[mdus->MercData[i].StanceCount]; - list::iterator iter = zone->merc_stance_list[mercData->MercTemplateID].begin(); - while(iter != zone->merc_stance_list[mercData->MercTemplateID].end()) - { - mdus->MercData[i].Stances[stanceindex].StanceIndex = stanceindex; - mdus->MercData[i].Stances[stanceindex].Stance = (iter->StanceID); - stanceindex++; - iter++; - } + mdus->MercData[i].Stances[stanceindex].StanceIndex = stanceindex; + mdus->MercData[i].Stances[stanceindex].Stance = (iter->StanceID); + stanceindex++; + iter++; } + } - mdus->MercData[i].MercUnk05 = 1; - - EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataUpdate, 1); //Packet sizes are handled by the encoder. - outapp->pBuffer = (unsigned char*)mdus; - //DumpPacket(outapp); - FastQueuePacket(&outapp); + mdus->MercData[i].MercUnk05 = 1; + //DumpPacket(outapp); + FastQueuePacket(&outapp); + return; } } } else { - MercenaryMerchantList_Struct* mml = new MercenaryMerchantList_Struct; + int stancecount = 0; + stancecount += zone->merc_stance_list[GetMercInfo().MercTemplateID].size(); + + EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataResponse, sizeof(MercenaryMerchantList_Struct) + (mercTypeCount * sizeof(MercenaryGrade_Struct)) + (mercCount * sizeof(MercenaryListEntry_Struct)) + stancecount * sizeof(MercenaryStance_Struct)); //Packet sizes are handled by the encoder. + MercenaryMerchantList_Struct* mml = (MercenaryMerchantList_Struct*)outapp->pBuffer; MercTemplate *mercData = &zone->merc_templates[GetMercInfo().MercTemplateID]; + if(mercData) { if(mercTypeCount > 0) { mml->MercTypeCount = mercTypeCount; //We only should have one merc entry. mml->MercGrades = new MercenaryGrade_Struct[mercTypeCount]; // DBStringID for Type + mml->MercGrades[0].GradeCountEntry = 1; } mml->MercCount = mercCount; if(mercCount > 0) @@ -7234,17 +7242,25 @@ void Client::SendMercPersonalInfo() iter++; } } - - EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataResponse, 1); //Packet sizes are handled by the encoder. - outapp->pBuffer = (unsigned char*)mml; - // DumpPacket(outapp); FastQueuePacket(&outapp); } + else + { + safe_delete(outapp); + SendMercMerchantResponsePacket(0); + return; + } if (GetClientVersion() == EQClientSoD) { SendMercMerchantResponsePacket(0); } } + else + { + safe_delete(outapp); + SendMercMerchantResponsePacket(0); + return; + } } } @@ -7256,7 +7272,7 @@ void Client::SendClearMercInfo() nmhs->MercCount = 0; nmhs->MercID = 1; - DumpPacket(outapp); + //DumpPacket(outapp); FastQueuePacket(&outapp); } diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index f4adef8ce..3d1bff42a 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -13496,8 +13496,6 @@ void Client::Handle_OP_MercenaryDataRequest(const EQApplicationPacket *app) //send info about your current merc(s) } - DumpPacket(app); - if(!RuleB(Mercs, AllowMercs)) { return; } @@ -13515,19 +13513,28 @@ void Client::Handle_OP_MercenaryDataRequest(const EQApplicationPacket *app) return; } - MercenaryMerchantList_Struct* mml = new MercenaryMerchantList_Struct; - mercTypeCount = tar->GetNumMercTypes(GetClientVersion()); mercCount = tar->GetNumMercs(GetClientVersion()); - std::list mercTypeList = tar->GetMercTypesList(GetClientVersion()); std::list mercDataList = tar->GetMercsList(GetClientVersion()); - mml->MercTypeCount = mercTypeCount; int i = 0; + int StanceCount = 0; + for(std::list::iterator mercListItr = mercDataList.begin(); mercListItr != mercDataList.end(); mercListItr++) + { + list::iterator siter = zone->merc_stance_list[mercListItr->MercTemplateID].begin(); + for(siter = zone->merc_stance_list[mercListItr->MercTemplateID].begin(); siter != zone->merc_stance_list[mercListItr->MercTemplateID].end(); siter++) + { + StanceCount++; + } + } + EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataResponse, sizeof(MercenaryMerchantList_Struct) + (mercTypeCount * sizeof(MercenaryGrade_Struct)) + (mercCount * sizeof(MercenaryListEntry_Struct)) + (StanceCount * sizeof(MercenaryStance_Struct))); + MercenaryMerchantList_Struct* mml = (MercenaryMerchantList_Struct*)outapp->pBuffer; + + mml->MercTypeCount = mercTypeCount; if(mercTypeCount > 0) { mml->MercGrades = new MercenaryGrade_Struct[mercTypeCount]; @@ -13540,50 +13547,50 @@ void Client::Handle_OP_MercenaryDataRequest(const EQApplicationPacket *app) if(mercCount > 0) { - mml->Mercs = new MercenaryListEntry_Struct[mercCount]; i = 0; - for(std::list::iterator mercListItr = mercDataList.begin(); mercListItr != mercDataList.end(); mercListItr++) + mml->Mercs = new MercenaryListEntry_Struct[mercCount]; + for(std::list::iterator mercListIter = mercDataList.begin(); mercListIter != mercDataList.end(); mercListIter++) { - mml->Mercs[i].MercID = mercListItr->MercTemplateID; - mml->Mercs[i].MercType = mercListItr->MercType; - mml->Mercs[i].MercSubType = mercListItr->MercSubType; - mml->Mercs[i].PurchaseCost = RuleB(Mercs, ChargeMercPurchaseCost) ? Merc::CalcPurchaseCost(mercListItr->MercTemplateID, GetLevel(), 0): 0; - mml->Mercs[i].UpkeepCost = RuleB(Mercs, ChargeMercUpkeepCost) ? Merc::CalcUpkeepCost(mercListItr->MercTemplateID, GetLevel(), 0): 0; + mml->Mercs[i].MercID = mercListIter->MercTemplateID; + mml->Mercs[i].MercType = mercListIter->MercType; + mml->Mercs[i].MercSubType = mercListIter->MercSubType; + mml->Mercs[i].PurchaseCost = RuleB(Mercs, ChargeMercPurchaseCost) ? Merc::CalcPurchaseCost(mercListIter->MercTemplateID, GetLevel(), 0): 0; + mml->Mercs[i].UpkeepCost = RuleB(Mercs, ChargeMercUpkeepCost) ? Merc::CalcUpkeepCost(mercListIter->MercTemplateID, GetLevel(), 0): 0; mml->Mercs[i].Status = 0; - mml->Mercs[i].AltCurrencyCost = RuleB(Mercs, ChargeMercPurchaseCost) ? Merc::CalcPurchaseCost(mercListItr->MercTemplateID, GetLevel(), altCurrentType): 0; - mml->Mercs[i].AltCurrencyUpkeep = RuleB(Mercs, ChargeMercUpkeepCost) ? Merc::CalcUpkeepCost(mercListItr->MercTemplateID, GetLevel(), altCurrentType): 0; + mml->Mercs[i].AltCurrencyCost = RuleB(Mercs, ChargeMercPurchaseCost) ? Merc::CalcPurchaseCost(mercListIter->MercTemplateID, GetLevel(), altCurrentType): 0; + mml->Mercs[i].AltCurrencyUpkeep = RuleB(Mercs, ChargeMercUpkeepCost) ? Merc::CalcUpkeepCost(mercListIter->MercTemplateID, GetLevel(), altCurrentType): 0; mml->Mercs[i].AltCurrencyType = altCurrentType; mml->Mercs[i].MercUnk01 = 0; mml->Mercs[i].TimeLeft = -1; mml->Mercs[i].MerchantSlot = i + 1; mml->Mercs[i].MercUnk02 = 1; - mml->Mercs[i].StanceCount = zone->merc_stance_list[mercListItr->MercTemplateID].size(); + int mercStanceCount = 0; + list::iterator iter = zone->merc_stance_list[mercListIter->MercTemplateID].begin(); + for(iter = zone->merc_stance_list[mercListIter->MercTemplateID].begin(); iter != zone->merc_stance_list[mercListIter->MercTemplateID].end(); iter++) + { + mercStanceCount++; + } + mml->Mercs[i].StanceCount = mercStanceCount; mml->Mercs[i].MercUnk03 = 519044964; mml->Mercs[i].MercUnk04 = 1; //mml->Mercs[i].MercName; int stanceindex = 0; - if(mml->Mercs[i].StanceCount != 0) + if(mercStanceCount > 0) { - mml->Mercs[i].Stances = new MercenaryStance_Struct[mml->Mercs[i].StanceCount]; - list::iterator iter = zone->merc_stance_list[mercListItr->MercTemplateID].begin(); - while(iter != zone->merc_stance_list[mercListItr->MercTemplateID].end()) + mml->Mercs[i].Stances = new MercenaryStance_Struct[mercStanceCount]; + list::iterator iter2 = zone->merc_stance_list[mercListIter->MercTemplateID].begin(); + while(iter2 != zone->merc_stance_list[mercListIter->MercTemplateID].end()) { mml->Mercs[i].Stances[stanceindex].StanceIndex = stanceindex; - mml->Mercs[i].Stances[stanceindex].Stance = (iter->StanceID); + mml->Mercs[i].Stances[stanceindex].Stance = (iter2->StanceID); stanceindex++; - iter++; + iter2++; } } i++; } } - - - EQApplicationPacket *outapp = new EQApplicationPacket(OP_MercenaryDataResponse, 1); //Packet sizes are handled by the encoder. - outapp->pBuffer = (unsigned char*)mml; - // DumpPacket(outapp); FastQueuePacket(&outapp); - } } @@ -13605,7 +13612,7 @@ void Client::Handle_OP_MercenaryHire(const EQApplicationPacket *app) uint32 merc_unk1 = mmrq->MercUnk01; uint32 merc_unk2 = mmrq->MercUnk02; - DumpPacket(app); + //DumpPacket(app); if(MERC_DEBUG > 0) Message(7, "Mercenary Debug: Template ID (%i), Merchant ID (%i), Unknown1 (%i), Unknown2 (%i)", merc_template_id, merchant_id, merc_unk1, merc_unk2); @@ -13668,7 +13675,7 @@ void Client::Handle_OP_MercenarySuspendRequest(const EQApplicationPacket *app) SuspendMercenary_Struct* sm = (SuspendMercenary_Struct*) app->pBuffer; uint32 merc_suspend = sm->SuspendMerc; // Seen 30 for suspending or unsuspending - DumpPacket(app); + //DumpPacket(app); if(MERC_DEBUG > 0) Message(7, "Mercenary Debug: Suspend ( %i ) received.", merc_suspend); @@ -13699,7 +13706,7 @@ void Client::Handle_OP_MercenaryCommand(const EQApplicationPacket *app) GetMercInfo().State = option; } - DumpPacket(app); + //DumpPacket(app); if(MERC_DEBUG > 0) Message(7, "Mercenary Debug: Command %i, Option %i received.", merc_command, option); @@ -13723,7 +13730,7 @@ void Client::Handle_OP_MercenaryDataUpdateRequest(const EQApplicationPacket *app return; } - DumpPacket(app); + //DumpPacket(app); if(MERC_DEBUG > 0) Message(7, "Mercenary Debug: Data Update Request Received."); @@ -13745,7 +13752,7 @@ void Client::Handle_OP_MercenaryDismiss(const EQApplicationPacket *app) return; } - DumpPacket(app); + //DumpPacket(app); uint8 Command = 0; if(app->size > 0) @@ -13765,7 +13772,7 @@ void Client::Handle_OP_MercenaryDismiss(const EQApplicationPacket *app) merc->Dismiss(); } - // Unsure if there is a server response to this packet + SendMercMerchantResponsePacket(10); } @@ -13780,7 +13787,7 @@ void Client::Handle_OP_MercenaryTimerRequest(const EQApplicationPacket *app) return; } - DumpPacket(app); + //DumpPacket(app); if(MERC_DEBUG > 0) Message(7, "Mercenary Debug: Timer Request received."); diff --git a/zone/merc.cpp b/zone/merc.cpp index 267cbfdda..18722cf52 100644 --- a/zone/merc.cpp +++ b/zone/merc.cpp @@ -5123,7 +5123,7 @@ bool Merc::Unsuspend(bool setMaxStats) { if(!mercOwner->IsGrouped()) { Group *g = new Group(mercOwner); - if(AddMercToGroup(this, g)) + if(g && AddMercToGroup(this, g)) { entity_list.AddGroup(g); database.SetGroupLeaderName(g->GetID(), mercOwner->GetName()); @@ -5134,6 +5134,15 @@ bool Merc::Unsuspend(bool setMaxStats) { loaded = true; } + else + { + if(MERC_DEBUG > 0) + mercOwner->Message(7, "Mercenary failed to join the group - Suspending"); + + Suspend(); + safe_delete(g); + return false; + } } else if (AddMercToGroup(this, mercOwner->GetGroup())) {