263 lines
6.0 KiB
JavaScript
263 lines
6.0 KiB
JavaScript
import { TILE, SEA_GY, BEDROCK_GY, GEN_MARGIN_X, GRAV, GRAV_WATER, MOVE, JUMP, DAY_LEN, SAVE_KEY, MOVE_SEND_INTERVAL, MAX_RAINDROPS, MAX_CHAT_MESSAGES, VOICE_SERVER } from './constants.js';
|
||
|
||
// Все мутабельные переменные игры в одном объекте состояния
|
||
export const state = {
|
||
// Константы (для доступа из модулей)
|
||
TILE,
|
||
SEA_GY,
|
||
BEDROCK_GY,
|
||
GEN_MARGIN_X,
|
||
GRAV,
|
||
GRAV_WATER,
|
||
MOVE,
|
||
JUMP,
|
||
DAY_LEN,
|
||
SAVE_KEY,
|
||
MOVE_SEND_INTERVAL,
|
||
MAX_RAINDROPS,
|
||
MAX_CHAT_MESSAGES,
|
||
VOICE_SERVER,
|
||
|
||
// Камера
|
||
camX: 0,
|
||
camY: 0,
|
||
W: 0,
|
||
H: 0,
|
||
dpr: 1,
|
||
|
||
// Canvas/DOM (заполняется в main.js)
|
||
gameEl: null,
|
||
canvas: null,
|
||
ctx: null,
|
||
lightC: null,
|
||
lightCtx: null,
|
||
|
||
// День/ночь
|
||
worldTime: 0.30, // старт в полдень (0 = рассвет, 0.5+ = ночь)
|
||
isNightTime: false,
|
||
dayNightCycle: true,
|
||
|
||
// Мультиплеер
|
||
isMultiplayer: false,
|
||
mySocketId: null,
|
||
socket: null,
|
||
voiceSocket: null,
|
||
voicePosT: 0,
|
||
|
||
// Сервер
|
||
SERVER_URL: '',
|
||
TELEGRAM_BOT_USERNAME: '',
|
||
TELEGRAM_APP_SHORT_NAME: '',
|
||
|
||
// Игрок
|
||
playerName: null,
|
||
worldId: null,
|
||
|
||
// Инвентарь/UI
|
||
selected: "dirt",
|
||
showFullInventory: false,
|
||
craftOpen: false,
|
||
inventoryOpen: false,
|
||
chatOpen: false,
|
||
minimapOpen: false,
|
||
modeIdx: 0,
|
||
currentFurnaceKey: null,
|
||
|
||
// Мир
|
||
blocksVersion: 0,
|
||
worldSeed: Math.floor(Math.random() * 1000000),
|
||
|
||
// Погода
|
||
weatherType: "clear",
|
||
isRaining: false,
|
||
rainIntensity: 0,
|
||
weatherTimer: 0,
|
||
weatherChangeInterval: 60 + Math.random() * 120,
|
||
snowflakes: [],
|
||
lightningFlash: 0,
|
||
lightningTimer: 0,
|
||
|
||
// Мобы/спавн
|
||
spawnT: 0,
|
||
|
||
// Цикл
|
||
last: 0,
|
||
prevJump: false,
|
||
|
||
// Сеть — throttle отправки позиции
|
||
lastMoveSendTime: 0,
|
||
lastSentX: 0,
|
||
lastSentY: 0,
|
||
|
||
// Mining progress
|
||
mining: { gx: null, gy: null, progress: 0, hardness: 0 },
|
||
|
||
// Trade/Market
|
||
myTgId: null,
|
||
tradePanel: null,
|
||
tradeContent: null,
|
||
marketPanel: null,
|
||
marketContent: null,
|
||
|
||
// DOM-ссылки (заполняются в main.js)
|
||
hpEl: null,
|
||
foodEl: null,
|
||
sxEl: null,
|
||
syEl: null,
|
||
todEl: null,
|
||
worldIdEl: null,
|
||
playerCountEl: null,
|
||
deathEl: null,
|
||
hotbarEl: null,
|
||
craftPanel: null,
|
||
recipesEl: null,
|
||
inventoryPanel: null,
|
||
inventoryGrid: null,
|
||
multiplayerStatus: null,
|
||
tempEl: null,
|
||
|
||
// Игрок
|
||
player: {
|
||
x: 6 * TILE,
|
||
y: 0 * TILE,
|
||
z: 0,
|
||
w: 34,
|
||
h: 34,
|
||
d: 34,
|
||
vx: 0,
|
||
vy: 0,
|
||
vz: 0,
|
||
grounded: false,
|
||
inWater: false,
|
||
headInWater: false,
|
||
hp: 100,
|
||
hunger: 100,
|
||
o2: 100,
|
||
invuln: 0,
|
||
fallStartY: 0,
|
||
lastStepTime: 0,
|
||
sleeping: false,
|
||
inBoat: false,
|
||
armor: 0,
|
||
equippedArmor: null,
|
||
temperature: 15,
|
||
slowTimer: 0,
|
||
// Опыт и уровень. Раньше этих полей не было вовсе: элементы #xplevel
|
||
// и #xpbar были в HTML, но player.xp нигде не рос, и HUD вечно показывал
|
||
// «Lv.1 | 0/50». Порог уровня — 50 * level.
|
||
xp: 0,
|
||
level: 1
|
||
},
|
||
|
||
// Точка спавна
|
||
spawnPoint: { x: 6 * TILE, y: 0 * TILE },
|
||
|
||
// Инвентарь
|
||
inv: {
|
||
dirt: 6, stone: 0, sand: 0, gravel: 0, clay: 0,
|
||
wood: 0, planks: 0, ladder: 0, leaves: 0, coal: 0,
|
||
copper_ore: 0, iron_ore: 0, gold_ore: 0, diamond_ore: 0,
|
||
brick: 0, glass: 0,
|
||
tnt: 1, campfire: 0, torch: 0,
|
||
meat: 0, cooked: 0, arrow: 0,
|
||
wood_pickaxe: 0, stone_pickaxe: 0, iron_pickaxe: 0,
|
||
wood_sword: 0, stone_sword: 0, iron_sword: 0,
|
||
wood_axe: 0, stone_axe: 0, iron_axe: 0,
|
||
wood_shovel: 0, stone_shovel: 0, iron_shovel: 0,
|
||
iron_armor: 0, gold_armor: 0,
|
||
bow: 0, furnace: 0,
|
||
bed: 0, boat: 0,
|
||
iron_ingot: 0, gold_ingot: 0, copper_ingot: 0,
|
||
cobblestone: 0,
|
||
// New items
|
||
chicken_meat: 0, feather: 0, bone: 0, gunpowder: 0,
|
||
wheat: 0, bread: 0, carrot: 0, potato: 0, baked_potato: 0,
|
||
mushroom_stew: 0,
|
||
scorpion_stinger: 0, polar_fur: 0, slime_ball: 0, eagle_feather: 0,
|
||
snow: 0, ice: 0, cactus: 0, mushroom: 0, moss: 0, farmland: 0,
|
||
spruce_leaves: 0, dead_bush: 0, swamp_water: 0,
|
||
wheat_seeds: 0, wheat_stage0: 0, carrot_stage0: 0, potato_stage0: 0
|
||
},
|
||
|
||
// Лодка
|
||
boat: {
|
||
x: 0, y: 0,
|
||
w: 34, h: 34,
|
||
vx: 0, vy: 0,
|
||
active: false,
|
||
inWater: false
|
||
},
|
||
|
||
// Ввод
|
||
inp: { up: false, down: false, left: false, right: false, jump: false, mine: false, build: false, bow: false, l: false, r: false, j: false, s: false,
|
||
ax: 0, ay: 0, // аналоговые оси джойстика (-1..1)
|
||
kfwd: 0, kside: 0, // клавиатура: вперёд/назад и влево/вправо (-1..1)
|
||
mineHeld: false },
|
||
|
||
// Мышь
|
||
mouse: { x: 0, y: 0 },
|
||
|
||
// Другие игроки (MP)
|
||
otherPlayers: new Map(),
|
||
|
||
// Серверные мобы (MP)
|
||
serverMobs: new Map(),
|
||
|
||
// Мобы
|
||
mobs: [],
|
||
|
||
// Снаряды
|
||
projectiles: [],
|
||
|
||
// Отслеживание изменений мира
|
||
placedBlocks: [],
|
||
removedBlocks: [],
|
||
|
||
// Серверные изменения
|
||
serverOverrides: new Map(),
|
||
|
||
// Чат
|
||
chatMessages: [],
|
||
|
||
// Погода — капли
|
||
raindrops: [],
|
||
|
||
// Облака
|
||
clouds: Array.from({ length: 10 }, () => ({
|
||
x: Math.random() * 2000,
|
||
y: -200 - Math.random() * 260,
|
||
w: 80 + Math.random() * 120,
|
||
s: 12 + Math.random() * 20
|
||
})),
|
||
|
||
// Частицы
|
||
parts: [],
|
||
|
||
// Активный TNT
|
||
activeTNT: new Set(),
|
||
|
||
// Прочность инструментов
|
||
toolDurability: new Map(),
|
||
protections: new Map(),
|
||
|
||
// Последние выбранные предметы
|
||
recentItems: [],
|
||
|
||
// Активные печи
|
||
activeFurnaces: new Map(),
|
||
cropTimers: new Map(),
|
||
|
||
// Сгенерированные колонны
|
||
generated: new Set(),
|
||
|
||
// Изображение героя
|
||
heroImg: new Image(),
|
||
|
||
// Сетка мира
|
||
grid: new Map(),
|
||
blocks: [],
|
||
|
||
// In-memory save fallback
|
||
inMemorySave: null,
|
||
};
|