Jump to content

zMpyster

Members
  • Posts

    111
  • Joined

  • Last visited

Posts posted by zMpyster

  1. local enableBlips = true
    local renderNorthBlip = true
    local alwaysRenderMap = false 
    local alwaysRenderOxygen = false 
    local worldW, worldH = 3072, 3072 
    local blip = 8 
    local sx, sy = guiGetScreenSize()
    local rt = dxCreateRenderTarget(290, 175)
    local xFactor, yFactor = sx/1366, sy/768
    local yFactor = xFactor 
    
    function findRotation(x1,y1,x2,y2) 
      local t = -math.deg(math.atan2(x2-x1,y2-y1))
      if t < 0 then t = t + 360 end;
      return t;
    end
    function getPointFromDistanceRotation(x, y, dist, angle) 
        local a = math.rad(90 - angle);
        local dx = math.cos(a) * dist;
        local dy = math.sin(a) * dist;
        return x+dx, y+dy;
    end
    
    newTab = {}
    function drawRadar()
    	if (not isPlayerMapVisible()) then
    		local mW, mH = dxGetMaterialSize(rt)
    		local x, y = getElementPosition(localPlayer)
    		local X, Y = mW/2 -(x/(6000/worldW)), mH/2 +(y/(6000/worldH))
    		local camX,camY,camZ = getElementRotation(getCamera())
    		dxSetRenderTarget(rt, true)
    		if alwaysRenderMap or getElementInterior(localPlayer) == 0 then
    			dxDrawRectangle(0, 0, mW, mH, 0xFF7CA7D1) 
    			dxDrawImage(X - worldW/2, mH/5 + (Y - worldH/2), worldW, worldH, "image/world.png", camZ, (x/(6000/worldW)), -(y/(6000/worldH)))
    		end
    		dxSetRenderTarget()
    		dxDrawRectangle((30)*xFactor, sy-((198+10))*yFactor, (271)*xFactor, (164)*yFactor, tocolor(0, 0, 0, 160))
    		dxDrawImage((30+5)*xFactor, sy-((200+5))*yFactor, (270-10)*xFactor, (155)*yFactor, rt, 0, 0, 0, tocolor(139, 137, 137))
    		local rx, ry, rz = getElementRotation(localPlayer)
    		local lB = (33)*xFactor
    		local rB = (8+290)*xFactor
    		local tB = sy-(208)*yFactor
    		local bB = tB + (155)*yFactor
    		local cX, cY = (rB+lB)/2, (tB+bB)/2 +(35)*yFactor
    		local toLeft, toTop, toRight, toBottom = cX-lB, cY-tB, rB-cX, bB-cY
    		for k, v in ipairs(getElementsByType("blip")) do
    			local bx, by = getElementPosition(v)
    			local actualDist = getDistanceBetweenPoints2D(x, y, bx, by)
    			local maxDist = getBlipVisibleDistance(v)
    			if actualDist <= maxDist and getElementDimension(v)==getElementDimension(localPlayer) and getElementInterior(v)==getElementInterior(localPlayer) then
    				local dist = actualDist/(6000/((worldW+worldH)/2))
    				local rot = findRotation(bx, by, x, y)-camZ
    				local bpx, bpy = getPointFromDistanceRotation(cX, cY, math.min(dist, math.sqrt(toTop^2 + toRight^2)), rot)
    				local bpx = math.max(lB, math.min(rB, bpx))
    				local bpy = math.max(tB, math.min(bB, bpy))
    				local bid = getElementData(v, "customIcon") or getBlipIcon(v)
    				local _, _, _, bcA = getBlipColor(v)
    				local bcR, bcG, bcB = 255, 255, 255
    				if getBlipIcon(v) == 0 then
    					bcR, bcG, bcB = getBlipColor(v)
    				end				
    				if getBlipIcon(v) == 13 then
    					setBlipSize(v, 6.4)
    				end				
    				if getBlipIcon(v) == 25 then
    					setBlipSize(v, 7)
    				end
    				local bS = getBlipSize(v)
    				if getBlipIcon(v) ~= 34 then
    					dxDrawImage(bpx -(blip*bS)*xFactor/2, bpy -(blip*bS)*yFactor/2, (blip*bS)*xFactor, (blip*bS)*yFactor, "image/blip/"..bid..".png", 0, 0, 0, tocolor(bcR, bcG, bcB, bcA))
    				end
    			end
    		end
    		if renderNorthBlip then
    			local rot = -camZ+180
    			local bpx, bpy = getPointFromDistanceRotation(cX, cY, math.sqrt(toTop^2 + toRight^2), rot) 
    			local bpx = math.max(lB, math.min(rB, bpx))
    			local bpy = math.max(tB, math.min(bB, bpy)) 
    			local dist = getDistanceBetweenPoints2D(cX, cY, bpx, bpy) 
    			local bpx, bpy = getPointFromDistanceRotation(cX, cY, dist, rot) 
    			if bpx and bpy then 
    				local bpx = math.max(lB, math.min(rB, bpx))
    				local bpy = math.max(tB, math.min(bB, bpy)) 
    				dxDrawImage(bpx -(blip*2)/2, bpy -(blip*2)/2, blip*2, blip*2, "image/blip/4.png", 0, 0, 0) --draw north (4) blip
    			end
    		end
    		dxDrawImage(cX -(blip*2)*xFactor/2, cY -(blip*2)*yFactor/2, (blip*2)*xFactor, (blip*2)*yFactor, "image/player.png", camZ-rz, 0, 0)
    	end
    end
    addEventHandler("onClientRender", root, drawRadar)

    Esse script cria um mini mapa com uma imagem 1536x1536. Eu editei essa imagem, adicionando 201 de largura, sendo assim a imagem atual está com 1737x1536 de tamanho, gostaria de saber de alguma forma conseguiria editar esse script para as novas dimensões da imagem

    Note: As coordenadas do mapa original permaneceram a mesma(1536x1536), ou seja, apenas foi adicionado 201 de largura.

    Note: Não foi eu o criador do script, apenas modifiquei o minimapa. 

  2. Estava editando meu mod de trems e queria que de alguma forma quando tivesse 5 vagões o trem ficasse mais lento do que o normal.

    Eu já tentei usar setModelHandling e nada, muitos vão sugerir usar o setTrainSpeed, porém, eu quero que o player que esteja no trem seja livre para escolher a velocidade de andar e não que o script fique setando a velocidade do trem

  3. 22 minutes ago, Lord Henry said:

    Não consigo pensar em nenhuma situação onde seja possível colocar tantos dados que precisam de 200 tabelas em 1 elementData. Só seria possível com 200 elementData também.

    É uma comparação para eu ter uma noção do quão melhor é usar tabelas

  4. 5 hours ago, andreisrww said:

    O exemplo não ficou muito claro, mas se você quiser salvar vários tipos de lanches, basta usar apenas UMA tabela, por exemplo:

    
    local lanches = {
        "Cheese-Burger",
        "Cheese-Bacon",
        "Cheese-Salada",
        "Misto Quente"
    }
    

    E daí você pode adicionar quantos lanches você quiser, utilizando apenas uma tabela.

    Tem como fazer assim, mas, eu me referia a um caso onde não tivesse alternativas, você só tinha 2 opções, usar 200 tabelas ou 1 elementData, qual seria mais viável?

  5. Acho que todos sabem que o uso de muitos elementDatas acabam fazendo com o que o servidor fique "lagando", a minha dúvida é, quantas tabelas precisam ser criadas para o preço ficar igual ao de um elementData? 

  6. Bom pessoal, tenho 2 scripts aqui, só que eu preciso quando o script 1 for desligado (lado do servidor), o script 2 retorne um valor (lado do cliente), eu tentei usar o trigger, mas, acaba que não dá tempo de finalizar a função e retornar o valor

    Os scripts que preciso de ligação é um de contagem de KM (funções no lado do cliente) e um de concessionária que receberá o valor de KM rodados quando for desligado (funções no lado do server)

    Espero ter conseguido deixar claro minha dúvida!

  7. posCars = {
    	[1] = {-60.607, -1891.674, 7.345, -0, 0, 38.494, 589},
    	[2] = {-67.794, -1893.794, 7.373, -0, 0, 6.455, 402},
    	[3] = {-63.686, -1876.661, 7.145, -0, 0, 68.574, 492},
    	[4] = {-68.76, -1883.958, 7.231, -0, 0, 64.54, 546},
    	[5] = {-72.508, -1875.779, 7.144, -0, 0, 37.604, 400},
    	[6] = {-74.556, -1893.794, 7.375, -0, 0, 9.432, 579},
    	[7] = {-96.755, -1874.517, 7.059, -0, 0, 300.318, 580},
    	[8] = {-86.229, -1883.356, 7.192, -0, 0, 329.811, 550},
    	[9] = {-88.031, -1875.9, 7.092, -0, 0, 305.942, 494},
    	[10] = {-83.617, -1895.983, 7.36, -0, 0, 342, 474},
    	[11] = {-90.568, -1893.863, 7.321, -0, 0, 324.894, 603},
    	[12] = {-95.74, -1889.7, 7.257, -0, 0, 322.857, 549, 500},
    	[13] = {-102.904, -1884.16, 7.173, -0, 0, 316.183, 507},
    	[14] = {-115.831, -1879.266, 7.087, -0, 0, 320.578, 483},
    	[15] = {-113.032, -1883.835, 7.151, -0, 0, 309.337, 404},
    	[16] = {-87.334, -1907.68, 7.5, -0, 0, 350.368, 502},
    	[17] = {-81.205, -1913.04, 7.581, -0, 0, 9.733, 536},
    	[18] = {-93.914, -1914.425, 7.576, -0, 0, 339.613, 600},
    	[19] = {-100.304, -1902.246, 7.412, -0, 0, 323.16, 421},
    	[20] = {-108.174, -1900.021, 7.369, -0, 0, 307.313, 602},
    	[21] = {-102.732, -1916.18, 7.583, -0, 0, 330.774, 540},
    	[22] = {-112.588, -1910.002, 7.491, -0, 0, 311.229, 445},
    	[23] = {-119.002, -1905.607, 7.423, -0, 0, 304.179, 426},
    	[24] = {-115.182, -1917.262, 7.581, -0, 0, 294.489, 566},
    	[25] = {-122.122, -1914.214, 7.529, -0, 0, 315.483, 604},
    	[26] = {-116.957, -1892.801, 7.26, -0, 0, 305.495, 547},
    	[27] = {-118.075, -1899.84, 7.35, -0, 0, 303.497, 411},
    	[28] = {-124.798, -1891.835, 7.234, -0, 0, 314.033},
    	[29] = {-128.865, -1875.398, 7.014, -0, 0, 293.666},
    	[30] = {-131.948, -1881.229, 7.084, -0, 0, 312.091},
    	[31] = {-122.083, -1903.347, 12.111, -0, 0, 325.415},
    	[32] = {-104.14, -1914.299, 12.289, -0, 0, 344.294},
    }
    
    function resourceStart()
    	for k=1, #posCars do
    		car[k] = createVehicle(posCars[k][7] or 411, posCars[k][1], posCars[k][2], posCars[k][3], posCars[k][4], posCars[k][5], posCars[k][6])
    		setVehicleDamageProof(car[k], true)
    		setVehicleLocked(car[k], true)
    		setVehicleColor(car[k], 255, 255, 255)
    		setTimer (function()
    			setElementFrozen(car[k], true)
    		end, 3000, 1)
    	end
    end
    addEventHandler("onResourceStart", resourceRoot, resourceStart)

    Esse script estava normal, porém hj fui iniciá-lo e começou a spawnar 2 carros ao invés de apenas 1

     

    cliente:

    	obj = createObject(1917, -100.8, -1879.4, -4.3, 0.75, 0, 187.75)
    	objLowLOD = createObject ( 1917, -100.8, -1879.4, -4.3,0.75, 0, 187.75,true )
    	setLowLODElement ( obj, objLowLOD )
       	 engineSetModelLODDistance ( 1917, 300 )

    attempt to call global  'engineSetModelLODDistance' (a nil value)

    esse erro tbm, começou a dar apenas agr, eu queria deixar o debug limpo, esse erro não está interferindo em nada, porém fica dando no debug

  8. Sim, eu dei uma olhada e também vi essas funções, más, eu ainda tenho uma dúvida aqui, por que eles removeram essas funções? Alguém sabe se à algum projeto para novas funções parecidas como essas? O "Custom Train Tracks" ainda ta de pé?

    Talvez vocês saibam mais do que eu

  9. Comecei agora a mexer com o zmodeler, estou tendo um problema na parte de textura, meu carro estava com a porta invertida, o porta-malas tava como porta direita e a porta direita como porta-malas.

    Eu arrumei esse problema, exportei o dff tudo certo, porém quando iniciei o recurso do carro ele ficou sem textura, as portas estavam certas porém ele estava sem textura.

    Eu fiz aquilo de exportar o txd em bmp para ver se no zmodeler ele ficava com textura, porém nada, e as vezes dava esse erro aqui  "invalid file signature. file:OpenSaveService.cpp. line:680"

    Eu tentei colocar a textura pela bola vermelha, porém fica tudo errado, coisas sobrepondo outras.

     

  10. Então, é que o que eu queria mesmo é por exemplo: Eu spawno um "linerunner" e um trailer, ai encaixando o trailer no caminhão ele fica preso pra todos, não fica aquela coisa bugada para os players sabe, será que então um código assim funcionaria:

     

    test = {}
    function detachTrailer(theTruck)
      	if test[source] ~= true then
    		attachTrailerToVehicle(theTruck, source)
      		test[source] = true
       	end
    end
    addEventHandler("onTrailerAttach", getRootElement(), detachTrailer)
    
    function reattachTrailer(theTruck)
        if test[source] == true then
        	test[source] = false
        end
    end
    addEventHandler("onTrailerDetach", getRootElement(), reattachTrailer)

    Não testei, porém, creio eu que dessa forma acabaria com o loop infinito

  11. Acho que não é novidade pra ninguém que quando pegamos um trailer de caminhão manualmente sem script, fica bugado para os outros jogadores. Daí eu descobri um evento, "onTrailerAttach" que curiosamente ele é chamado até quando é do jeito manualmente (sem ser pela função "attachTrailerToVehicle")

     

    E com isso criei esse pequeno código, que na teoria, ele desbugaria o trailer quando estivesse no caminhão, más, eu não tenho uma host, e por isso não consigo ter a visão dos jogadores, e ai venho perguntar a vocês que já testaram ou podem testar

     

    Esse código realmente funciona? Ou a carga fica bugada mesmo assim?

    function detachTrailer(theTruck)
    	attachTrailerToVehicle(theTruck, source)
    end
    addEventHandler("onTrailerAttach", getRootElement(), detachTrailer)
  12. trailerPos = {
    	[1] = {279.029, 1441.746, 10.586, -0, 0, 87.888},
    	[2] = {280.043, 1465.739, 10.586, -0, 0, 90.49},
    	[3] = {279.93, 1396.926, 10.586, -0, 0, 84.962},
    	[4] = {278.257, 1373.356, 10.586, -0, 0, 80.523},
    	[5] = {278.169, 1351.675, 10.586, -0, 0, 85.951},
    }
    
    for k=1, #trailerPos do
        trailer[k] = createVehicle(435, trailerPos[k][1], trailerPos[k][2], trailerPos[k][3], -0, 0, trailerPos[k][6])
        setVehicleRespawnPosition(trailer[k], trailerPos[k][1], trailerPos[k][2], trailerPos[k][3], -0, 0, trailerPos[k][6])
        setTimer ( function()
            setElementFrozen(trailer[k], true)
    	end, 800, 1)
    end
    
    function teste()
        for k=1, #trailerPos do
            respawnVehicle(trailer[k])
            setTimer ( function()
                setElementFrozen(trailer[k], true)
            end, 800, 1)
        end
    end
    addCommandHandler("teste", teste)

    Então pessoal, queria mostrar pra vcs um bug que ta tendo nesse script, podem ver que a posição é sempre a mesma, só que quando eu respawno o veículo eles ficam bugados, más, usando as mesma coordenadas eu consigo criar eles sem nenhum bug.

    no createVehicle eles nascem normalmente como qualquer carro

    no respawnVehicle eles nascem debaixo da terra

  13. Bom pessoal, eu fiz um mapa, e eu queria saber se tem como colocar pra ele ser visto da mesma distância do mapa do GTA SA, pq quando eu vou um pouco pra trás no meu mapa ele some, já no do GTA SA não, o mapa que eu fiz foi feito pelo editor de mapas.

  14. 6 minutes ago, DNL291 said:

    Confuso o código, me parece um algoritmo não está eficiente e pode ser mais simplificado para o que você precisa.

    Aqui está as funções que você vai precisar para obter o jogador mais próximo:

    
    function obterUberMaisProximoDoCliente( thePlayer )
    	local tableUber = getPlayersInGroup( "UBER" )
    	if not tableUber then return end
    	
    	local px,py,pz = getElementPosition(thePlayer)
    	local lastMinDis = 999999
    	local nearest = false
    	local dist
    	
    	for i, uber in ipairs(tableUber) do
    		local x,y,z = getElementPosition( uber )
    		local distance = getDistanceBetweenPoints3D( px,py,pz, x,y,z )
    		
    		if distance < lastMinDis then 
    			lastMinDis = distance
    			nearest = uber
          		dist = distance
    		end
    	end
    	return nearest, dist
    end
    
    -- https://wiki.multitheftauto.com/wiki/GetPlayersInGroup
    function getPlayersInGroup ( GroupName )
     
        local aTable = {}
     
        assert ( tostring ( GroupName ) , "Bad Argument At Argument #1 Group Moust String" )
       
        assert ( aclGetGroup ( tostring ( GroupName ) ) , "Bad Argument At Argument #1 Group not Found "  )
       
        for i , player_ in ipairs ( getElementsByType ( "player" ) ) do
       
        local TheAcc =  getPlayerAccount ( player_ )
       
        if not isGuestAccount ( TheAcc ) then  
     
        if isObjectInACLGroup ( "user." ..getAccountName ( TheAcc ) , aclGetGroup ( tostring ( GroupName ) ) ) then
         
        table.insert ( aTable , player_ )
                 end  
            end
        end 
        return aTable
    end
    

    >

    
    local uberProximo, distancia = obterUberMaisProximoDoCliente( cliente )
    

     

    Realmente ficou bem mais simplificado, só que ainda persisto com a dúvida do inicio, se dois players chamassem o uber ao mesmo tempo, teria chance de bugar as distâncias?

  15. playerOrDist = {}
    accountName = {}
    distancia = {}
    function getUberNear(cliente)
    	tableUber = aclGroupListObjects(aclGetGroup("UBER"))
    	for objects,name in pairs(tableUber)do
    		local accountName = split(name, '.')
    		local player = getAccountPlayer(getAccount(accountName[2]))
    		if (getElementType( player ) == "player" and player ~= cliente) then
    			local jX, jY, jZ = getElementPosition (player) 
    			local pX, pY, pZ = getElementPosition (cliente)
    			local dist = getDistanceBetweenPoints3D ( pX, pY, pZ, jX, jY, jZ)
    			if distancia[cliente] == nil or distancia[cliente] == false then
    				distancia[cliente] = dist..","..player
    			else
    				local playerOrDist = split(distancia[cliente], ',')
    				if playerOrDist[1] > dist then
    					distancia[cliente] = dist..","..player
    				end
    			end
    		end
    	end
    	return distancia[cliente]
    end

    Testei agr, pensava que no loop, "name" retornava a conta já, más, retorna "user.conta".

    Pelo oq vi agr ta tudo certo, não da pra testar muita coisa pq precisa de 2 players...

  16. 5 minutes ago, Lord Henry said:

    Está faltando parte desse código.

    E tem falhas de lógica.

    • Na sua linha 5, a função getAccountPlayer só funciona com argumento do tipo account, mas name é sempre um valor do tipo string.
    • Você está usando uma table chamada distancia na linha 10, que não foi declarada em lugar nenhum. Mas vou supor que esteja declarada na parte que vc não mostrou.
    • Na sua linha 13, você está usando uma variável local com nome de uma table que não é local. Era melhor usar outro nome pra não entrar em conflito com a table.
    playerOrDist = {}
    distancia = {}
    function getUberNear(cliente)
    	tableUber = aclGroupListObjects(aclGetGroup("UBER"))
    	for objects,name in pairs(tableUber)do
    		player = getAccountPlayer(getAccount(name))
    		if (getElementType( player ) == "player" and player ~= cliente) then
    			local jX, jY, jZ = getElementPosition (player) 
    			local pX, pY, pZ = getElementPosition (cliente)
    			local dist = getDistanceBetweenPoints3D ( pX, pY, pZ, jX, jY, jZ)
    			if distancia[cliente] == nil or distancia[cliente] == false then
    				distancia[cliente] = dist..","..player
    			else
    				local playerOrDist = split(distancia[cliente], ',')
    				if playerOrDist[1] > dist then
    					distancia[cliente] = dist..","..player
    				end
    			end
    		end
    	end
    	return distancia[cliente]
    end

    a "distancia" eu tinha declarado lá em cima, sorry, na linha 5, eu acho que arrumei, o local na parte "local playerOrDist = split(distancia[cliente], ',')" eu coloquei por causa que o split, faz playerOrDist virar uma tabela contendo duas variáveis (distância e nome).

    Desculpe os erros bestas, não testei o mod

×
×
  • Create New...