From 20a82df9a0b33cd89dd56b83947c558d95bb2047 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 19 Jan 2017 14:02:32 -0800 Subject: [PATCH 1/3] Fix scripts not reloading in certain edge cases --- .../src/scripts/EntityScriptServer.cpp | 13 ++++--------- libraries/entities/src/EntityItem.h | 4 ---- libraries/script-engine/src/ScriptEngine.cpp | 7 +++++++ libraries/script-engine/src/ScriptEngine.h | 1 + 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index 02a348df37..579cd8ced6 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -216,12 +216,6 @@ void EntityScriptServer::resetEntitiesScriptEngine() { auto webSocketServerConstructorValue = newEngine->newFunction(WebSocketServerClass::constructor); newEngine->globalObject().setProperty("WebSocketServer", webSocketServerConstructorValue); - -// newEngine->setEmitScriptUpdatesFunction([this]() { -// SharedNodePointer entityServerNode = DependencyManager::get()->soloNodeOfType(NodeType::EntityServer); -// return !entityServerNode || isPhysicsEnabled(); -// }); - newEngine->registerGlobalObject("AvatarList", DependencyManager::get().data()); newEngine->registerGlobalObject("SoundCache", DependencyManager::get().data()); @@ -287,14 +281,15 @@ void EntityScriptServer::entityServerScriptChanging(const EntityItemID& entityID } void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const bool reload) { - if (_entityViewer.getTree() && !_shuttingDown) { + if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { + auto details = _entitiesScriptEngine->getEntityScriptDetails(entityID); + EntityItemPointer entity = _entityViewer.getTree()->findEntityByEntityItemID(entityID); - if (entity && entity->shouldPreloadServerScript() && _entitiesScriptEngine) { + if (entity && (details.scriptText != entity->getServerScripts() || reload)) { QString scriptUrl = entity->getServerScripts(); scriptUrl = ResourceManager::normalizeURL(scriptUrl); qDebug() << "Loading entity server script" << scriptUrl << "for" << entityID; ScriptEngine::loadEntityScript(_entitiesScriptEngine, entityID, scriptUrl, reload); - entity->serverScriptHasPreloaded(); } } } diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index d4b62e74de..cb696dd91d 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -444,9 +444,6 @@ public: ((_loadedScript != _script) || (_loadedScriptTimestamp != _scriptTimestamp)); } void scriptHasPreloaded() { _loadedScript = _script; _loadedScriptTimestamp = _scriptTimestamp; } - bool shouldPreloadServerScript() const { return !_serverScripts.isEmpty() && ((_loadedServerScripts != _serverScripts)); } - void serverScriptHasPreloaded() { _loadedServerScripts = _serverScripts; } - bool getClientOnly() const { return _clientOnly; } void setClientOnly(bool clientOnly) { _clientOnly = clientOnly; } // if this entity is client-only, which avatar is it associated with? @@ -519,7 +516,6 @@ protected: QString _loadedScript; /// the value of _script when the last preload signal was sent quint64 _scriptTimestamp{ ENTITY_ITEM_DEFAULT_SCRIPT_TIMESTAMP }; /// the script loaded property used for forced reload QString _serverScripts; - QString _loadedServerScripts; /// the value of _scriptTimestamp when the last preload signal was sent // NOTE: on construction we want this to be different from _scriptTimestamp so we intentionally bump it diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index cedf5a4ed8..5cbd5c2739 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1587,6 +1587,13 @@ void ScriptEngine::unloadAllEntityScripts() { #endif // DEBUG_ENGINE_STATE } +EntityScriptDetails ScriptEngine::getEntityScriptDetails(const EntityItemID& entityID) const { + if (_entityScripts.contains(entityID)) { + return _entityScripts[entityID]; + } + return EntityScriptDetails(); +} + void ScriptEngine::refreshFileScript(const EntityItemID& entityID) { if (!_entityScripts.contains(entityID)) { return; diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index e266ff3bc9..bdf542905a 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -149,6 +149,7 @@ public: const QStringList& params = QStringList()) override; Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const PointerEvent& event); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision); + Q_INVOKABLE EntityScriptDetails getEntityScriptDetails(const EntityItemID& entityID) const; Q_INVOKABLE void requestGarbageCollection() { collectGarbage(); } From 3203e8c7c2ec7fdb3002106ea2515de770e20a7a Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 19 Jan 2017 15:49:40 -0800 Subject: [PATCH 2/3] Use Huffman's version of getEntityScriptDetails --- assignment-client/src/scripts/EntityScriptServer.cpp | 5 +++-- libraries/networking/src/EntityScriptClient.h | 2 +- libraries/script-engine/src/ScriptEngine.cpp | 7 ------- libraries/script-engine/src/ScriptEngine.h | 1 - 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index 579cd8ced6..6da935d0db 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -281,8 +281,9 @@ void EntityScriptServer::entityServerScriptChanging(const EntityItemID& entityID } void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const bool reload) { - if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { - auto details = _entitiesScriptEngine->getEntityScriptDetails(entityID); + EntityScriptDetails details; + if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine && + _entitiesScriptEngine->getEntityScriptDetails(entityID, details)) { EntityItemPointer entity = _entityViewer.getTree()->findEntityByEntityItemID(entityID); if (entity && (details.scriptText != entity->getServerScripts() || reload)) { diff --git a/libraries/networking/src/EntityScriptClient.h b/libraries/networking/src/EntityScriptClient.h index f32d78a6dd..d331b8ca31 100644 --- a/libraries/networking/src/EntityScriptClient.h +++ b/libraries/networking/src/EntityScriptClient.h @@ -73,4 +73,4 @@ private: void forceFailureOfPendingRequests(SharedNodePointer node); }; -#endif \ No newline at end of file +#endif diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 5cbd5c2739..cedf5a4ed8 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1587,13 +1587,6 @@ void ScriptEngine::unloadAllEntityScripts() { #endif // DEBUG_ENGINE_STATE } -EntityScriptDetails ScriptEngine::getEntityScriptDetails(const EntityItemID& entityID) const { - if (_entityScripts.contains(entityID)) { - return _entityScripts[entityID]; - } - return EntityScriptDetails(); -} - void ScriptEngine::refreshFileScript(const EntityItemID& entityID) { if (!_entityScripts.contains(entityID)) { return; diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index bdf542905a..e266ff3bc9 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -149,7 +149,6 @@ public: const QStringList& params = QStringList()) override; Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const PointerEvent& event); Q_INVOKABLE void callEntityScriptMethod(const EntityItemID& entityID, const QString& methodName, const EntityItemID& otherID, const Collision& collision); - Q_INVOKABLE EntityScriptDetails getEntityScriptDetails(const EntityItemID& entityID) const; Q_INVOKABLE void requestGarbageCollection() { collectGarbage(); } From 07da0c5e9c8a356dcc8aa53f13976066a8d834bd Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 19 Jan 2017 15:58:55 -0800 Subject: [PATCH 3/3] Fix script loading bug --- assignment-client/src/scripts/EntityScriptServer.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/scripts/EntityScriptServer.cpp b/assignment-client/src/scripts/EntityScriptServer.cpp index 6da935d0db..b2daabbd6c 100644 --- a/assignment-client/src/scripts/EntityScriptServer.cpp +++ b/assignment-client/src/scripts/EntityScriptServer.cpp @@ -281,12 +281,12 @@ void EntityScriptServer::entityServerScriptChanging(const EntityItemID& entityID } void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, const bool reload) { - EntityScriptDetails details; - if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine && - _entitiesScriptEngine->getEntityScriptDetails(entityID, details)) { + if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { EntityItemPointer entity = _entityViewer.getTree()->findEntityByEntityItemID(entityID); - if (entity && (details.scriptText != entity->getServerScripts() || reload)) { + EntityScriptDetails details; + bool notRunning = !_entitiesScriptEngine->getEntityScriptDetails(entityID, details); + if (entity && (reload || notRunning || details.scriptText != entity->getServerScripts())) { QString scriptUrl = entity->getServerScripts(); scriptUrl = ResourceManager::normalizeURL(scriptUrl); qDebug() << "Loading entity server script" << scriptUrl << "for" << entityID;