diff --git a/overcooked_simulator/counters.py b/overcooked_simulator/counters.py
index 3d930aa54e15a4c6ad9f187b3766eee34f96cc07..40779e5cb228c993a65b5264f684225ea1ff78bc 100644
--- a/overcooked_simulator/counters.py
+++ b/overcooked_simulator/counters.py
@@ -623,7 +623,7 @@ class Trashcan(Counter):
         return None
 
     def can_drop_off(self, item: Item) -> bool:
-        return True
+        return item.name != "Extinguisher"
 
 
 class CookingCounter(Counter):
diff --git a/overcooked_simulator/game_content/environment_config.yaml b/overcooked_simulator/game_content/environment_config.yaml
index fdbe1db23264984fa1521d2641c1b49dc2915b41..96b6660b50523f0caa5481c18d9edefebd317da3 100644
--- a/overcooked_simulator/game_content/environment_config.yaml
+++ b/overcooked_simulator/game_content/environment_config.yaml
@@ -88,7 +88,8 @@ player_config:
   player_speed_units_per_seconds: 6
   interaction_range: 1.6
   restricted_view: False
-  view_angle: 95
+  view_angle: 60
+  view_range: 3  # in grid units, can be "null"
 
 effect_manager:
   FireManager:
diff --git a/overcooked_simulator/game_server.py b/overcooked_simulator/game_server.py
index c5bb5d2577dd0dde98a76f54474893fd0a838b56..d54341a53d2a8100a0a2b9aa12c4bf3879e27f8b 100644
--- a/overcooked_simulator/game_server.py
+++ b/overcooked_simulator/game_server.py
@@ -675,6 +675,12 @@ class CreateEnvironmentConfig(BaseModel):
     seed: int
 
 
+class ManageEnv(BaseModel):
+    manager_id: str
+    env_id: str
+    reason: str
+
+
 class AdditionalPlayer(BaseModel):
     manager_id: str
     env_id: str
@@ -697,8 +703,10 @@ async def additional_player(creation: AdditionalPlayer) -> dict[str, PlayerInfo]
 
 
 @app.post("/manage/stop_env/")
-async def stop_env(manager_id: str, env_id: str, reason: str) -> str:
-    accept = environment_handler.stop_env(manager_id, env_id, reason)
+async def stop_env(manage_env: ManageEnv) -> str:
+    accept = environment_handler.stop_env(
+        manage_env.manager_id, manage_env.env_id, manage_env.reason
+    )
     if accept:
         raise HTTPException(
             status_code=403 if accept == 1 else 409,
diff --git a/overcooked_simulator/gui_2d_vis/drawing.py b/overcooked_simulator/gui_2d_vis/drawing.py
index d9e5e8e22b0c3ad16df665e496c759178cd26262..64f05f4513139b1c405ccf23afa04bc82342b5eb 100644
--- a/overcooked_simulator/gui_2d_vis/drawing.py
+++ b/overcooked_simulator/gui_2d_vis/drawing.py
@@ -153,20 +153,23 @@ class Visualizer:
             direction = pygame.math.Vector2(state["view_restriction"]["direction"])
             pos = pygame.math.Vector2(state["view_restriction"]["position"])
             angle = state["view_restriction"]["angle"] / 2
+            range = state["view_restriction"]["range"]
 
             pos = pos * grid_size + pygame.math.Vector2([grid_size / 2, grid_size / 2])
 
             rect_scale = max(width, height)
+            # rect_scale = 2 * grid_size
 
             left_beam = pos + (direction.rotate(angle) * rect_scale * 2)
             right_beam = pos + (direction.rotate(-angle) * rect_scale * 2)
 
+            offset_front = direction * grid_size * 0.2
             pygame.draw.polygon(
                 screen,
                 colors["black"],
                 (
-                    pos - (direction * grid_size * 0.6),
-                    left_beam - (direction * grid_size * 0.6),
+                    pos - offset_front,
+                    left_beam - offset_front,
                     left_beam + (direction.rotate(90) * rect_scale),
                     pos
                     - (direction * rect_scale * 2)
@@ -175,9 +178,28 @@ class Visualizer:
                     - (direction * rect_scale * 2)
                     + (direction.rotate(-90) * rect_scale),
                     right_beam + (direction.rotate(-90) * rect_scale),
-                    right_beam - (direction * grid_size * 0.6),
+                    right_beam - offset_front,
                 ),
             )
+            if range:
+                pygame.draw.polygon(
+                    screen,
+                    colors["black"],
+                    (
+                        pos
+                        + (direction.rotate(90) * rect_scale)
+                        + (direction * range * grid_size),
+                        pos
+                        + (direction.rotate(-90) * rect_scale)
+                        + (direction * range * grid_size),
+                        pos
+                        + (direction.rotate(-90) * rect_scale)
+                        + (direction * rect_scale),
+                        pos
+                        + (direction.rotate(90) * rect_scale)
+                        + (direction * rect_scale),
+                    ),
+                )
 
     def draw_background(
         self, surface: pygame.Surface, width: int, height: int, grid_size: int
diff --git a/overcooked_simulator/gui_2d_vis/overcooked_gui.py b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
index a4d28c5cb9fe468683db502766b2f2f0c37a7371..8808d1dbb0be8194625b0f1872298fc0b3a5a8de 100644
--- a/overcooked_simulator/gui_2d_vis/overcooked_gui.py
+++ b/overcooked_simulator/gui_2d_vis/overcooked_gui.py
@@ -860,7 +860,7 @@ class PyGameGUI:
 
     def finished_button_press(self):
         requests.post(
-            f"{self.request_url}/manage/stop_env",
+            f"{self.request_url}/manage/stop_env/",
             json={
                 "manager_id": self.manager_id,
                 "env_id": self.current_env_id,
diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py
index 2c259a7f0e2952c443608ca4ff4f288a0860a559..0cd22554c736c8aae47d7673d9ad156979b013ce 100644
--- a/overcooked_simulator/overcooked_environment.py
+++ b/overcooked_simulator/overcooked_environment.py
@@ -167,6 +167,9 @@ class Environment:
             self.player_view_angle = self.environment_config["player_config"][
                 "view_angle"
             ]
+            self.player_view_range = self.environment_config["player_config"][
+                "view_range"
+            ]
 
         self.extra_setup_functions()
 
@@ -788,6 +791,7 @@ class Environment:
                     "position": self.players[player_id].pos.tolist(),
                     "angle": self.player_view_angle,
                     "counter_mask": None,
+                    "range": self.player_view_range,
                 }
                 if self.player_view_restricted
                 else None,
diff --git a/overcooked_simulator/player.py b/overcooked_simulator/player.py
index 2a8f58a6905165af665dccee7ce3e45016273e6f..638bc4cd5c0d537aa5823af96543a008b43c3300 100644
--- a/overcooked_simulator/player.py
+++ b/overcooked_simulator/player.py
@@ -37,6 +37,9 @@ class PlayerConfig:
     """Whether or not the player can see the entire map at once or just a view frustrum."""
     view_angle: int | None = None
     """Angle of the players view if restricted."""
+    view_range: float | None = None
+    """Range of the players view if restricted. In grid units."""
+
 
 class Player:
     """Class representing a player in the game environment. A player consists of a name, their position and what
@@ -153,7 +156,7 @@ class Player:
             self.holding.combine(returned_by_counter)
 
         log.debug(
-            f"Self: {self.holding}, {counter.__class__.__name__}: {counter.occupied_by}"
+            f"Self: {self.holding.__class__.__name__}: {self.holding}, {counter.__class__.__name__}: {counter.occupied_by}"
         )
         # if isinstance(self.holding, Plate):
         #     log.debug(self.holding.clean)
diff --git a/overcooked_simulator/state_representation.py b/overcooked_simulator/state_representation.py
index 9d4e7427f092fb77769873dd570988e1e3c94f4d..2faa1a1932035342e57b27df9865d673efdcc8cb 100644
--- a/overcooked_simulator/state_representation.py
+++ b/overcooked_simulator/state_representation.py
@@ -71,6 +71,7 @@ class ViewRestriction(BaseModel):
     position: list[float]
     angle: int  # degrees
     counter_mask: None | list[bool]
+    range: float | None
 
 
 class StateRepresentation(BaseModel):
diff --git a/setup.py b/setup.py
index 8daf673c953090b4bbf6ce910949487412e300a5..a4b8f900e5aa215bba1ef9b2d66078e5ce9096ab 100644
--- a/setup.py
+++ b/setup.py
@@ -11,17 +11,18 @@ with open("CHANGELOG.md") as history_file:
     history = history_file.read()
 
 requirements = [
-    "numpy",
-    "pygame",
-    "scipy",
+    "numpy>=1.26.2",
+    "pygame>=2.5.2",
+    "scipy>=1.11.4",
     "pytest>=3",
-    "pyyaml",
-    "pygame-gui",
-    "fastapi",
-    "uvicorn",
-    "websockets",
-    "requests",
-    "platformdirs",
+    "pyyaml>=6.0.1",
+    "pygame-gui>=0.6.9",
+    "pydantic>=2.5.3",
+    "fastapi>=0.109.2",
+    "uvicorn>=0.27.0",
+    "websockets>=12.0",
+    "requests>=2.31.0",
+    "platformdirs>=4.1.0",
 ]
 
 test_requirements = [
@@ -56,4 +57,12 @@ setup(
     url="https://gitlab.ub.uni-bielefeld.de/scs/cocosy/overcooked-simulator",
     version="0.1.0",
     zip_safe=False,
+    extras_requires={
+        "rl": [
+            "gymnasium>=0.28.1",
+            "stable-baselines3[extra]>=2.2.1",
+            "opencv-python>=4.9",
+            "wandb>=0.16.3",
+        ]
+    },
 )