mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-11 08:52:27 +00:00
More
This commit is contained in:
parent
c18cba4faf
commit
abc507d173
@ -143,6 +143,7 @@ namespace Logs {
|
|||||||
Corpses,
|
Corpses,
|
||||||
XTargets,
|
XTargets,
|
||||||
EvolveItem,
|
EvolveItem,
|
||||||
|
Visibility,
|
||||||
MaxCategoryID /* Don't Remove this */
|
MaxCategoryID /* Don't Remove this */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -244,7 +245,8 @@ namespace Logs {
|
|||||||
"EqTime",
|
"EqTime",
|
||||||
"Corpses",
|
"Corpses",
|
||||||
"XTargets",
|
"XTargets",
|
||||||
"EvolveItem"
|
"EvolveItem",
|
||||||
|
"Visibility"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -854,6 +854,16 @@
|
|||||||
OutF(LogSys, Logs::Detail, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
OutF(LogSys, Logs::Detail, Logs::XTargets, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define LogVisibility(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::General, Logs::Visibility))\
|
||||||
|
OutF(LogSys, Logs::General, Logs::Visibility, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define LogVisibilityDetail(message, ...) do {\
|
||||||
|
if (LogSys.IsLogEnabled(Logs::Detail, Logs::Visibility))\
|
||||||
|
OutF(LogSys, Logs::Detail, Logs::Visibility, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define Log(debug_level, log_category, message, ...) do {\
|
#define Log(debug_level, log_category, message, ...) do {\
|
||||||
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
if (LogSys.IsLogEnabled(debug_level, log_category))\
|
||||||
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
LogSys.Out(debug_level, log_category, __FILE__, __func__, __LINE__, message, ##__VA_ARGS__);\
|
||||||
|
|||||||
@ -86,6 +86,9 @@ struct BenchTimer
|
|||||||
void reset() { start_time = clock::now(); }
|
void reset() { start_time = clock::now(); }
|
||||||
// this is seconds
|
// this is seconds
|
||||||
double elapsed() { return std::chrono::duration<double> (clock::now() - start_time).count(); }
|
double elapsed() { return std::chrono::duration<double> (clock::now() - start_time).count(); }
|
||||||
|
std::chrono::milliseconds::rep elapsedMilliseconds() { return std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - start_time).count(); }
|
||||||
|
std::chrono::microseconds::rep elapsedMicroseconds() { return std::chrono::duration_cast<std::chrono::microseconds>(clock::now() - start_time).count(); }
|
||||||
|
std::chrono::nanoseconds::rep elapsedNanoseconds() { return std::chrono::duration_cast<std::chrono::nanoseconds>(clock::now() - start_time).count(); }
|
||||||
private:
|
private:
|
||||||
std::chrono::time_point<std::chrono::high_resolution_clock> start_time;
|
std::chrono::time_point<std::chrono::high_resolution_clock> start_time;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4956,6 +4956,20 @@ void Client::Handle_OP_ClientUpdate(const EQApplicationPacket *app) {
|
|||||||
CheckScanCloseMobsMovingTimer();
|
CheckScanCloseMobsMovingTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// see_close
|
||||||
|
if (moving) {
|
||||||
|
if (m_see_close_mobs_timer.GetRemainingTime() > 1000) {
|
||||||
|
m_see_close_mobs_timer.Disable();
|
||||||
|
m_see_close_mobs_timer.Start(1000);
|
||||||
|
m_see_close_mobs_timer.Trigger();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (m_see_close_mobs_timer.GetDuration() == 1000) {
|
||||||
|
m_see_close_mobs_timer.Disable();
|
||||||
|
m_see_close_mobs_timer.Start(60000);
|
||||||
|
m_see_close_mobs_timer.Trigger();
|
||||||
|
}
|
||||||
|
|
||||||
CheckSendBulkClientPositionUpdate();
|
CheckSendBulkClientPositionUpdate();
|
||||||
|
|
||||||
int32 new_animation = ppu->animation;
|
int32 new_animation = ppu->animation;
|
||||||
|
|||||||
@ -285,6 +285,10 @@ bool Client::Process() {
|
|||||||
entity_list.ScanCloseMobs(this);
|
entity_list.ScanCloseMobs(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_see_close_mobs_timer.Check()) {
|
||||||
|
entity_list.UpdateVisibility(this);
|
||||||
|
}
|
||||||
|
|
||||||
if (RuleB(Inventory, LazyLoadBank)) {
|
if (RuleB(Inventory, LazyLoadBank)) {
|
||||||
// poll once a second to see if we are close to a banker and we haven't loaded the bank yet
|
// poll once a second to see if we are close to a banker and we haven't loaded the bank yet
|
||||||
if (!m_lazy_load_bank && lazy_load_bank_check_timer.Check()) {
|
if (!m_lazy_load_bank && lazy_load_bank_check_timer.Check()) {
|
||||||
|
|||||||
@ -2869,6 +2869,7 @@ bool EntityList::RemoveMobFromCloseLists(Mob *mob)
|
|||||||
);
|
);
|
||||||
|
|
||||||
it->second->m_close_mobs.erase(entity_id);
|
it->second->m_close_mobs.erase(entity_id);
|
||||||
|
it->second->m_can_see_mob.erase(entity_id);
|
||||||
++it;
|
++it;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2922,6 +2923,9 @@ void EntityList::RemoveAuraFromMobs(Mob *aura)
|
|||||||
// All of the above makes a tremendous impact on the bottom line of cpu cycle performance because we run an order of magnitude
|
// All of the above makes a tremendous impact on the bottom line of cpu cycle performance because we run an order of magnitude
|
||||||
// less checks by focusing our hot path logic down to a very small subset of relevant entities instead of looping an entire
|
// less checks by focusing our hot path logic down to a very small subset of relevant entities instead of looping an entire
|
||||||
// entity list (zone wide)
|
// entity list (zone wide)
|
||||||
|
|
||||||
|
BenchTimer g_scan_bench_timer;
|
||||||
|
|
||||||
void EntityList::ScanCloseMobs(Mob *scanning_mob)
|
void EntityList::ScanCloseMobs(Mob *scanning_mob)
|
||||||
{
|
{
|
||||||
if (!scanning_mob) {
|
if (!scanning_mob) {
|
||||||
@ -2932,6 +2936,8 @@ void EntityList::ScanCloseMobs(Mob *scanning_mob)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_scan_bench_timer.reset();
|
||||||
|
|
||||||
float scan_range = zone->GetMaxUpdateRange();
|
float scan_range = zone->GetMaxUpdateRange();
|
||||||
|
|
||||||
// Reserve memory in m_close_mobs to avoid frequent re-allocations if not already reserved.
|
// Reserve memory in m_close_mobs to avoid frequent re-allocations if not already reserved.
|
||||||
@ -2959,22 +2965,27 @@ void EntityList::ScanCloseMobs(Mob *scanning_mob)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateVisibility(scanning_mob);
|
|
||||||
|
|
||||||
LogAIScanClose(
|
LogAIScanClose(
|
||||||
"[{}] Scanning close list > list_size [{}] moving [{}]",
|
"[{}] Scanning close list > list_size [{}] moving [{}] elapsed [{}] us",
|
||||||
scanning_mob->GetCleanName(),
|
scanning_mob->GetCleanName(),
|
||||||
scanning_mob->m_close_mobs.size(),
|
scanning_mob->m_close_mobs.size(),
|
||||||
scanning_mob->IsMoving() ? "true" : "false"
|
scanning_mob->IsMoving() ? "true" : "false",
|
||||||
|
g_scan_bench_timer.elapsedMicroseconds()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BenchTimer g_vis_bench_timer;
|
||||||
|
|
||||||
void EntityList::UpdateVisibility(Mob *scanning_mob)
|
void EntityList::UpdateVisibility(Mob *scanning_mob)
|
||||||
{
|
{
|
||||||
if (!scanning_mob || !scanning_mob->IsClient()) {
|
if (!scanning_mob || !scanning_mob->IsClient()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ScanCloseMobs(scanning_mob);
|
||||||
|
|
||||||
|
g_vis_bench_timer.reset();
|
||||||
|
|
||||||
// Ensure sufficient capacity in the visibility map
|
// Ensure sufficient capacity in the visibility map
|
||||||
if (scanning_mob->m_can_see_mob.bucket_count() < scanning_mob->m_close_mobs.size()) {
|
if (scanning_mob->m_can_see_mob.bucket_count() < scanning_mob->m_close_mobs.size()) {
|
||||||
scanning_mob->m_can_see_mob.reserve(scanning_mob->m_close_mobs.size());
|
scanning_mob->m_can_see_mob.reserve(scanning_mob->m_close_mobs.size());
|
||||||
@ -2991,7 +3002,7 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
auto [it_scanning_visible, inserted_scanning_visible] = scanning_mob->m_can_see_mob.try_emplace(mob_id, false);
|
auto [it_scanning_visible, inserted_scanning_visible] = scanning_mob->m_can_see_mob.try_emplace(mob_id, false);
|
||||||
bool scanning_last_known_visible = it_scanning_visible->second;
|
bool scanning_last_known_visible = it_scanning_visible->second;
|
||||||
|
|
||||||
if (!scanning_last_known_visible) {
|
if (!scanning_last_known_visible && mob->IsClient()) {
|
||||||
scanning_mob->SendAppearancePacket(
|
scanning_mob->SendAppearancePacket(
|
||||||
AppearanceType::Invisibility,
|
AppearanceType::Invisibility,
|
||||||
0,
|
0,
|
||||||
@ -3000,14 +3011,14 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
mob->CastToClient()
|
mob->CastToClient()
|
||||||
);
|
);
|
||||||
it_scanning_visible->second = true;
|
it_scanning_visible->second = true;
|
||||||
scanning_mob->Shout(fmt::format("Setting scanning_mob visible to mob [{}]", mob->GetCleanName()).c_str());
|
LogVisibilityDetail("Setting scanning_mob [{}] visible to mob [{}]", scanning_mob->GetCleanName(), mob->GetCleanName());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now update the visibility for `mob` to `scanning_mob`
|
// Now update the visibility for `mob` to `scanning_mob`
|
||||||
auto [it_mob_visible, inserted_mob_visible] = mob->m_can_see_mob.try_emplace(scanning_mob->GetID(), false);
|
auto [it_mob_visible, inserted_mob_visible] = mob->m_can_see_mob.try_emplace(scanning_mob->GetID(), false);
|
||||||
bool mob_last_known_visible = it_mob_visible->second;
|
bool mob_last_known_visible = it_mob_visible->second;
|
||||||
|
|
||||||
if (!mob_last_known_visible) {
|
if (!mob_last_known_visible && scanning_mob->IsClient()) {
|
||||||
mob->SendAppearancePacket(
|
mob->SendAppearancePacket(
|
||||||
AppearanceType::Invisibility,
|
AppearanceType::Invisibility,
|
||||||
0,
|
0,
|
||||||
@ -3016,7 +3027,7 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
scanning_mob->CastToClient()
|
scanning_mob->CastToClient()
|
||||||
);
|
);
|
||||||
it_mob_visible->second = true;
|
it_mob_visible->second = true;
|
||||||
mob->Shout(fmt::format("Setting mob visible to scanning_mob [{}]", scanning_mob->GetCleanName()).c_str());
|
LogVisibilityDetail("Setting mob [{}] visible to scanning_mob [{}]", mob->GetCleanName(), scanning_mob->GetCleanName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3032,7 +3043,7 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
auto [it, inserted] = scanning_mob->m_can_see_mob.try_emplace(mob_id, false);
|
auto [it, inserted] = scanning_mob->m_can_see_mob.try_emplace(mob_id, false);
|
||||||
bool last_known_visible = it->second;
|
bool last_known_visible = it->second;
|
||||||
|
|
||||||
if (!is_on_close_list && last_known_visible) {
|
if (!is_on_close_list && last_known_visible && mob->IsClient()) {
|
||||||
scanning_mob->SendAppearancePacket(
|
scanning_mob->SendAppearancePacket(
|
||||||
AppearanceType::Invisibility,
|
AppearanceType::Invisibility,
|
||||||
3001,
|
3001,
|
||||||
@ -3041,12 +3052,12 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
mob->CastToClient()
|
mob->CastToClient()
|
||||||
);
|
);
|
||||||
it->second = false;
|
it->second = false;
|
||||||
scanning_mob->Shout(fmt::format("Setting mob [{}] invisible to scanning_mob", mob->GetCleanName()).c_str());
|
LogVisibilityDetail("Setting mob [{}] invisible to scanning_mob [{}]", mob->GetCleanName(), scanning_mob->GetCleanName());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inverse: Update mob's view of scanning_mob visibility
|
// Inverse: Update mob's view of scanning_mob visibility
|
||||||
auto it_mob = mob->m_can_see_mob.find(scanning_mob->GetID());
|
auto it_mob = mob->m_can_see_mob.find(scanning_mob->GetID());
|
||||||
if (it_mob != mob->m_can_see_mob.end() && !scanning_mob->m_close_mobs.count(mob_id) && it_mob->second) {
|
if (it_mob != mob->m_can_see_mob.end() && !scanning_mob->m_close_mobs.count(mob_id) && it_mob->second && scanning_mob->IsClient()) {
|
||||||
mob->SendAppearancePacket(
|
mob->SendAppearancePacket(
|
||||||
AppearanceType::Invisibility,
|
AppearanceType::Invisibility,
|
||||||
3001,
|
3001,
|
||||||
@ -3055,9 +3066,17 @@ void EntityList::UpdateVisibility(Mob *scanning_mob)
|
|||||||
scanning_mob->CastToClient()
|
scanning_mob->CastToClient()
|
||||||
);
|
);
|
||||||
it_mob->second = false;
|
it_mob->second = false;
|
||||||
mob->Shout(fmt::format("Setting scanning_mob [{}] invisible to mob", scanning_mob->GetCleanName()).c_str());
|
LogVisibilityDetail("Setting scanning_mob [{}] invisible to mob [{}]", scanning_mob->GetCleanName(), mob->GetCleanName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LogVisibility(
|
||||||
|
"[{}] Visibility > list_size [{}] moving [{}] elapsed [{}] us",
|
||||||
|
scanning_mob->GetCleanName(),
|
||||||
|
scanning_mob->m_can_see_mob.size(),
|
||||||
|
scanning_mob->IsMoving() ? "true" : "false",
|
||||||
|
g_vis_bench_timer.elapsedMicroseconds()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EntityList::RemoveMerc(uint16 delete_id)
|
bool EntityList::RemoveMerc(uint16 delete_id)
|
||||||
|
|||||||
@ -129,6 +129,7 @@ Mob::Mob(
|
|||||||
position_update_melee_push_timer(500),
|
position_update_melee_push_timer(500),
|
||||||
hate_list_cleanup_timer(6000),
|
hate_list_cleanup_timer(6000),
|
||||||
m_scan_close_mobs_timer(6000),
|
m_scan_close_mobs_timer(6000),
|
||||||
|
m_see_close_mobs_timer(1000),
|
||||||
m_mob_check_moving_timer(1000),
|
m_mob_check_moving_timer(1000),
|
||||||
bot_attack_flag_timer(10000)
|
bot_attack_flag_timer(10000)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -204,6 +204,7 @@ public:
|
|||||||
std::unordered_map<uint16, Mob *> m_close_mobs;
|
std::unordered_map<uint16, Mob *> m_close_mobs;
|
||||||
std::unordered_map<int, bool> m_can_see_mob;
|
std::unordered_map<int, bool> m_can_see_mob;
|
||||||
Timer m_scan_close_mobs_timer;
|
Timer m_scan_close_mobs_timer;
|
||||||
|
Timer m_see_close_mobs_timer;
|
||||||
Timer m_mob_check_moving_timer;
|
Timer m_mob_check_moving_timer;
|
||||||
|
|
||||||
// Bot attack flag
|
// Bot attack flag
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user