Narutimmy Posted July 19, 2015 Share Posted July 19, 2015 Hola , bueno necesito mas ayuda ya se que me diran molesto por pedir tanto pero intento aprender Quiero optimizar un codigo.. lo que hace es que Cambia la data de al rededor de 3000 col en el mapa... de igual manera elimina mas de 3000 objetos y crea otros 3000 mas.... he intentado con poner timers para que de un descanzo entre uno y otro pero nada.... lo que quiero es evitar el network trouble y el uso de CPU que dura como 3mins... no importa si toma 5....8..10mins pero que no use el 100 sino un 30--50% nose es posible? function refreshItemLoots() outputChatBox("#ffaa00WARNING! #ffffff - Item Respawn esta en proceso!", getRootElement(), 255, 255, 255, true) setServerPassword( "Lyoko" ) for i,player in ipairs(getElementsByType("player")) do kickPlayer ( player, "Item Respawn, Regresa en unos Minutos // Item Respawn, back in a few minutes" ) end for i, loots in ipairs(getElementsByType("colshape")) do local itemloot = getElementData(loots, "itemloot") if itemloot then local objects = getElementData(loots, "objectsINloot") if objects then if objects[1] ~= nil then destroyElement(objects[1]) end if objects[2] ~= nil then destroyElement(objects[2]) end if objects[3] ~= nil then destroyElement(objects[3]) end end destroyElement(loots) end end setTimer(createPickupsOnServerStart, 30000, 1) setTimer(refreshItemLootPoints, 43200000, 1) end function createItemPickup(item, x, y, z, tableStringName) if item and x and y and z then do local object = createObject(itemTable[tostring(tableStringName)][item][2], x, y, z - 0.875, itemTable[tostring(tableStringName)][item][4], 0, math.random(0, 360)) setObjectScale(object, itemTable[tostring(tableStringName)][item][3]) setElementCollisionsEnabled(object, false) setElementFrozen(object, true) local col = createColSphere(x, y, z, 0.75) setElementData(col, "item", itemTable[tostring(tableStringName)][item][1]) setElementData(col, "parent", object) setTimer(function() if isElement(col) then destroyElement(col) destroyElement(object) end end, 900000, 1) return object end end end function table.size(tab) local length = 0 for _ in pairs(tab) do length = length + 1 end return length end function math.percentChance(percent, repeatTime) local hits = 0 for i = 1, repeatTime do local number = math.random(0, 200) / 2 if percent >= number then hits = hits + 1 end end return hits end function createItemLoot(lootPlace, x, y, z, id) col = createColSphere(x, y, z, 1.25) setElementData(col, "itemloot", true) setElementData(col, "Looteado", false) setElementData(col, "parent", lootPlace) setElementData(col, "MAX_Slots", 50) for i, item in ipairs(itemTable[lootPlace]) do local value = math.percentChance(item[5], math.random(2, 15)) setElementData(col, item[1], value) local ammoData, weapID = getWeaponAmmoType(item[1], true) if ammoData and value > 0 then setElementData(col, ammoData, math.random(1, 2)) end end ---2 refreshItemLoot(col, lootPlace) return col end function refreshItemLoot(col, place) local objects = getElementData(col, "objectsINloot") if objects then if objects[1] ~= nil then destroyElement(objects[1]) end if objects[2] ~= nil then destroyElement(objects[2]) end if objects[3] ~= nil then destroyElement(objects[3]) end end local counter = 0 local obejctItem = {} for i, item in ipairs(itemTable.other) do if getElementData(col, item[1]) and getElementData(col, item[1]) > 0 then if counter == 3 then break end counter = counter + 1 local x, y, z = getElementPosition(col) obejctItem[counter] = createObject(item[2], x + math.random(-1, 1), y + math.random(-1, 1), z - 0.875, item[4]) setObjectScale(obejctItem[counter], item[3]) setElementCollisionsEnabled(obejctItem[counter], false) setElementFrozen(obejctItem[counter], true) end end if obejctItem[1] == nil then local x, y, z = getElementPosition(col) obejctItem[1] = createObject(1463, x + math.random(-1, 1), y + math.random(-1, 1), z - 0.875, 0) setObjectScale(obejctItem[1], 0) setElementCollisionsEnabled(obejctItem[1], false) setElementFrozen(obejctItem[1], true) end if obejctItem[2] == nil then local x, y, z = getElementPosition(col) obejctItem[2] = createObject(1463, x + math.random(-1, 1), y + math.random(-1, 1), z - 0.875, 0) setObjectScale(obejctItem[2], 0) setElementCollisionsEnabled(obejctItem[2], false) setElementFrozen(obejctItem[2], true) end if obejctItem[3] == nil then local x, y, z = getElementPosition(col) obejctItem[3] = createObject(1463, x + math.random(-1, 1), y + math.random(-1, 1), z - 0.875, 0) setObjectScale(obejctItem[3], 0) setElementCollisionsEnabled(obejctItem[3], false) setElementFrozen(obejctItem[3], true) end setElementData(col, "objectsINloot", { obejctItem[1], obejctItem[2], obejctItem[3] }) end addEvent("refreshItemLoot", true) addEventHandler("refreshItemLoot", getRootElement(), refreshItemLoot) function createPickupsOnServerStart() iPickup = 0 for i, pos in ipairs(pickupPositions.residential) do iPickup = iPickup + 1 createItemLoot("residential", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart2, 20000, 1) end function createPickupsOnServerStart2() for i, pos in ipairs(pickupPositions.industrial) do iPickup = iPickup + 1 createItemLoot("industrial", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart3, 20000, 1) end function createPickupsOnServerStart3() for i, pos in ipairs(pickupPositions.farm) do iPickup = iPickup + 1 createItemLoot("farm", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart4, 20000, 1) end function createPickupsOnServerStart4() for i, pos in ipairs(pickupPositions.supermarket) do iPickup = iPickup + 1 createItemLoot("supermarket", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart5, 20000, 1) end function createPickupsOnServerStart5() for i, pos in ipairs(pickupPositions.military) do iPickup = iPickup + 1 createItemLoot("military", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart6, 20000, 1) end function createPickupsOnServerStart6() for i, pos in ipairs(pickupPositions.Militar2) do iPickup = iPickup + 1 createItemLoot("Militar2", pos[1], pos[2], pos[3], iPickup) end setServerPassword( nil ) end Practicamente es eso... yo se que aqui no se le hace el trabajo a otro.. pero si me dan ideas o funciones que puedan ayudarme por favor. Link to comment
MTA Team 0xCiBeR Posted July 20, 2015 MTA Team Share Posted July 20, 2015 Podrías utilizar una librería de async viewtopic.php?f=108&t=82493&p=752496 Link to comment
Narutimmy Posted July 20, 2015 Author Share Posted July 20, 2015 Podrías utilizar una librería de async viewtopic.php?f=108&t=82493&p=752496 Ya lo instale... y todo solo que no entiendo bien como se usa... da varios ejemplos pero algunas cosas no quedan claras como por ejemplo: Ejemplo 1 async:iterate(1, 50000000, function(i) local x = (i + 2) * i; -- heavy opreation outputServerLog(x); end); Que siginifica el "iterate(1, 50000000," ? y en el ejemplo 2 : async:foreach(vehicles, function(vehicle) vehicle:setHealth(1000); end); Que significa el : "foreach" ? EDIT: Lo unico que se me ocurre es que sea el nombre de la funcion? no encuentro una guia de la syntaxis async:foreach(createPickupsOnServerStart, function () iPickup = 0 for i, pos in ipairs(pickupPositions.residential) do iPickup = iPickup + 1 createItemLoot("residential", pos[1], pos[2], pos[3], iPickup) end setTimer(createPickupsOnServerStart2, 20000, 1) end); EDIT 2: Pues asi no funciono... lo probe asi pero no noto cambio... igual me da log execution... aonque lo probe en el PC local y no en el VPS... function createPickupsOnServerStart() iPickup = 0 for i, pos in ipairs(pickupPositions.residential) do iPickup = iPickup + 1 async:iterate(1, 50000000,createItemLoot("residential", pos[1], pos[2], pos[3], iPickup)); end setTimer(createPickupsOnServerStart2, 1000, 1) end Otro EDIT: Veamos y asi? function Replaceskins ( ) for id,name in pairs(skins) do txd = engineLoadTXD ( name..".txd" ) engineImportTXD ( txd, id ) dff = engineLoadDFF ( name..".dff", 0 ) engineReplaceModel ( dff, id ) end end addEventHandler ( "onClientResourceStart", getResourceRootElement(getThisResource()), Replaceskins) function Replaceskins ( ) async:iterate(0, 500000, function() for id,name in pairs(skins) do txd = engineLoadTXD ( name..".txd" ) engineImportTXD ( txd, id ) dff = engineLoadDFF ( name..".dff", 0 ) engineReplaceModel ( dff, id ) end end); end addEventHandler ( "onClientResourceStart", getResourceRootElement(getThisResource()), Replaceskins) Link to comment
Sasu Posted July 21, 2015 Share Posted July 21, 2015 function createPickupsOnServerStart() iPickup = 0 async:foreach(pickupPositions.residential, function(pos) iPickup = iPickup + 1 createItemLoot("residential", pos[1], pos[2], pos[3], iPickup) end ) setTimer(createPickupsOnServerStart2, 20000, 1) end Y para el script de skins deberas pasar la tabla porque no se como pasar el index por esa función. Algo asi me refiero: --[[ Tu debes tener una tabla como esta local skins = { [id] = name, [id] = name } ]] local skins = { {id, name}, {id, name} } function Replaceskins ( ) async:foreach(skins, function(v) txd = engineLoadTXD ( v[2]..".txd" ) engineImportTXD ( txd, v[1] ) dff = engineLoadDFF ( v[2]..".dff", 0 ) engineReplaceModel ( dff, v[1] ) end ) end addEventHandler ( "onClientResourceStart", resourceRoot, Replaceskins) Link to comment
Narutimmy Posted July 21, 2015 Author Share Posted July 21, 2015 function createPickupsOnServerStart() iPickup = 0 async:foreach(pickupPositions.residential, function(pos) iPickup = iPickup + 1 createItemLoot("residential", pos[1], pos[2], pos[3], iPickup) end ) setTimer(createPickupsOnServerStart2, 20000, 1) end Y para el script de skins deberas pasar la tabla porque no se como pasar el index por esa función. Algo asi me refiero: --[[ Tu debes tener una tabla como esta local skins = { [id] = name, [id] = name } ]] local skins = { {id, name}, {id, name} } function Replaceskins ( ) async:foreach(skins, function(v) txd = engineLoadTXD ( v[2]..".txd" ) engineImportTXD ( txd, v[1] ) dff = engineLoadDFF ( v[2]..".dff", 0 ) engineReplaceModel ( dff, v[1] ) end ) end addEventHandler ( "onClientResourceStart", resourceRoot, Replaceskins) muchas gracias ya funciono ... pero perdon si molesto.. me explicas un poco? entonces e lugar del for... solo es de usar "async:foreach"? me podrias explicar los demas argumentos? Link to comment
Sasu Posted July 21, 2015 Share Posted July 21, 2015 Hasta donde yo entendí, basándome en los ejemplos, solo le da un parametro a la función que está dentro del async:foreach, y ese es el valor. Es decir: for i, v in ipairs(table) do print(v) end -- Es lo mismo que.. async:foreach(table, function(v) print(v) end ) En cuanto a async:iterate sería lo siguiente: for i = 1, 100000 do print(i) end -- Es lo mismo que.. async:iterate(1, 100000, function(i) print(i) end ) No soy bueno explicando, disculpas. Link to comment
Narutimmy Posted July 21, 2015 Author Share Posted July 21, 2015 Hasta donde yo entendí, basándome en los ejemplos, solo le da un parametro a la función que está dentro del async:foreach, y ese es el valor. Es decir: for i, v in ipairs(table) do print(v) end -- Es lo mismo que.. async:foreach(table, function(v) print(v) end ) En cuanto a async:iterate sería lo siguiente: for i = 1, 100000 do print(i) end -- Es lo mismo que.. async:iterate(1, 100000, function(i) print(i) end ) No soy bueno explicando, disculpas. creo si lo en entiendo, solo una cosa mas, que diferencia ahi entre uno y otro? o cuando se puede usar uno y cuando no ? y que siginifica "1, 100000" ¿? Link to comment
Sasu Posted July 21, 2015 Share Posted July 21, 2015 Desde y hasta donde se ejecuta, en este caso seria 1..2..3..4...........99999..100000 y ahi termina. El foreach lo utilizas cuando tienes una tabla indexada numericamente y el iterate lo puedes usar cuando quieres repetir ciertas acciones. Link to comment
Narutimmy Posted July 21, 2015 Author Share Posted July 21, 2015 Desde y hasta donde se ejecuta, en este caso seria 1..2..3..4...........99999..100000 y ahi termina. El foreach lo utilizas cuando tienes una tabla indexada numericamente y el iterate lo puedes usar cuando quieres repetir ciertas acciones. Muchas Gracias seguire haciendo pruebas por ahora todo bien no mas trouble aonque tarda en terminas las funciones pero supongo es por lo mismo porque ahora lo hace en orden y no todo al mismo tiempo. Link to comment
Recommended Posts