diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/client/StarClientApplication.cpp | 1 | ||||
-rw-r--r-- | source/frontend/StarInterfaceLuaBindings.cpp | 5 | ||||
-rw-r--r-- | source/frontend/StarMainInterface.cpp | 26 | ||||
-rw-r--r-- | source/frontend/StarMainInterface.hpp | 4 | ||||
-rw-r--r-- | source/game/StarUniverseClient.cpp | 32 | ||||
-rw-r--r-- | source/game/StarUniverseClient.hpp | 11 | ||||
-rw-r--r-- | source/windowing/StarCanvasWidget.cpp | 11 | ||||
-rw-r--r-- | source/windowing/StarGuiContext.cpp | 10 | ||||
-rw-r--r-- | source/windowing/StarGuiContext.hpp | 1 | ||||
-rw-r--r-- | source/windowing/StarWidgetLuaBindings.cpp | 9 |
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", |