feat: item backgrounds and active slot index from entity
This commit is contained in:
parent
79b8039937
commit
ad2555c6d3
|
@ -5,6 +5,7 @@ import React, {useEffect, useState} from 'react';
|
||||||
import {compose} from '@avocado/core';
|
import {compose} from '@avocado/core';
|
||||||
import contempo from 'contempo';
|
import contempo from 'contempo';
|
||||||
// 1st party.
|
// 1st party.
|
||||||
|
import {usePropertyChange} from '../hooks/use-property-change';
|
||||||
import ItemSlot from './item-slot';
|
import ItemSlot from './item-slot';
|
||||||
|
|
||||||
const decorate = compose(
|
const decorate = compose(
|
||||||
|
@ -39,16 +40,51 @@ const decorate = compose(
|
||||||
`),
|
`),
|
||||||
);
|
);
|
||||||
|
|
||||||
const HotbarComponent = ({damageProton}) => {
|
const HotbarComponent = ({app}) => {
|
||||||
const [active, setActive] = useState(0);
|
const selfEntity = usePropertyChange(app, 'selfEntity');
|
||||||
|
const activeSlotIndex = usePropertyChange(selfEntity, 'activeSlotIndex');
|
||||||
|
const [slotImageUris, setSlotImageUris] = useState({});
|
||||||
|
useEffect(() => {
|
||||||
|
if (!selfEntity) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const onInventoryChanged = () => {
|
||||||
|
const imageUris = {};
|
||||||
|
const itemPromises = [];
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
const item = selfEntity.itemInSlot(i);
|
||||||
|
if (!item) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
itemPromises.push(item.then((item) => {
|
||||||
|
return item.hydrate().then(() => {
|
||||||
|
const image = item.imageForSlot(0);
|
||||||
|
if (image) {
|
||||||
|
imageUris[i] = image.uri;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
Promise.all(itemPromises).then(() => {
|
||||||
|
setSlotImageUris(imageUris);
|
||||||
|
})
|
||||||
|
};
|
||||||
|
selfEntity.on('inventoryChanged', onInventoryChanged);
|
||||||
|
onInventoryChanged();
|
||||||
|
return () => {
|
||||||
|
selfEntity.off('inventoryChanged', onInventoryChanged);
|
||||||
|
};
|
||||||
|
}, [selfEntity]);
|
||||||
|
|
||||||
const hotkeyForSlot = (index) => {
|
const hotkeyForSlot = (index) => {
|
||||||
return (index + 1) % 10;
|
return (index + 1) % 10;
|
||||||
}
|
}
|
||||||
const slots = [];
|
const slots = [];
|
||||||
for (let i = 0; i < 10; ++i) {
|
for (let i = 0; i < 10; ++i) {
|
||||||
const slot = <ItemSlot
|
const slot = <ItemSlot
|
||||||
|
backgroundImage={slotImageUris[i]}
|
||||||
className={classnames(
|
className={classnames(
|
||||||
active === i ? 'active' : '',
|
activeSlotIndex === i ? 'active' : '',
|
||||||
)}
|
)}
|
||||||
key={i}
|
key={i}
|
||||||
onClick={(event) => {
|
onClick={(event) => {
|
||||||
|
@ -64,14 +100,6 @@ const HotbarComponent = ({damageProton}) => {
|
||||||
}
|
}
|
||||||
return <div
|
return <div
|
||||||
className="hotbar unselectable"
|
className="hotbar unselectable"
|
||||||
onWheel={(event) => {
|
|
||||||
if (event.deltaY > 0) {
|
|
||||||
setActive((active + 1) % 10);
|
|
||||||
}
|
|
||||||
else if (event.deltaY < 0) {
|
|
||||||
setActive((active + 9) % 10);
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
<div className="hotbar-inner">
|
<div className="hotbar-inner">
|
||||||
{slots}
|
{slots}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user