void CZone::CharZoneIn(CCharEntity* PChar) { // ищем свободный targid для входящего в зону персонажа PChar->loc.zone = this; PChar->loc.zoning = false; PChar->loc.destination = 0; PChar->m_InsideRegionID = 0; if (PChar->isMounted() && !CanUseMisc(MISC_MOUNT)) { PChar->animation = ANIMATION_NONE; PChar->StatusEffectContainer->DelStatusEffectSilent(EFFECT_MOUNTED); } if (PChar->m_Costum != 0) { PChar->m_Costum = 0; PChar->StatusEffectContainer->DelStatusEffect(EFFECT_COSTUME); } PChar->ReloadPartyInc(); if (PChar->PParty != nullptr) { if (m_TreasurePool != nullptr) { PChar->PTreasurePool = m_TreasurePool; PChar->PTreasurePool->AddMember(PChar); } else { PChar->PParty->ReloadTreasurePool(PChar); } } else { PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); } if (m_zoneType != ZONETYPE_DUNGEON_INSTANCED) { PChar->PInstance = nullptr; } PChar->PLatentEffectContainer->CheckLatentsZone(); }
void CZone::IncreaseZoneCounter(CCharEntity* PChar) { DSP_DEBUG_BREAK_IF(PChar == NULL); DSP_DEBUG_BREAK_IF(PChar->loc.zone != NULL); DSP_DEBUG_BREAK_IF(PChar->PTreasurePool != NULL); // ищем свободный targid для входящего в зону персонажа PChar->targid = 0x400; for (EntityList_t::const_iterator it = m_charList.begin() ; it != m_charList.end() ; ++it) { if (PChar->targid != it->first) { break; } PChar->targid++; } if (PChar->targid >= 0x700) { ShowError(CL_RED"CZone::InsertChar : targid is high (03hX)\n" CL_RESET, PChar->targid); return; } PChar->loc.zone = this; PChar->loc.zoning = false; PChar->loc.destination = 0; PChar->m_InsideRegionID = 0; PChar->m_PVPFlag = CanUseMisc(MISC_PVP); m_charList[PChar->targid] = PChar; ShowDebug(CL_CYAN"CZone:: %s IncreaseZoneCounter <%u> %s \n" CL_RESET, GetName(), m_charList.size(),PChar->GetName()); if (!ZoneTimer && !m_charList.empty()) { ZoneTimer = CTaskMgr::getInstance()->AddTask( m_zoneName, gettick(), this, CTaskMgr::TASK_INTERVAL, m_regionList.empty() ? zone_server : zone_server_region, 500); } //remove status effects that wear on zone PChar->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_ON_ZONE); if (PChar->animation == ANIMATION_CHOCOBO && !CanUseMisc(MISC_CHOCOBO)) { PChar->animation = ANIMATION_NONE; PChar->StatusEffectContainer->DelStatusEffectSilent(EFFECT_CHOCOBO); } if (PChar->m_Costum != 0) { PChar->m_Costum = 0; PChar->StatusEffectContainer->DelStatusEffect(EFFECT_COSTUME); } if (PChar->PParty != NULL) { if (m_TreasurePool != NULL) { PChar->PTreasurePool = m_TreasurePool; PChar->PTreasurePool->AddMember(PChar); } else { PChar->PParty->ReloadTreasurePool(PChar); } if (PChar->PParty->GetSyncTarget() != NULL) { if (PChar->getZone() == PChar->PParty->GetSyncTarget()->getZone() ) { if (PChar->PParty->GetSyncTarget()->StatusEffectContainer->HasStatusEffect(EFFECT_LEVEL_SYNC) && PChar->PParty->GetSyncTarget()->StatusEffectContainer->GetStatusEffect(EFFECT_LEVEL_SYNC)->GetDuration() == 0) { PChar->pushPacket(new CMessageBasicPacket(PChar, PChar, 0, PChar->PParty->GetSyncTarget()->GetMLevel(), 540)); PChar->StatusEffectContainer->AddStatusEffect(new CStatusEffect( EFFECT_LEVEL_SYNC, EFFECT_LEVEL_SYNC, PChar->PParty->GetSyncTarget()->GetMLevel(), 0, 0), true); PChar->StatusEffectContainer->DelStatusEffectsByFlag(EFFECTFLAG_DEATH); } } } } else { PChar->PTreasurePool = new CTreasurePool(TREASUREPOOL_SOLO); PChar->PTreasurePool->AddMember(PChar); } PChar->PLatentEffectContainer->CheckLatentsZone(); }