DBY Posted January 4, 2016 Share Posted January 4, 2016 I think, mta should have this function because if you want refresh one resource, refreshResources refresh all and cause lag. I posted it because i need refresh only one resource and MTA don´t have this function. I tryed with 'refreshResources' but my console closed automatically. Link to comment
UserToDelete Posted January 4, 2016 Share Posted January 4, 2016 (edited) Sometimes I forget to update a resource, or leave it for later in the subject that I do not want to use refreshAll to determine if a script has been modified to another (cause too much lag for each minute). This function is perfect to see some automated resources. is simply the union of refreshResources () with getThisResource () for C ++ developers should not be very difficult to do this i think C++ need this code to modify: i don't know nothing about C++ /root/MTA10_Server/mods/deathmatch/logic/CResource.cpp:660 bool CResource::HasResourceChanged () { string strPath; list < CResourceFile* > ::iterator iterf = m_resourceFiles.begin (); for ( ; iterf != m_resourceFiles.end (); iterf++ ) { if ( GetFilePath ( (*iterf)->GetName(), strPath ) ) { CChecksum checksum = CChecksum::GenerateChecksumFromFile ( strPath ); if ( ( *iterf )->GetLastChecksum() != checksum ) return true; // Also check if file in http cache has been externally altered CResourceFile* pResourceFile = *iterf; switch ( pResourceFile->GetType () ) { case CResourceFile::RESOURCE_FILE_TYPE_CLIENT_SCRIPT: case CResourceFile::RESOURCE_FILE_TYPE_CLIENT_CONFIG: case CResourceFile::RESOURCE_FILE_TYPE_CLIENT_FILE: { string strCachedFilePath = pResourceFile->GetCachedPathFilename (); CChecksum cachedChecksum = CChecksum::GenerateChecksumFromFile ( strCachedFilePath ); if ( cachedChecksum != checksum ) return true; } break; default: break; } } } if ( GetFilePath ( "meta.xml", strPath ) ) { CChecksum checksum = CChecksum::GenerateChecksumFromFile ( strPath ); if ( checksum != m_metaChecksum ) return true; } return false; } Edited January 4, 2016 by Guest Link to comment
AlvarO Posted January 4, 2016 Share Posted January 4, 2016 In my opinion, I think that MTA should has this function since it started to work, basically becuase of the lag it cause refresh the whole server, imagine a server that need a lot of scripts (10-20 scripts), I seem better to refresh just one of the all resources inside, and as venad said "This function is perfect to see some automated resources." Link to comment
Jusonex Posted January 4, 2016 Share Posted January 4, 2016 Why do you want to refresh a single resource? Refreshing is basically checking for new resources and re-parsing the meta.xml. If your meta.xml file doesn't contain syntax errors, just restarting the resource should do the trick. You are also able to reload only certain parts of a resource (see: https://wiki.multitheftauto.com/wiki/RestartResource) 1 Link to comment
UserToDelete Posted January 4, 2016 Share Posted January 4, 2016 Why do you want to refresh a single resource? Refreshing is basically checking for new resources and re-parsing the meta.xml.If your meta.xml file doesn't contain syntax errors, just restarting the resource should do the trick. You are also able to reload only certain parts of a resource (see: https://wiki.multitheftauto.com/wiki/RestartResource) sometimes need to check if file has changed or not (without refreshall or restartResource) refreshAll not only check if meta has changed, check if ANY file has changed, we need refreshResource for that check Link to comment
UserToDelete Posted January 4, 2016 Share Posted January 4, 2016 This is the Lua solution Verified working local files = {} local Bytes = 0 addEventHandler("onResourceStart", resourceRoot, function() local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) Bytes = Bytes + _ files[xmlNodeGetAttribute(v, "src")] = _ fileClose(file) end end --print("+++++++ "..tostring(Bytes)) else return error("Could not find META") end end ) --USEFULL FUNCTION function refreshResource () local newBytes = 0 local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) newBytes = newBytes + _ fileClose(file) end end --print("+++++++ "..tostring(newBytes).." -- "..tostring(Bytes)) if newBytes ~= Bytes then restartResource(getThisResource()) end else return error("Could not find META"); end end addCommandHandler("refreshResource", refreshResource) But integration with MTA is necessary Link to comment
DBY Posted January 4, 2016 Author Share Posted January 4, 2016 Why do you want to refresh a single resource? Refreshing is basically checking for new resources and re-parsing the meta.xml.If your meta.xml file doesn't contain syntax errors, just restarting the resource should do the trick. You are also able to reload only certain parts of a resource (see: https://wiki.multitheftauto.com/wiki/RestartResource) I tried with restartResource but doesn't work fine. My script edit meta.xml and need refresh... refreshResources works but cause lag and sometimes close my console. Why not include refreshResource function? Link to comment
Castillo Posted January 4, 2016 Share Posted January 4, 2016 I have used the "refresh" function on my server with at least 350 players online and it never "lagged". Link to comment
DBY Posted January 4, 2016 Author Share Posted January 4, 2016 I have used the "refresh" function on my server with at least 350 players online and it never "lagged". I think don't so not have to do. I not mean '/refresh'. Try 'refreshResources(true)' function. Link to comment
Castillo Posted January 5, 2016 Share Posted January 5, 2016 That function should execute the same action as "refresh" command. Link to comment
UserToDelete Posted January 5, 2016 Share Posted January 5, 2016 That function should execute the same action as "refresh" command. Error, it is the same that refreshAll command refreshAll: If true MTA will check for changes in all resources. If false, MTA will only check for new resources and try to reload resources with errors refreshResource: MTA will check for changes in single resource Link to comment
DBY Posted January 5, 2016 Author Share Posted January 5, 2016 Why do you want to refresh a single resource? Refreshing is basically checking for new resources and re-parsing the meta.xml.If your meta.xml file doesn't contain syntax errors, just restarting the resource should do the trick. You are also able to reload only certain parts of a resource (see: https://wiki.multitheftauto.com/wiki/RestartResource) I tried with restartResource and her optionals arguments, but doesn't work... I save meta.xml with xmlSaveFile. I check if meta.xml changes saves sucessfully and yes, save it. But 'downloadFile' return error: File doesn't exists. Link to comment
Tomas Posted January 5, 2016 Share Posted January 5, 2016 This is the Lua solutionVerified working local files = {} local Bytes = 0 addEventHandler("onResourceStart", resourceRoot, function() local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) Bytes = Bytes + _ files[xmlNodeGetAttribute(v, "src")] = _ fileClose(file) end end --print("+++++++ "..tostring(Bytes)) else return error("Could not find META") end end ) --USEFULL FUNCTION function refreshResource () local newBytes = 0 local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) newBytes = newBytes + _ fileClose(file) end end --print("+++++++ "..tostring(newBytes).." -- "..tostring(Bytes)) if newBytes ~= Bytes then restartResource(getThisResource()) end else return error("Could not find META"); end end addCommandHandler("refreshResource", refreshResource) But integration with MTA is necessary Simplest than yours function refreshResource(res) if ( not res or not getResourceState(res) ) then return false end -- no given resource if ( not getResourceLoadFailureReason(res) == "" ) then return false end -- given resource failed to load local resourceName = getResourceName(res) local meta_file = ":"..resourceName.."/meta.xml" if ( not fileExists(meta_file) ) then return false end -- no meta file was found fileRename(meta_file, meta_file.."_") refreshResources() fileRename(meta_file.."_", meta_file) refreshResources() startResource(getResourceFromName(resourceName)) end By the way, your function would only properly work 1 time since it doesn't clear global variables and it'd only work with the resource where it's being loaded from. Link to comment
UserToDelete Posted January 9, 2016 Share Posted January 9, 2016 Tomas said: venadHD said: This is the Lua solution Verified working local files = {} local Bytes = 0 addEventHandler("onResourceStart", resourceRoot, function() local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) Bytes = Bytes + _ files[xmlNodeGetAttribute(v, "src")] = _ fileClose(file) end end --print("+++++++ "..tostring(Bytes)) else return error("Could not find META") end end ) --USEFULL FUNCTION function refreshResource () local newBytes = 0 local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) newBytes = newBytes + _ fileClose(file) end end --print("+++++++ "..tostring(newBytes).." -- "..tostring(Bytes)) if newBytes ~= Bytes then restartResource(getThisResource()) end else return error("Could not find META"); end end addCommandHandler("refreshResource", refreshResource) But integration with MTA is necessary Simplest than yours function refreshResource(res) if ( not res or not getResourceState(res) ) then return false end -- no given resource if ( not getResourceLoadFailureReason(res) == "" ) then return false end -- given resource failed to load local resourceName = getResourceName(res) local meta_file = ":"..resourceName.."/meta.xml" if ( not fileExists(meta_file) ) then return false end -- no meta file was found fileRename(meta_file, meta_file.."_") refreshResources() fileRename(meta_file.."_", meta_file) refreshResources() startResource(getResourceFromName(resourceName)) end By the way, your function would only properly work 1 time since it doesn't clear global variables and it'd only work with the resource where it's being loaded from. You are using refreshResources(),and your script don't work like refreshResource() must be. Anyway, needed integration with MTA:SA functions. Link to comment
RaceXtreme Posted July 19, 2016 Share Posted July 19, 2016 If refreshResource() is integrated in MTA:SA so refreshResources() could be deleted because if one needs to refresh all resources, he just needs a iterator. However, this breaks the avaiable scripts. So what now? If that lua version solves the problem of everyone we could just include it somewhere in the Wiki instead of making mess adding more native functions. 1 Link to comment
MegaThorx Posted July 28, 2016 Share Posted July 28, 2016 I can't understand what you want. But i'm sure it is possible with lua only. As Jusonex said refreshResources will check all resources meta.xml and load new resources. But if you just use restartResource it will parse the meta.xml also again. The other case could be if you want to see which resources had been modified and this is also very easy. Just go through the files and generate a hash from the contents and compare them at a later point. Link to comment
UserToDelete Posted August 5, 2016 Share Posted August 5, 2016 This is the Lua solutionVerified working local files = {} local Bytes = 0 addEventHandler("onResourceStart", resourceRoot, function() local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) Bytes = Bytes + _ files[xmlNodeGetAttribute(v, "src")] = _ fileClose(file) end end --print("+++++++ "..tostring(Bytes)) else return error("Could not find META") end end ) --USEFULL FUNCTION function refreshResource () local newBytes = 0 local meta = xmlLoadFile(":"..getResourceName(getThisResource()).."/meta.xml") if meta then for k,v in ipairs(xmlNodeGetChildren(meta)) do if fileExists(xmlNodeGetAttribute(v, "src")) then local file = fileOpen(xmlNodeGetAttribute(v, "src")) local _ = fileGetSize(file) newBytes = newBytes + _ fileClose(file) end end --print("+++++++ "..tostring(newBytes).." -- "..tostring(Bytes)) if newBytes ~= Bytes then restartResource(getThisResource()) end else return error("Could not find META"); end end addCommandHandler("refreshResource", refreshResource) But integration with MTA is necessary Simplest than yours function refreshResource(res) if ( not res or not getResourceState(res) ) then return false end -- no given resource if ( not getResourceLoadFailureReason(res) == "" ) then return false end -- given resource failed to load local resourceName = getResourceName(res) local meta_file = ":"..resourceName.."/meta.xml" if ( not fileExists(meta_file) ) then return false end -- no meta file was found fileRename(meta_file, meta_file.."_") refreshResources() fileRename(meta_file.."_", meta_file) refreshResources() startResource(getResourceFromName(resourceName)) end By the way, your function would only properly work 1 time since it doesn't clear global variables and it'd only work with the resource where it's being loaded from. If bytes of file changes your script will never WORK. Link to comment
GTX Posted September 20, 2016 Share Posted September 20, 2016 Note that refreshResources(true) refreshes ALL resources on your server, which can cause lag. Use refreshResources(). Link to comment
Gravestone Posted September 21, 2016 Share Posted September 21, 2016 Maybe this can do the job? Link to comment
Bonsai Posted October 1, 2016 Share Posted October 1, 2016 On 4.1.2016 at 11:04 PM, Jusonex said: Why do you want to refresh a single resource? Refreshing is basically checking for new resources and re-parsing the meta.xml. If your meta.xml file doesn't contain syntax errors, just restarting the resource should do the trick. You are also able to reload only certain parts of a resource (see: https://wiki.multitheftauto.com/wiki/RestartResource) That would be needed if you have some selfmade map loader that never actually starts and stops resources I guess. If you e.g. want to rename a map, it wont be updated until you restart the whole server, since you cannot just start/stop the resource. Therefore, having a function to refresh a single, non running resource, can be useful. Link to comment
MisterQuestions Posted November 25, 2016 Share Posted November 25, 2016 On 30/9/2016 at 8:58 PM, Bonsai said: That would be needed if you have some selfmade map loader that never actually starts and stops resources I guess. If you e.g. want to rename a map, it wont be updated until you restart the whole server, since you cannot just start/stop the resource. Therefore, having a function to refresh a single, non running resource, can be useful. Actually map info is loaded with map, at least on your gamemode and on lot of gamemodes. Map name must be as the renamed one with no problem without refreshing, since you just open the meta.xml file to get all map data. Link to comment
Recommended Posts