local triggered = {} local opened_time = {} direction = {} local door_set = {} door_name = {} local current_time = os.clock local nearest_carriable_object = {} local nearest_carriable_object_dist = {} local door_delay = 3 function pressure_plate_init_name(e,name) door_name[e] = name door_set[e] = nil triggered[e] = 0 direction[e] = 0 opened_time[e] = 0 nearest_carriable_object[e] = e nearest_carriable_object_dist[e] = 99999 end function pressure_plate_main(e) if door_set[e] == nil then for a = 1,9999 do if door_name[a] ~= nil and a ~= e then if door_name[a] == door_name[e] then door_set[e] = a break end end end else PlayerDist = GetPlayerDistance(e) if triggered[e] == 0 then if GetTimer(e) > 250 then nearest_carriable_object_dist[e] = 99999 StartTimer(e) for a = 1,9999 do if carriable_object[a] ~= nil and carriable_object[a] == 1 then if GetDistance(e,a) < nearest_carriable_object_dist[e] then nearest_carriable_object[e] = a nearest_carriable_object_dist[e] = GetDistance(e,a) end end end end if PlayerDist < 80 or GetDistance(e,nearest_carriable_object[e]) < 80 then -- open door when player stands on plate triggered[e] = 1 direction[e] = 0 if g_Entity[door_set[e]]['animating'] == 0 then SetAnimation(direction[e]) PlayAnimation(door_set[e]) g_Entity[door_set[e]]['animating'] = 1 end PlaySound(door_set[e],0) CollisionOff(door_set[e]) end elseif triggered[e] == 1 then if PlayerDist < 90 or GetDistance(e,nearest_carriable_object[e]) < 90 then -- delay countdown until player steps off plate opened_time[e] = current_time() else if (PlayerDist > 90 or GetDistance(e,nearest_carriable_object[e]) > 90) and opened_time[e]+door_delay < current_time() then -- close door after delay time has passed triggered[e] = 0 direction[e] = 1 if g_Entity[door_set[e]]['animating'] == 0 then SetAnimation(direction[e]) PlayAnimation(door_set[e]) g_Entity[door_set[e]]['animating'] = 1 end PlaySound(door_set[e],1) CollisionOn(door_set[e]) end end end end end function pressure_plate_exit(e) end function GetDistance(e,v) if g_Entity[e] ~= nil and g_Entity[e] ~= 0 and g_Entity[v] ~= nil and g_Entity[v] ~= 0 then local disx = g_Entity[e]['x'] - g_Entity[v]['x'] local disz = g_Entity[e]['z'] - g_Entity[v]['z'] local disy = g_Entity[e]['y'] - g_Entity[v]['y'] return math.sqrt(disx^2 + disz^2 + disy^2) end end