diff --git a/common/database.h b/common/database.h index 1928d5025..fe08e83fb 100644 --- a/common/database.h +++ b/common/database.h @@ -141,6 +141,7 @@ public: bool CheckInstanceExpired(uint16 instance_id); bool CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version, uint32 duration); bool GetUnusedInstanceID(uint16& instance_id); + bool TryGetUnusedInstanceID(uint16& instance_id); bool IsGlobalInstance(uint16 instance_id); bool RemoveClientFromInstance(uint16 instance_id, uint32 char_id); bool RemoveClientsFromInstance(uint16 instance_id); diff --git a/common/database_instances.cpp b/common/database_instances.cpp index 4dd21c754..00c9a2476 100644 --- a/common/database_instances.cpp +++ b/common/database_instances.cpp @@ -130,11 +130,32 @@ bool Database::CreateInstance(uint16 instance_id, uint32 zone_id, uint32 version e.duration = duration; RespawnTimesRepository::ClearInstanceTimers(*this, e.id); - - return InstanceListRepository::InsertOne(*this, e).id; + InstanceListRepository::ReplaceOne(*this, e); + return instance_id > 0 && e.id; } bool Database::GetUnusedInstanceID(uint16 &instance_id) +{ + // attempt to get an unused instance id + for (int a = 0; a < 10; a++) { + uint16 attempted_id = 0; + if (TryGetUnusedInstanceID(attempted_id)) { + auto i = InstanceListRepository::NewEntity(); + i.id = attempted_id; + i.notes = "Prefetching"; + auto n = InstanceListRepository::InsertOne(*this, i); + if (n.id > 0) { + instance_id = n.id; + return true; + } + } + } + + instance_id = 0; + return false; +} + +bool Database::TryGetUnusedInstanceID(uint16 &instance_id) { uint32 max_reserved_instance_id = RuleI(Instances, ReservedInstances); uint32 max_instance_id = 32000;