Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/client/StarClientApplication.cpp1
-rw-r--r--source/frontend/StarInterfaceLuaBindings.cpp5
-rw-r--r--source/frontend/StarMainInterface.cpp26
-rw-r--r--source/frontend/StarMainInterface.hpp4
-rw-r--r--source/game/StarUniverseClient.cpp32
-rw-r--r--source/game/StarUniverseClient.hpp11
-rw-r--r--source/windowing/StarCanvasWidget.cpp11
-rw-r--r--source/windowing/StarGuiContext.cpp10
-rw-r--r--source/windowing/StarGuiContext.hpp1
-rw-r--r--source/windowing/StarWidgetLuaBindings.cpp9
10 files changed, 86 insertions, 24 deletions
diff --git a/source/client/StarClientApplication.cpp b/source/client/StarClientApplication.cpp
index f7ab21b..9de1642 100644
--- a/source/client/StarClientApplication.cpp
+++ b/source/client/StarClientApplication.cpp
@@ -614,6 +614,7 @@ void ClientApplication::changeState(MainAppState newState) {
m_worldPainter = make_shared<WorldPainter>();
m_mainInterface = make_shared<MainInterface>(m_universeClient, m_worldPainter, m_cinematicOverlay);
m_universeClient->setLuaCallbacks("interface", LuaBindings::makeInterfaceCallbacks(m_mainInterface.get()));
+ m_universeClient->startLua();
m_mainMixer->setWorldPainter(m_worldPainter);
diff --git a/source/frontend/StarInterfaceLuaBindings.cpp b/source/frontend/StarInterfaceLuaBindings.cpp
index 14b2e7c..d5e0960 100644
--- a/source/frontend/StarInterfaceLuaBindings.cpp
+++ b/source/frontend/StarInterfaceLuaBindings.cpp
@@ -27,6 +27,11 @@ LuaCallbacks LuaBindings::makeInterfaceCallbacks(MainInterface* mainInterface) {
return GuiContext::singleton().interfaceScale();
});
+ callbacks.registerCallback("queueMessage", [mainInterface](String const& message, Maybe<float> cooldown, Maybe<float> springState) {
+ mainInterface->queueMessage(message, cooldown, springState.value(0));
+ });
+
+
return callbacks;
}
diff --git a/source/frontend/StarMainInterface.cpp b/source/frontend/StarMainInterface.cpp
index 9f335b6..0dc3a01 100644
--- a/source/frontend/StarMainInterface.cpp
+++ b/source/frontend/StarMainInterface.cpp
@@ -62,8 +62,8 @@ namespace Star {
GuiMessage::GuiMessage() : message(), cooldown(), springState() {}
-GuiMessage::GuiMessage(String const& message, float cooldown)
- : message(message), cooldown(cooldown), springState(0) {}
+GuiMessage::GuiMessage(String const& message, float cooldown, float spring)
+ : message(message), cooldown(cooldown), springState(spring) {}
MainInterface::MainInterface(UniverseClientPtr client, WorldPainterPtr painter, CinematicPtr cinematicOverlay) {
m_state = Running;
@@ -369,6 +369,9 @@ bool MainInterface::handleInputEvent(InputEvent const& event) {
player->endTrigger();
}
+ for (auto& pair : m_canvases)
+ pair.second->sendEvent(event);
+
return true;
}
@@ -863,11 +866,15 @@ void MainInterface::doChat(String const& chat, bool addToHistory) {
m_chat->addHistory(chat);
}
-void MainInterface::queueMessage(String const& message) {
- auto guiMessage = make_shared<GuiMessage>(message, m_config->messageTime);
+void MainInterface::queueMessage(String const& message, Maybe<float> cooldown, float spring) {
+ auto guiMessage = make_shared<GuiMessage>(message, cooldown.value(m_config->messageTime), spring);
m_messages.append(guiMessage);
}
+void MainInterface::queueMessage(String const& message) {
+ queueMessage(message, m_config->messageTime, 0.0f);
+}
+
void MainInterface::queueJoinRequest(pair<String, RpcPromiseKeeper<P2PJoinRequestReply>> request)
{
m_queuedJoinRequests.push_back(request);
@@ -927,18 +934,21 @@ void MainInterface::warpTo(WarpAction const& warpAction) {
}
CanvasWidgetPtr MainInterface::fetchCanvas(String const& canvasName, bool ignoreInterfaceScale) {
+ CanvasWidgetPtr canvas;
+
if (auto canvasPtr = m_canvases.ptr(canvasName))
- return *canvasPtr;
+ canvas = *canvasPtr;
else {
- CanvasWidgetPtr canvas = m_canvases.emplace(canvasName, make_shared<CanvasWidget>()).first->second;
+ m_canvases.emplace(canvasName, canvas = make_shared<CanvasWidget>());
canvas->setPosition(Vec2I());
if (ignoreInterfaceScale)
canvas->setSize(Vec2I(m_guiContext->windowSize()));
else
canvas->setSize(Vec2I(m_guiContext->windowInterfaceSize()));
- canvas->setIgnoreInterfaceScale(ignoreInterfaceScale);
- return canvas;
}
+
+ canvas->setIgnoreInterfaceScale(ignoreInterfaceScale);
+ return canvas;
}
PanePtr MainInterface::createEscapeDialog() {
diff --git a/source/frontend/StarMainInterface.hpp b/source/frontend/StarMainInterface.hpp
index d96779d..9cf2342 100644
--- a/source/frontend/StarMainInterface.hpp
+++ b/source/frontend/StarMainInterface.hpp
@@ -49,7 +49,7 @@ STAR_CLASS(MainInterface);
struct GuiMessage {
GuiMessage();
- GuiMessage(String const& message, float cooldown);
+ GuiMessage(String const& message, float cooldown, float spring = 0);
String message;
float cooldown;
@@ -105,7 +105,9 @@ public:
void doChat(String const& chat, bool addToHistory);
+ void queueMessage(String const& message, Maybe<float> cooldown, float spring);
void queueMessage(String const& message);
+
void queueItemPickupText(ItemPtr const& item);
void queueJoinRequest(pair<String, RpcPromiseKeeper<P2PJoinRequestReply>> request);
diff --git a/source/game/StarUniverseClient.cpp b/source/game/StarUniverseClient.cpp
index 1622518..bc1b0b9 100644
--- a/source/game/StarUniverseClient.cpp
+++ b/source/game/StarUniverseClient.cpp
@@ -30,6 +30,7 @@ UniverseClient::UniverseClient(PlayerStoragePtr playerStorage, StatisticsPtr sta
m_playerStorage = move(playerStorage);
m_statistics = move(statistics);
m_pause = false;
+ m_luaRoot = make_shared<LuaRoot>();
reset();
}
@@ -86,7 +87,7 @@ Maybe<String> UniverseClient::connect(UniverseConnection connection, bool allowA
return String(strf("Join failed! Server does not support connections with protocol version {}", StarProtocolVersion));
connection.pushSingle(make_shared<ClientConnectPacket>(Root::singleton().assets()->digest(), allowAssetsMismatch, m_mainPlayer->uuid(), m_mainPlayer->name(),
- m_mainPlayer->species(), m_playerStorage->loadShipData(m_mainPlayer->uuid()), ShipUpgrades(m_mainPlayer->shipUpgrades()),
+ m_mainPlayer->species(), m_playerStorage->loadShipData(m_mainPlayer->uuid()), m_mainPlayer->shipUpgrades(),
m_mainPlayer->log()->introComplete(), account));
connection.sendAll(timeout);
@@ -219,8 +220,11 @@ void UniverseClient::update() {
m_statistics->update();
- if (!m_pause)
+ if (!m_pause) {
m_worldClient->update();
+ for (auto& p : m_scriptContexts)
+ p.second->update();
+ }
m_connection->push(m_worldClient->getOutgoingPackets());
if (!m_pause)
@@ -444,6 +448,28 @@ void UniverseClient::setLuaCallbacks(String const& groupName, LuaCallbacks const
m_worldClient->setLuaCallbacks(groupName, callbacks);
}
+void UniverseClient::startLua() {
+ auto assets = Root::singleton().assets();
+ for (auto& p : assets->json("/client.config:universeScriptContexts").toObject()) {
+ auto scriptComponent = make_shared<ScriptComponent>();
+ scriptComponent->setLuaRoot(m_luaRoot);
+ scriptComponent->setScripts(jsonToStringList(p.second.toArray()));
+
+ for (auto& pair : m_luaCallbacks)
+ scriptComponent->addCallbacks(pair.first, pair.second);
+
+ m_scriptContexts.set(p.first, scriptComponent);
+ scriptComponent->init();
+ }
+}
+
+void UniverseClient::stopLua() {
+ for (auto& p : m_scriptContexts)
+ p.second->uninit();
+
+ m_scriptContexts.clear();
+}
+
ClockConstPtr UniverseClient::universeClock() const {
return m_universeClock;
}
@@ -539,6 +565,8 @@ void UniverseClient::handlePackets(List<PacketPtr> const& packets) {
}
void UniverseClient::reset() {
+ stopLua();
+
m_universeClock.reset();
m_worldClient.reset();
m_celestialDatabase.reset();
diff --git a/source/game/StarUniverseClient.hpp b/source/game/StarUniverseClient.hpp
index b26f2df..daad481 100644
--- a/source/game/StarUniverseClient.hpp
+++ b/source/game/StarUniverseClient.hpp
@@ -10,6 +10,7 @@
#include "StarAiTypes.hpp"
#include "StarSky.hpp"
#include "StarUniverseConnection.hpp"
+#include "StarLuaComponents.hpp"
namespace Star {
@@ -29,8 +30,8 @@ STAR_CLASS(CelestialDatabase);
STAR_CLASS(JsonRpcInterface);
STAR_CLASS(TeamClient);
STAR_CLASS(QuestManager);
-
STAR_CLASS(UniverseClient);
+STAR_CLASS(LuaRoot);
class UniverseClient {
public:
@@ -86,6 +87,8 @@ public:
uint16_t maxPlayers();
void setLuaCallbacks(String const& groupName, LuaCallbacks const& callbacks);
+ void startLua();
+ void stopLua();
ClockConstPtr universeClock() const;
CelestialLogConstPtr celestialLog() const;
@@ -141,6 +144,12 @@ private:
List<ChatReceivedMessage> m_pendingMessages;
Maybe<String> m_disconnectReason;
+
+ LuaRootPtr m_luaRoot;
+
+ typedef LuaUpdatableComponent<LuaBaseComponent> ScriptComponent;
+ typedef shared_ptr<ScriptComponent> ScriptComponentPtr;
+ StringMap<ScriptComponentPtr> m_scriptContexts;
};
}
diff --git a/source/windowing/StarCanvasWidget.cpp b/source/windowing/StarCanvasWidget.cpp
index ed2e30f..a0eeb7d 100644
--- a/source/windowing/StarCanvasWidget.cpp
+++ b/source/windowing/StarCanvasWidget.cpp
@@ -88,20 +88,21 @@ bool CanvasWidget::sendEvent(InputEvent const& event) {
return false;
auto& context = GuiContext::singleton();
+ int interfaceScale = m_ignoreInterfaceScale ? 1 : context.interfaceScale();
if (auto mouseButtonDown = event.ptr<MouseButtonDownEvent>()) {
- if (inMember(*context.mousePosition(event)) && m_captureMouse) {
- m_clickEvents.append({*context.mousePosition(event) - screenPosition(), mouseButtonDown->mouseButton, true});
+ if (inMember(*context.mousePosition(event, interfaceScale)) && m_captureMouse) {
+ m_clickEvents.append({*context.mousePosition(event, interfaceScale) - screenPosition(), mouseButtonDown->mouseButton, true});
m_clickEvents.limitSizeBack(MaximumEventBuffer);
return true;
}
} else if (auto mouseButtonUp = event.ptr<MouseButtonUpEvent>()) {
if (m_captureMouse) {
- m_clickEvents.append({*context.mousePosition(event) - screenPosition(), mouseButtonUp->mouseButton, false});
+ m_clickEvents.append({*context.mousePosition(event, interfaceScale) - screenPosition(), mouseButtonUp->mouseButton, false});
m_clickEvents.limitSizeBack(MaximumEventBuffer);
return true;
}
} else if (event.is<MouseMoveEvent>()) {
- m_mousePosition = *context.mousePosition(event) - screenPosition();
+ m_mousePosition = *context.mousePosition(event, interfaceScale) - screenPosition();
return false;
} else if (auto keyDown = event.ptr<KeyDownEvent>()) {
if (m_captureKeyboard) {
@@ -258,7 +259,7 @@ void CanvasWidget::renderTriangles(Vec2F const& renderingOffset, List<tuple<Vec2
void CanvasWidget::renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, unsigned fontSize, Vec4B const& color, FontMode mode, float lineSpacing, String const& font, String const& directives) {
auto& context = GuiContext::singleton();
context.setFontProcessingDirectives(directives);
- context.setFontSize(fontSize);
+ context.setFontSize(fontSize, m_ignoreInterfaceScale ? 1 : context.interfaceScale());
context.setFontColor(color);
context.setFontMode(mode);
context.setFont(font);
diff --git a/source/windowing/StarGuiContext.cpp b/source/windowing/StarGuiContext.cpp
index 2d649c5..73713d1 100644
--- a/source/windowing/StarGuiContext.cpp
+++ b/source/windowing/StarGuiContext.cpp
@@ -98,9 +98,9 @@ void GuiContext::setInterfaceScale(int interfaceScale) {
m_interfaceScale = interfaceScale;
}
-Maybe<Vec2I> GuiContext::mousePosition(InputEvent const& event) const {
- auto getInterfacePosition = [this](Vec2I pos) {
- return Vec2I(pos) / interfaceScale();
+Maybe<Vec2I> GuiContext::mousePosition(InputEvent const& event, int pixelRatio) const {
+ auto getInterfacePosition = [pixelRatio](Vec2I pos) {
+ return Vec2I(pos) / pixelRatio;
};
if (auto mouseMoveEvent = event.ptr<MouseMoveEvent>())
@@ -115,6 +115,10 @@ Maybe<Vec2I> GuiContext::mousePosition(InputEvent const& event) const {
return {};
}
+Maybe<Vec2I> GuiContext::mousePosition(InputEvent const& event) const {
+ return mousePosition(event, interfaceScale());
+}
+
Set<InterfaceAction> GuiContext::actions(InputEvent const& event) const {
return m_keyBindings.actions(event);
}
diff --git a/source/windowing/StarGuiContext.hpp b/source/windowing/StarGuiContext.hpp
index 1d6ed46..8e689ee 100644
--- a/source/windowing/StarGuiContext.hpp
+++ b/source/windowing/StarGuiContext.hpp
@@ -50,6 +50,7 @@ public:
int interfaceScale() const;
void setInterfaceScale(int interfaceScale);
+ Maybe<Vec2I> mousePosition(InputEvent const& event, int pixelRatio) const;
Maybe<Vec2I> mousePosition(InputEvent const& event) const;
Set<InterfaceAction> actions(InputEvent const& event) const;
diff --git a/source/windowing/StarWidgetLuaBindings.cpp b/source/windowing/StarWidgetLuaBindings.cpp
index 46f1ac8..f69bd53 100644
--- a/source/windowing/StarWidgetLuaBindings.cpp
+++ b/source/windowing/StarWidgetLuaBindings.cpp
@@ -25,13 +25,14 @@ LuaMethods<CanvasWidgetPtr> LuaUserDataMethods<CanvasWidgetPtr>::make() {
methods.registerMethodWithSignature<void, CanvasWidgetPtr>("clear", mem_fn(&CanvasWidget::clear));
- methods.registerMethod("drawDrawable", [](CanvasWidgetPtr canvasWidget, Drawable drawable) {
- canvasWidget->drawDrawable(move(drawable), Vec2F());
+ methods.registerMethod("drawDrawable", [](CanvasWidgetPtr canvasWidget, Drawable drawable, Maybe<Vec2F> screenPos) {
+ canvasWidget->drawDrawable(move(drawable), screenPos.value(Vec2F()));
});
- methods.registerMethod("drawDrawables", [](CanvasWidgetPtr canvasWidget, List<Drawable> drawables) {
+ methods.registerMethod("drawDrawables", [](CanvasWidgetPtr canvasWidget, List<Drawable> drawables, Maybe<Vec2F> screenPos) {
+ Vec2F pos = screenPos.value(Vec2F());
for (auto& drawable : drawables)
- canvasWidget->drawDrawable(move(drawable), Vec2F());
+ canvasWidget->drawDrawable(move(drawable), pos);
});
methods.registerMethod("drawImage",