Let us not get rude my good and excellent dude: I know the tibia networking protocol like the back of my hand and Let me repeat;
there is no server function for handling hotkeys (there are infact surprisingly few incoming parse packet commands at-all!; you just have the core things you would need like throw, use, set-outfit, turn, move, logoff, and that's about it, a hotkey would just be a zero position use command) when you 'use' in the battle window or press on a hotkey the client tries to handle it if possible acting as if you had clicked directly on the entity in question on tile / in world, if an ID DOES have to be read it will never be actually trusted and will just be used as a 'could you please use this IF IT DOES exist in my inventory', note any any such interface WOULD be subject to a CID / SID interface limitation problem (newer Tibia protocols may indeed do something like that which would sadly be disappointingly limited but atleast still not actually broken or hackable)
All low level networking commands include both position and stack pos - the fact that you saw a server using CID is not conclusive evidence that the Tibia protocol lacks this data, as much as it was a sign that the particular server you were playing on was simply doing things insecurely, it will always be possible to process a request from the client in a way that doesn't require any trust. (tho it's extremely easy for servers to fail to do that!)
The client does ALSO SEND THE CID but it's just totally client controlled / insecure (and it's considered bad practice to ever actually use it).
I'd be very curious if you can reproduce a situation which shows a modern server acting upon a CID but looking at the Protocol.cpp code its easy to see that it should really NEVER be using it for anything (it's not trustable and its also just never needed as you also receive sufficient location information in all the relevant packet types).
I do remember there were places in older servers where decoded ItemIDs were just being passes straight off to the LUA (this might have been a source of the interesting error message you saw which seemed to ''know about item types which were no longer even in your possession''!)
Those servers were really badly written! clients data is NEVER to be trusted! (after all it can just send ANY ID it likes!! we only want to trust locations since we can look those up in our server data and we should ofcoarse still verify them as being possible / valid before use)
I have no doubt there probably are servers that do this part wrong, but it's less a sign that they have to do it that way and more just a sign that they are lazy. (the Tibia protocol itself is filled with examples like this; where once initially trusted client data was revoked but not removed, with the untrusted data still being sent right next to the useful bytes) server maintainers should keep an eye out for what data NOT to trust

(eg any bytes determined by the client)
If you do find a protocol packet parsing function that clearly takes an ID but not a location (perhaps in some new fandadle version) I'd be very curious to read it! (It's definitely not a thing done in any of the older protocols and I'd be quite surprised if they ever did/do break with that tradition)
Your example is thus
not a valid
counter argument (indeed
any argument countering would have to premise with the Idea that Tibia's protocol is fundamentally insecure, and that is simply something that that has been tested quite well for some time now)
Hope that's nice and clear!, All the best!