47 lines
1.7 KiB
JavaScript
47 lines
1.7 KiB
JavaScript
// Socket helpers: цвет, отправка позиции/блоков
|
||
import { state } from '../core/state.js';
|
||
import { SERVER_URL } from '../config.js';
|
||
import { MOVE_SEND_INTERVAL } from '../core/constants.js';
|
||
|
||
|
||
// Генерация случайного цвета для игрока на основе socket_id
|
||
export function getRandomPlayerColor(socketId) {
|
||
const colors = ['#e74c3c', '#3498db', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c', '#e91e63', '#00bcd4'];
|
||
let hash = 0;
|
||
for (let i = 0; i < socketId.length; i++) {
|
||
hash = ((hash << 5) - hash) + socketId.charCodeAt(i);
|
||
hash = hash & hash;
|
||
}
|
||
return colors[Math.abs(hash) % colors.length];
|
||
}
|
||
|
||
// Throttle для отправки позиции (10-20 раз в секунду)
|
||
let lastMoveSendTime = 0;
|
||
|
||
let lastSentX = 0, lastSentY = 0;
|
||
|
||
// Отправка позиции игрока (с throttle)
|
||
export function sendPlayerPosition() {
|
||
if (!state.isMultiplayer || !state.socket || !state.socket.connected) return;
|
||
|
||
const now = performance.now() / 1000;
|
||
if (now - lastMoveSendTime < MOVE_SEND_INTERVAL) return;
|
||
|
||
// Отправляем только если позиция изменилась
|
||
const dx = Math.abs(state.player.x - lastSentX);
|
||
const dy = Math.abs(state.player.y - lastSentY);
|
||
if (dx < 1 && dy < 1) return;
|
||
|
||
lastMoveSendTime = now;
|
||
lastSentX = state.player.x;
|
||
lastSentY = state.player.y;
|
||
|
||
state.socket.emit('player_move', { x: state.player.x, y: state.player.y, player_name: state.playerName });
|
||
}
|
||
|
||
// Отправка изменения блока
|
||
export function sendBlockChange(gx, gy, t, op) {
|
||
if (!state.isMultiplayer || !state.socket || !state.socket.connected) return;
|
||
|
||
state.socket.emit('block_change', { gx, gy, t, op });
|
||
} |