1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#include "StarCharSelection.hpp"
#include "StarGuiReader.hpp"
#include "StarRoot.hpp"
#include "StarLargeCharPlateWidget.hpp"
#include "StarTextBoxWidget.hpp"
#include "StarAssets.hpp"
#include "StarRandom.hpp"
#include "StarInputEvent.hpp"
namespace Star {
CharSelectionPane::CharSelectionPane(PlayerStoragePtr playerStorage,
CreateCharCallback createCallback,
SelectCharacterCallback selectCallback,
DeleteCharacterCallback deleteCallback)
: m_playerStorage(playerStorage),
m_downScroll(0),
m_filteredList({}),
m_search(""),
m_createCallback(createCallback),
m_selectCallback(selectCallback),
m_deleteCallback(deleteCallback) {
auto& root = Root::singleton();
GuiReader guiReader;
guiReader.registerCallback("playerUpButton", [=](Widget*) { shiftCharacters(-1); });
guiReader.registerCallback("playerDownButton", [=](Widget*) { shiftCharacters(1); });
guiReader.registerCallback("charSelector1", [=](Widget*) { selectCharacter(0); });
guiReader.registerCallback("charSelector2", [=](Widget*) { selectCharacter(1); });
guiReader.registerCallback("charSelector3", [=](Widget*) { selectCharacter(2); });
guiReader.registerCallback("charSelector4", [=](Widget*) { selectCharacter(3); });
guiReader.registerCallback("createCharButton", [=](Widget*) { m_createCallback(); });
guiReader.registerCallback("searchCharacter", [=](Widget* obj) {
m_downScroll = 0;
m_search = convert<TextBoxWidget>(obj)->getText().trim().toLower();
updateCharacterPlates();
});
guiReader.registerCallback("clearSearch", [=](Widget*) {
auto searchCharacter = fetchChild<TextBoxWidget>("searchCharacter");
searchCharacter->setText("");
});
guiReader.construct(root.assets()->json("/interface/windowconfig/charselection.config"), this);
}
bool CharSelectionPane::sendEvent(InputEvent const& event) {
if (m_visible) {
if (auto mouseWheel = event.ptr<MouseWheelEvent>()) {
if (inMember(*context()->mousePosition(event))) {
if (mouseWheel->mouseWheel == MouseWheel::Down)
shiftCharacters(1);
else if (mouseWheel->mouseWheel == MouseWheel::Up)
shiftCharacters(-1);
return true;
}
}
}
return Pane::sendEvent(event);
}
void CharSelectionPane::show() {
Pane::show();
m_downScroll = 0;
updateCharacterPlates();
}
void CharSelectionPane::shiftCharacters(int shift) {
m_downScroll = std::max<int>(std::min<int>(m_downScroll + shift, m_filteredList.size() - 3), 0);
updateCharacterPlates();
}
void CharSelectionPane::selectCharacter(unsigned buttonIndex) {
if (m_downScroll + buttonIndex < m_filteredList.size()) {
auto playerUuid = m_filteredList.get(m_downScroll + buttonIndex);
auto player = m_playerStorage->loadPlayer(playerUuid);
if (player->isPermaDead() && !player->isAdmin()) {
auto sound = Random::randValueFrom(
Root::singleton().assets()->json("/interface.config:buttonClickFailSound").toArray(), "")
.toString();
if (!sound.empty())
context()->playAudio(sound);
} else
m_selectCallback(player);
} else
m_createCallback();
}
void CharSelectionPane::updateCharacterPlates() {
auto updatePlayerLine = [this](String name, unsigned scrollPosition) {
m_filteredList = m_playerStorage->playerUuidListByName(m_search);
auto charSelector = fetchChild<LargeCharPlateWidget>(name);
if (m_filteredList.size() > 0 && scrollPosition < m_filteredList.size()) {
auto playerUuid = m_filteredList.get(scrollPosition);
if (auto player = m_playerStorage->loadPlayer(playerUuid)) {
player->humanoid()->setFacingDirection(Direction::Right);
charSelector->setPlayer(player);
charSelector->enableDelete([this, playerUuid](Widget*) { m_deleteCallback(playerUuid); });
return;
}
}
charSelector->setPlayer(PlayerPtr());
charSelector->disableDelete();
};
updatePlayerLine("charSelector1", m_downScroll + 0);
updatePlayerLine("charSelector2", m_downScroll + 1);
updatePlayerLine("charSelector3", m_downScroll + 2);
updatePlayerLine("charSelector4", m_downScroll + 3);
if (m_downScroll > 0)
fetchChild("playerUpButton")->show();
else
fetchChild("playerUpButton")->hide();
if (m_downScroll < m_filteredList.size() - 3)
fetchChild("playerDownButton")->show();
else
fetchChild("playerDownButton")->hide();
}
}
|