|
@@ -88,11 +88,14 @@ uint64 InstanceDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
|
}
|
|
}
|
|
|
|
|
|
if (this->nodeExists(node, "TimeLimit")) {
|
|
if (this->nodeExists(node, "TimeLimit")) {
|
|
- uint32 limit;
|
|
|
|
|
|
+ int64 limit;
|
|
|
|
|
|
- if (!this->asUInt32(node, "TimeLimit", limit))
|
|
|
|
|
|
+ if (!this->asInt64(node, "TimeLimit", limit))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ if (limit == 0) // Infinite duration
|
|
|
|
+ limit = INT64_MAX;
|
|
|
|
+
|
|
instance->limit = limit;
|
|
instance->limit = limit;
|
|
} else {
|
|
} else {
|
|
if (!exists)
|
|
if (!exists)
|
|
@@ -100,11 +103,14 @@ uint64 InstanceDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
|
}
|
|
}
|
|
|
|
|
|
if (this->nodeExists(node, "IdleTimeOut")) {
|
|
if (this->nodeExists(node, "IdleTimeOut")) {
|
|
- uint32 idle;
|
|
|
|
|
|
+ int64 idle;
|
|
|
|
|
|
- if (!this->asUInt32(node, "IdleTimeOut", idle))
|
|
|
|
|
|
+ if (!this->asInt64(node, "IdleTimeOut", idle))
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ if (idle == 0) // Infinite duration
|
|
|
|
+ idle = INT64_MAX;
|
|
|
|
+
|
|
instance->timeout = idle;
|
|
instance->timeout = idle;
|
|
} else {
|
|
} else {
|
|
if (!exists)
|
|
if (!exists)
|
|
@@ -359,7 +365,7 @@ static TIMER_FUNC(instance_subscription_timer){
|
|
bool instance_startkeeptimer(std::shared_ptr<s_instance_data> idata, int instance_id)
|
|
bool instance_startkeeptimer(std::shared_ptr<s_instance_data> idata, int instance_id)
|
|
{
|
|
{
|
|
// No timer
|
|
// No timer
|
|
- if (!idata || idata->keep_timer != INVALID_TIMER || idata->keep_limit == 0)
|
|
|
|
|
|
+ if (!idata || idata->keep_timer != INVALID_TIMER)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
std::shared_ptr<s_instance_db> db = instance_db.find(idata->id);
|
|
std::shared_ptr<s_instance_db> db = instance_db.find(idata->id);
|
|
@@ -368,7 +374,7 @@ bool instance_startkeeptimer(std::shared_ptr<s_instance_data> idata, int instanc
|
|
return false;
|
|
return false;
|
|
|
|
|
|
// Add timer
|
|
// Add timer
|
|
- idata->keep_limit = static_cast<unsigned int>(time(nullptr)) + db->limit;
|
|
|
|
|
|
+ idata->keep_limit = time(nullptr) + db->limit;
|
|
idata->keep_timer = add_timer(gettick() + db->limit * 1000, instance_delete_timer, instance_id, 0);
|
|
idata->keep_timer = add_timer(gettick() + db->limit * 1000, instance_delete_timer, instance_id, 0);
|
|
|
|
|
|
switch(idata->mode) {
|
|
switch(idata->mode) {
|
|
@@ -376,19 +382,19 @@ bool instance_startkeeptimer(std::shared_ptr<s_instance_data> idata, int instanc
|
|
break;
|
|
break;
|
|
case IM_CHAR:
|
|
case IM_CHAR:
|
|
if (map_charid2sd(idata->owner_id)) // Notify player of the added instance timer
|
|
if (map_charid2sd(idata->owner_id)) // Notify player of the added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_PARTY:
|
|
case IM_PARTY:
|
|
if (party_search(idata->owner_id)) // Notify party of the added instance timer
|
|
if (party_search(idata->owner_id)) // Notify party of the added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_GUILD:
|
|
case IM_GUILD:
|
|
if (guild_search(idata->owner_id)) // Notify guild of the added instance timer
|
|
if (guild_search(idata->owner_id)) // Notify guild of the added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_CLAN:
|
|
case IM_CLAN:
|
|
if (clan_search(idata->owner_id)) // Notify clan of the added instance timer
|
|
if (clan_search(idata->owner_id)) // Notify clan of the added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return false;
|
|
return false;
|
|
@@ -415,7 +421,7 @@ bool instance_startidletimer(std::shared_ptr<s_instance_data> idata, int instanc
|
|
return false;
|
|
return false;
|
|
|
|
|
|
// Add the timer
|
|
// Add the timer
|
|
- idata->idle_limit = static_cast<unsigned int>(time(nullptr)) + db->timeout;
|
|
|
|
|
|
+ idata->idle_limit = time(nullptr) + db->timeout;
|
|
idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0);
|
|
idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0);
|
|
|
|
|
|
switch(idata->mode) {
|
|
switch(idata->mode) {
|
|
@@ -423,19 +429,19 @@ bool instance_startidletimer(std::shared_ptr<s_instance_data> idata, int instanc
|
|
break;
|
|
break;
|
|
case IM_CHAR:
|
|
case IM_CHAR:
|
|
if (map_charid2sd(idata->owner_id)) // Notify player of added instance timer
|
|
if (map_charid2sd(idata->owner_id)) // Notify player of added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_PARTY:
|
|
case IM_PARTY:
|
|
if (party_search(idata->owner_id)) // Notify party of added instance timer
|
|
if (party_search(idata->owner_id)) // Notify party of added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_GUILD:
|
|
case IM_GUILD:
|
|
if (guild_search(idata->owner_id)) // Notify guild of added instance timer
|
|
if (guild_search(idata->owner_id)) // Notify guild of added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_CLAN:
|
|
case IM_CLAN:
|
|
if (clan_search(idata->owner_id)) // Notify clan of added instance timer
|
|
if (clan_search(idata->owner_id)) // Notify clan of added instance timer
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return false;
|
|
return false;
|
|
@@ -457,6 +463,7 @@ bool instance_stopidletimer(std::shared_ptr<s_instance_data> idata, int instance
|
|
return false;
|
|
return false;
|
|
|
|
|
|
// Delete the timer - Party has returned or instance is destroyed
|
|
// Delete the timer - Party has returned or instance is destroyed
|
|
|
|
+ idata->idle_limit = 0;
|
|
delete_timer(idata->idle_timer, instance_delete_timer);
|
|
delete_timer(idata->idle_timer, instance_delete_timer);
|
|
idata->idle_timer = INVALID_TIMER;
|
|
idata->idle_timer = INVALID_TIMER;
|
|
|
|
|
|
@@ -465,19 +472,19 @@ bool instance_stopidletimer(std::shared_ptr<s_instance_data> idata, int instance
|
|
break;
|
|
break;
|
|
case IM_CHAR:
|
|
case IM_CHAR:
|
|
if (map_charid2sd(idata->owner_id)) // Notify the player
|
|
if (map_charid2sd(idata->owner_id)) // Notify the player
|
|
- clif_instance_changestatus(instance_id, IN_NOTIFY, 0);
|
|
|
|
|
|
+ clif_instance_changestatus(instance_id, IN_NOTIFY, static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_PARTY:
|
|
case IM_PARTY:
|
|
if (party_search(idata->owner_id)) // Notify the party
|
|
if (party_search(idata->owner_id)) // Notify the party
|
|
- clif_instance_changestatus(instance_id, IN_NOTIFY, 0);
|
|
|
|
|
|
+ clif_instance_changestatus(instance_id, IN_NOTIFY, static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_GUILD:
|
|
case IM_GUILD:
|
|
if (guild_search(idata->owner_id)) // Notify the guild
|
|
if (guild_search(idata->owner_id)) // Notify the guild
|
|
- clif_instance_changestatus(instance_id, IN_NOTIFY, 0);
|
|
|
|
|
|
+ clif_instance_changestatus(instance_id, IN_NOTIFY, static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_CLAN:
|
|
case IM_CLAN:
|
|
if (clan_search(idata->owner_id)) // Notify the clan
|
|
if (clan_search(idata->owner_id)) // Notify the clan
|
|
- clif_instance_changestatus(instance_id, IN_NOTIFY, 0);
|
|
|
|
|
|
+ clif_instance_changestatus(instance_id, IN_NOTIFY, static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return false;
|
|
return false;
|
|
@@ -677,15 +684,8 @@ int instance_addmap(int instance_id) {
|
|
|
|
|
|
// Set to busy, update timers
|
|
// Set to busy, update timers
|
|
idata->state = INSTANCE_BUSY;
|
|
idata->state = INSTANCE_BUSY;
|
|
- if (db->timeout > 0) {
|
|
|
|
- idata->idle_limit = static_cast<unsigned int>(time(nullptr)) + db->timeout;
|
|
|
|
- idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (db->limit > 0) {
|
|
|
|
- //This will allow the instance to get a time in 'instance_startkeeptimer'
|
|
|
|
- idata->keep_limit = 1;
|
|
|
|
- }
|
|
|
|
|
|
+ idata->idle_limit = time(nullptr) + db->timeout;
|
|
|
|
+ idata->idle_timer = add_timer(gettick() + db->timeout * 1000, instance_delete_timer, instance_id, 0);
|
|
idata->nomapflag = db->nomapflag;
|
|
idata->nomapflag = db->nomapflag;
|
|
idata->nonpc = db->nonpc;
|
|
idata->nonpc = db->nonpc;
|
|
|
|
|
|
@@ -724,19 +724,19 @@ int instance_addmap(int instance_id) {
|
|
break;
|
|
break;
|
|
case IM_CHAR:
|
|
case IM_CHAR:
|
|
if (map_charid2sd(idata->owner_id)) // Inform player of the created instance
|
|
if (map_charid2sd(idata->owner_id)) // Inform player of the created instance
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_PARTY:
|
|
case IM_PARTY:
|
|
if (party_search(idata->owner_id)) // Inform party members of the created instance
|
|
if (party_search(idata->owner_id)) // Inform party members of the created instance
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_GUILD:
|
|
case IM_GUILD:
|
|
if (guild_search(idata->owner_id)) // Inform guild members of the created instance
|
|
if (guild_search(idata->owner_id)) // Inform guild members of the created instance
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
case IM_CLAN:
|
|
case IM_CLAN:
|
|
if (clan_search(idata->owner_id)) // Inform clan members of the created instance
|
|
if (clan_search(idata->owner_id)) // Inform clan members of the created instance
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
return 0;
|
|
return 0;
|
|
@@ -934,7 +934,7 @@ bool instance_destroy(int instance_id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- unsigned int now = static_cast<unsigned int>(time(nullptr));
|
|
|
|
|
|
+ int64 now = time(nullptr);
|
|
|
|
|
|
if(idata->keep_limit && idata->keep_limit <= now)
|
|
if(idata->keep_limit && idata->keep_limit <= now)
|
|
type = IN_DESTROY_LIVE_TIMEOUT;
|
|
type = IN_DESTROY_LIVE_TIMEOUT;
|
|
@@ -1117,7 +1117,7 @@ bool instance_reqinfo(struct map_session_data *sd, int instance_id)
|
|
} else if (idata->state == INSTANCE_BUSY) { // Give info on the instance if busy
|
|
} else if (idata->state == INSTANCE_BUSY) { // Give info on the instance if busy
|
|
int map_instance_id = map_getmapdata(sd->bl.m)->instance_id;
|
|
int map_instance_id = map_getmapdata(sd->bl.m)->instance_id;
|
|
if (map_instance_id == 0 || map_instance_id == instance_id) {
|
|
if (map_instance_id == 0 || map_instance_id == instance_id) {
|
|
- clif_instance_status(instance_id, idata->keep_limit, idata->idle_limit);
|
|
|
|
|
|
+ clif_instance_status(instance_id, static_cast<uint32>(idata->keep_limit), static_cast<uint32>(idata->idle_limit));
|
|
sd->instance_mode = idata->mode;
|
|
sd->instance_mode = idata->mode;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1134,7 +1134,7 @@ bool instance_addusers(int instance_id)
|
|
{
|
|
{
|
|
std::shared_ptr<s_instance_data> idata = util::umap_find(instances, instance_id);
|
|
std::shared_ptr<s_instance_data> idata = util::umap_find(instances, instance_id);
|
|
|
|
|
|
- if(!idata || idata->state != INSTANCE_BUSY || idata->idle_limit == 0)
|
|
|
|
|
|
+ if(!idata || idata->state != INSTANCE_BUSY)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
// Stop the idle timer if we had one
|
|
// Stop the idle timer if we had one
|
|
@@ -1155,7 +1155,7 @@ bool instance_delusers(int instance_id)
|
|
{
|
|
{
|
|
std::shared_ptr<s_instance_data> idata = util::umap_find(instances, instance_id);
|
|
std::shared_ptr<s_instance_data> idata = util::umap_find(instances, instance_id);
|
|
|
|
|
|
- if(!idata || idata->state != INSTANCE_BUSY || idata->idle_limit == 0)
|
|
|
|
|
|
+ if(!idata || idata->state != INSTANCE_BUSY)
|
|
return false;
|
|
return false;
|
|
|
|
|
|
int users = 0;
|
|
int users = 0;
|
|
@@ -1190,8 +1190,8 @@ void do_reload_instance(void)
|
|
// Create new keep timer
|
|
// Create new keep timer
|
|
std::shared_ptr<s_instance_db> db = instance_db.find(idata->id);
|
|
std::shared_ptr<s_instance_db> db = instance_db.find(idata->id);
|
|
|
|
|
|
- if (db && db->limit > 0)
|
|
|
|
- idata->keep_limit = static_cast<unsigned int>(time(nullptr)) + db->limit;
|
|
|
|
|
|
+ if (db)
|
|
|
|
+ idata->keep_limit = time(nullptr) + db->limit;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|