6.2 KiB
🎮 Player Data & Active Item System
File: src/core/player.js
Updated: 10.12.2025
📦 Nove Funkcije za Active Item
Dodane čiste helper funkcije za delo z igralčevim aktivnim itemom (trenutno selected slot).
🔧 API Reference
1. getPlayerActiveItem(playerOrScene)
Pridobi trenutno aktivni item.
import { getPlayerActiveItem } from './core/player.js';
const activeItem = getPlayerActiveItem(player);
// Returns: { type: 'axe', count: 1 } or null
2. getPlayerActiveItemType(playerOrScene)
Pridobi samo tip aktivnega itema.
import { getPlayerActiveItemType } from './core/player.js';
const itemType = getPlayerActiveItemType(scene);
// Returns: 'axe' or null
3. hasPlayerActiveItem(playerOrScene, itemType)
Preveri ali ima igralec specifičen item aktiven.
import { hasPlayerActiveItem } from './core/player.js';
if (hasPlayerActiveItem(player, 'seeds')) {
console.log('Player has seeds selected!');
}
4. isPlayerActiveItemTool(playerOrScene)
Preveri ali je aktivni item orodje.
import { isPlayerActiveItemTool } from './core/player.js';
if (isPlayerActiveItemTool(scene)) {
// Show tool animation
}
Tool Types:
axepickaxehoeswordfishing_rodwatering_can
5. consumePlayerActiveItem(playerOrScene, amount)
Porabi aktivni item (npr. za seeds).
import { consumePlayerActiveItem } from './core/player.js';
// Plant seed
if (hasPlayerActiveItem(player, 'seeds')) {
consumePlayerActiveItem(player, 1);
console.log('Seed used!');
}
6. getPlayerData(player)
Pridobi vse igralčeve podatke v enem objektu.
import { getPlayerData } from './core/player.js';
const playerData = getPlayerData(player);
console.log(playerData);
/*
{
// Position
gridX: 50,
gridY: 50,
x: 1200,
y: 800,
// Stats
hp: 85,
maxHp: 100,
energy: 70,
maxEnergy: 100,
// Progression
level: 3,
xp: 150,
xpToNextLevel: 225,
// State
isDead: false,
isMoving: false,
direction: 'down',
lastDir: { x: 0, y: 1 },
// Active item
activeItem: { type: 'axe', count: 1 },
activeItemType: 'axe',
activeItemCount: 1
}
*/
💡 Primeri Uporabe
Primer 1: Farming System
import { hasPlayerActiveItem, consumePlayerActiveItem } from './core/player.js';
function tryPlantCrop(scene, gridX, gridY) {
// Check if player has seeds
if (!hasPlayerActiveItem(scene, 'seeds')) {
console.log('⚠️ No seeds!');
return false;
}
// Plant crop
scene.farmingSystem.plantCrop(gridX, gridY, 'wheat');
// Consume seed
consumePlayerActiveItem(scene, 1);
return true;
}
Primer 2: Building System
import { getPlayerActiveItem } from './core/player.js';
function tryPlaceBuilding(scene, gridX, gridY) {
const activeItem = getPlayerActiveItem(scene);
if (!activeItem) {
console.log('⚠️ No item selected');
return false;
}
// Check if item is buildable
const buildableItems = ['fence', 'chest', 'furnace'];
if (!buildableItems.includes(activeItem.type)) {
console.log(`⚠️ ${activeItem.type} cannot be placed`);
return false;
}
// Place building
scene.buildingSystem.placeBuilding(activeItem.type, gridX, gridY);
// Remove from inventory
scene.inventorySystem.removeItem(activeItem.type, 1);
return true;
}
Primer 3: Combat System
import { isPlayerActiveItemTool, getPlayerActiveItemType } from './core/player.js';
function calculatePlayerDamage(player) {
let baseDamage = 5;
if (isPlayerActiveItemTool(player)) {
const toolType = getPlayerActiveItemType(player);
switch (toolType) {
case 'sword':
baseDamage = 20;
break;
case 'axe':
baseDamage = 10;
break;
case 'pickaxe':
baseDamage = 8;
break;
default:
baseDamage = 5;
}
}
return baseDamage;
}
Primer 4: UI Display
import { getPlayerData } from './core/player.js';
function updatePlayerUI(player) {
const data = getPlayerData(player);
// Update health bar
const hpPercent = (data.hp / data.maxHp) * 100;
healthBar.setPercent(hpPercent);
// Update level text
levelText.setText(`Level ${data.level}`);
// Update XP bar
const xpPercent = (data.xp / data.xpToNextLevel) * 100;
xpBar.setPercent(xpPercent);
// Show active item
if (data.activeItem) {
activeItemIcon.setTexture(`item_${data.activeItemType}`);
activeItemCount.setText(data.activeItemCount);
} else {
activeItemIcon.setVisible(false);
}
}
🎯 Migration Guide
Before (Old Way):
// Old: Direct UI access
const uiScene = this.scene.get('UIScene');
const selectedIdx = uiScene.selectedSlot;
const slot = this.inventorySystem.slots[selectedIdx];
if (slot && slot.type === 'seeds') {
// Do something
}
After (New Way):
// New: Clean helper function
import { hasPlayerActiveItem } from './core/player.js';
if (hasPlayerActiveItem(this, 'seeds')) {
// Do something
}
📊 Benefits
✅ Cleaner Code - hasPlayerActiveItem(player, 'seeds') vs manual slot checking
✅ Centralized Logic - One place to update if inventory system changes
✅ Type Safety - Functions validate inputs
✅ Flexibility - Works with both player instance and scene
✅ Complete Data - getPlayerData() gives everything in one call
🔄 Integration with Existing Code
Vse funkcije delujejo z obstoječim sistemom - samo wrappajo UIScene.selectedSlot logiko v čiste funkcije.
No breaking changes! Stara koda še vedno dela.
Status: ✅ Ready to use!
Location: src/core/player.js & src/core/index.js