You still kept the 1-second constant loop at the end of Main.
As I said, you're getting the script stuck (for when you script something below it), as it will just keep waiting forever.
Other than that, structure-wise the script is fine, though scripting-wise DamageMultiplication is broken, and nothing will happen.
Here's a quick script I'd do for what you're trying to do:
(Keep in mind I'm not good with this kind of loop. An issue here is that, for example, whatever you script, like the damage multiplier, will CONSTANTLY be applied. In this case it's harmless, but if you do something else, like say, spawning something, well... it's going to keep spawning forever until the game crashes)
while true do --Anything inside here gets looped forever
FindX, FindY, FindZ = PlayerGetPosXYZ() --Constantly gets Jimmy's coordinates, and gives each coordinate a name, to use as you please.
TextPrintString("Finding peds matching specified conditions...", 1, 1) --Constantly prints this when not printing anything below, aka before it finds a ped. Printing text is the easiest way to see your script working in real time.
for i, Ped in ({PedFindInAreaXYZ(FindX, FindY, FindZ, 80)}) do --Starts a loop of constantly finding peds in a specific range (80) and stores them in a table.
if i ~= gPlayer and not PedIsDead(Ped) then --Some conditions
if PedGetFaction(Ped) == 5 then --Preppies faction condition
TextPrintString("Found a prep!", 1, 1)
--Script something here idk
elseif PedGetFaction(Ped) == 1 then --Nerds faction condition
TextPrintString("Found a Nerd!", 1, 1)
--Script something here idk
end
end
end
Wait(0)
end