scriptEngines->shutdownScripting(); _entitiesScriptEngine.clear(); auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); // our entity tree is going to go away so tell that to the EntityScriptingInterface entityScriptingInterface->setEntityTree(nullptr); // Should always be true as they are singletons. if (entityScriptingInterface->getPacketSender() == &_entityEditSender) { // The packet sender is about to go away. entityScriptingInterface->setPacketSender(nullptr); }} void EntityScriptServer::addingEntity(const EntityItemID& entityID) { checkAndCallPreload(entityID);} void EntityScriptServer::deletingEntity(const EntityItemID& entityID) { if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { _entitiesScriptEngine->unloadEntityScript(entityID, true); }} void EntityScriptServer::entityServerScriptChanging(const EntityItemID& entityID, bool reload) { if (_entityViewer.getTree() && !_shuttingDown) { _entitiesScriptEngine->unloadEntityScript(entityID, true); checkAndCallPreload(entityID, reload); }} void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, bool reload) { if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { EntityItemPointer entity = _entityViewer.getTree()->findEntityByEntityItemID(entityID); EntityScriptDetails details; bool notRunning = !_entitiesScriptEngine->getEntityScriptDetails(entityID, details); if (entity && (reload || notRunning || details.scriptText != entity->getServerScripts())) { QString scriptUrl = entity->getServerScripts(); if (!scriptUrl.isEmpty()) { scriptUrl = DependencyManager::get<ResourceManager>()->normalizeURL(scriptUrl); qCDebug(entity_script_server) << "Loading entity server script" << scriptUrl << "for" << entityID; _entitiesScriptEngine->loadEntityScript(entityID, scriptUrl, reload); } } }} void EntityScriptServer::sendStatsPacket() { } void EntityScriptServer::handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { auto packetType = message->getType(); if (packetType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(message, senderNode); if (message->getSize() > statsMessageLength) { // pull out the piggybacked packet and create a new QSharedPointer<NLPacket> for it int piggyBackedSizeWithHeader = message->getSize() - statsMessageLength; auto buffer = std::unique_ptr<char[]>(new char[piggyBackedSizeWithHeader]); memcpy(buffer.get(), message->getRawMessage() + statsMessageLength, piggyBackedSizeWithHeader); auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggyBackedSizeWithHeader, message->getSenderSockAddr()); message = QSharedPointer<ReceivedMessage>::create(*newPacket); } else { return; // bail since no piggyback data } packetType = message->getType(); } // fall through to piggyback message if (packetType == PacketType::EntityData) { _entityViewer.processDatagram(*message, senderNode); } else if (packetType == PacketType::EntityErase) { _entityViewer.processEraseMessage(*message, senderNode); }} void EntityScriptServer::aboutToFinish() { shutdownScriptEngine(); DependencyManager::destroy<AssignmentDynamicFactory>(); DependencyManager::destroy<AssignmentParentFinder>(); DependencyManager::get<ResourceManager>()->cleanup(); DependencyManager::destroy<PluginManager>(); DependencyManager::destroy<ResourceScriptingInterface>(); DependencyManager::destroy<EntityScriptingInterface>(); // cleanup the AudioInjectorManager (and any still running injectors) DependencyManager::destroy<AudioInjectorManager>(); DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<EntityScriptServerServices>(); // cleanup codec & encoder if (_codec && _encoder) { _codec->releaseEncoder(_encoder); _encoder = nullptr; }}Lines 501–607 of 607. Previous lines
scriptEngines->shutdownScripting(); _entitiesScriptEngine.clear(); auto entityScriptingInterface = DependencyManager::get<EntityScriptingInterface>(); // our entity tree is going to go away so tell that to the EntityScriptingInterface entityScriptingInterface->setEntityTree(nullptr); // Should always be true as they are singletons. if (entityScriptingInterface->getPacketSender() == &_entityEditSender) { // The packet sender is about to go away. entityScriptingInterface->setPacketSender(nullptr); } } void EntityScriptServer::addingEntity(const EntityItemID& entityID) { checkAndCallPreload(entityID); } void EntityScriptServer::deletingEntity(const EntityItemID& entityID) { if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { _entitiesScriptEngine->unloadEntityScript(entityID, true); } } void EntityScriptServer::entityServerScriptChanging(const EntityItemID& entityID, bool reload) { if (_entityViewer.getTree() && !_shuttingDown) { _entitiesScriptEngine->unloadEntityScript(entityID, true); checkAndCallPreload(entityID, reload); } } void EntityScriptServer::checkAndCallPreload(const EntityItemID& entityID, bool reload) { if (_entityViewer.getTree() && !_shuttingDown && _entitiesScriptEngine) { EntityItemPointer entity = _entityViewer.getTree()->findEntityByEntityItemID(entityID); EntityScriptDetails details; bool notRunning = !_entitiesScriptEngine->getEntityScriptDetails(entityID, details); if (entity && (reload || notRunning || details.scriptText != entity->getServerScripts())) { QString scriptUrl = entity->getServerScripts(); if (!scriptUrl.isEmpty()) { scriptUrl = DependencyManager::get<ResourceManager>()->normalizeURL(scriptUrl); qCDebug(entity_script_server) << "Loading entity server script" << scriptUrl << "for" << entityID; _entitiesScriptEngine->loadEntityScript(entityID, scriptUrl, reload); } } } } void EntityScriptServer::sendStatsPacket() { } void EntityScriptServer::handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) { auto packetType = message->getType(); if (packetType == PacketType::OctreeStats) { int statsMessageLength = OctreeHeadlessViewer::parseOctreeStats(message, senderNode); if (message->getSize() > statsMessageLength) { // pull out the piggybacked packet and create a new QSharedPointer<NLPacket> for it int piggyBackedSizeWithHeader = message->getSize() - statsMessageLength; auto buffer = std::unique_ptr<char[]>(new char[piggyBackedSizeWithHeader]); memcpy(buffer.get(), message->getRawMessage() + statsMessageLength, piggyBackedSizeWithHeader); auto newPacket = NLPacket::fromReceivedPacket(std::move(buffer), piggyBackedSizeWithHeader, message->getSenderSockAddr()); message = QSharedPointer<ReceivedMessage>::create(*newPacket); } else { return; // bail since no piggyback data } packetType = message->getType(); } // fall through to piggyback message if (packetType == PacketType::EntityData) { _entityViewer.processDatagram(*message, senderNode); } else if (packetType == PacketType::EntityErase) { _entityViewer.processEraseMessage(*message, senderNode); } } void EntityScriptServer::aboutToFinish() { shutdownScriptEngine(); DependencyManager::destroy<AssignmentDynamicFactory>(); DependencyManager::destroy<AssignmentParentFinder>(); DependencyManager::get<ResourceManager>()->cleanup(); DependencyManager::destroy<PluginManager>(); DependencyManager::destroy<ResourceScriptingInterface>(); DependencyManager::destroy<EntityScriptingInterface>(); // cleanup the AudioInjectorManager (and any still running injectors) DependencyManager::destroy<AudioInjectorManager>(); DependencyManager::destroy<ScriptEngines>(); DependencyManager::destroy<EntityScriptServerServices>(); // cleanup codec & encoder if (_codec && _encoder) { _codec->releaseEncoder(_encoder); _encoder = nullptr; } }