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

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErodeesFleurs <3353309908@qq.com>2024-04-02 09:34:06 +0800
committerErodeesFleurs <3353309908@qq.com>2024-04-02 09:34:06 +0800
commitbe571b5cd04f3986dc5725b4b04b4f94bd67a16c (patch)
tree5f0c8e4a3ed78a3fd753f512993afbb7dd60282d
parent14506b1014aa2e5cbc041ff7b6907c5f499a0e10 (diff)
add world.sendPacket and fixed deadlock
-rw-r--r--source/game/StarUniverseServer.cpp3
-rw-r--r--source/game/StarWorldServer.cpp7
-rw-r--r--source/game/StarWorldServer.hpp1
-rw-r--r--source/game/scripting/StarWorldLuaBindings.cpp7
-rw-r--r--source/game/scripting/StarWorldLuaBindings.hpp1
5 files changed, 17 insertions, 2 deletions
diff --git a/source/game/StarUniverseServer.cpp b/source/game/StarUniverseServer.cpp
index 9085db9..f2d8b3e 100644
--- a/source/game/StarUniverseServer.cpp
+++ b/source/game/StarUniverseServer.cpp
@@ -475,7 +475,8 @@ bool UniverseServer::updatePlanetType(CelestialCoordinate const& coordinate, Str
void UniverseServer::sendPacket(ConnectionId clientId, PacketPtr packet) {
RecursiveMutexLocker locker(m_mainLock);
- m_connectionServer->sendPackets(clientId, {packet});
+ if (m_clients.contains(clientId))
+ m_connectionServer->sendPackets(clientId, {packet});
}
void UniverseServer::run() {
diff --git a/source/game/StarWorldServer.cpp b/source/game/StarWorldServer.cpp
index ad3b555..95ec8c3 100644
--- a/source/game/StarWorldServer.cpp
+++ b/source/game/StarWorldServer.cpp
@@ -544,6 +544,11 @@ List<PacketPtr> WorldServer::getOutgoingPackets(ConnectionId clientId) {
return std::move(clientInfo->outgoingPackets);
}
+void WorldServer::sendPacket(ConnectionId clientId, PacketPtr const& packet) {
+ if (auto const& clientInfo = m_clientInfo.get(clientId))
+ clientInfo->outgoingPackets.append(packet);
+}
+
Maybe<Json> WorldServer::receiveMessage(ConnectionId fromConnection, String const& message, JsonArray const& args) {
Maybe<Json> result;
for (auto& p : m_scriptContexts) {
@@ -2084,7 +2089,7 @@ float WorldServer::lightLevel(Vec2F const& pos) const {
}
void WorldServer::setDungeonBreathable(DungeonId dungeonId, Maybe<bool> breathable) {
- Maybe<float> current = m_dungeonIdBreathable.maybe(dungeonId);
+ Maybe<bool> current = m_dungeonIdBreathable.maybe(dungeonId);
if (breathable != current) {
if (breathable)
m_dungeonIdBreathable[dungeonId] = *breathable;
diff --git a/source/game/StarWorldServer.hpp b/source/game/StarWorldServer.hpp
index 4c11217..e1821d5 100644
--- a/source/game/StarWorldServer.hpp
+++ b/source/game/StarWorldServer.hpp
@@ -104,6 +104,7 @@ public:
void handleIncomingPackets(ConnectionId clientId, List<PacketPtr> const& packets);
List<PacketPtr> getOutgoingPackets(ConnectionId clientId);
+ void sendPacket(ConnectionId clientId, PacketPtr const& packet);
Maybe<Json> receiveMessage(ConnectionId fromConnection, String const& message, JsonArray const& args);
diff --git a/source/game/scripting/StarWorldLuaBindings.cpp b/source/game/scripting/StarWorldLuaBindings.cpp
index cc91ec2..0016589 100644
--- a/source/game/scripting/StarWorldLuaBindings.cpp
+++ b/source/game/scripting/StarWorldLuaBindings.cpp
@@ -390,6 +390,7 @@ namespace LuaBindings {
callbacks.registerCallbackWithSignature<List<EntityId>>("players", bind(ServerWorldCallbacks::players, world));
callbacks.registerCallbackWithSignature<LuaString, LuaEngine&>("fidelity", bind(ServerWorldCallbacks::fidelity, world, _1));
callbacks.registerCallbackWithSignature<Maybe<LuaValue>, String, String, LuaVariadic<LuaValue>>("callScriptContext", bind(ServerWorldCallbacks::callScriptContext, world, _1, _2, _3));
+ callbacks.registerCallbackWithSignature<void, ConnectionId, String, Json>("sendPacket", bind(ServerWorldCallbacks::sendPacket, world, _1, _2, _3));
callbacks.registerCallbackWithSignature<double>("skyTime", [serverWorld]() {
return serverWorld->sky()->epochTime();
@@ -1186,6 +1187,12 @@ namespace LuaBindings {
return context->invoke(function, args);
}
+ void ServerWorldCallbacks::sendPacket(WorldServer* world, ConnectionId clientId, String const& packetType, Json const& packetData) {
+ PacketType type = PacketTypeNames.getLeft(packetType);
+ auto packet = createPacket(type, packetData);
+ world->sendPacket(clientId, packet);
+ }
+
void WorldDebugCallbacks::debugPoint(Vec2F const& arg1, Color const& arg2) {
SpatialLogger::logPoint("world", arg1, arg2.toRgba());
}
diff --git a/source/game/scripting/StarWorldLuaBindings.hpp b/source/game/scripting/StarWorldLuaBindings.hpp
index 010affd..114536d 100644
--- a/source/game/scripting/StarWorldLuaBindings.hpp
+++ b/source/game/scripting/StarWorldLuaBindings.hpp
@@ -88,6 +88,7 @@ namespace LuaBindings {
List<EntityId> players(World* world);
LuaString fidelity(World* world, LuaEngine& engine);
Maybe<LuaValue> callScriptContext(World* world, String const& contextName, String const& function, LuaVariadic<LuaValue> const& args);
+ void sendPacket(WorldServer* world, ConnectionId clientId, String const& packetType, Json const& packetData);
}
namespace WorldDebugCallbacks {