Other Languages Moderators Lord Henry Posted May 20, 2017 Other Languages Moderators Share Posted May 20, 2017 Estou criando um script de eventos, nesse script o admin pode criar 1 evento de cada vez e os jogadores podem participar caso queiram. O que estou com dificuldade seria para eventos de corrida, pois como a maioria deve saber, os mapas de corrida simplesmente não funcionam se não estiver no gamemode race. Só que se eu alterar o gamemode do server, vai mudar para todo mundo, inclusive pra quem não está participando do evento. Eu gostaria de saber se é possível alterar o gamemode para somente alguns jogadores ou então algum jeito de ativar um mapa de corrida específico sem alterar o gamemode atual do servidor. O mapa é escolhido no script de evento pelo admin. Eu estava dando uma olhada no resource 'race' e vi que ele ativa uma série de outros resources junto, como por exemplo o votemanager dos mapas, placares, contagem regressiva, tempo de corrida, etc...No meu script a maioria deles não será necessário. No gamemode race, ele carrega outro mapa de corrida automaticamente após terminar a corrida atual, mas no meu script o evento deve terminar e os jogadores voltam para a posição que estavam antes de participar. Link to comment
DNL291 Posted May 21, 2017 Share Posted May 21, 2017 (edited) Você precisa editar o race neste caso e deixar tudo pra funcionar de acordo com o seu sistema de eventos. Acho que é só modificar o gamemode mesmo (nunca usei o gamemode race, então não te dou certeza que só fazer isso). Deixar o gamemode como script é claro. E usar eventos, funções exportadas caso seja preciso. Se você já tiver algum conhecimento de como tudo funciona no race, vai ter mais facilidade . Edit: Se mapa do evento for o mesmo que do GM race acho que é só converter pra código Lua. Edited May 21, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 22, 2017 Author Other Languages Moderators Share Posted May 22, 2017 20 hours ago, DNL291 said: Deixar o gamemode como script é claro. E usar eventos, funções exportadas caso seja preciso. Como faz isso? Link to comment
Gw8 Posted May 22, 2017 Share Posted May 22, 2017 (edited) Tipo você quer por um mapa race no gamemode play? Se for isso é simples, se eu tivesse fazendo faria assim, faria um cache do mapa, depois os sistemas para criar os objetos, depois o spawn eo countdown depois o sistema de morte, depois o winner. Seria mais simples e pratico e pra selecionar os jogadores e só mudar a dimensão pra ficar mais facil. Isso em script novo, sem usar o gm race. Edited May 22, 2017 by Gw8 Link to comment
Other Languages Moderators Lord Henry Posted May 24, 2017 Author Other Languages Moderators Share Posted May 24, 2017 On 2017-5-22 at 12:42, Gw8 said: Tipo você quer por um mapa race no gamemode play? Se for isso é simples, se eu tivesse fazendo faria assim, faria um cache do mapa, depois os sistemas para criar os objetos, depois o spawn eo countdown depois o sistema de morte, depois o winner. Seria mais simples e pratico e pra selecionar os jogadores e só mudar a dimensão pra ficar mais facil. Isso em script novo, sem usar o gm race. Eu to pensando em fazer assim...só que não faço ideia de como "spawnar" os markers um por vez a cada vez que o jogador colide em um. Eu sei que os markers são sempre client-side, quando termina o countdown e inicia a corrida, ele cria direto o marker 1 e o 2. Quando o jogador colide no 1, ele deleta o marker 1, cria o 3 e assim por diante, sempre mantendo 2 markers criados. Só que não sei como chamar os markers de cada vez. Eu sei que no arquivo ele classifica por ID e informa qual é o próximo marker, de maneira que ele saiba qual chamar em seguida. <map mod="deathmatch"> <!-->O arquivo original está assim...mas só funciona no Race.</--> <spawnpoint posX="-2389.578125" posY="-2214.670410" posZ="32.949440" rotation="339" vehicle="468" id="spawnpoint0" /> <spawnpoint posX="-2392.252930" posY="-2214.180420" posZ="32.949440" rotation="330" vehicle="468" id="spawnpoint1" /> <spawnpoint posX="-2394.579834" posY="-2212.746582" posZ="32.949440" rotation="320" vehicle="468" id="spawnpoint2" /> <spawnpoint posX="-2396.306396" posY="-2210.714844" posZ="32.949440" rotation="306" vehicle="468" id="spawnpoint3" /> <spawnpoint posX="-2397.809570" posY="-2208.184326" posZ="32.949440" rotation="299" vehicle="468" id="spawnpoint4" /> <spawnpoint posX="-2399.312988" posY="-2205.918945" posZ="32.949440" rotation="294" vehicle="468" id="spawnpoint5" /> <spawnpoint posX="-2399.995117" posY="-2203.309814" posZ="32.949440" rotation="289" vehicle="468" id="spawnpoint6" /> <!-->Mais um monte de spawnpoints</--> <checkpoint posX="-2375.774414" posY="-2196.347656" posZ="32.376450" color="#007fff" id="checkpoint0" nextid="checkpoint1" /> <checkpoint posX="-2264.348389" posY="-2142.104492" posZ="55.736046" color="#007fff" id="checkpoint1" nextid="checkpoint2" /> <checkpoint posX="-2159.435059" posY="-2035.847534" posZ="91.579437" color="#007fff" id="checkpoint2" nextid="checkpoint3" /> <checkpoint posX="-2100.626465" posY="-1895.320435" posZ="108.437828" color="#ff0000" id="checkpoint3" nextid="checkpoint4" /> <checkpoint posX="-2224.203369" posY="-2053.038818" posZ="118.907944" color="#007fff" id="checkpoint4" nextid="checkpoint5" /> <checkpoint posX="-2447.318848" posY="-2078.869141" posZ="125.247055" color="#ff0000" id="checkpoint5" nextid="checkpoint6" /> <!-->Mais um monte de checkpoints</--> <checkpoint posX="-2375.783936" posY="-2196.322510" posZ="32.338516" color="#ffef00" id="checkpoint47" /> <!-->Checkpoint da linha de chegada.</--> <object posX="-2367.477783" posY="-2187.626709" posZ="32.561180" rotX="0" rotY="0" rotZ="0" model="2780" id="object0" /> <object posX="-2362.699219" posY="-2194.435791" posZ="32.645840" rotX="0" rotY="0" rotZ="158.995845444583" model="2780" id="object1" /> <object posX="-2525.923584" posY="-1696.326660" posZ="401.407379" rotX="0" rotY="0" rotZ="3.43774677078494" model="3264" id="object2" /> <object posX="-2319.156982" posY="-1632.014771" posZ="500.054626" rotX="0" rotY="0" rotZ="0" model="3873" id="object3" /> <!-->Alguns objetos de mapa, também classificados por IDs.</--> </map> Link to comment
Gw8 Posted May 24, 2017 Share Posted May 24, 2017 (edited) primeiro passo é salvar essas configurações numa tabela depois disso vai ficar fácil, faz o sistema conforme o index da tabela.[lua] checkPoint = { {posX="-2375.774414",posY="-2196.347656",posZ="32.376450",color="#007fff",id="checkpoint0",nextid="checkpoint1"}, {posX="-2375.774414",posY="-2196.347656",posZ="32.376450",color="#007fff",id="checkpoint1",nextid="checkpoint2"}, {posX="-2375.774414",posY="-2196.347656",posZ="32.376450",color="#007fff",id="checkpoint2",nextid="checkpoint3"}, {posX="-2375.774414",posY="-2196.347656",posZ="32.376450",color="#007fff",id="checkpoint3"} } --começo do mapa: currentMarker = 1 function createCheckPointByIndex(index) local marker = createMarker(checkPoint[index]) -- só um exemplo, mas você vai ter que preencher os dados local circle = createColCircle(checkPoint[index]) -- só um exemplo, mas você vai ter que preencher os dados setElementData(circle,"marker",marker) -- element do marker setElementData(circle,"index",index) -- numero do checkpoint end function destroyCheckPointByIndex(element) local marker = getElementData(element,"marker") if isElement(marker) then destroyElement(marker) -- destruir o marker end if isElement(element) then destroyElement(element) -- destruir o circle end end function onClientCircleHit(theElement,dimension) -- o circle e chamado pelo source, sendo assim local index = getElementData(source,"index") if index == currentMarker then local current = index + 2 -- se voce esta no 1 eo 2 ja esta criado, so somar mais 2 no index atual if checkPoint[current] then -- verifica se existe este index na tabela createCheckPointByIndex(current) end currentMarker = currentMarker + 1 destroyCheckPointByIndex(source) end end addEventHandler("onClientColShapeHit",getRootElement(),onClientCircleHit) createCheckPointByIndex(1) createCheckPointByIndex(2) [/lua] pelo menos é mais ou menos isso, não testei o código. Edited May 24, 2017 by Gw8 Link to comment
DNL291 Posted May 26, 2017 Share Posted May 26, 2017 (edited) On 2017-5-24 at 10:10, Lord Henry said: Eu to pensando em fazer assim...só que não faço ideia de como "spawnar" os markers um por vez a cada vez que o jogador colide em um. Eu sei que os markers são sempre client-side, quando termina o countdown e inicia a corrida, ele cria direto o marker 1 e o 2. Quando o jogador colide no 1, ele deleta o marker 1, cria o 3 e assim por diante, sempre mantendo 2 markers criados. Só que não sei como chamar os markers de cada vez. Eu sei que no arquivo ele classifica por ID e informa qual é o próximo marker, de maneira que ele saiba qual chamar em seguida. Se ainda não conseguiu fazer essa parte dos checkpoints, mostre seu código aqui (se não for problema torná-lo público). Será mais fácil criar diretamente no seu código do que escrever um exemplo. Edited May 26, 2017 by DNL291 Link to comment
Other Languages Moderators Lord Henry Posted May 26, 2017 Author Other Languages Moderators Share Posted May 26, 2017 (edited) Eu estou resolvendo ainda o menu para criar eventos...quando eu voltar a mexer nos mapas dai eu aviso. Estou com um problema para converter a string "50%" para número. Usando tonumber não resolve pois ele não sabe que número é o %, então eu teria que dar um jeito de remover o % da string antes de usar o tonumber. Alguém ae sabe alguma função para encontrar e deletar determinado caractere de uma string? Edited May 26, 2017 by Lord Henry Link to comment
DNL291 Posted May 26, 2017 Share Posted May 26, 2017 string.gsub(text, "%", "") Tente isso. Link to comment
Other Languages Moderators Lord Henry Posted May 26, 2017 Author Other Languages Moderators Share Posted May 26, 2017 7 minutes ago, DNL291 said: string.gsub(text, "%", "") Tente isso. Não funcionou... Link to comment
DNL291 Posted May 26, 2017 Share Posted May 26, 2017 É, eu percebi testando aqui que não funciona... Tenta isto: string.gsub(text, "%p", "") 1 Link to comment
Other Languages Moderators Lord Henry Posted May 26, 2017 Author Other Languages Moderators Share Posted May 26, 2017 6 minutes ago, DNL291 said: É, eu percebi testando aqui que não funciona... Tenta isto: string.gsub(text, "%p", "") Agora funcionou perfeitamente. Link to comment
Other Languages Moderators Lord Henry Posted June 3, 2017 Author Other Languages Moderators Share Posted June 3, 2017 Olá. Consegui implementar a corrida depois de vários bugs resolvidos. (só não tenho como testar multiplayer...) Uma pergunta: O jogador pode desistir do evento a qualquer momento usando /desistir. Ao fazer isso, ele chama algumas funções e remove alguns eventHandlers. SÓ QUE Se o jogador desistir no meio da corrida, o script tenta cancelar um evento "onClientRender", só que este evento só começa a executar depois que o jogador finaliza a corrida. Isso gera um Warning no debugscript (não gera nada no Console): WARNING: Bad argument @ 'removeEventHandler' [Expected function at argument 3, got nil] Eu devo deixar com esse warning? Ou existe algum jeito de verificar se a função existe antes de tentar cancelá-la? (Ele não interfere em nada no funcionamento do script e só aparece no debugscript.) Obs: Esse aviso não ocorre se o jogador tentar desistir depois de ter completado a corrida, pois o evento irá existir para ser cancelado. Link to comment
DNL291 Posted June 4, 2017 Share Posted June 4, 2017 Você pode usar uma variável pra verificar se o "onClientRender" está ativo. Quando ativar o "onClientRender" passa true para a variável. Link to comment
Gw8 Posted June 4, 2017 Share Posted June 4, 2017 na verdade tem alguma coisa errada no remove, ou no nome da função algo desse tipo, pois removeEvent funciona normalmente, independente se a função esta ativa ou nao, exemplo: function showRadar() end function startRadar() removeEventHandler("onClientRender",root,showRadar) addEventHandler("onClientRender",root,showRadar) end function stopRadar() removeEventHandler("onClientRender",root,showRadar) end Link to comment
Other Languages Moderators Lord Henry Posted June 4, 2017 Author Other Languages Moderators Share Posted June 4, 2017 2 hours ago, Gw8 said: na verdade tem alguma coisa errada no remove, ou no nome da função algo desse tipo, pois removeEvent funciona normalmente, independente se a função esta ativa ou nao, exemplo: function showRadar() end function startRadar() removeEventHandler("onClientRender",root,showRadar) addEventHandler("onClientRender",root,showRadar) end function stopRadar() removeEventHandler("onClientRender",root,showRadar) end A função cujo "onClientRender" deve ser cancelada só é declarada após o jogador finalizar a corrida, por isso ocorre o erro. Vou testar rapidão oq o @DNL291 disse e já falo se deu certo. Link to comment
Other Languages Moderators Lord Henry Posted June 6, 2017 Author Other Languages Moderators Share Posted June 6, 2017 On 2017-6-4 at 18:08, Lord Henry said: Vou testar rapidão oq o @DNL291 disse e já falo se deu certo. Deu certo, mas em vez de uma variável, setei ElementData no jogador para fazer a verificação...pois é uma função client-side. Link to comment
DNL291 Posted June 7, 2017 Share Posted June 7, 2017 (edited) Não entendi o porque do setElementData se está no client. Mas se o código está funcionando sem erros então sem problemas. Lembre-se se desativar a sincronização com o lado server se não haver necessidade. Edit: Você também pode enviar o jogador local usando triggerServerEvent. Edited June 7, 2017 by DNL291 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now