void CPrivManager::AddEmpirePriv(BYTE empire, BYTE type, int value, time_t duration_sec) { if (MAX_PRIV_NUM <= type) { sys_err("PRIV_MANAGER: AddEmpirePriv: wrong empire priv type(%u) recved", type); return; } if (duration_sec < 0) duration_sec = 0; time_t now = CClientManager::instance().GetCurrentTime(); time_t end = now+duration_sec; // 이전 설정값 무효화 // priority_queue에 들어있는 pointer == m_aaPrivEmpire[type][empire] { if (m_aaPrivEmpire[type][empire]) m_aaPrivEmpire[type][empire]->bRemoved = true; } TPrivEmpireData * p = new TPrivEmpireData(type, value, empire, end); m_pqPrivEmpire.push(std::make_pair(end, p)); m_aaPrivEmpire[type][empire] = p; // ADD_EMPIRE_PRIV_TIME SendChangeEmpirePriv(empire, type, value, end); // END_OF_ADD_EMPIRE_PRIV_TIME sys_log(0, "Empire Priv empire(%d) type(%d) value(%d) duration_sec(%d)", empire, type, value, duration_sec); }
// // @version 05/06/07 Bang2ni - БЯє№АыАё·О єёіКЅє°Ў Аыїл µИ ±жµеїЎ ґлЗС Гіё® // void CPrivManager::Update() { time_t now = CClientManager::instance().GetCurrentTime(); while (!m_pqPrivGuild.empty() && m_pqPrivGuild.top().first <= now) { TPrivGuildData* p = m_pqPrivGuild.top().second; m_pqPrivGuild.pop(); if (p->value != 0 && !p->bRemoved) { PrivGuildDataMap::const_iterator it = m_aPrivGuild[p->type].find(p->guild_id); // ADD_GUILD_PRIV_TIME // ±жµеїЎ БЯє№АыАё·О єёіКЅє°Ў јіБ¤µЗѕъА» °жїм map АЗ value °Ў °»ЅЕ(јцБ¤) µЗѕъАё№З·О // TPrivGuildData АЗ ЖчАОЕН°Ў °°А»¶§ ЅЗБ¦·О »иБ¦ЗШ БЦ°н °ФАУј№цµйїЎ°Ф cast ЗШ БШґЩ. if (it != m_aPrivGuild[p->type].end() && it->second == p) { m_aPrivGuild[p->type].erase(it); SendChangeGuildPriv(p->guild_id, p->type, 0, 0); // END_OF_ADD_GUILD_PRIV_TIME } } delete p; } while (!m_pqPrivEmpire.empty() && m_pqPrivEmpire.top().first <= now) { TPrivEmpireData* p = (m_pqPrivEmpire.top().second); m_pqPrivEmpire.pop(); if (p->value != 0 && !p->bRemoved) { SendChangeEmpirePriv(p->empire, p->type, 0, 0); m_aaPrivEmpire[p->type][p->empire] = 0; } delete p; } while (!m_pqPrivChar.empty() && m_pqPrivChar.top().first <= now) { TPrivCharData* p = (m_pqPrivChar.top().second); m_pqPrivChar.pop(); if (!p->bRemoved) { // TODO send packet SendChangeCharPriv(p->pid, p->type, 0); PrivCharDataMap::const_iterator it = m_aPrivChar[p->type].find(p->pid); if (it != m_aPrivChar[p->type].end()) m_aPrivChar[p->type].erase(it); } delete p; } }
// // @version 05/06/07 Bang2ni - 중복적으로 보너스가 적용 된 길드에 대한 처리 // void CPrivManager::Update() { time_t now = CClientManager::instance().GetCurrentTime(); while (!m_pqPrivGuild.empty() && m_pqPrivGuild.top().first <= now) { TPrivGuildData* p = m_pqPrivGuild.top().second; m_pqPrivGuild.pop(); if (p->value != 0 && !p->bRemoved) { typeof(m_aPrivGuild[p->type].begin()) it = m_aPrivGuild[p->type].find(p->guild_id); // ADD_GUILD_PRIV_TIME // 길드에 중복적으로 보너스가 설정되었을 경우 map 의 value 가 갱신(수정) 되었으므로 // TPrivGuildData 의 포인터가 같을때 실제로 삭제해 주고 게임서버들에게 cast 해 준다. if (it != m_aPrivGuild[p->type].end() && it->second == p) { m_aPrivGuild[p->type].erase(it); SendChangeGuildPriv(p->guild_id, p->type, 0, 0); // END_OF_ADD_GUILD_PRIV_TIME } } delete p; } while (!m_pqPrivEmpire.empty() && m_pqPrivEmpire.top().first <= now) { TPrivEmpireData* p = (m_pqPrivEmpire.top().second); m_pqPrivEmpire.pop(); if (p->value != 0 && !p->bRemoved) { SendChangeEmpirePriv(p->empire, p->type, 0, 0); m_aaPrivEmpire[p->type][p->empire] = 0; } delete p; } while (!m_pqPrivChar.empty() && m_pqPrivChar.top().first <= now) { TPrivCharData* p = (m_pqPrivChar.top().second); m_pqPrivChar.pop(); if (!p->bRemoved) { // TODO send packet SendChangeCharPriv(p->pid, p->type, 0); typeof(m_aPrivChar[p->type].begin()) it = m_aPrivChar[p->type].find(p->pid); if (it != m_aPrivChar[p->type].end()) m_aPrivChar[p->type].erase(it); } delete p; } }