97 lines
3.2 KiB
Python
97 lines
3.2 KiB
Python
from channels.generic.websocket import AsyncWebsocketConsumer
|
|
|
|
from transcendence.abstract.AbstractRoomMember import AbstractRoomMember
|
|
|
|
from .Position import Position
|
|
|
|
import time
|
|
|
|
from .. import config
|
|
|
|
from ..models import GameModel
|
|
|
|
MIN_POSITION: float = config.PADDLE_RATIO / 2
|
|
MAX_POSITION: float = 1 - MIN_POSITION
|
|
|
|
class GameMember(AbstractRoomMember):
|
|
|
|
def __init__(self, user_id: int, socket: AsyncWebsocketConsumer, room):
|
|
super().__init__(user_id, socket)
|
|
self.position: Position = Position(0.5, int(time.time() * 1000.0))
|
|
self.room = room
|
|
self.is_a_player = user_id in GameModel.objects.get(pk = self.room.game_id).get_players_id()
|
|
|
|
def receive(self, data: dict):
|
|
|
|
detail: str = data.get("detail")
|
|
|
|
if (detail is None):
|
|
return
|
|
|
|
if (detail == "update_my_paddle_pos"):
|
|
self.update_position(data)
|
|
|
|
def send_error(self, error_message: str):
|
|
|
|
self.send("error", {"error_message": error_message})
|
|
|
|
def update_position(self, data: dict):
|
|
|
|
if (not self.is_a_player):
|
|
return
|
|
|
|
new_position: Position = Position()
|
|
|
|
new_position.position = data.get("position")
|
|
|
|
if (new_position is None):
|
|
self.send_error("missing new_position")
|
|
return
|
|
|
|
new_position.time = data.get("time")
|
|
|
|
if (new_position.time is None):
|
|
self.send_error("missing time")
|
|
return
|
|
|
|
if (self.position.time > new_position.time):
|
|
self.send_error("time error")
|
|
return
|
|
|
|
distance: float = abs(self.position.position - new_position.position)
|
|
|
|
sign = 1 if self.position.position >= new_position.position else -1
|
|
|
|
time_difference = (new_position.time - self.position.time) / 1000
|
|
|
|
max_distance = config.PADDLE_SPEED_PER_SECOND_MAX * (time_difference) * config.PADDLE_SPEED_PER_SECOND_TOLERANCE
|
|
|
|
new_position_verified: Position = new_position.copy()
|
|
|
|
if (distance > max_distance):
|
|
print(max_distance, distance, time_difference, self.position.position, new_position.position)
|
|
new_position_verified.position = self.position.position + max_distance * sign
|
|
|
|
if (not MIN_POSITION <= new_position_verified.position <= MAX_POSITION):
|
|
|
|
new_position_verified.position = max(new_position_verified.position, MIN_POSITION)
|
|
new_position_verified.position = min(new_position_verified.position, MAX_POSITION)
|
|
|
|
if (new_position.position != new_position_verified.position):
|
|
self.send("update_paddles", {
|
|
"players": [
|
|
{
|
|
"position": new_position_verified.position,
|
|
"time": new_position_verified.time,
|
|
"id": self.user_id,
|
|
},
|
|
],
|
|
})
|
|
print("trop vite")
|
|
|
|
self.position = new_position
|
|
|
|
|
|
def send_ball(self, ball):
|
|
self.send("update_ball_pos", {"x": ball.x,
|
|
"y": ball.y}) |