From 475bc17e9d9ae050e644bc1d923aaa3351fa676b Mon Sep 17 00:00:00 2001
From: fheinrich <fheinrich@techfak.uni-bielefeld.de>
Date: Thu, 7 Dec 2023 11:36:56 +0100
Subject: [PATCH] Added pushing other players around.

---
 overcooked_simulator/game_items.py            |  2 --
 overcooked_simulator/main.py                  |  1 -
 .../overcooked_environment.py                 | 34 ++++++++++++++++++-
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/overcooked_simulator/game_items.py b/overcooked_simulator/game_items.py
index b713fbfd..27ef0c50 100644
--- a/overcooked_simulator/game_items.py
+++ b/overcooked_simulator/game_items.py
@@ -1,8 +1,6 @@
 class HoldableItem:
     """Base class for game items which can be held by a player."""
 
-    pass
-
     def can_combine(self, other):
         return False
 
diff --git a/overcooked_simulator/main.py b/overcooked_simulator/main.py
index b3fa9d42..33c5b91a 100644
--- a/overcooked_simulator/main.py
+++ b/overcooked_simulator/main.py
@@ -5,7 +5,6 @@ import numpy as np
 import pygame
 
 from overcooked_simulator import ROOT_DIR
-from overcooked_simulator.game_items import Tomato, Plate
 from overcooked_simulator.player import Player
 from overcooked_simulator.pygame_gui.pygame_gui import PyGameGUI
 from overcooked_simulator.simulation_runner import Simulator
diff --git a/overcooked_simulator/overcooked_environment.py b/overcooked_simulator/overcooked_environment.py
index 8245fafa..c1f452f4 100644
--- a/overcooked_simulator/overcooked_environment.py
+++ b/overcooked_simulator/overcooked_environment.py
@@ -156,6 +156,8 @@ class Environment:
 
         The movement action is a unit 2d vector.
 
+        Detects collisions with other players and pushes them out of the way.
+
         Args:
             player: The player to move.
             move_vector: The movement vector which is a unit-2d-vector of the movement direction
@@ -165,6 +167,18 @@ class Environment:
         step = move_vector * player.move_dist
         player.move(step)
         if self.detect_collision(player):
+            collided_players = self.get_collided_players(player)
+            for collided_player in collided_players:
+                pushing_vector = collided_player.pos - player.pos
+                if np.linalg.norm(pushing_vector) != 0:
+                    pushing_vector = pushing_vector / np.linalg.norm(pushing_vector)
+
+                old_pos_other = collided_player.pos.copy()
+                collided_player.move(pushing_vector * (collided_player.move_dist / 2))
+                if self.detect_collision_counters(
+                        collided_player
+                ) or self.detect_collision_world_bounds(player):
+                    collided_player.move_abs(old_pos_other)
             player.move_abs(old_pos)
 
             old_pos = player.pos.copy()
@@ -196,11 +210,29 @@ class Environment:
         Returns: True if the player is intersecting with any object in the environment.
         """
         return (
-                self.detect_player_collision(player)
+                len(self.get_collided_players(player)) != 0
                 or self.detect_collision_counters(player)
                 or self.detect_collision_world_bounds(player)
         )
 
+    def get_collided_players(self, player: Player) -> list[Player]:
+        """Detects collisions between the queried player and other players. Returns the list of the collided players.
+        A player is modelled as a circle. Collision is detected if the distance between the players is smaller
+        than the sum of the radius's.
+
+        Args:
+            player: The player to check collisions with other players for.
+
+        Returns: The list of other players the player collides with.
+
+        """
+        other_players = filter(lambda p: p.name != player.name, self.players.values())
+
+        def collide(p):
+            return np.linalg.norm(player.pos - p.pos) <= (player.radius + p.radius)
+
+        return list(filter(collide, other_players))
+
     def detect_player_collision(self, player: Player):
         """Detects collisions between the queried player and other players.
         A player is modelled as a circle. Collision is detected if the distance between the players is smaller
-- 
GitLab