Sign in to follow this  
Lord Henry

É possível mudar o gamemode para somente alguns jogadores do server?

Recommended Posts

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.

Share this post


Link to post

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 by DNL291

Share this post


Link to post
20 hours ago, DNL291 said:

Deixar o gamemode como script é claro. E usar eventos, funções exportadas caso seja preciso.

Como faz isso?

Share this post


Link to post

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 by Gw8

Share this post


Link to post
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>

 

Share this post


Link to post

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 by Gw8

Share this post


Link to post
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 by DNL291

Share this post


Link to post

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 by Lord Henry

Share this post


Link to post
string.gsub(text, "%", "")

Tente isso.

Share this post


Link to post
7 minutes ago, DNL291 said:

string.gsub(text, "%", "")

Tente isso.

Não funcionou...

Share this post


Link to post

É, eu percebi testando aqui que não funciona... Tenta isto:

string.gsub(text, "%p", "")

 

  • Like 1

Share this post


Link to post
6 minutes ago, DNL291 said:

É, eu percebi testando aqui que não funciona... Tenta isto:


string.gsub(text, "%p", "")

 

Agora funcionou perfeitamente.

Share this post


Link to post

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.

Share this post


Link to post

Você pode usar uma variável pra verificar se o "onClientRender" está ativo. Quando ativar o "onClientRender" passa true para a variável.

Share this post


Link to post

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

 

Share this post


Link to post
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.

Share this post


Link to post
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.

Share this post


Link to post

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 by DNL291

Share this post


Link to post

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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.