There's 3 problems with that.
1. You're adding 1 ROI, but clearing all, so if they had other ROI's in their inventory beforehand then they'd lose them. Use Inventory [take] instead.
2. You're setting an event script at some arbitrary point in time, and not unsetting it.
3. It's still not really going to work well. SetEventScript is also global, so everyone will be running that script if they swing their own ROI regardless of their history or other state, until it is unset. Because SetEventScripts are global, generally they ought to be set only on the PlayerJoin event.
4 problems actually.
He's also setting a swing event for the ring of ice, Which does not do anything to help the OP, Who wants to use the freezing effect of the ring.
Why not skip all the hassle and just spawn a temp zone on the player with .0001 speed and 10 gravity, then delete it after X seconds?
That doesn't freeze the player's camera.
Honestly, What I would do is something similar to the original script.
Item [RingOfIce] [durability=1]
Inventory [player] [add] [RingOfIce]
Item [RingOfIce] [durability=default]
This should give you a ring of ice that is defaulted to 1 durability.
Yes, Item commands are global. However, Most scripts have a running time of fractions of a millisecond. So the only time this would affect other players is if another player got an ice ring within a fifth of a millisecond of this script running.
The likelihood of that happening is so low that I really don't think that it would ever affect gameplay.
Here's the thing though. Are you making a map where you want people to get full durability ice rings anyway? If not, Why not just make an item command that changes the durability on player join?