When "autorespawn" is set to 1 in emp_vehicle_spawner it will only spawn a new vehicle once the full "emp_sv_vehicle_fadeout_time" for the previous vehicle's carcass has run out. Even if you recycle the carcass. It should be changed to either have a new vehicle respawn when the previous one has been destroyed OR spawn a new vehicle if the carcass has been recycled. Even better would be to have both choices.
My code kung fu is weak but growing, so I'm going to take a stab at this one. Real coders chime in please. emp_vehicle_spawner.cpp Line 204 CEmpVehicleSpawner::Think It doesn't seem to take carcass recycle in to account at all, just tags on a future recycle time based on fadeout_time. Code: // Check for death if (!m_flRespawnTime && m_pLastVehicle->m_flDestroyTime != 0) --> m_flRespawnTime = gpGlobals->curtime + emp_sv_vehicle_fadeout_time.GetInt(); // Death detected, try to respawn if (m_flRespawnTime && gpGlobals->curtime >= m_flRespawnTime && BuildVehicle(NULL)) m_flRespawnTime = 0; Maybe adding additional info to the BE and NF engy recycle code could correct this Emp_weapon_nf_engineer_kit.cpp Line 717 Code: if (finalHealth == 0) { // This carcass has been completely recycled. --> pTank->m_flRespawnTime = 1; // New Line. Carcass gone so skip "Check for Death" pTank->RemoveVehicle(); pOldTank = NULL; m_irecycledresources = 0; m_fRecycledResourcesForTankRemainder = 0.0f; } If RespawnTime = 1, then "check for death" is skipped In "Death detected", each of the three checks are now satisfied and RespawnTime gets set to zero.
Shouldn't you set m_flDestroyTime instead of m_flRespawnTime in the engineer kit code? Btw, fl...Time fields are supposed to be assigned 0 or gpGlobals->curtime, 1 is not really a useful time.
Setting DestroyTime to zero in engie code does achieve the correct result for "Death Check". But doesn't satisfy the check for "try to respawn" if RespawnTime is at default 0. Instead of "= 1", then maybe a more elegant line could be.... pTank->m_flRespawnTime = gpGlobals->curtime - RESPAWNABLE_PROP_DEFAULT_TIME; // ? This would subtract the default value of 60 from current time allowing a respawn immediately after recyle. Or that's my hope anyway. "Death Check" time extension should be bypassed, and then the true result of "try respawn" resets RespawnTime back to zero. In all cases I could find, DestroyTime is simply float being used as true/false condition, not as a real time stamp value. So that's why "1" seemed and easy option. (though hackish I can now see)
If you want it to respawn right now, it would be right to set it to gpGlobals->curtime, if you want it to respawn RESPAWNABLE_PROP_DEFAULT_TIME seconds from now you could set it to gpGlobals->curtime + RESPAWNABLE_PROP_DEFAULT_TIME. You are probably right that it doesn't change the behavior but it makes the code follow the same conventions as the rest of the codebase.
pTank->m_flRespawnTime = gpGlobals->curtime - RESPAWNABLE_PROP_DEFAULT_TIME My thinking here is that if the code has a chance to set RespawnTime to a future time, before the engie recycle happens... m_flRespawnTime = gpGlobals->curtime + emp_sv_vehicle_fadeout_time.GetInt(); ... then just setting to curtime might not be far enough ahead for an instant respawn. So setting it to curtime minus a bit in the past would take care of that case.
Times are supposed to be checked by comparing greater than or equal to curtime but that might not be applied everywhere. If you want to be sure you can subtract one tick, you can find the amount of time of one tick in the gpGlobals object, not sure which field.
I'll have a look. Or maybe another option would be to simply reverse any possible time addition with... pTank->m_flRespawnTime = gpGlobals->curtime - emp_sv_vehicle_fadeout_time.GetInt(); //??
When is this autorespawn feature used exactly? I've worked out a change that would allow respawn after a recycle.
So maps without normal VF's that spawn their own replacement vehicles periodically. I'm guessing this reaches a max vehicle problem where you server doesn't use the default carcass fade-out time?
No, havoc and atomic only ever spawn one vehicle per spawner. Which is why it's important to have it respawn as soon as the carcass has been recycled. But really there should also be an option for it to ignore the carcass entirely, and just spawn a new vehicle as soon as the old one dies.
I always took it as a punishment for losing the vehicle in the first place like every other game. It gives time for the other team to advance instead of just instantly having your tank back.
As with player spawns some small time penalty seems appropriate. "Insta-spawn at recycle" sounds like something easily turned in to at least a mini-sploit on v-spawner maps. Rush a tank, loose it, 2 engie recycle, rush another ... rinse and repeat. I don't know how v-spawner maps work. I'm guessing they periodically check for an available vehicle, if none available then wait a period before checking again? Depending on the mechanics, a patch of the code may still leave long delays which might need map updates to improve. The patch would put the carcass on the queue sooner, but what is the v-spawner doing about it?