Jump to content

Optimizar script


Recommended Posts

Hola :D, bueno necesito mas ayuda :S ya se que me diran molesto por pedir tanto :S 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 :S 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
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 :S

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
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
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 :D ... 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

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. :roll:

Link to comment
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. :roll:

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 :S? y que siginifica "1, 100000" ¿?

Link to comment

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
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.

0NPVkqa.png

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...