void CParty::AddMember(CBattleEntity* PEntity, Sql_t* sql) { DSP_DEBUG_BREAK_IF(PEntity == NULL); DSP_DEBUG_BREAK_IF(PEntity->PParty != NULL); PEntity->PParty = this; members.push_back(PEntity); if (m_PartyType == PARTY_PCS) { DSP_DEBUG_BREAK_IF(PEntity->objtype != TYPE_PC); CCharEntity* PChar = (CCharEntity*)PEntity; uint32 allianceid = 0; if (m_PAlliance) { allianceid = m_PAlliance->m_AllianceID; } Sql_Query(sql, "INSERT INTO accounts_parties (charid, partyid, allianceid, partyflag) VALUES (%u, %u, %u, %u);", PChar->id, m_PartyID, allianceid, GetMemberFlags(PChar)); uint8 data[4]; WBUFL(data, 0) = m_PartyID; message::send(MSG_PT_RELOAD, data, sizeof data, NULL); ReloadTreasurePool(PChar); if (PChar->nameflags.flags & FLAG_INVITE) { PChar->nameflags.flags ^= FLAG_INVITE; charutils::SaveCharStats(PChar); PChar->status = STATUS_UPDATE; PChar->pushPacket(new CMenuConfigPacket(PChar)); PChar->pushPacket(new CCharUpdatePacket(PChar)); PChar->pushPacket(new CCharSyncPacket(PChar)); } PChar->PTreasurePool->UpdatePool(PChar); //Apply level sync if the party is level synced if (m_PSyncTarget != NULL) { if (PChar->getZone() == m_PSyncTarget->getZone() ) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, m_PSyncTarget->GetMLevel(), 540)); PChar->StatusEffectContainer->AddStatusEffect(new CStatusEffect( EFFECT_LEVEL_SYNC, EFFECT_LEVEL_SYNC, m_PSyncTarget->GetMLevel(), 0, 0), true); PChar->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DISPELABLE | EFFECTFLAG_ON_ZONE); PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE, new CCharSyncPacket(PChar)); } } } }
void CParty::ReloadParty() { auto info = GetPartyInfo(); //alliance if (this->m_PAlliance != nullptr) { for (auto&& party : m_PAlliance->partyList) { party->RefreshFlags(info); for (auto&& member : party->members) { CCharEntity* PChar = (CCharEntity*)member; PChar->ReloadPartyDec(); uint16 alliance = 0; PChar->pushPacket(new CPartyDefinePacket(party)); //auto effects = std::make_unique<CPartyEffectsPacket>(); uint8 j = 0; for (auto&& memberinfo : info) { if ((memberinfo.flags & (PARTY_SECOND | PARTY_THIRD)) != alliance) { alliance = memberinfo.flags & (PARTY_SECOND | PARTY_THIRD); j = 0; } auto PPartyMember = zoneutils::GetChar(memberinfo.id); if (PPartyMember) { PChar->pushPacket(new CPartyMemberUpdatePacket(PPartyMember, j, memberinfo.flags | GetMemberFlags(PPartyMember), PChar->getZone())); //if (memberinfo.partyid == party->GetPartyID() && PPartyMember != PChar) // effects->AddMemberEffects(PChar); } else { uint16 zoneid = memberinfo.zone == 0 ? memberinfo.prev_zone : memberinfo.zone; PChar->pushPacket(new CPartyMemberUpdatePacket( memberinfo.id, memberinfo.name.c_str(), memberinfo.flags, j, zoneid)); } j++; } //PChar->pushPacket(effects.release()); } } } else { RefreshFlags(info); //regular party for (uint8 i = 0; i < members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)members.at(i); PChar->PLatentEffectContainer->CheckLatentsPartyJobs(); PChar->PLatentEffectContainer->CheckLatentsPartyMembers(members.size()); PChar->PLatentEffectContainer->CheckLatentsPartyAvatar(); PChar->ReloadPartyDec(); PChar->pushPacket(new CPartyDefinePacket(this)); //auto effects = std::make_unique<CPartyEffectsPacket>(); uint8 j = 0; for (auto&& memberinfo : info) { auto PPartyMember = zoneutils::GetChar(memberinfo.id); if (PPartyMember) { PChar->pushPacket(new CPartyMemberUpdatePacket(PPartyMember, j, memberinfo.flags | GetMemberFlags(PPartyMember), PChar->getZone())); //if (PPartyMember != PChar) // effects->AddMemberEffects(PChar); } else { uint16 zoneid = memberinfo.zone == 0 ? memberinfo.prev_zone : memberinfo.zone; PChar->pushPacket(new CPartyMemberUpdatePacket( memberinfo.id, memberinfo.name.c_str(), memberinfo.flags, j, zoneid)); //effects->AddMemberEffects(memberinfo.id); } j++; } //PChar->pushPacket(effects.release()); } } }