-- LUA Script - precede every function and global member with lowercase name of script + '_main' g_teleporter_name_list = {} function teleporter_name_init_name(e, name) -- initialise transporter within level g_teleporter_name_list[e] = {name = name, state = 'off', tTime = 0} end local function distBetween (e1, e2) local Dx, Dy, Dz = e1.x - e2.x, e1.y - e2.y, e1.z - e2.z return (Dx * Dx + Dy * Dy + Dz * Dz) end local visuals = {Amb = 0} local function saveVisuals() visuals.Amb = GetAmbienceIntensity() end local function resetVisuals() SetAmbienceIntensity(visuals.Amb) end local function CloserThan(Ent, dist) local DY = Ent.y - g_PlayerPosY if math.abs(DY) < 100 then local DX = Ent.x - g_PlayerPosX local DZ = Ent.z - g_PlayerPosZ return (DX * DX + DZ * DZ) < dist * dist end return false end function teleporter_name_main(e) local TP = g_teleporter_name_list[e] local Ent = g_Entity[e] if TP.state == 'off' and CloserThan(Ent, 120) and not CloserThan(Ent, 50) then -- transporter aware of players proximity and powers up if g_Time > TP.tTime then TP.state = 'pwup' end end if TP.state == 'pwup' and CloserThan(Ent, 20) then -- find matching or closest transporter local closest = math.huge local otherEnd = nil local Ent = g_Entity[e] local useName = (TP.name ~= 'Transporter Green' and TP.name ~= 'Transporter Blue') for k,v in pairs(g_teleporter_name_list) do if k ~= e then if useName and v.name == TP.name then otherEnd = k break else local dist = distBetween(g_Entity[k], Ent) if dist < closest then otherEnd = k closest = dist end end end end if otherEnd ~= nil then TP.oeEnt = g_Entity[otherEnd] TP.state = 'tran' saveVisuals() else TP.oeEnt = nil end end if TP.state == 'tran' then SetAmbienceIntensity(255) TP.state = 'done' -- transport player here PlaySound(e, 0) TP.tTime = g_Time + 200 end if TP.state == 'done' and g_Time > TP.tTime then local Ent = g_Entity[e] local OE = TP.oeEnt SetFreezePosition(g_PlayerPosX - (Ent.x - OE.x), g_PlayerPosY - (Ent.y - OE.y), g_PlayerPosZ - (Ent.z - OE.z)); TransportToFreezePositionOnly() TP.state = 'over' resetVisuals() end if TP.state ~= 'off' and not CloserThan(Ent, 120) and g_Time > TP.tTime then -- transporter powers down and cools down TP.state = 'off' TP.tTime = g_Time + 500 end end