@rpg-engine/long-bow 0.1.92 → 0.1.96

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/Item/Inventory/ItemContainer.d.ts +1 -1
  4. package/dist/components/Item/Inventory/ItemSlot.d.ts +1 -1
  5. package/dist/components/Item/Inventory/itemContainerHelper.d.ts +1 -0
  6. package/dist/long-bow.cjs.development.js +13 -41
  7. package/dist/long-bow.cjs.development.js.map +1 -1
  8. package/dist/long-bow.cjs.production.min.js +1 -1
  9. package/dist/long-bow.cjs.production.min.js.map +1 -1
  10. package/dist/long-bow.esm.js +13 -41
  11. package/dist/long-bow.esm.js.map +1 -1
  12. package/package.json +98 -98
  13. package/src/components/Abstractions/SlotsContainer.tsx +42 -42
  14. package/src/components/Button.tsx +30 -30
  15. package/src/components/Chat/Chat.tsx +193 -193
  16. package/src/components/CheckButton.tsx +65 -65
  17. package/src/components/DraggableContainer.tsx +150 -150
  18. package/src/components/Dropdown.tsx +57 -57
  19. package/src/components/Equipment/EquipmentSet.tsx +134 -134
  20. package/src/components/Input.tsx +11 -11
  21. package/src/components/Item/Cards/ItemTooltip.tsx +32 -32
  22. package/src/components/Item/Inventory/ItemContainer.tsx +65 -65
  23. package/src/components/Item/Inventory/ItemContainerTypes.ts +4 -4
  24. package/src/components/Item/Inventory/ItemSlot.tsx +198 -199
  25. package/src/components/Item/Inventory/itemContainerHelper.ts +86 -94
  26. package/src/components/ListMenu.tsx +65 -65
  27. package/src/components/Multitab/Tab.tsx +57 -57
  28. package/src/components/Multitab/TabBody.tsx +13 -13
  29. package/src/components/Multitab/TabsContainer.tsx +97 -97
  30. package/src/components/NPCDialog/NPCDialog.tsx +145 -145
  31. package/src/components/NPCDialog/NPCDialogText.tsx +53 -53
  32. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +239 -239
  33. package/src/components/ProgressBar.tsx +91 -91
  34. package/src/components/PropertySelect/PropertySelect.tsx +101 -101
  35. package/src/components/PropertySelect/img/ui-arrows/arrow01-left-clicked.png +0 -0
  36. package/src/components/PropertySelect/img/ui-arrows/arrow01-left.png +0 -0
  37. package/src/components/PropertySelect/img/ui-arrows/arrow01-right-clicked.png +0 -0
  38. package/src/components/PropertySelect/img/ui-arrows/arrow01-right.png +0 -0
  39. package/src/components/PropertySelect/img/ui-arrows/arrow02-left-clicked.png +0 -0
  40. package/src/components/PropertySelect/img/ui-arrows/arrow02-left.png +0 -0
  41. package/src/components/PropertySelect/img/ui-arrows/arrow02-right-clicked.png +0 -0
  42. package/src/components/PropertySelect/img/ui-arrows/arrow02-right.png +0 -0
  43. package/src/components/QuestInfo/QuestInfo.tsx +143 -143
  44. package/src/components/RPGUIContainer.tsx +47 -47
  45. package/src/components/RPGUIRoot.tsx +14 -14
  46. package/src/components/RadioButton.tsx +53 -53
  47. package/src/components/RangeSlider.tsx +68 -68
  48. package/src/components/RelativeListMenu.tsx +83 -83
  49. package/src/components/ScrollList.tsx +77 -77
  50. package/src/components/SimpleProgressBar.tsx +62 -62
  51. package/src/components/SkillProgressBar.tsx +123 -123
  52. package/src/components/SkillsContainer.tsx +196 -196
  53. package/src/components/TextArea.tsx +11 -11
  54. package/src/components/Truncate.tsx +25 -25
  55. package/src/components/shared/Column.tsx +16 -16
  56. package/src/components/shared/SpriteFromAtlas.tsx +99 -99
  57. package/src/components/typography/DynamicText.tsx +49 -49
  58. package/src/constants/uiColors.ts +10 -10
  59. package/src/hooks/useEventListener.ts +21 -21
  60. package/src/hooks/useOutsideAlerter.ts +25 -25
  61. package/src/index.tsx +25 -25
  62. package/src/libs/StringHelpers.ts +3 -3
  63. package/src/mocks/atlas/icons/icons.json +735 -735
  64. package/src/mocks/atlas/items/items.json +5215 -5215
  65. package/src/mocks/equipmentSet.mocks.ts +347 -347
  66. package/src/mocks/itemContainer.mocks.ts +249 -249
  67. package/src/mocks/skills.mocks.ts +122 -122
  68. package/src/stories/Button.stories.tsx +36 -36
  69. package/src/stories/Chat.stories.tsx +170 -170
  70. package/src/stories/CheckButton.stories.tsx +48 -48
  71. package/src/stories/DraggableContainer.stories.tsx +28 -28
  72. package/src/stories/Dropdown.stories.tsx +46 -46
  73. package/src/stories/EquipmentSet.stories.tsx +50 -50
  74. package/src/stories/ItemContainer.stories.tsx +50 -50
  75. package/src/stories/ListMenu.stories.tsx +56 -56
  76. package/src/stories/Multitab.stories.tsx +51 -51
  77. package/src/stories/NPCDialog.stories.tsx +130 -130
  78. package/src/stories/ProgressBar.stories.tsx +23 -23
  79. package/src/stories/PropertySelect.stories.tsx +41 -41
  80. package/src/stories/QuestInfo.stories.tsx +76 -76
  81. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  82. package/src/stories/RadioButton.stories.tsx +49 -49
  83. package/src/stories/RangeSlider.stories.tsx +60 -60
  84. package/src/stories/ScrollList.stories.tsx +85 -85
  85. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  86. package/src/stories/SkillProgressBar.stories.tsx +30 -30
  87. package/src/stories/SkillsContainer.stories.tsx +31 -31
  88. package/src/stories/Text.stories.tsx +42 -42
  89. package/src/types/eventTypes.ts +4 -4
  90. package/src/types/index.d.ts +2 -2
@@ -1,150 +1,150 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import Draggable, { DraggableData } from 'react-draggable';
3
- import styled from 'styled-components';
4
- import { useOutsideClick } from '../hooks/useOutsideAlerter';
5
- import { IPosition } from '../types/eventTypes';
6
- import { RPGUIContainerTypes } from './RPGUIContainer';
7
-
8
- export interface IDraggableContainerProps {
9
- children: React.ReactNode;
10
- width?: string;
11
- height?: string;
12
- className?: string;
13
- type?: RPGUIContainerTypes;
14
- title?: string;
15
- imgSrc?: string;
16
- imgWidth?: string;
17
- onCloseButton?: () => void;
18
- cancelDrag?: string;
19
- onPositionChange?: (position: IPosition) => void;
20
- onOutsideClick?: () => void;
21
- }
22
-
23
- export const DraggableContainer: React.FC<IDraggableContainerProps> = ({
24
- children,
25
- width = '50%',
26
- height,
27
- className,
28
- type = RPGUIContainerTypes.FramedGold,
29
- onCloseButton,
30
- title,
31
- imgSrc,
32
- imgWidth = '20px',
33
- cancelDrag,
34
- onPositionChange,
35
- onOutsideClick,
36
- }) => {
37
- const draggableRef = useRef(null);
38
-
39
- useOutsideClick(draggableRef, 'item-container');
40
-
41
- useEffect(() => {
42
- document.addEventListener('clickOutside', event => {
43
- const e = event as CustomEvent;
44
-
45
- if (e.detail.id === 'item-container') {
46
- if (onOutsideClick) {
47
- onOutsideClick();
48
- }
49
- }
50
- });
51
-
52
- return () => {
53
- document.removeEventListener('clickOutside', _e => {});
54
- };
55
- }, []);
56
-
57
- return (
58
- <Draggable
59
- cancel={`.container-close,${cancelDrag}`}
60
- onDrag={(_e, data: DraggableData) => {
61
- if (onPositionChange) {
62
- onPositionChange({
63
- x: data.x,
64
- y: data.y,
65
- });
66
- }
67
- }}
68
- >
69
- <Container
70
- ref={draggableRef}
71
- width={width}
72
- height={height || 'auto'}
73
- className={`rpgui-container ${type} ${className}`}
74
- >
75
- {title && (
76
- <TitleContainer className="drag-handler">
77
- <Title>
78
- {imgSrc && <Icon src={imgSrc} width={imgWidth} />}
79
- {title}
80
- </Title>
81
- </TitleContainer>
82
- )}
83
- {onCloseButton && (
84
- <CloseButton
85
- className="container-close"
86
- onClick={onCloseButton}
87
- onTouchStart={onCloseButton}
88
- >
89
- X
90
- </CloseButton>
91
- )}
92
-
93
- {children}
94
- </Container>
95
- </Draggable>
96
- );
97
- };
98
-
99
- interface IContainerProps {
100
- width: string;
101
- height: string;
102
- }
103
-
104
- const Container = styled.div<IContainerProps>`
105
- height: ${props => props.height};
106
- width: ${({ width }) => width};
107
- display: flex;
108
- flex-wrap: wrap;
109
- image-rendering: pixelated;
110
-
111
- &.rpgui-container {
112
- padding-top: 1.5rem;
113
- }
114
- `;
115
-
116
- const CloseButton = styled.div`
117
- position: absolute;
118
- top: 3px;
119
- right: 0px;
120
- color: white;
121
- z-index: 22;
122
- font-size: 0.8rem;
123
- `;
124
-
125
- const TitleContainer = styled.div`
126
- width: 100%;
127
- height: 100%;
128
- display: flex;
129
- flex-wrap: wrap;
130
- justify-content: flex-start;
131
- align-items: center;
132
- `;
133
-
134
- const Title = styled.h1`
135
- color: white;
136
- z-index: 22;
137
- font-size: 0.6rem;
138
- `;
139
-
140
- interface ICustomIconProps {
141
- width: string;
142
- }
143
-
144
- const Icon = styled.img`
145
- color: white;
146
- z-index: 22;
147
- font-size: 10px;
148
- width: ${(props: ICustomIconProps) => props.width};
149
- margin-right: 0.5rem;
150
- `;
1
+ import React, { useEffect, useRef } from 'react';
2
+ import Draggable, { DraggableData } from 'react-draggable';
3
+ import styled from 'styled-components';
4
+ import { useOutsideClick } from '../hooks/useOutsideAlerter';
5
+ import { IPosition } from '../types/eventTypes';
6
+ import { RPGUIContainerTypes } from './RPGUIContainer';
7
+
8
+ export interface IDraggableContainerProps {
9
+ children: React.ReactNode;
10
+ width?: string;
11
+ height?: string;
12
+ className?: string;
13
+ type?: RPGUIContainerTypes;
14
+ title?: string;
15
+ imgSrc?: string;
16
+ imgWidth?: string;
17
+ onCloseButton?: () => void;
18
+ cancelDrag?: string;
19
+ onPositionChange?: (position: IPosition) => void;
20
+ onOutsideClick?: () => void;
21
+ }
22
+
23
+ export const DraggableContainer: React.FC<IDraggableContainerProps> = ({
24
+ children,
25
+ width = '50%',
26
+ height,
27
+ className,
28
+ type = RPGUIContainerTypes.FramedGold,
29
+ onCloseButton,
30
+ title,
31
+ imgSrc,
32
+ imgWidth = '20px',
33
+ cancelDrag,
34
+ onPositionChange,
35
+ onOutsideClick,
36
+ }) => {
37
+ const draggableRef = useRef(null);
38
+
39
+ useOutsideClick(draggableRef, 'item-container');
40
+
41
+ useEffect(() => {
42
+ document.addEventListener('clickOutside', event => {
43
+ const e = event as CustomEvent;
44
+
45
+ if (e.detail.id === 'item-container') {
46
+ if (onOutsideClick) {
47
+ onOutsideClick();
48
+ }
49
+ }
50
+ });
51
+
52
+ return () => {
53
+ document.removeEventListener('clickOutside', _e => {});
54
+ };
55
+ }, []);
56
+
57
+ return (
58
+ <Draggable
59
+ cancel={`.container-close,${cancelDrag}`}
60
+ onDrag={(_e, data: DraggableData) => {
61
+ if (onPositionChange) {
62
+ onPositionChange({
63
+ x: data.x,
64
+ y: data.y,
65
+ });
66
+ }
67
+ }}
68
+ >
69
+ <Container
70
+ ref={draggableRef}
71
+ width={width}
72
+ height={height || 'auto'}
73
+ className={`rpgui-container ${type} ${className}`}
74
+ >
75
+ {title && (
76
+ <TitleContainer className="drag-handler">
77
+ <Title>
78
+ {imgSrc && <Icon src={imgSrc} width={imgWidth} />}
79
+ {title}
80
+ </Title>
81
+ </TitleContainer>
82
+ )}
83
+ {onCloseButton && (
84
+ <CloseButton
85
+ className="container-close"
86
+ onClick={onCloseButton}
87
+ onTouchStart={onCloseButton}
88
+ >
89
+ X
90
+ </CloseButton>
91
+ )}
92
+
93
+ {children}
94
+ </Container>
95
+ </Draggable>
96
+ );
97
+ };
98
+
99
+ interface IContainerProps {
100
+ width: string;
101
+ height: string;
102
+ }
103
+
104
+ const Container = styled.div<IContainerProps>`
105
+ height: ${props => props.height};
106
+ width: ${({ width }) => width};
107
+ display: flex;
108
+ flex-wrap: wrap;
109
+ image-rendering: pixelated;
110
+
111
+ &.rpgui-container {
112
+ padding-top: 1.5rem;
113
+ }
114
+ `;
115
+
116
+ const CloseButton = styled.div`
117
+ position: absolute;
118
+ top: 3px;
119
+ right: 0px;
120
+ color: white;
121
+ z-index: 22;
122
+ font-size: 0.8rem;
123
+ `;
124
+
125
+ const TitleContainer = styled.div`
126
+ width: 100%;
127
+ height: 100%;
128
+ display: flex;
129
+ flex-wrap: wrap;
130
+ justify-content: flex-start;
131
+ align-items: center;
132
+ `;
133
+
134
+ const Title = styled.h1`
135
+ color: white;
136
+ z-index: 22;
137
+ font-size: 0.6rem;
138
+ `;
139
+
140
+ interface ICustomIconProps {
141
+ width: string;
142
+ }
143
+
144
+ const Icon = styled.img`
145
+ color: white;
146
+ z-index: 22;
147
+ font-size: 10px;
148
+ width: ${(props: ICustomIconProps) => props.width};
149
+ margin-right: 0.5rem;
150
+ `;
@@ -1,57 +1,57 @@
1
- import React, { useEffect, useState } from 'react';
2
- import { v4 as uuidv4 } from 'uuid';
3
- import { _RPGUI } from './RPGUIRoot';
4
-
5
- export interface IOptionsProps {
6
- id: number;
7
- value: string;
8
- option: string;
9
- }
10
-
11
- export interface IDropdownProps {
12
- options: IOptionsProps[];
13
- width?: string;
14
- onChange: (value: string) => void;
15
- }
16
-
17
- export const Dropdown: React.FC<IDropdownProps> = ({
18
- options,
19
- width,
20
- onChange,
21
- }) => {
22
- const dropdownId = uuidv4();
23
-
24
- const [selectedValue, setSelectedValue] = useState<string>('');
25
-
26
- useEffect(() => {
27
- const element = document.getElementById(`rpgui-dropdown-${dropdownId}`);
28
- const dropdownValue = _RPGUI.get_value(element);
29
- setSelectedValue(dropdownValue);
30
-
31
- element?.addEventListener('change', (event: any) => {
32
- setSelectedValue(event?.target.value);
33
- });
34
- }, []);
35
-
36
- useEffect(() => {
37
- if (selectedValue) {
38
- onChange(selectedValue);
39
- }
40
- }, [selectedValue]);
41
-
42
- return (
43
- <select
44
- id={`rpgui-dropdown-${dropdownId}`}
45
- style={{ width: width }}
46
- className="rpgui-dropdown"
47
- >
48
- {options.map(option => {
49
- return (
50
- <option key={option.id} value={option.value}>
51
- {option.option}
52
- </option>
53
- );
54
- })}
55
- </select>
56
- );
57
- };
1
+ import React, { useEffect, useState } from 'react';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import { _RPGUI } from './RPGUIRoot';
4
+
5
+ export interface IOptionsProps {
6
+ id: number;
7
+ value: string;
8
+ option: string;
9
+ }
10
+
11
+ export interface IDropdownProps {
12
+ options: IOptionsProps[];
13
+ width?: string;
14
+ onChange: (value: string) => void;
15
+ }
16
+
17
+ export const Dropdown: React.FC<IDropdownProps> = ({
18
+ options,
19
+ width,
20
+ onChange,
21
+ }) => {
22
+ const dropdownId = uuidv4();
23
+
24
+ const [selectedValue, setSelectedValue] = useState<string>('');
25
+
26
+ useEffect(() => {
27
+ const element = document.getElementById(`rpgui-dropdown-${dropdownId}`);
28
+ const dropdownValue = _RPGUI.get_value(element);
29
+ setSelectedValue(dropdownValue);
30
+
31
+ element?.addEventListener('change', (event: any) => {
32
+ setSelectedValue(event?.target.value);
33
+ });
34
+ }, []);
35
+
36
+ useEffect(() => {
37
+ if (selectedValue) {
38
+ onChange(selectedValue);
39
+ }
40
+ }, [selectedValue]);
41
+
42
+ return (
43
+ <select
44
+ id={`rpgui-dropdown-${dropdownId}`}
45
+ style={{ width: width }}
46
+ className="rpgui-dropdown"
47
+ >
48
+ {options.map(option => {
49
+ return (
50
+ <option key={option.id} value={option.value}>
51
+ {option.option}
52
+ </option>
53
+ );
54
+ })}
55
+ </select>
56
+ );
57
+ };
@@ -1,134 +1,134 @@
1
- import {
2
- IEquipmentSet,
3
- IItem,
4
- IItemContainer,
5
- ItemSlotType,
6
- } from '@rpg-engine/shared';
7
- import React from 'react';
8
- import styled from 'styled-components';
9
- import { DraggableContainer } from '../DraggableContainer';
10
- import { SlotContainerType } from '../Item/Inventory/ItemContainerTypes';
11
- import { ItemSlot } from '../Item/Inventory/ItemSlot';
12
- import { RPGUIContainerTypes } from '../RPGUIContainer';
13
-
14
- export interface IEquipmentSetProps {
15
- equipmentSet: IEquipmentSet;
16
- onClose?: () => void;
17
- onItemClick?: (
18
- item: IItem,
19
- slotContainerType: SlotContainerType | null
20
- ) => void;
21
- onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;
22
- onSelected?: (optionId: string) => void;
23
- initialPosition?: { x: number; y: number };
24
- }
25
-
26
- export const EquipmentSet: React.FC<IEquipmentSetProps> = ({
27
- equipmentSet,
28
- onClose,
29
- onMouseOver,
30
- onSelected,
31
- onItemClick,
32
- }) => {
33
- const {
34
- neck,
35
- leftHand,
36
- ring,
37
- head,
38
- armor,
39
- legs,
40
- boot,
41
- inventory,
42
- rightHand,
43
- accessory,
44
- } = equipmentSet;
45
-
46
- const equipmentData = [
47
- neck,
48
- leftHand,
49
- ring,
50
- head,
51
- armor,
52
- legs,
53
- boot,
54
- inventory,
55
- rightHand,
56
- accessory,
57
- ];
58
-
59
- const equipmentMaskSlots = [
60
- ItemSlotType.Neck,
61
- ItemSlotType.LeftHand,
62
- ItemSlotType.Ring,
63
- ItemSlotType.Head,
64
- ItemSlotType.Torso,
65
- ItemSlotType.Legs,
66
- ItemSlotType.Feet,
67
- ItemSlotType.Inventory,
68
- ItemSlotType.RightHand,
69
- ItemSlotType.Accessory,
70
- ];
71
-
72
- const onRenderEquipmentSlotRange = (start: number, end: number) => {
73
- const equipmentRange = equipmentData.slice(start, end);
74
- const slotMaksRange = equipmentMaskSlots.slice(start, end);
75
-
76
- return equipmentRange.map((data, i) => {
77
- const item = data as IItem;
78
- const itemContainer =
79
- (item && (item.itemContainer as IItemContainer)) ?? null;
80
- return (
81
- <ItemSlot
82
- key={i}
83
- slotIndex={i}
84
- item={item}
85
- itemContainer={itemContainer}
86
- slotContainerType={SlotContainerType.EQUIPMENT_SET}
87
- slotSpriteMask={slotMaksRange[i]}
88
- onMouseOver={(event, slotIndex, item) => {
89
- if (onMouseOver) onMouseOver(event, slotIndex, item);
90
- }}
91
- onClick={(item, slotContainerType) => {
92
- if (onItemClick) onItemClick(item, slotContainerType);
93
- }}
94
- onSelected={(optionId: string) => {
95
- if (onSelected) onSelected(optionId);
96
- }}
97
- />
98
- );
99
- });
100
- };
101
-
102
- return (
103
- <DraggableContainer
104
- title={'Equipments'}
105
- type={RPGUIContainerTypes.Framed}
106
- onCloseButton={() => {
107
- if (onClose) onClose();
108
- }}
109
- width="330px"
110
- cancelDrag=".equipment-container-body"
111
- >
112
- <EquipmentSetContainer className="equipment-container-body">
113
- <EquipmentColumn>{onRenderEquipmentSlotRange(0, 3)}</EquipmentColumn>
114
- <EquipmentColumn>{onRenderEquipmentSlotRange(3, 7)}</EquipmentColumn>
115
- <EquipmentColumn>{onRenderEquipmentSlotRange(7, 10)}</EquipmentColumn>
116
- </EquipmentSetContainer>
117
- </DraggableContainer>
118
- );
119
- };
120
-
121
- const EquipmentSetContainer = styled.div`
122
- width: inherit;
123
- display: flex;
124
- justify-content: center;
125
- flex-wrap: wrap;
126
- flex-direction: row;
127
- `;
128
-
129
- const EquipmentColumn = styled.div`
130
- display: flex;
131
- justify-content: center;
132
- flex-wrap: wrap;
133
- flex-direction: column;
134
- `;
1
+ import {
2
+ IEquipmentSet,
3
+ IItem,
4
+ IItemContainer,
5
+ ItemSlotType,
6
+ } from '@rpg-engine/shared';
7
+ import React from 'react';
8
+ import styled from 'styled-components';
9
+ import { DraggableContainer } from '../DraggableContainer';
10
+ import { SlotContainerType } from '../Item/Inventory/ItemContainerTypes';
11
+ import { ItemSlot } from '../Item/Inventory/ItemSlot';
12
+ import { RPGUIContainerTypes } from '../RPGUIContainer';
13
+
14
+ export interface IEquipmentSetProps {
15
+ equipmentSet: IEquipmentSet;
16
+ onClose?: () => void;
17
+ onItemClick?: (
18
+ item: IItem,
19
+ slotContainerType: SlotContainerType | null
20
+ ) => void;
21
+ onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;
22
+ onSelected?: (optionId: string) => void;
23
+ initialPosition?: { x: number; y: number };
24
+ }
25
+
26
+ export const EquipmentSet: React.FC<IEquipmentSetProps> = ({
27
+ equipmentSet,
28
+ onClose,
29
+ onMouseOver,
30
+ onSelected,
31
+ onItemClick,
32
+ }) => {
33
+ const {
34
+ neck,
35
+ leftHand,
36
+ ring,
37
+ head,
38
+ armor,
39
+ legs,
40
+ boot,
41
+ inventory,
42
+ rightHand,
43
+ accessory,
44
+ } = equipmentSet;
45
+
46
+ const equipmentData = [
47
+ neck,
48
+ leftHand,
49
+ ring,
50
+ head,
51
+ armor,
52
+ legs,
53
+ boot,
54
+ inventory,
55
+ rightHand,
56
+ accessory,
57
+ ];
58
+
59
+ const equipmentMaskSlots = [
60
+ ItemSlotType.Neck,
61
+ ItemSlotType.LeftHand,
62
+ ItemSlotType.Ring,
63
+ ItemSlotType.Head,
64
+ ItemSlotType.Torso,
65
+ ItemSlotType.Legs,
66
+ ItemSlotType.Feet,
67
+ ItemSlotType.Inventory,
68
+ ItemSlotType.RightHand,
69
+ ItemSlotType.Accessory,
70
+ ];
71
+
72
+ const onRenderEquipmentSlotRange = (start: number, end: number) => {
73
+ const equipmentRange = equipmentData.slice(start, end);
74
+ const slotMaksRange = equipmentMaskSlots.slice(start, end);
75
+
76
+ return equipmentRange.map((data, i) => {
77
+ const item = data as IItem;
78
+ const itemContainer =
79
+ (item && (item.itemContainer as IItemContainer)) ?? null;
80
+ return (
81
+ <ItemSlot
82
+ key={i}
83
+ slotIndex={i}
84
+ item={item}
85
+ itemContainer={itemContainer}
86
+ slotContainerType={SlotContainerType.EQUIPMENT_SET}
87
+ slotSpriteMask={slotMaksRange[i]}
88
+ onMouseOver={(event, slotIndex, item) => {
89
+ if (onMouseOver) onMouseOver(event, slotIndex, item);
90
+ }}
91
+ onClick={(item, slotContainerType) => {
92
+ if (onItemClick) onItemClick(item, slotContainerType);
93
+ }}
94
+ onSelected={(optionId: string) => {
95
+ if (onSelected) onSelected(optionId);
96
+ }}
97
+ />
98
+ );
99
+ });
100
+ };
101
+
102
+ return (
103
+ <DraggableContainer
104
+ title={'Equipments'}
105
+ type={RPGUIContainerTypes.Framed}
106
+ onCloseButton={() => {
107
+ if (onClose) onClose();
108
+ }}
109
+ width="330px"
110
+ cancelDrag=".equipment-container-body"
111
+ >
112
+ <EquipmentSetContainer className="equipment-container-body">
113
+ <EquipmentColumn>{onRenderEquipmentSlotRange(0, 3)}</EquipmentColumn>
114
+ <EquipmentColumn>{onRenderEquipmentSlotRange(3, 7)}</EquipmentColumn>
115
+ <EquipmentColumn>{onRenderEquipmentSlotRange(7, 10)}</EquipmentColumn>
116
+ </EquipmentSetContainer>
117
+ </DraggableContainer>
118
+ );
119
+ };
120
+
121
+ const EquipmentSetContainer = styled.div`
122
+ width: inherit;
123
+ display: flex;
124
+ justify-content: center;
125
+ flex-wrap: wrap;
126
+ flex-direction: row;
127
+ `;
128
+
129
+ const EquipmentColumn = styled.div`
130
+ display: flex;
131
+ justify-content: center;
132
+ flex-wrap: wrap;
133
+ flex-direction: column;
134
+ `;