Fixed NO MORE DESYNCS ON THREADS

This commit is contained in:
Cooldude2606
2017-12-09 11:52:13 +00:00
parent 41a25c6464
commit 8701696464
2 changed files with 21 additions and 26 deletions

View File

@@ -11,7 +11,7 @@ Discord: https://discord.gg/r6dC2uK
-- replaces the base error function -- replaces the base error function
_error = error _error = error
error = function(err) error = function(err)
if _G.discord_emit then if _G.discord_emit and game then
local color = _G.Color and Color.to_hex(defines.text_color.bg) or '0x0' local color = _G.Color and Color.to_hex(defines.text_color.bg) or '0x0'
discord_emit{title='SCRIPT ERROR',color=color,description=err} discord_emit{title='SCRIPT ERROR',color=color,description=err}
elseif _G.game then elseif _G.game then

View File

@@ -9,13 +9,14 @@ Discord: https://discord.gg/r6dC2uK
--Please Only Edit Below This Line----------------------------------------------------------- --Please Only Edit Below This Line-----------------------------------------------------------
-- server allows control over threads and other features the devs missed out -- server allows control over threads and other features the devs missed out
local Server = {} local Server = {}
local thread = {} Server.thread = {}
Server.thread.__index = Server.thread
--- Returns a un-used uuid (better system needed) --- Returns a un-used uuid (better system needed)
-- @usage obj.uuid = Server.new_uuid() -- @usage obj.uuid = Server.new_uuid()
-- @treturn string the new uuid -- @treturn string the new uuid
function Server.new_uuid() function Server.new_uuid()
uuid = tostring(Server._uuid()()) local uuid = tostring(Server._uuid()())
uuid = string.to_hex('uuid'..uuid) uuid = string.to_hex('uuid'..uuid)
return uuid return uuid
end end
@@ -46,7 +47,7 @@ end
-- see thread:create (this was done so thread can remain local) -- see thread:create (this was done so thread can remain local)
function Server.new_thread(obj) function Server.new_thread(obj)
return thread:create(obj) return Server.thread:create(obj)
end end
--- Used to get a thread via it's uuid or by name if one is given --- Used to get a thread via it's uuid or by name if one is given
@@ -116,13 +117,9 @@ function Server._thread_handler(event)
local threads = Server._threads().events[event_id] local threads = Server._threads().events[event_id]
if not threads then return end if not threads then return end
table.each(threads,function(uuid) table.each(threads,function(uuid)
game.print('loop '..uuid)
local next_thread = Server.get_thread(uuid) local next_thread = Server.get_thread(uuid)
game.print('before valid '..table.to_string(table.keys(next_thread)))
if next_thread and next_thread:valid() then if next_thread and next_thread:valid() then
game.print('before type check '..uuid)
if is_type(next_thread._events[event_id],'function') then if is_type(next_thread._events[event_id],'function') then
game.print('before pcall '..uuid)
local success, err = pcall(next_thread._events[event_id],next_thread,event) local success, err = pcall(next_thread._events[event_id],next_thread,event)
if not success then next_thread:error(err) end if not success then next_thread:error(err) end
end end
@@ -190,9 +187,9 @@ end)
-- @usage new_thread = thread:create() -- @usage new_thread = thread:create()
-- @tparam[opt={}] table obj all are opt {timeout=int,name=str,data=any} advanced users can prefix with _function to avoid the on_function functions -- @tparam[opt={}] table obj all are opt {timeout=int,name=str,data=any} advanced users can prefix with _function to avoid the on_function functions
-- @treturn table the new thread object -- @treturn table the new thread object
function thread:create(obj) function Server.thread:create(obj)
local obj = obj or {} local obj = obj or {}
obj=table.merge(obj,self) setmetatable(obj,Server.thread)
obj.uuid = Server.new_uuid() obj.uuid = Server.new_uuid()
return obj return obj
end end
@@ -201,16 +198,7 @@ end
-- @usage if thread:valid() then end -- @usage if thread:valid() then end
-- @tparam bolean skip_location_check true to skip the location check -- @tparam bolean skip_location_check true to skip the location check
-- @treturn bolean is the thread valid -- @treturn bolean is the thread valid
function thread:valid(skip_location_check) function Server.thread:valid(skip_location_check)
game.print('1'..tosting(is_type(self.uuid,'string')))
game.print('1'..tosting(is_type(self.opened,'number')))
game.print('1'..tosting(is_type(Server._threads().all[self.uuid],'table')))
game.print('1'..tosting(is_type(self.timeout)))
game.print('1'..tosting(is_type(self.timeout,'number')))
game.print('1'..tosting(is_type(self.name)))
game.print('1'..tosting(is_type(self.name,'string')))
game.print('1'..tosting(is_type(self._close)))
game.print('1'..tosting(is_type(self._close,'function')))
local skip_location_check = skip_location_check or false local skip_location_check = skip_location_check or false
if is_type(self.uuid,'string') and if is_type(self.uuid,'string') and
skip_location_check or is_type(self.opened,'number') and skip_location_check or is_type(self.opened,'number') and
@@ -231,7 +219,7 @@ end
--- Opens the thread by storing it in a place the server object can find it --- Opens the thread by storing it in a place the server object can find it
-- @usage thread:open() -- return true -- @usage thread:open() -- return true
-- @treturn bolean if the thread was opened -- @treturn bolean if the thread was opened
function thread:open() function Server.thread:open()
if not self:valid(true) or self.opened then return false end if not self:valid(true) or self.opened then return false end
local threads = Server._threads() local threads = Server._threads()
local uuid = self.uuid local uuid = self.uuid
@@ -254,7 +242,7 @@ end
--- Inverse of thread:open() - it removes the thread and calles on_close --- Inverse of thread:open() - it removes the thread and calles on_close
-- @usage thread:close() -- return true -- @usage thread:close() -- return true
-- @treturn bolean if the thread had a on_close function -- @treturn bolean if the thread had a on_close function
function thread:close() function Server.thread:close()
local threads = Server._threads() local threads = Server._threads()
local uuid = self.uuid local uuid = self.uuid
local _return = false local _return = false
@@ -284,7 +272,7 @@ end
-- @usage thread:resolve(x,y,z) -- return true -- @usage thread:resolve(x,y,z) -- return true
-- @param[opt] ... any arguments you want to pass to the resolve function -- @param[opt] ... any arguments you want to pass to the resolve function
-- @treturn bolean true if the thread called on_success or on_error -- @treturn bolean true if the thread called on_success or on_error
function thread:resolve(...) function Server.thread:resolve(...)
local _return = false local _return = false
if is_type(self._resolve,'function') then if is_type(self._resolve,'function') then
local success, err = pcall(self._resolve,...) local success, err = pcall(self._resolve,...)
@@ -304,7 +292,7 @@ end
--- Checks the timeout on a thread - if timedout then it calles on_timeout and closes --- Checks the timeout on a thread - if timedout then it calles on_timeout and closes
-- @usage thread:check_timeout() -- return true -- @usage thread:check_timeout() -- return true
-- @treturn bolean if the thread timedout -- @treturn bolean if the thread timedout
function thread:check_timeout() function Server.thread:check_timeout()
local _return = false local _return = false
if not self:valid() then return false end if not self:valid() then return false end
if is_type(self.timeout,'number') and game.tick >= (self.opened+self.timeout) then if is_type(self.timeout,'number') and game.tick >= (self.opened+self.timeout) then
@@ -321,7 +309,7 @@ end
-- @usage thread:error(err) -- return true -- @usage thread:error(err) -- return true
-- @param err the err to be rasied -- @param err the err to be rasied
-- @treturn bolean did the thread handdle the error -- @treturn bolean did the thread handdle the error
function thread:error(err) function Server.thread:error(err)
local _return = false local _return = false
if is_type(self._error,'function') then if is_type(self._error,'function') then
pcall(self._error,self,err) pcall(self._error,self,err)
@@ -338,7 +326,7 @@ end
-- @tparam string event the name of the event that it is called on -- @tparam string event the name of the event that it is called on
-- @tparam function callback the function which is called on the event -- @tparam function callback the function which is called on the event
-- @treturn was the function added -- @treturn was the function added
function thread:on_event(event,callback) function Server.thread:on_event(event,callback)
local events = {'close','timeout','tick','resolve','success','error'} local events = {'close','timeout','tick','resolve','success','error'}
local value = table.find(events,function(v,k,find) return v == string.lower(find) end,event) local value = table.find(events,function(v,k,find) return v == string.lower(find) end,event)
if value and is_type(callback,'function') then if value and is_type(callback,'function') then
@@ -362,6 +350,13 @@ Event.register(defines.events.on_tick,function(event)
end end
end) end)
Event.register(-2,function(event)
local threads = Server.threads()
for uuid,thread in pairs(threads) do
setmetatable(thread,Server.thread)
end
end)
return Server return Server
--[[ --[[
Thread Example: Thread Example: