Jump to content

Render Server-side


Lalalu

Recommended Posts

Hola que tal, quisiera que me orientaran en algo. Hay un código de un usuario aquí en el foro que permite caminar en el agua utilizando la creación de un objeto y render bajo el jugador, el problema es que esto solo lo ve el jugador que lo ejecuta, no pueden verlo los demás. He intentado con un trigger desde el server side pero no he podido lograr que funcione, quisiera que me orientaran al respecto para lograr que los demás players te vean caminando sobre el agua... por acá adjunto el código original y post del usuario:

https://forum.multitheftauto.com/topic/58614-water-walk/

 

-- water walk 
local obj = {} 
  
function WaterWalk() 
if obj[localPlayer] then 
local x,y,_ = getElementPosition(localPlayer) 
setElementPosition(obj[localPlayer],x,y,-.5) 
end 
end 
addEventHandler ("onClientRender",root,WaterWalk) 
  
function WaterOn() 
local px,py,_ = getElementPosition(localPlayer) 
obj[localPlayer] = createObject(1221,px,py,0) 
setElementAlpha(obj[localPlayer],0) 
end 
addCommandHandler("water",WaterOn) 

 

Edited by Lalalu
Link to comment
1 hour ago, D4rk said:

Como tal puede crear el comando en el lado del cliente, despues lo pasas al server guardas el objecto en una tabla, despues lo vuelves a triggear al cliente.

O sea pero mantengo la creación del objeto en el client side?? anteriormente lo único que habia hecho fue colocar un triggerClient para crear el render

Edited by Lalalu
Link to comment

Puedes mover la función 'waterOn' a server-side, al momento de usar el comando triggearlo a todos los jugadores conectados para luego desde client-side obtener a ese jugador guardado en una variable quizás para luego renderizar los objetos debajo de él. Otra es no triggearlo, sino al momento de usar el comando adherirle al jugador alguna key con elementData para sincronizarlo tanto client-side como server-side, y desde client-side hacer un loop de jugadores dentro del evento render con la condición de la 'key' elementData que te mencioné y así crear los objetos debajo de él para que todos logren verlo. No sé que tan óptimo podría ser eso, pero es una idea así rápida. Espero se entienda ?

Edited by #Dv^
  • Thanks 1
Link to comment

----- Server ---- 
local objects = {}

--- comando para crear o destruir el objeto y almacenar en la tabla 
addCommandHandler("water", 
   function(player)
      if not objects[player] then 
         objects[player] = createObject(1221, 0, 0, 0)
      else 
         destroyElement(objects[player])
         objects[player] = nil 
      end 
      --- mandamos al client todos los objetos 
      triggerClientEvent("water_walk", root, objects)
   end 
)
---- si un jugador entra al server necesitamos mandarle la tabla de objetos 
addEventHandler("onPlayerResourceStart", root, 
   function(loadedResource)
	  if loadedResource == resource then
         triggerClientEvent(source, "water_walk", source, objects)
	  end
   end
)


----- Client ---- 
local objects = {}
addEvent("water_walk", true)
addEventHandler("water_walk", root,
   function(o)
      objects = o
      ---- removemos el render por si la tabla esta vacia
      removeEventHandler("onClientRender", root, managewaterwalk)

      if objects and 
         --- Si la tabla no esta vacía y hay al menos un objeto iniciamos el render 
         for _, object, in pairs(objects) do 
            if object then 
               addEventHandler("onClientRender", root, managewaterwalk)
               return
            end 
         end 
      end 
   end 
)

function managewaterwalk()
   for player, object in pairs(objects) do 
      local x, y, z = getElementPosition(player)
      setElementPosition(object, x, y, z - .5)
   end 
end 

PD: no lo he probado así que me avisas si te sirve

  • Thanks 1
Link to comment
1 hour ago, alex17" said:

PD: no lo he probado así que me avisas si te sirve

Hola, muchas gracias a todos por la ayuda. He intentando de las formas que me han explicado #Dv y Dark, a lo que he podido entender pero no me ha funcionado, no lo ven los demás o causa muchos bajones de fps.

Alex si me sirvió tu forma, pero el player se desliza  al estar sobre el agua y si por ejemplo lo tengo activado yo y alguien sale del servidor se me desactiva. Lo del deslizamiento siempre me pasa cuando trato de crear el objeto en server-side porque no podía colocarlo con el getWaterLevel, de esta forma si funciona perfecto pero añadiéndolo al render en el client-side :)

       local level = getWaterLevel(x,y,z) or 0
          object = createObject(1221, x, y, level)

 

Edited by Lalalu
Link to comment
14 minutes ago, Lalalu said:

Hola, muchas gracias a todos por la ayuda. He intentando de las formas que me han explicado #Dv y Dark, a lo que he podido entender pero no me ha funcionado, no lo ven los demás o causa muchos bajones de fps.

Alex si me sirvió tu forma, pero el player se desliza  al estar sobre el agua y si por ejemplo lo tengo activado yo y alguien sale del servidor se me desactiva. Lo del deslizamiento siempre me pasa cuando trato de crear el objeto en server-side porque no podía colocarlo con el getWaterLevel, de esta forma si funciona perfecto pero añadiéndolo al render en el client-side :)

       local level = getWaterLevel(x,y,z) or 0
          object = createObject(1221, x, y, level)

 

si deja de funcionar al salir del servidor, es por que da un error, hay que añadir otra funciòn mas en el server 

addEventHandler("onPlayerQuit", root,
     function()
        if objects[source] then 
           destroyObject(objects[source])
           objects[source] = nil 
           triggerClientEvent("water_walk", root, objects)
        end 
     end 
)

 

  • Thanks 1
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

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