Fixes an issue with instance timer display (#6988)
* Fixes #6835.
* Follow up to ac7292c.
* Instance packet updates were ignored if instances had infinite duration or timeouts.
* Infinite duration or timeout instances now store the cap as INT64_MAX instead of 0.
* Converts the TimeLimit and IdleTimeOut storage types from uint32 to int64 to allow longer 'infinite' duration instances.
Thanks to @samers1 and @Atemo!
This commit is contained in:
@@ -88,11 +88,14 @@ uint64 InstanceDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
||||
}
|
||||
|
||||
if (this->nodeExists(node, "TimeLimit")) {
|
||||
uint32 limit;
|
||||
int64 limit;
|
||||
|
||||
if (!this->asUInt32(node, "TimeLimit", limit))
|
||||
if (!this->asInt64(node, "TimeLimit", limit))
|
||||
return 0;
|
||||
|
||||
if (limit == 0) // Infinite duration
|
||||
limit = INT64_MAX;
|
||||
|
||||
instance->limit = limit;
|
||||
} else {
|
||||
if (!exists)
|
||||
@@ -100,11 +103,14 @@ uint64 InstanceDatabase::parseBodyNode(const ryml::NodeRef& node) {
|
||||
}
|
||||
|
||||
if (this->nodeExists(node, "IdleTimeOut")) {
|
||||
uint32 idle;
|
||||
int64 idle;
|
||||
|
||||
if (!this->asUInt32(node, "IdleTimeOut", idle))
|
||||
if (!this->asInt64(node, "IdleTimeOut", idle))
|
||||
return 0;
|
||||
|
||||
if (idle == 0) // Infinite duration
|
||||
idle = INT64_MAX;
|
||||
|
||||
instance->timeout = idle;
|
||||
} else {
|
||||
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)
|
||||
{
|
||||
// No timer
|
||||
if (!idata || idata->keep_timer != INVALID_TIMER || idata->keep_limit == 0)
|
||||
if (!idata || idata->keep_timer != INVALID_TIMER)
|
||||
return false;
|
||||
|
||||
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;
|
||||
|
||||
// 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);
|
||||
|
||||
switch(idata->mode) {
|
||||
@@ -376,19 +382,19 @@ bool instance_startkeeptimer(std::shared_ptr<s_instance_data> idata, int instanc
|
||||
break;
|
||||
case IM_CHAR:
|
||||
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;
|
||||
case IM_PARTY:
|
||||
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;
|
||||
case IM_GUILD:
|
||||
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;
|
||||
case IM_CLAN:
|
||||
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;
|
||||
default:
|
||||
return false;
|
||||
@@ -415,7 +421,7 @@ bool instance_startidletimer(std::shared_ptr<s_instance_data> idata, int instanc
|
||||
return false;
|
||||
|
||||
// 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);
|
||||
|
||||
switch(idata->mode) {
|
||||
@@ -423,19 +429,19 @@ bool instance_startidletimer(std::shared_ptr<s_instance_data> idata, int instanc
|
||||
break;
|
||||
case IM_CHAR:
|
||||
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;
|
||||
case IM_PARTY:
|
||||
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;
|
||||
case IM_GUILD:
|
||||
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;
|
||||
case IM_CLAN:
|
||||
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;
|
||||
default:
|
||||
return false;
|
||||
@@ -457,6 +463,7 @@ bool instance_stopidletimer(std::shared_ptr<s_instance_data> idata, int instance
|
||||
return false;
|
||||
|
||||
// Delete the timer - Party has returned or instance is destroyed
|
||||
idata->idle_limit = 0;
|
||||
delete_timer(idata->idle_timer, instance_delete_timer);
|
||||
idata->idle_timer = INVALID_TIMER;
|
||||
|
||||
@@ -465,19 +472,19 @@ bool instance_stopidletimer(std::shared_ptr<s_instance_data> idata, int instance
|
||||
break;
|
||||
case IM_CHAR:
|
||||
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;
|
||||
case IM_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;
|
||||
case IM_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;
|
||||
case IM_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;
|
||||
default:
|
||||
return false;
|
||||
@@ -677,15 +684,8 @@ int instance_addmap(int instance_id) {
|
||||
|
||||
// Set to busy, update timers
|
||||
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->nonpc = db->nonpc;
|
||||
|
||||
@@ -724,19 +724,19 @@ int instance_addmap(int instance_id) {
|
||||
break;
|
||||
case IM_CHAR:
|
||||
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;
|
||||
case IM_PARTY:
|
||||
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;
|
||||
case IM_GUILD:
|
||||
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;
|
||||
case IM_CLAN:
|
||||
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;
|
||||
default:
|
||||
return 0;
|
||||
@@ -934,7 +934,7 @@ bool instance_destroy(int instance_id)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
unsigned int now = static_cast<unsigned int>(time(nullptr));
|
||||
int64 now = time(nullptr);
|
||||
|
||||
if(idata->keep_limit && idata->keep_limit <= now)
|
||||
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
|
||||
int map_instance_id = map_getmapdata(sd->bl.m)->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;
|
||||
}
|
||||
}
|
||||
@@ -1134,7 +1134,7 @@ bool instance_addusers(int 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;
|
||||
|
||||
// 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);
|
||||
|
||||
if(!idata || idata->state != INSTANCE_BUSY || idata->idle_limit == 0)
|
||||
if(!idata || idata->state != INSTANCE_BUSY)
|
||||
return false;
|
||||
|
||||
int users = 0;
|
||||
@@ -1190,8 +1190,8 @@ void do_reload_instance(void)
|
||||
// Create new keep timer
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user