It looks like event handlers are dynamically being registered, that should not happen. They should register at the start only and never unregister. Rather you should call a function from that and change 'that' function as you need to do different things (or no-op if nothing).
That may or may not be the only issue, but it is definitely an issue. :-)
Even on_nth_tick? I can re-arrange things to use on_tick (because it checks every tick for more fuel if you have none), but then I'd have an on_tick that does nothing for 10k ticks on average.
I have to admit I have not tested this on multiplayer, so the superficial flaws may be hiding other fundamental flaws that don't apply to singleplayer.
Ah how'd I miss the update notification. Yes, doesn't matter the event, if a script.* is called for an event then it should always be called on script load, never conditionally through-out gameplay, just once at the load and done.