If i'm not wrong, after a quick read to the code, you are using GetEngineeringNextEventType() to detect the shield hit. that will check for shield hits in your events, and also in the AI's events, what in large battles can be a bit laggy.
go for what MLeo said, or use ET_WEAPON_HIT. you can filter the shield rating from both events
(I think MLeo is talking about ET_TACTICAL_SHIELD_LEVEL_CHANGE, this one has also listeners for each shield vector:
ET_TACTICAL_SHIELD_0_LEVEL_CHANGE, _SHIELD_1, _SHIELD_2, and so on. so, instead of a single listener broadcasting the whole game for events, you have six but restricted to the events you want to hear.)