Jump to content

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


Recommended Posts

  • Other Languages Moderators

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
  • Moderators

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

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
Link to comment
  • Other Languages Moderators
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

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
Link to comment
  • Moderators
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
Link to comment
  • Other Languages Moderators

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
Link to comment
  • Other Languages Moderators
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

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

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
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
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
  • Moderators

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
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...