void CParty::ReloadTreasurePool(CCharEntity* PChar) { DSP_DEBUG_BREAK_IF(PChar == NULL); if (PChar->PTreasurePool != NULL && PChar->PTreasurePool->GetPoolType() == TREASUREPOOL_ZONE){ return; } //alliance if(PChar->PParty != NULL) { if (PChar->PParty->m_PAlliance != NULL) { for (uint8 a = 0; a < PChar->PParty->m_PAlliance->partyList.size(); ++a) { for (uint8 i = 0; i < PChar->PParty->m_PAlliance->partyList.at(a)->members.size(); ++i) { CCharEntity* PPartyMember = (CCharEntity*)PChar->PParty->m_PAlliance->partyList.at(a)->members.at(i); if (PPartyMember != PChar && PPartyMember->PTreasurePool != NULL && PPartyMember->getZone() == PChar->getZone()) { if (PChar->PTreasurePool != NULL) { PChar->PTreasurePool->DelMember(PChar); } PChar->PTreasurePool = PPartyMember->PTreasurePool; PChar->PTreasurePool->AddMember(PChar); return; } } }//regular party }else if (PChar->PParty->m_PAlliance == NULL){ for (uint8 i = 0; i < members.size(); ++i){ CCharEntity* PPartyMember = (CCharEntity*)members.at(i); if (PPartyMember != PChar && PPartyMember->PTreasurePool != NULL && PPartyMember->getZone() == PChar->getZone()) { if (PChar->PTreasurePool != NULL) { PChar->PTreasurePool->DelMember(PChar); } PChar->PTreasurePool = PPartyMember->PTreasurePool; PChar->PTreasurePool->AddMember(PChar); return; } } } } if (PChar->PTreasurePool == NULL) { PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); } }
void CParty::DisbandParty() { SetSyncTarget(NULL); SetQuaterMaster(NULL); m_PLeader = NULL; m_PAlliance = NULL; if (m_PartyType == PARTY_PCS) { PushPacket(NULL, 0, new CPartyDefinePacket(NULL)); for (uint8 i = 0; i < members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)members.at(i); PChar->PParty = NULL; PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, PChar->getZone())); // TODO: TreasurePool должен оставаться у последнего персонажа, но сейчас это не критично if (PChar->PTreasurePool != NULL && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } } Sql_Query(SqlHandle,"UPDATE accounts_sessions SET partyid = %u WHERE partyid = %u", 0, m_PartyID); } delete this; }
void CParty::DisbandParty(bool playerInitiated) { if (m_PAlliance) { m_PAlliance->removeParty(this); } m_PSyncTarget = nullptr; SetQuarterMaster(nullptr); m_PLeader = nullptr; m_PAlliance = nullptr; if (m_PartyType == PARTY_PCS) { PushPacket(0, 0, new CPartyDefinePacket(nullptr)); for (uint8 i = 0; i < members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)members.at(i); PChar->PParty = nullptr; PChar->PLatentEffectContainer->CheckLatentsPartyJobs(); PChar->PLatentEffectContainer->CheckLatentsPartyMembers(members.size()); PChar->PLatentEffectContainer->CheckLatentsPartyAvatar(); PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, 0, PChar->getZone())); // TODO: TreasurePool должен оставаться у последнего персонажа, но сейчас это не критично if (PChar->PTreasurePool != nullptr && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(server_clock::now()); sync->SetDuration(30000); } Sql_Query(SqlHandle, "DELETE FROM accounts_parties WHERE charid = %u;", PChar->id); } // make sure chat server isn't notified of a disband if this came from the chat server already if (playerInitiated) { uint8 data[8] {}; ref<uint32>(data, 0) = m_PartyID; ref<uint32>(data, 4) = m_PartyID; message::send(MSG_PT_DISBAND, data, sizeof data, nullptr); } } delete this; }
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::RemoveMember(CBattleEntity* PEntity) { DSP_DEBUG_BREAK_IF(PEntity == NULL); DSP_DEBUG_BREAK_IF(PEntity->PParty != this); if (m_PLeader == PEntity) { RemovePartyLeader(PEntity); } else { for (uint32 i = 0; i < members.size(); ++i) { if (PEntity == members.at(i)) { members.erase(members.begin()+i); if (m_PartyType == PARTY_PCS) { CCharEntity* PChar = (CCharEntity*)PEntity; if (m_PQuaterMaster == PChar) { SetQuaterMaster(NULL); } if (m_PSyncTarget == PChar) { SetSyncTarget(NULL); } PChar->pushPacket(new CPartyDefinePacket(NULL)); PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, PChar->getZone())); PChar->pushPacket(new CCharUpdatePacket(PChar)); PChar->pushPacket(new CCharSyncPacket(PChar)); PChar->PParty = NULL; ReloadParty(); if (PChar->PTreasurePool != NULL && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } Sql_Query(SqlHandle,"UPDATE accounts_sessions SET partyid = 0 WHERE charid = %u", PChar->id); } break; } } } }
void CParty::AddMember(CBattleEntity* PEntity) { 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; ReloadParty(); 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_DEATH); PChar->loc.zone->PushPacket(PChar, CHAR_INRANGE, new CCharSyncPacket(PChar)); } } Sql_Query(SqlHandle,"UPDATE accounts_sessions SET partyid = %u WHERE charid = %u", m_PartyID, PChar->id); } }
void CLatentEffectContainer::CheckLatentsPartyMembers(uint8 members) { for (uint16 i = 0; i < m_LatentEffectList.size(); ++i) { if (m_LatentEffectList.at(i)->GetConditionsID() == LATENT_PARTY_MEMBERS) { if (m_LatentEffectList.at(i)->GetConditionsValue() <= members) { m_LatentEffectList.at(i)->Activate(); } else { m_LatentEffectList.at(i)->Deactivate(); } } if (m_LatentEffectList.at(i)->GetConditionsID() == LATENT_PARTY_MEMBERS_IN_ZONE) { int inZone = 0; if (m_LatentEffectList.at(i)->GetConditionsValue() <= members ) { for (uint8 m = 0; m < members; ++m) { CCharEntity* PMember = (CCharEntity*)m_POwner->PParty->members.at(m); if (PMember->getZone() == m_POwner->getZone()) { inZone++; } } if (inZone == m_LatentEffectList.at(i)->GetConditionsValue()) m_LatentEffectList.at(i)->Activate(); else m_LatentEffectList.at(i)->Deactivate(); } else { if (m_LatentEffectList.at(i)->IsActivated()) m_LatentEffectList.at(i)->Deactivate(); } } } m_POwner->UpdateHealth(); }
void CParty::DisbandParty() { DisableSync(); SetQuaterMaster(NULL); m_PLeader = NULL; m_PAlliance = NULL; if (m_PartyType == PARTY_PCS) { PushPacket(NULL, 0, new CPartyDefinePacket(NULL)); for (uint8 i = 0; i < members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)members.at(i); PChar->PParty = NULL; PChar->PLatentEffectContainer->CheckLatentsPartyJobs(); PChar->PLatentEffectContainer->CheckLatentsPartyMembers(members.size()); PChar->PLatentEffectContainer->CheckLatentsPartyAvatar(); PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, PChar->getZone())); // TODO: TreasurePool должен оставаться у последнего персонажа, но сейчас это не критично if (PChar->PTreasurePool != NULL && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(gettick()); sync->SetDuration(30000); } } Sql_Query(SqlHandle,"UPDATE accounts_sessions SET partyid = %u WHERE partyid = %u", 0, m_PartyID); } delete this; }
void CParty::PushPacket(CCharEntity* PPartyMember, uint8 ZoneID, CBasicPacket* packet) { for (uint32 i = 0; i < members.size(); ++i) { if(members.at(i)->objtype != TYPE_PC) continue; CCharEntity* member = (CCharEntity*)members.at(i); if (member != PPartyMember && member->status != STATUS_DISAPPEAR && !jailutils::InPrison(member) ) { if (ZoneID == 0 || member->getZone() == ZoneID) { member->pushPacket(new CBasicPacket(*packet)); } } } delete packet; }
void CParty::ReloadParty() { //alliance if (this->m_PAlliance != NULL) { CAlliance* ourAlliance = this->m_PAlliance; for (uint8 a = 0; a < ourAlliance->partyList.size(); ++a) { for (uint8 i = 0; i < ourAlliance->partyList.at(a)->members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)ourAlliance->partyList.at(a)->members.at(i); PChar->pushPacket(new CPartyDefinePacket(ourAlliance->partyList.at(a))); for (uint8 y = 0; y < ourAlliance->partyList.at(a)->members.size(); ++y) { PChar->pushPacket(new CPartyMemberUpdatePacket((CCharEntity*)ourAlliance->partyList.at(a)->members.at(y),y, PChar->getZone())); } } } return; } //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->pushPacket(new CPartyDefinePacket(this)); for (uint8 y = 0; y < members.size(); ++y) { PChar->pushPacket(new CPartyMemberUpdatePacket((CCharEntity*)members.at(y), y, PChar->getZone())); } } }
void CParty::ReloadParty() { //check if partyflags have changed int ret = Sql_Query(SqlHandle, "SELECT charid, partyflag FROM accounts_parties WHERE partyid = %d;", m_PartyID); if (ret != SQL_ERROR && Sql_NumRows(SqlHandle) > 0) { uint8 j = 0; while (Sql_NextRow(SqlHandle) == SQL_SUCCESS) { uint32 charid = Sql_GetUIntData(SqlHandle, 0); uint16 memberflags = Sql_GetUIntData(SqlHandle, 1); if (memberflags & PARTY_LEADER) { bool found = false; for (auto member : members) { if (member->id == charid) { m_PLeader = member; found = true; } } if (!found) { m_PLeader = NULL; } } if (memberflags & PARTY_QM) { bool found = false; for (auto member : members) { if (member->id == charid) { m_PQuaterMaster = member; found = true; } } if (!found) { m_PQuaterMaster = NULL; } } } } //alliance if (this->m_PAlliance != NULL) { for (uint8 a = 0; a < m_PAlliance->partyList.size(); ++a) { for (uint8 i = 0; i < m_PAlliance->partyList.at(a)->members.size(); ++i) { CCharEntity* PChar = (CCharEntity*)m_PAlliance->partyList.at(a)->members.at(i); PChar->ReloadPartyDec(); uint16 alliance = 0; PChar->pushPacket(new CPartyDefinePacket(m_PAlliance->partyList.at(a))); int ret = Sql_Query(SqlHandle, "SELECT chars.charid, chars.charname, partyflag, pos_zone, partyid FROM accounts_parties \ LEFT JOIN chars ON accounts_parties.charid = chars.charid WHERE \ allianceid = %d ORDER BY partyflag & %u, timestamp;", m_PAlliance->m_AllianceID, PARTY_SECOND | PARTY_THIRD); if (ret != SQL_ERROR && Sql_NumRows(SqlHandle) > 0) { uint8 j = 0; while (Sql_NextRow(SqlHandle) == SQL_SUCCESS) { if (Sql_GetUIntData(SqlHandle, 2) & (PARTY_SECOND | PARTY_THIRD) != alliance) { alliance = Sql_GetUIntData(SqlHandle, 2) & (PARTY_SECOND | PARTY_THIRD); j = 0; } CCharEntity* PPartyMember = zoneutils::GetChar(Sql_GetUIntData(SqlHandle, 0)); if (PPartyMember) { PChar->pushPacket(new CPartyMemberUpdatePacket(PPartyMember, j, PChar->getZone())); } else { PChar->pushPacket(new CPartyMemberUpdatePacket( Sql_GetUIntData(SqlHandle, 0), Sql_GetData(SqlHandle, 1), Sql_GetUIntData(SqlHandle, 2), Sql_GetUIntData(SqlHandle, 3))); } j++; } } } } } else //regular party for (uint8 i = 0; i < members.size(); ++i)
void CParty::DelMember(CBattleEntity* PEntity) { DSP_DEBUG_BREAK_IF(PEntity == NULL); DSP_DEBUG_BREAK_IF(PEntity->PParty != this); if (m_PLeader == PEntity) { RemovePartyLeader(PEntity); } else { for (uint32 i = 0; i < members.size(); ++i) { if (PEntity == members.at(i)) { members.erase(members.begin() + i); if (m_PartyType == PARTY_PCS) { CCharEntity* PChar = (CCharEntity*)PEntity; if (m_PQuaterMaster == PChar) { SetQuarterMaster(NULL); } if (m_PSyncTarget == PChar) { SetSyncTarget(NULL, 553); CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(gettick()); sync->SetDuration(30000); } DisableSync(); } if (m_PSyncTarget != NULL && m_PSyncTarget != PChar) { if (PChar->status != STATUS_DISAPPEAR && PChar->getZone() == m_PSyncTarget->getZone()) { CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(gettick()); sync->SetDuration(30000); } } } PChar->PLatentEffectContainer->CheckLatentsPartyMembers(members.size()); PChar->pushPacket(new CPartyDefinePacket(NULL)); PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, PChar->getZone())); PChar->pushPacket(new CCharUpdatePacket(PChar)); PChar->PParty = NULL; if (PChar->PTreasurePool != NULL && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } } break; } } } }
void CMobEntity::DropItems() { CCharEntity* PChar = (CCharEntity*)GetEntity(m_OwnerID.targid, TYPE_PC); if (PChar != nullptr && PChar->id == m_OwnerID.id) { loc.zone->PushPacket(this, CHAR_INRANGE, new CMessageBasicPacket(PChar, this, 0, 0, MSGBASIC_DEFEATS_TARG)); if (!CalledForHelp()) { blueutils::TryLearningSpells(PChar, this); m_UsedSkillIds.clear(); if (m_giveExp) { charutils::DistributeExperiencePoints(PChar, this); } DropList_t* DropList = itemutils::GetDropList(m_DropID); //ShowDebug(CL_CYAN"DropID: %u dropping with TH Level: %u\n" CL_RESET, PMob->m_DropID, PMob->m_THLvl); if (DropList != nullptr && !getMobMod(MOBMOD_NO_DROPS) && DropList->size()) { for (uint8 i = 0; i < DropList->size(); ++i) { //THLvl is the number of 'extra chances' at an item. If the item is obtained, then break out. uint8 tries = 0; uint8 maxTries = 1 + (m_THLvl > 2 ? 2 : m_THLvl); uint8 bonus = (m_THLvl > 2 ? (m_THLvl - 2) * 10 : 0); while (tries < maxTries) { if (dsprand::GetRandomNumber(1000) < DropList->at(i).DropRate * map_config.drop_rate_multiplier + bonus) { PChar->PTreasurePool->AddItem(DropList->at(i).ItemID, this); break; } tries++; } } } // check for gil (beastmen drop gil, some NMs drop gil) if (CanDropGil() || (map_config.all_mobs_gil_bonus > 0 && getMobMod(MOBMOD_GIL_MAX) >= 0)) // Negative value of MOBMOD_GIL_MAX is used to prevent gil drops in Dynamis/Limbus. { charutils::DistributeGil(PChar, this); // TODO: REALISATION MUST BE IN TREASUREPOOL } //check for seal drops /* MobLvl >= 1 = Beastmen Seals ID=1126 >= 50 = Kindred Seals ID=1127 >= 75 = Kindred Crests ID=2955 >= 90 = High Kindred Crests ID=2956 */ uint16 Pzone = PChar->getZone(); bool validZone = ((Pzone > 0 && Pzone < 39) || (Pzone > 42 && Pzone < 134) || (Pzone > 135 && Pzone < 185) || (Pzone > 188 && Pzone < 255)); if (validZone && charutils::GetRealExp(PChar->GetMLevel(), GetMLevel()) > 0) { if (((PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SIGNET) && conquest::GetInfluenceGraphics(PChar->loc.zone->GetRegionID()) < 64) || (PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SANCTION) && PChar->loc.zone->GetRegionID() >= 28 && PChar->loc.zone->GetRegionID() <= 32) || (PChar->StatusEffectContainer->HasStatusEffect(EFFECT_SIGIL) && PChar->loc.zone->GetRegionID() >= 33 && PChar->loc.zone->GetRegionID() <= 40)) && m_Element > 0 && dsprand::GetRandomNumber(100) < 20) // Need to move to CRYSTAL_CHANCE constant { PChar->PTreasurePool->AddItem(4095 + m_Element, this); } // Todo: Avatarite and Geode drops during day/weather. Much higher chance during weather than day. // Item element matches day/weather element, not mob crystal. Lv80+ xp mobs can drop Avatarite. // Wiki's have conflicting info on mob lv required for Geodes. One says 50 the other 75. I think 50 is correct. if (dsprand::GetRandomNumber(100) < 20 && PChar->PTreasurePool->CanAddSeal() && !getMobMod(MOBMOD_NO_DROPS)) { //RULES: Only 1 kind may drop per mob if (GetMLevel() >= 75 && luautils::IsExpansionEnabled("ABYSSEA")) //all 4 types { switch (dsprand::GetRandomNumber(4)) { case 0: PChar->PTreasurePool->AddItem(1126, this); break; case 1: PChar->PTreasurePool->AddItem(1127, this); break; case 2: PChar->PTreasurePool->AddItem(2955, this); break; case 3: PChar->PTreasurePool->AddItem(2956, this); break; } } else if (GetMLevel() >= 70 && luautils::IsExpansionEnabled("ABYSSEA")) //b.seal & k.seal & k.crest { switch (dsprand::GetRandomNumber(3)) { case 0: PChar->PTreasurePool->AddItem(1126, this); break; case 1: PChar->PTreasurePool->AddItem(1127, this); break; case 2: PChar->PTreasurePool->AddItem(2955, this); break; } } else if (GetMLevel() >= 50) //b.seal & k.seal only { if (dsprand::GetRandomNumber(2) == 0) { PChar->PTreasurePool->AddItem(1126, this); } else { PChar->PTreasurePool->AddItem(1127, this); } } else { //b.seal only PChar->PTreasurePool->AddItem(1126, this); } } } } PChar->setWeaponSkillKill(false); StatusEffectContainer->KillAllStatusEffect(); // NOTE: this is called for all alliance / party members! luautils::OnMobDeath(this, PChar); } else { luautils::OnMobDeath(this, nullptr); } }
void CParty::SetSyncTarget(int8* MemberName, uint16 message) { CBattleEntity* PEntity = nullptr; if (MemberName) { PEntity = GetMemberByName(MemberName); } if (map_config.level_sync_enable) { if (PEntity && PEntity->objtype == TYPE_PC) { CCharEntity* PChar = (CCharEntity*)PEntity; //enable level sync if (PChar->GetMLevel() < 10) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 10, 541)); return; } else if (PChar->getZone() != GetLeader()->getZone()) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 0, 542)); return; } else { for (uint8 i = 0; i < members.size(); ++i) { if (members.at(i)->StatusEffectContainer->HasStatusEffect({EFFECT_LEVEL_RESTRICTION, EFFECT_LEVEL_SYNC})) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 0, 543)); return; } } m_PSyncTarget = PChar; for (uint8 i = 0; i < members.size(); ++i) { if (members.at(i)->objtype != TYPE_PC) continue; CCharEntity* member = (CCharEntity*)members.at(i); if (member->status != STATUS_DISAPPEAR && member->getZone() == PChar->getZone()) { member->pushPacket(new CMessageStandardPacket(PChar->GetMLevel(), 0, 0, 0, message)); member->StatusEffectContainer->AddStatusEffect(new CStatusEffect( EFFECT_LEVEL_SYNC, EFFECT_LEVEL_SYNC, PChar->GetMLevel(), 0, 0), true); member->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DISPELABLE | EFFECTFLAG_ON_ZONE); member->loc.zone->PushPacket(member, CHAR_INRANGE, new CCharSyncPacket(member)); } } Sql_Query(SqlHandle, "UPDATE accounts_parties SET partyflag = partyflag & ~%d WHERE partyid = %u AND partyflag & %d", PARTY_SYNC, m_PartyID, PARTY_SYNC); Sql_Query(SqlHandle, "UPDATE accounts_parties SET partyflag = partyflag | %d WHERE partyid = %u AND charid = '%u';", PARTY_SYNC, m_PartyID, PChar->id); } } else { if (m_PSyncTarget != nullptr) { //disable level sync for (uint8 i = 0; i < members.size(); ++i) { if (members.at(i)->objtype != TYPE_PC) continue; CCharEntity* member = (CCharEntity*)members.at(i); if (member->status != STATUS_DISAPPEAR) { CStatusEffect* sync = member->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { member->pushPacket(new CMessageBasicPacket(member, member, 10, 30, message)); sync->SetStartTime(server_clock::now()); sync->SetDuration(30000); } } } } m_PSyncTarget = nullptr; Sql_Query(SqlHandle, "UPDATE accounts_parties SET partyflag = partyflag & ~%d WHERE partyid = %u AND partyflag & %d", PARTY_SYNC, m_PartyID, PARTY_SYNC); } } }
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, 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, (const int8*)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, 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, (const int8*)memberinfo.name.c_str(), memberinfo.flags, j, zoneid)); //effects->AddMemberEffects(memberinfo.id); } j++; } //PChar->pushPacket(effects.release()); } } }
void CParty::RemoveMember(CBattleEntity* PEntity) { DSP_DEBUG_BREAK_IF(PEntity == nullptr); DSP_DEBUG_BREAK_IF(PEntity->PParty != this); if (m_PLeader == PEntity) { RemovePartyLeader(PEntity); } else { for (uint32 i = 0; i < members.size(); ++i) { if (PEntity == members.at(i)) { members.erase(members.begin() + i); if (m_PartyType == PARTY_PCS) { CCharEntity* PChar = (CCharEntity*)PEntity; if (m_PQuaterMaster == PChar) { SetQuarterMaster(nullptr); } if (m_PSyncTarget == PChar) { SetSyncTarget(nullptr, 553); CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(server_clock::now()); sync->SetDuration(30000); } DisableSync(); } if (m_PSyncTarget != nullptr && m_PSyncTarget != PChar) { if (PChar->status != STATUS_DISAPPEAR) { CStatusEffect* sync = PChar->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, 30, 553)); sync->SetStartTime(server_clock::now()); sync->SetDuration(30000); } } } PChar->PLatentEffectContainer->CheckLatentsPartyMembers(members.size()); PChar->pushPacket(new CPartyDefinePacket(nullptr)); PChar->pushPacket(new CPartyMemberUpdatePacket(PChar, 0, 0, PChar->getZone())); PChar->pushPacket(new CCharUpdatePacket(PChar)); PChar->PParty = nullptr; Sql_Query(SqlHandle, "DELETE FROM accounts_parties WHERE charid = %u;", PChar->id); uint8 data[4] {}; ref<uint32>(data, 0) = m_PartyID; message::send(MSG_PT_RELOAD, data, sizeof data, nullptr); if (PChar->PTreasurePool != nullptr && PChar->PTreasurePool->GetPoolType() != TREASUREPOOL_ZONE) { PChar->PTreasurePool->DelMember(PChar); PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); PChar->PTreasurePool->UpdatePool(PChar); } } break; } } } }
void CParty::SetSyncTarget(CBattleEntity* PEntity, uint16 message) { if (map_config.level_sync_enable) { if (PEntity && PEntity->objtype == TYPE_PC) { CCharEntity* PChar = (CCharEntity*)PEntity; //enable level sync if (PChar->GetMLevel() < 10 ) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 10, 541)); return; } else if (PChar->getZone() != GetLeader()->getZone()) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 0, 542)); return; } else { for (uint32 i = 0; i < members.size(); ++i) { if(members.at(i)->StatusEffectContainer->HasStatusEffect(EFFECT_LEVEL_RESTRICTION)) { ((CCharEntity*)GetLeader())->pushPacket(new CMessageBasicPacket((CCharEntity*)GetLeader(), (CCharEntity*)GetLeader(), 0, 0, 543)); return; } } m_PSyncTarget = PChar; for (uint32 i = 0; i < members.size(); ++i) { if(members.at(i)->objtype != TYPE_PC) continue; CCharEntity* member = (CCharEntity*)members.at(i); if (member->status != STATUS_DISAPPEAR && member->getZone() == PChar->getZone() ) { member->pushPacket(new CMessageStandardPacket(PChar->GetMLevel(), 0, 0, 0, message)); member->StatusEffectContainer->AddStatusEffect(new CStatusEffect( EFFECT_LEVEL_SYNC, EFFECT_LEVEL_SYNC, PChar->GetMLevel(), 0, 0), true); member->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DISPELABLE); member->loc.zone->PushPacket(member, CHAR_INRANGE, new CCharSyncPacket(member)); } } } } else { if (m_PSyncTarget != NULL) { //disable level sync for (uint32 i = 0; i < members.size(); ++i) { if(members.at(i)->objtype != TYPE_PC) continue; CCharEntity* member = (CCharEntity*)members.at(i); if (member->status != STATUS_DISAPPEAR && member->getZone() == m_PSyncTarget->getZone() ) { CStatusEffect* sync = member->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC); if (sync && sync->GetDuration() == 0) { member->pushPacket(new CMessageBasicPacket(member, member, 10, 30, message)); sync->SetStartTime(gettick()); sync->SetDuration(30000); } } } } } } }