Leaderboard
Popular Content
Showing content with the highest reputation on 17/03/17 in all areas
-
السلام عليكم ورحمة الله وبركاته كيف الحال شباب باذن الله كويسين اخليكم مع الشرح طيب الحين ملاحظه مهمممه هذا هو الاصدار الاول الاصدار الثاني سيكون مدفوع والخصائص الزائده هي 1-لوحة للتحكم بالقوانين 2-لوجو قبل التسجيل سيكون للاعضاء الجدد فقط واكثر باذن الله وعشان كذا ابي طلب منكم كم السعر للاصدار القادم باذن الله اقتراحاتكم التحميل اضغط هنا شكر خاص ل @Abdul KariM @N3xT @#Soking8 points
-
طبعاً جودة الفيديو ماهي حلوة ولا اي شي تراني نوب بموضوع الفيديوهات هذا لأني ما سويت من زمان المهم ابي رأيكم بشئ هذا طبعاً مود اصدار تجريبي اذا سويت الكامل منه انشره ام ابيعه ؟؟؟1 point
-
بسم الله الرحمن الرحيم السلام عليكم ورحمة الله وبركاته سويت لوحة تسجيل بسيطة وان شاء الله تعجبكم وميزتها شي المعلومات تكون محفوظة تلقائياً يعني اول ما تدخل كلمة السر واسم الحساب هيكونو موجودين صور... التحميل استغفر الله واتوب اليه - إضغط هنا ملاحظة مهمة بس الاصدار تجريبي بسبب حفظ المعلومات1 point
-
ما ادري كيف تستخدمون الماث راندوم, ما اشوف انه قال يبي عشوائي؟ يوم تحطونه عشوائي يمكن يطلع نفس الكلام مرتين يعني نفترض الجدول كذا : messages = { { "1" }, { "2" }, { "3" }, { "4" } } ممكن يطلع اول شي رقم 3 وبعدين 1 وبعدين 2 وبعدين يرجع يطلع 3 وكذاا..1 point
-
1 point
-
1 point
-
1 point
-
1 point
-
1 point
-
1 point
-
N3xT = نكست عموماً أبدعت لكن كنت أفضل الدي اكس عن اللوحات العايدية , للأفضل ان شاء الله.1 point
-
1 point
-
1 point
-
حبيب قلبي اكيد اقتراحاتك مطلوبه يا قلبي لبه قلبك مشكور على تفهيمي fetchremote لولا الله ثم انت ما كنت حاولت يعطيك العافيه ومشكور الاخ سوكنق والاخ نيكست ولا مدري حاط بنص الاسم 3 يعني ع هذا اللي اعرفه اسمه عقدني صراحه مشكورين جميعا1 point
-
ماشاء الله شغل ابداع اعجز عن التكلم والله يعطيك العافيةة وواصل وننتظر الاصدار المدفوع1 point
-
1 point
-
ماستر نزل مودات زياده وحلوة اذا تبي اقتراحات انا جاهز1 point
-
اهنيييييك ماستر والله موداتك كلها حلوهـ لاتوقف واصل بلاك فواصل1 point
-
يعطيك العأفية ع هيككَ شغل ي مبدعع , تشكر عليه .. وننتظر جديدك ي بطل .1 point
-
1 point
-
Olá. Tenho interesse no assunto de RPG em MTA. Até hoje não vi nenhum servidor RPG (de verdade) Brasileiro, apenas gringos e mesmo assim não achei grande coisa comparado ao servidor de RPG do SAMP. (não sei se posso citar o nome dele.) Tenho um servidor local cuja ideia também era pra ser RPG, mas enfrento diversas dificuldades em desenvolver pois não tenho como fazer testes com mais de um jogador. Realmente concordo que atualmente os RPGs do MTA são uma espécie de Freeroam com empregos e nada mais, não são realmente RPGs. Se conseguíssemos criar um servidor de RPG de verdade e que funcione sem problemas, com certeza seria exclusividade Brasileira, uma vez que não existem servidores de MTA assim Brasileiros. A sua ideia é interessante, a maioria delas já existem no servidor de RPG do SAMP. Alguns comentários que tenho: Creio que este não seja o caminho ideal. Você pode colocar os valores das coisas comparadas ao mundo real. (veículos normais custando em torno de 50 mil e veículos esportivos em torno de 500 mil). Os empregos devem gerar uma renda baixa para garantir que os jogadores não fiquem ricos com tanta facilidade ou sem esforço. Digamos que os empregos em que o jogador ganha ao completar determinada tarefa rendam em média até 5 mil reais, esse valor pode ser maior ou menor dependendo do level necessário para trabalhar nesse emprego. É necessário ter um excelente balanceamento nesta parte, pois seria terrível empregos de level alto que gerem uma renda miserável ou que empregos de level baixo que rendam demais. Creio que usar o Serial do jogador já serve. Mas caso o seu objetivo seja impedir que os jogadores tenham mais de uma conta (o que no fim das contas sempre é burlável), você pode definir que o jogador só pode ter 1 login por Serial e, caso o serial já tenha sido usado para criar uma conta, não pode usar para criar outra mesmo se for em outro IP. Além disso, você pode definir cada IP a seu respectivo serial, impedindo que outro IP faça login em uma conta criada neste Serial (impedir troca de contas entre jogadores) Resumindo: O jogador cria uma conta e faz login nela pela primeira vez. O servidor então salva o Serial e o IP em que essa conta foi criada. Essa conta não pode ser acessada por outro Serial e nem por outro IP mesmo se souber o login e senha. (recuperação de conta em casos de perda do computador podem ser feitas somente via e-mail, o e-mail deve ser obrigatório ao criar a conta. O jogador deve informar o Serial ou IP em que conectava antes, para poder registrar o novo Serial na conta.) Além disso, as contas podem ser apagadas automaticamente após 6 meses sem atividade. (liberando casas compradas e tudo mais) A ideia de perder o veículo é arriscada, seria interessante existir a profissão de Guincho, que pode rebocar o veículo explodido para uma garagem Pay'N'Spray que irá recuperar o veículo por um custo moderado (poderia ser uma porcentagem do valor do veículo, sugiro uns 30%). Uma punição severa deverá ser aplicada ao jogador que explodiu o veículo (exceto se o jogador que explodiu estiver trabalhando como Terrorista ou algo do gênero). Veículos com certeza devem ficar indestrutíveis enquanto não estiverem sendo ocupados, impedindo que o jogador perca seu veículo que foi explodido enquanto ele estava offline. É frustrante perder tudo ao morrer, é claro que deve haver um custo no hospital, sugiro que seja baseado no level do jogador. (500 X level). Assim os jogadores de level baixo não perdem todas as suas economias pagando uma fortuna no hospital e os jogadores de level alto perdem uma quantidade grande, fazendo com que evitem serem mortos. O ideal seria a necessidade de ter determinado level para poder usar tal arma, impedindo que jogadores novatos usem armas muito fortes pra zoar. ------------------------------------------------------------------- Algumas sugestões: O jogador pode ficar jogando sem conta, mas nada será salvo e ele poderá upar até no máximo level 5 (5 horas de jogo). Inclusive seria interessante deixar uma marca da água no canto da tela escrito "NÃO REGISTRADO" para fazer o jogador sentir a necessidade de criar uma conta. O interessante disso é que nem sempre o jogador que aparece, fica no servidor. As vezes ele quer apenas conhecer e ver como funciona sem nenhum compromisso de jogar. Criar uma conta seria perda de tempo para ele. Tutorial inicial obrigatório para todos os jogadores novos após criarem a conta. O tutorial não seria o velho texto chato de sempre, seria com animação e exemplos. Tudo explicado também por voz para ficar mais intuitivo. Regras de fácil acesso, podem ser lidas usando /regras em que aparece na tela uma janela com todas elas. A existência de regras específicas para cada profissão. Acessadas com /regrasprof (o servidor verifica qual profissão o jogador está e mostra as regras daquela profissão para ele.) A existência de uma equipe para investigar e punir policiais (corregedores). Estes por sua vez podem (ou não) serem membros da Staff, eles podem dar prisão Administrativa aos jogadores policiais que abusarem do poder. A prisão Administrativa não pode ser paga com fiança e a pena demora várias horas. Diferente da prisão comum dos policiais, que demoram no máximo 6 minutos (1 minuto por estrela) e podem ser pagas com fiança. (quanto mais alto o level do jogador preso, mais cara é a fiança. Cada jogador vai possuir um ID que varia dependendo da ordem de entrada no servidor. Ex: Existem 10 jogadores no servidor, todos com seus IDs do 1 ao 10. Então entra mais um jogador, este será o ID 11. Depois o jogador de ID 6 desloga e sai do servidor. O próximo jogador que entrar ficará com o ID 6 e assim por diante. Os IDs servem para mencionar o jogador no lugar de seu nick, servem para qualquer coisa. Exemplo: Em vez de usar /msg NickDoPlayer Texto para mandar uma mensagem privada a ele, pode usar /msg IDDoPlayer Texto. Os IDs aparecem antes dos nicks dos jogadores no scoreboard do TAB. Ex: (4)NickDoPlayer. Todo o dinheiro arrecadado com impostos de casas e veículos, dinheiro arrecadado com fianças, são utilizados para pagar os salários dos empregos level baixo em que o jogador não tem tarefas a cumprir. (recebem um salário fixo a cada hora de jogo). O jogador deve pagar imposto sobre sua casa (caso tenha uma), o imposto é cobrado a cada hora também, uma porcentagem baseada no valor do imóvel. (10%) e o mesmo ocorre com o veículo. O jogador pode acumular até 12 impostos atrasados, ao acumular o 13º, perde a casa e/ou o veículo cujo imposto atrasou demais. (o tempo de cobrança não passa enquanto o jogador está offline, na verdade ele é cobrado a cada vez que o jogador passa de level.) Ser possível o dono de casa convidar outros jogadores para morar em sua casa como inquilinos. O valor do aluguel é combinado entre eles. (o aluguel é debitado da conta do inquilino automaticamente cada vez que ele upar de level, caso não tenha saldo suficiente, acumula aluguel atrasado até 12 e perde a permissão de morar automaticamente ao atrasar o 13º aluguel. O dono da casa recebe uma notificação toda vez que algum morador de sua casa atrasa o aluguel. Podendo expulsar antes o inquilino, se desejar.) O dono da casa pode permitir ou restringir uma série de permissões ao inquilino, como por exemplo: Permissão de deixar a casa aberta para qualquer um entrar, permissão de guardar armas, comidas e bebidas na casa. (há um limite máximo dependendo da casa, casas mais caras tem mais espaço). O dono da casa ainda pode definir um sub-dono para sua casa, este tem permissão para tudo, não paga aluguel pois também é dono, pode tirar e colocar novos inquilinos exceto vender a casa. (existe um número máximo de moradores que cada casa pode ter, dependendo do preço da casa.) As casas teriam um preço muito variado, desde 50 mil até 10 milhões. As casas oferecem comida e bebida de graça aos moradores, basta usar /comer ou /beber na cozinha para encher sua barra de fome e sede. Também podem usar /dormir em um sofá ou cama. Jogadores podem usar /deitar para dormir em qualquer lugar, mas demora muito mais do que se fosse fazer uma cama de uma casa (cerca de 70% mais demorado). Os jogadores podem morrer de fome e sede, caso o jogador zere a barra de sono, o personagem desmaia e dorme automaticamente onde estiver (como se estivesse usado o /deitar) e só acorda quando a barra atingir a metade, podendo ser atacado e roubado se estiver em um lugar desprotegido. (se estiver dirigindo, perde o controle do veículo e dorme dentro dele.) Algumas regras que pensei logo de cara envolvendo policiais. Policiais podem atribuir níveis de procurado a jogadores por qualquer motivo. /procurar NickDoJogador Motivo (o motivo deve estar nas regras dos policiais, caso contrário o policial pode ser punido pelos Corregedores por motivo indevido no uso de comando. Cada vez que um policial usa um comando em outro jogador /algemar /prender /revistar, etc. Aparece uma notificação no chat dos Corregedores, informando algo do tipo: *O policial '(5)JogadorPlayer' algemou '(3)PlayerName'. (Motivo: dsfsdkfs) Policiais não podem algemar jogadores que não estão com pelo menos 2 níveis de procurado. Caso o façam e o jogador tirar print, o policial será punido pelos Corregedores. Policiais não podem algemar fora da viatura. Se o policial algemar um jogador a pé ou dentro de um veículo que não é viatura, poderá ser punido por abuso de poder, isso serve para facilitar um pouco a vida dos bandidos, que podem correr para lugares inacessíveis de viatura como interiores. Policiais ganham bônus se prenderem um jogador que está com profissão criminosa. Policiais não são procurados se matarem um jogador que está com profissão criminosa. Policiais não podem fazer blitz em zonas de segurança. (áreas verdes) Policiais não podem fazer qualquer procedimento perto de spawn de profissões criminosas. (Exemplo: revistar, algemar, colocar na viatura nem prender jogadores que nascem nas fazendas de maconha após pegarem profissão de traficante.) Todos os comandos de policial só funcionam se estiver a uma distância máxima do jogador procurado. (Sugiro uns 10 metros para /revistar, /algemar, /colocarvtr e /prender. E uns 30 metros para usar o /perseguir e o /procurar) Todos os comandos possíveis de policial. /revistar Nick/ID. Revista o jogador informado, para saber quantos níveis de procurado ele possui. Funciona em qualquer um. /procurar Nick/ID Motivo. Adiciona 1 estrela de procurado ao jogador informado. Só pode ser usado novamente depois de 1 minuto. Funciona em qualquer um, exceto em outros policiais. /algemar Nick/ID Motivo. Algema o jogador, tira ele de seu veículo caso ele esteja e dá Freeze nele. De maneira que ele não caia caso seja algemado no ar. Funciona em qualquer um inclusive policiais. É ilegal se usar em alguém que não está procurado. /colocarvtr Nick/ID. Coloca o jogador no porta-malas da sua viatura, só funciona se o jogador estiver algemado e se você estiver dentro de uma viatura. O jogador não consegue sair até ser levado para a DP. O policial tem 3 minutos para levar o procurado para a DP, caso contrário o procurado poderá escapar. /prender Nick/ID. Encaminha o jogador algemado para a cela da prisão. Este comando funciona em qualquer lugar, não é necessário levar o jogador até a DP para usar esse comando, útil para casos em que o policial está com pressa. Mas não recebe bônus caso o jogador seja criminoso. /executarprisao Nick/ID. Encaminha o jogador algemado que está dentro da sua viatura para a cela da prisão. Só funciona na frente de uma DP. Gera bônus em caso do jogador ter profissão criminosa. /perseguir Nick/ID. Usado para mandar uma mensagem de 'Pare' na tela do jogador procurado. Útil quando os policiais estão atrás de um suspeito que está fugindo de veículo, solicitando que ele encoste o veículo e se renda. /bafometro Nick/ID. Solicita o jogador a fazer o teste do bafômetro, ele pode /aceitar ou /recusar. Indica se o jogador está ou não alcoolizado. O jogador fica alcoolizado se beber qualquer bebida com alcool, a duração do alcool depende de quantas doses o jogador tomou. (sugiro 3 minutos por dose.) O jogador desmaia ao beber 10 doses. Enquanto está alcoolizado, o jogador fica com a tela balançando e o jogador anda no estilo bêbado. /tirarveiculo Nick/ID Motivo. Apreende o veículo do jogador por tempo indeterminado até que ele pague a fiança do veículo. (sugiro 40% do valor do veículo) O veículo apreendido não pode ser usado até sua fiança ser paga para recuperar o veículo. /desarmar Nick/ID Motivo. Remove todas as armas do jogador. Só pode ser usado caso o jogador esteja usando armas sem ter porte de armas ou se as armas forem contrabandeadas. (não foram compradas na Ammu-Nation, foram compradas de traficantes por preço mais baixo). /documentos Nick/ID. Verifica os documentos do jogador, se ele tem porte de armas ou não, se tem carteira de motorista. Caso o jogador esteja sem porte de armas e tenha armas, o policial pode usar o /desarmar para tirar as armas e pode /tirarveiculo se o jogador estiver sem carteira de motorista. (se o carro for público, ou seja, encontrado nos lugares públicos do mapa, apenas respawna o veículo.) O policial pode então dar /procurar no jogador. /blitz. Cria um tapete de pregos na posição e rotação do policial. Jogadores que passarem com veículo terão os pneus estourados e poderão ser /procurados por furar bloqueio policial. /destruirblitz. Destrói o tapete de pregos (só pode criar 1 tapete por policial), usado para permitir a passagem dos jogadores depois que foram revistados na operação da blitz. /rp Texto. Manda uma mensagem para todos os jogadores que possuem uma profissão de policial. Sistema complexo de clãs, cada clã pode ter no máximo 50 membros. Os clãs podem ter uma base (caso algum líder ou sub-líder compre) com spawn de armas, vida e colete. Podem ter carros na base. (também comprados pelos líderes e sub-líderes ou até mesmo pelos comandantes). Os clãs possuem uma contagem de Kills/Death para estabelecer um Rank de Clãs. Os membros do clã podem realizar ataques contra zonas de outros clãs. (igual o sistema de dominar territórios) Os membros do clã recebem uma quantidade de bônus em dinheiro dependendo do número de territórios que seu clã domina a cada hora de jogo. Mas diferente do salário das profissões que se recebe no momento em que o jogador upa de level, esse bônus se ganha a cada hora do servidor, o pagamento continua sendo feito a todos os membros a cada hora ao mesmo tempo, os membros que estiverem offline não recebem. Cada clã só pode comprar 1 base apenas. Existem bases mais caras e mais baratas. O clã pode ter a base comprada por outro clã caso fique sem territórios, o dinheiro gasto para comprar a base de outro clã vai para os impostos. Sugiro fazer os territórios em San Fierro pra não ficar padrão ao jogo normal. Sistema bancário avançado, com função de transferir valores para outros jogadores. Útil para casos onde os membros devem ajudar os líderes do clã a comprar uma base, depositando valores na conta do líder que vai realizar a compra. Jogadores devem dropar o dinheiro do bolso quando morrem. (O valor que estiver aparecendo no HUD quando morreu, para isso é recomendado que os jogadores sempre depositem sua grana no banco para não haver grandes perdas ao morrer, ainda sim será necessário pagar o hospital usando a grana do banco.) Obrigatório o servidor possuir um fórum no site, para os jogadores poderem fazer novas sugestões, denúncias, perguntas, reports de bugs e tudo mais. Ideias todos nós temos, colocar em prática não é o problema, realizá-las sim é o problema. Caso queira ver como funciona o servidor de SAMP, eu fiz uma série nele faz um tempo.1 point
-
اهنيك الصراحه و باذن الله تصير افضل مبرمج تحياتي داب1 point
-
لاني جالس اسوي مود فكرته مبتكره شوي بتشوفوه قريب هذي اخر خطوه +_+ #Edit: ------------------------يعطيكم العافيه جميعا يغلق1 point
-
1 point
-
1 point
-
1 point
-
Job to help him, not to copy paste and write everything for him. The way you have to do this by making a colshape and using getElementsWithinColShape "vehicle" and then it s hould be done it is our duty to help him as long as he learns not blindly give codes all time1 point
-
Its our job to help on this forum, try not to be a moderator if you are not one. Thank you @Gordon_G.1 point
-
He'll never understand if you make everything for him just explain next time NeXus...1 point
-
@Ra1D1Um It's not worth fixing a script which is not even yours, I think so.1 point
-
1 point
-
You'll have to do some calculations again. local sX, sY = guiGetScreenSize() _getCursorPosition = getCursorPosition function getCursorPosition() local cX, cY = _getCursorPosition() if cX and cY then return cX*sX, cY*sY end return -1, -1 end function inBox(x, y, w, h) local cX, cY = getCursorPosition() if cX > x and cX < x + w and cY > y and cY < y + h then return true end return false end function onClick(cButton, cState) if cButton == "left" and cState == "down" then for i = 0, 4 do if inBox(100, 100+i*15, 100, 15) then clickedElement = i+1+drawFrom end end end end Again, not tested, but should work. @Extinction1 point
-
You are right. dxDrawRectangle(100, 100, 100, #testItems > drawItems and #testItems*15 or drawItems*15)1 point
-
You'll have to do some calculations about it. local testItems = {} local drawFrom = 1 local drawItems = 5 for i = 1, 20 do table.insert(testItems, i) end function dxDrawComboBox() dxDrawRectangle(100, 100, 100, testItems > drawItems and drawItems*15 or #testItems*15) for i, k in pairs(testItems) do if i >= drawFrom and i <= drawFrom+drawItems then dxDrawText(k, 100, 100+(i-1)*15) end end end bindKey("mouse_wheel_down", "down", function() if #testItems > drawItems and drawFrom < #testItems then drawFrom = drawFrom+1 end end) bindKey("mouse_wheel_up", "down", function() if drawItems > 1 then drawFrom = drawFrom - 1 end end) Didn't test, but should work. If you need further help, feel free to ask here.1 point
-
1 point
-
Ну я ж не знаю что там должно быть. По идее если с value все в порядке то и выводится будет только оно. А вот если увидишь rusty vagina, значит где-то еще в коде у тебя сидит vagina.1 point
-
564 if isElement(attacker) and getElementData(attacker,"zombie") then 679 setElementData(getLocalPlayer(),"blood",(getElementData(getLocalPlayer(),"blood") or 12000)-math.random(100,1000)) 299 guiSetText(statsLabel["blood"],"Кровь: "..tostring(value or "rusty vagina"))1 point
-
The only reason for choosing 10ms is that you'll get 1 update per frame on a server running at 100FPS. In reality however default FPS rate for a server is 36 (27.77..ms sync interval) and most displays today runs at 60FPS (16.66..ms sync interval). My test server runs at 60FPS so in my case I wouldn't have noticed any difference if I've used say 20ms, other than support for more players and objects before noticing any lag. I did try this with Crystals bot resource however and 50-75 bots works just fine with a 10ms sync interval, first after spawning more than 75 bots and vehicles I did notice some lag. Without testing I think a 100ms sync interval should be sufficient as well. Luckily it's easy to change these values while testing what works best for individual servers.1 point
-
I don't think setting all sync intervals that low is a good idea if you are expecting more than a few players. It might not be notable with 2 players but it sure will be with more... Not to mention that 10 seems a little low, even the player sync is only 100 by default.1 point
-
This is a complex problem but you can make it work almost perfect in most cases. Changing unoccupied_vehicle_sync_interval like 3aGl3 suggested (and the other sync intervals too) is a good start. I'm using 10ms on all of them except lightweight sync where 100ms is used: <!-- Player sync interval. Default: 100 --> <player_sync_interval>10</player_sync_interval> <!-- Lightweight (player) sync interval. Used when players are far apart. Default: 1500 --> <lightweight_sync_interval>100</lightweight_sync_interval> <!-- Camera sync interval. Default: 500 --> <camera_sync_interval>10</camera_sync_interval> <!-- Ped sync interval. Default: 400 --> <ped_sync_interval>10</ped_sync_interval> <!-- Unoccupied_vehicle sync interval. Default: 400 --> <unoccupied_vehicle_sync_interval>10</unoccupied_vehicle_sync_interval> <!-- Keysync mouse rotation sync interval. For limiting key sync packets due to mouse movement. Default: 100 --> <keysync_mouse_sync_interval>10</keysync_mouse_sync_interval> <!-- Keysync analog movement sync interval. For limiting key sync packets due to joystick movement. Default: 100 --> <keysync_analog_sync_interval>10</keysync_analog_sync_interval> This high sync intervals are barely noticeable on the server's CPU usage (Debian 8.7, mtasa-1.5.3), same applies for the network speed (Avg: 30 kBit/s) with 2 players online. Now this isn't everything you need, you would also need something that detects and update differences in positioning. Here's one potential solution, first the server side code which will obtain the current coordinates of a first (and a second trailer attached to an invisible Tanker semi truck attached to the first trailer). Coordinates server side will match the element syncer which should be the player who is driving the big rig. -- Trailer sync function trailerSyncTimers[client] = setTimer(function(client) -- Sync first truck trailer if there is any if vehicles and vehicles[client] and isElement(vehicles[client]) and isElement(getElementData(vehicles[client], "GTWvehicles.attachedTrailer")) then local tx,ty,tz = getElementPosition(getElementData(vehicles[client], "GTWvehicles.attachedTrailer")) local trx,try,trz = getElementRotation(getElementData(vehicles[client], "GTWvehicles.attachedTrailer")) setElementData(getElementData(vehicles[client], "GTWvehicles.attachedTrailer"), "GTWvehicles.trailer.location", toJSON({tx,ty,tz, trx,try,trz})) else killTimer(trailerSyncTimers[client]) end -- Sync first truck trailer if there is any if trailers and trailers[client] and trailers[client][1] and isElement(trailers[client][1]) and isElement(getElementData(trailers[client][1], "GTWvehicles.second_trailer")) then local tx,ty,tz = getElementPosition(getElementData(trailers[client][1], "GTWvehicles.second_trailer")) local trx,try,trz = getElementRotation(getElementData(trailers[client][1], "GTWvehicles.second_trailer")) setElementData(getElementData(trailers[client][1], "GTWvehicles.second_trailer"), "GTWvehicles.trailer.location", toJSON({tx,ty,tz, trx,try,trz})) end end, 250, 0, client) Now on the client side. This is where the coordinates are obtained from the trailer object itself which we set on the server earlier. Here's where we'll look for the big changes like if the trailer is rotated ~45 degrees for a player looking at the rig from the outside while everything looks perfectly normal to the driver. We'll also check for differences in positioning, in this case a distance of 20 units are used while the difference in rotation are π/6 rad (30 degrees) setTimer(function() for k,v in pairs(getElementsByType("vehicle", root, true)) do if getVehicleType(v) == "Trailer" and getElementData(v, "GTWvehicles.trailer.location") and getElementData(v, "GTWvehicles.towingVehicle") and getElementData(v, "GTWvehicles.towingVehicle") ~= getPedOccupiedVehicle(localPlayer) then local data = fromJSON(getElementData(v, "GTWvehicles.trailer.location")) --outputChatBox("Trailer "..k.." is streamed in at position: {"..math.floor(data[1])..", ".. -- math.floor(data[2])..", "..math.floor(data[3]).."} with rotation: {"..math.floor(data[4])..", ".. -- math.floor(data[5])..", "..math.floor(data[6]).."}") local tx,ty,tz = getElementPosition(v) local trx,try,trz = getElementRotation(v) --local sx,sy,sz = getElementVelocity(v) --outputChatBox("Updated trailer position for player: "..getPlayerName(localPlayer)..", Diff: x: ".. -- math.floor(math.abs(tx-data[1])).." sx: ("..math.floor(sx).."), y: ".. -- math.floor(math.abs(ty-data[2])).." sy: ("..math.floor(sy).."), z: ".. -- math.floor(math.abs(tz-data[3])).." sz: ("..math.floor(sz).. -- "), Diff rot: rx: "..math.floor(math.abs(trx-data[4])).. -- ", ry: "..math.floor(math.abs(try-data[5]))..", rz: "..math.floor(math.abs(trz-data[6]))) local t_tower = getElementData(v, "GTWvehicles.towingVehicle") if t_tower and isElement(t_tower) then setTimer(attachTrailerToVehicle, 100, 1, t_tower, v) end local t2_tower = getElementData(t_tower, "GTWvehicles.second_tower") if t2_tower and isElement(t2_tower) then setTimer(attachTrailerToVehicle, 100, 1, t2_tower, v) end if math.abs(tx-data[1]) > 20 or math.abs(ty-data[2]) > 20 or math.abs(tz-data[3]) > 20 or (math.abs(trz-data[6]) > 30 and math.abs(trz-data[6]) < 150) then --outputChatBox("Old pos: "..math.floor(tx)..", "..math.floor(ty)..", "..math.floor(tz)) setElementPosition(v, data[1],data[2],data[3]) setElementRotation(v, data[4],data[5],data[6]) --local tx,ty,tz = getElementPosition(v) --outputChatBox("New pos: "..math.floor(tx)..", "..math.floor(ty)..", "..math.floor(tz)) end end end end, 500, 0) Next thing to do here would be to not allow an element to stream out. This is slightly easier tho since you only need to pass the newly created trailer element (and the semi truck) to the client and then use setElementStreamable client side. Here's an example I've been using to solve this issue with trains carrying 20-30 trailers. Server: triggerClientEvent(root, "GTWvehicles.onStreamOut", root, vehicles[client]) Client: function check_stream_out(c_train) setElementStreamable(c_train, true) end addEvent("GTWvehicles.onStreamOut", true) addEventHandler("GTWvehicles.onStreamOut", root, check_stream_out) This code is a part of https://github.com/404rq/GTW-RPG/tree/v4.0-development and might need a few adjustments to work in your server but it shows the principles. vehicles[client] contains the semi truck and trailers[client][1] contains the first trailer. The trailer can identify it's tower from it's element data set to: GTWvehicles.towingVehicle which is set upon creation. If you're having any trouble, try changing the values in this line, that's pretty much how aggressive the sync will be, if it's too aggressive you may experience other issues: if math.abs(tx-data[1]) > 20 or math.abs(ty-data[2]) > 20 or math.abs(tz-data[3]) > 20 or (math.abs(trz-data[6]) > 30 and math.abs(trz-data[6]) < 150) then I hope this works for you too1 point
-
1 point
-
may be that server is running on an highly configured vps or host as i only know about unoccupied_vehicle_sync_interval setting and in my opinion that's the only way of achieving it1 point
-
Trailers are handled as empty vehicles in MTA and are only updated according to unoccupied_vehicle_sync_interval. That causes problems for all other players who see you pull that trailer, while for you it seems fine other players see the trailers correct position only every x ms. One fix would be to change the unoccupied_vehicle_sync_interval setting to a lower value but that will cause heavy server load. There is also a bug on the bugtracker but I can't find it.1 point
-
1 point