You're mixing a lot of low level implementation detail in with the high level concepts here, which makes it harder to understand. Forget about asset IDs, packets, ticks, and any other low level stuff. Solve the problem purely in terms of abstract information exchange first. Then, write the code to implement that.
To answer your first paragraph in these more abstract terms - the client needs to send enough information to the server for the server to be able to meaningfully process it, no more, no less. That will probably include an ID so that the server can respond and say “that thing you were calling ‘TempEntity123’, is really called ‘Entity456’ ”. Obviously if it's a per-process ID, the server doesn't need to tell the client of a replacement ID, it just tells it that the entity is confirmed to be created.
As for the rest… it's still not clear why a client should ever fail to ‘predict’ a rocket that it, itself, has launched. This isn't about how small the chance is - it should never happen. If it does, it's a bug, and all you have to do is decide how to report the bug so that you can fix it.
Unless you mean something different by “properly predict”. Usually, ‘prediction’ in most game networking is just a fancy way of saying ‘executed locally before the server had a chance to verify’. And this should be restricted to only what is essential for responsive gameplay.
I can't fathom a situation where the server somehow knows that it needs to spawn an entity based on client input when that client itself failed to spawn the entity. Perform whatever client-side validation you need to do first, then send the necessary information to the server about it.
allencook said:
if the player predicts the rocket hit a moving player, but it actually didn't hit it on the server
This should almost never happen, because the state of the rocket and the remote player are both being sent by the server and the client is only rendering what is being sent.
There are only really 2 situations where this isn't the case:
- the initial ‘predicted’ phase where the server hasn't yet responded to confirm the rocket's existence
- if/when you're doing some extrapolation of the remotely-controlled objects beyond the state that you've been sent.
In both these situations, you're only doing this for visual purposes and to reduce apparent latency, so you shouldn't be basing any actual game logic on it. No objects should be getting killed or despawned, apart from purely visual ones. e.g. You might predict that you need explosion visuals - but you shouldn't create a physics-based explosion client-side.
allencook said:
we should just put them in a “disabled” state
If you really need to be able to remove things from play based on the client's decision making, without waiting for the server, then a temporary ‘client-disabled’ state is a possibility. But you're mostly just opening yourself up to even more complexity, especially since you now have the potential for the rest of the game to get out of sync because you've disabled an object prematurely.
The simplest and best answer is to make no significant changes to the client-side simulation until the server requests them, except what is absolutely necessary for responsiveness.