/
RaskolnickOFF
/
3D
Обзор
Документация
Войти
/
RaskolnickOFF
/
3D
Код
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
js/source/WorldSetup.js
86 строк
3 KB
RaskolnickOFF
fixes
19 июн 2026, 19:05
19 июн 2026, 19:05
84fe909
Код
Авторство
О чём код?
// js/source/WorldSetup.js — создание игрока, зон мира и обработка смерти ( WorldMapData параметром) import * as THREE from 'three'; import { Components } from './core/Components.js'; import { GameEvents } from './core/GameEvents.js'; /** * @param {import('./core/Engine.js').Engine} engine * @param {import('./core/EventBus.js').EventBus} eventBus * @param {import('./core/SimulationContext.js').SimulationContext} ctx * @param {import('./systems/ZoneSystem.js').ZoneSystem} zoneSystem * @param {import('./world/WorldMapData.js').WorldMapData} worldMapData */ export function setupWorld(engine, eventBus, ctx, zoneSystem, worldMapData) { // --- Player --- const geometry = new THREE.BoxGeometry(1, 1, 1); const material = new THREE.MeshStandardMaterial({ color: '#ff4400' }); const cubeMesh = new THREE.Mesh(geometry, material); cubeMesh.castShadow = true; const playerEntity = engine.createEntity() .add(Components.TRANSFORM, ctx.settings.player.startPosition) .add(Components.CURRENT_TILE, ctx.settings.player.startTile) .add(Components.VELOCITY, { x: 0, y: 0, z: 0 }) .add(Components.MESH, cubeMesh) .add(Components.HEALTH, ctx.settings.player.maxHP) .add(Components.PLAYER, true); // --- World Zones --- const worldSize = ctx.settings.terrain?.size || 60; const zoneSize = 15; const zonesPerRow = Math.floor(worldSize / zoneSize); const halfWorld = worldSize / 2; let zoneId = 0; for (let row = 0; row < zonesPerRow; row++) { for (let col = 0; col < zonesPerRow; col++) { const minX = -halfWorld + col * zoneSize; const maxX = minX + zoneSize; const minZ = -halfWorld + row * zoneSize; const maxZ = minZ + zoneSize; // Единый источник правды: биом по координатам центра зоны const centerX = (minX + maxX) / 2; const centerZ = (minZ + maxZ) / 2; const biome = worldMapData.getBiomeAt(centerX, centerZ); zoneSystem.createZone({ zoneId: zoneId++, bounds: { minX, maxX, minZ, maxZ }, biomeType: biome.type, spawnTable: biome.spawnTable }); } } // --- Death handler --- let _respawning = false; eventBus.on(GameEvents.PLAYER_DIED, ({ entity }) => { if (_respawning) return; _respawning = true; console.log('Player died, respawning in 2 seconds...'); setTimeout(() => { const transform = entity.get(Components.TRANSFORM); if (transform) { transform.x = 0; transform.y = 1; transform.z = 0; transform.rotY = 0; } entity.add(Components.HEALTH, ctx.settings.player.maxHP); entity.add(Components.INVULNERABLE, true); eventBus.emit(GameEvents.HEALTH_CHANGED, { entity, health: ctx.settings.player.maxHP }); setTimeout(() => { entity.remove(Components.INVULNERABLE); _respawning = false; }, 1000); }, 2000); }); return { playerEntity }; }