Pular para o conteúdo
Ver no aplicativo

Uma forma melhor de navegar. Saiba mais.

Genesys Forum

Um aplicativo em tela cheia na sua tela inicial com notificações push, distintivos e mais.

Para instalar este aplicativo no iOS e iPadOS
  1. Toque no ícone Compartilhar no Safari
  2. Role o menu e toque em Adicionar à Tela de Início.
  3. Toque em Adicionar no canto superior direito.
Para instalar este aplicativo no Android
  1. Toque no menu de 3 pontos (⋮) no canto superior direito do navegador.
  2. Toque em Adicionar à tela inicial ou Instalar aplicativo.
  3. Confirme tocando em Instalar.

Mapa por Instância (Dungeon Instance)

Respostas Destacadas

  • Licença Plus

Sugestão de implementação de suporte a Mapa por Instância (Dungeon Instance)

Olá!

Gostaria de sugerir a implementação de um sistema de Map Instance (Instância de Mapa) no emulador.

Hoje, quando vários jogadores entram em uma dungeon, todos utilizam o mesmo mapa físico, compartilhando monstros, NPCs e progresso. Isso limita bastante a criação de sistemas PvE modernos.

A ideia seria permitir que o servidor criasse várias cópias independentes de um mesmo mapa.

Exemplo

Existe apenas um mapa:

Mapa 70

Hoje:

Party A
Party B
Party C

↓

Mapa 70

Resultado:

  • todos veem os mesmos monstros;

  • todos atacam o mesmo boss;

  • progresso compartilhado;

  • uma party pode atrapalhar a outra.

A proposta seria:

Party A
↓

Mapa 70 (Instância 1)

------------------------

Party B
↓

Mapa 70 (Instância 2)

------------------------

Party C
↓

Mapa 70 (Instância 3)

Visualmente o mapa é exatamente o mesmo.

Porém cada instância possui:

  • monstros próprios;

  • NPCs próprios;

  • progresso próprio;

  • cronômetro próprio;

  • boss próprio;

  • eventos próprios.

Nenhuma party interfere na outra.


Exemplo prático

Party A mata o Boss.

Somente a Party A recebe:

Etapa concluída

Enquanto isso, a Party B continua normalmente na primeira etapa.

Nenhum monstro desaparece da outra instância.


O que seria interessante existir na Source

Algo semelhante a:

int CreateMapInstance(int map);

Retorno:

InstanceID

Depois:

MoveUserToInstance(Index, InstanceID);

ou

MoveUser(
    Index,
    Map,
    InstanceID,
    X,
    Y
);

Para monstros:

CreateMonster(
    MonsterClass,
    InstanceID,
    X,
    Y
);

Ou

Monster.Instance = InstanceID;

Assim cada instância teria seus próprios monstros.


Consultas

Também seria interessante:

GetUserInstance(Index);

GetMonsterInstance(Index);

DestroyInstance(InstanceID);

GetPlayersInInstance(InstanceID);

Eventos Lua

Seria excelente disponibilizar nas bridges Lua algo como:

User.GetInstance(aIndex)

User.SetInstance(aIndex, instance)

Monster.GetInstance(monster)

Instance.Create(map)

Instance.Destroy(id)

Instance.GetPlayers(id)

Ou funções equivalentes.


Benefícios

Com esse recurso seria possível desenvolver:

  • Dungeons por Party

  • Dungeons Solo

  • Boss exclusivos

  • Sistema de Andares

  • Torre Infinita

  • Survival

  • Raid

  • Castle PvE

  • Eventos temporários

  • Missões por instância

  • Campanhas

  • Labirintos

  • Challenge Mode

  • Speed Run

  • Ranking por tempo

Tudo sem conflito entre jogadores.


Consumo de memória

Não seria necessário duplicar arquivos do mapa.

Uma instância utilizaria os mesmos recursos carregados:

Terrain

Objects

Textures

BMD

Mudaria apenas o estado da execução:

Jogadores

Monstros

NPCs

Drops

Objetos temporários

Cronômetros

Eventos

Ou seja, várias instâncias utilizariam o mesmo mapa carregado em memória, alterando apenas os dados dinâmicos.


Exemplo de uso

int instance = CreateMapInstance(70);

MoveUserToInstance(player1, instance);
MoveUserToInstance(player2, instance);

CreateMonster(BudgeDragon, instance, 120, 85);
CreateMonster(BudgeDragon, instance, 125, 90);

CreateMonster(Boss, instance, 150, 150);

Quando todos saírem:

DestroyInstance(instance);

Toda a memória utilizada pela dungeon seria liberada automaticamente.


Considerações finais

A implementação desse recurso abriria possibilidades para sistemas PvE muito mais avançados no emulador, sem a necessidade de criar dezenas de mapas duplicados apenas para simular instâncias. Além de simplificar o desenvolvimento, manteria um consumo de recursos mais eficiente e permitiria que múltiplas parties utilizassem a mesma dungeon simultaneamente, cada uma com sua própria execução independente. Isso aproximaria o emulador do funcionamento adotado por MMORPGs modernos e facilitaria a criação de conteúdos escaláveis, como raids, campanhas, dungeons por dificuldade e eventos cooperativos.

Mas isso já existe, não?

CustomInstance.txt

Só não puxei as chamadas pro Lua ainda porque não recebi feedback total da custom.

E já temos a um bom tempo, faça os testes e depois informe, mas nele você pode definir a quantidade de instâncias, a party se encontrar outra party na instancia 1, podem ir para outra instância.

Rivify Brasil Ltda

Holding de tecnologia, Software, Cloud, IA
e infraestrutura digital.

[email protected]  •  www.rivify.com.br

Av. Tiradentes, 960, 9.º andar, sala 2 — Luz
São Paulo/SP — CEP 01102-000
CNPJ 68.145.965/0001-06

Nos acompanhem nas redes @rivifybrasil

  • Autor
  • Licença Plus
2 horas atrás, José Silva disse:

Mas isso já existe, não?

CustomInstance.txt

Só não puxei as chamadas pro Lua ainda porque não recebi feedback total da custom.

E já temos a um bom tempo, faça os testes e depois informe, mas nele você pode definir a quantidade de instâncias, a party se encontrar outra party na instancia 1, podem ir para outra instância.

Olá José.

Analisando melhor a documentação e os arquivos do servidor, encontrei o arquivo CustomInstance.txt.

Pelo que entendi, ele indica que já existe um sistema de instâncias na source, com configurações como:

  • MaxActiveInstance

  • MaxPlayersPerInstance

  • MaxActiveMapsPerInstance

  • DurationMinutes

  • MaxMonsterUse

Além disso, é possível definir quais mapas aceitam instâncias privadas.

Minha dúvida é: esse sistema já está totalmente implementado na source?

A ideia que tenho é desenvolver dungeons totalmente em Lua, por exemplo:

  • Cada party entra em sua própria instância.

  • Cada instância possui monstros, boss, progresso e cronômetro independentes.

  • Uma party não interfere na outra, mesmo utilizando o mesmo mapa base.

  • Ao finalizar ou expirar o tempo, a instância é destruída automaticamente.

Gostaria de saber se atualmente existe alguma forma de acessar esse sistema pelo Lua ou se ele é utilizado apenas internamente pela source.

Caso ainda não exista uma API para isso, acredito que algumas funções como estas seriam suficientes para permitir a criação de sistemas bastante avançados:

Instance.Create(map)
Instance.Destroy(instanceId)

player:getInstance()
player:setInstance(instanceId)

Instance.AddPlayer(instanceId, player)
Instance.RemovePlayer(instanceId, player)

Instance.SpawnMonster(instanceId, monsterClass, x, y)

Instance.GetPlayers(instanceId)

Com isso seria possível desenvolver dungeons, raids, torres, eventos PvE e outros sistemas praticamente apenas em Lua, aproveitando um recurso que aparentemente a source já possui.

O que você acha? O sistema do CustomInstance já suporta esse tipo de utilização ou ainda seria necessário expandi-lo?

O sistema que eu estava desenvolvendo aqui era justamente uma dungeon/raid em Lua.

A solução que encontrei, sem um sistema de instâncias, seria criar várias cópias do mesmo mapa. Por exemplo, quando uma party tenta iniciar a dungeon, o servidor verifica:

  • Se o mapa X estiver ocupado, tenta o mapa Y.

  • Se o mapa Y estiver ocupado, tenta o mapa Z.

  • E assim sucessivamente até encontrar um mapa livre.

O problema dessa abordagem é que ela possui algumas limitações importantes.

Primeiro, é necessário duplicar os arquivos do mapa World e Object para cada slot da dungeon. Se eu quiser permitir 10 execuções simultâneas da mesma raid, precisarei manter 10 cópias desses arquivos, aumentando o tamanho do cliente e tornando a manutenção muito mais trabalhosa. Qualquer alteração no mapa precisa ser replicada em todas as cópias.

Além disso, vi que o sistema de CustomInstance está configurado para suportar até 10 instâncias. Na prática, esse limite pode acabar sendo baixo dependendo do conteúdo do servidor.

Por exemplo, imagine uma única raid com três dificuldades:

  • Easy

  • Medium

  • Hard

Se houver 10 players ou 10 parties executando essas variações ao mesmo tempo, todas as instâncias disponíveis já estariam ocupadas. Isso impediria que outros jogadores participassem de outras dungeons ou raids que também utilizassem o sistema de instâncias.

Minha dúvida é:

  • Esse limite de 10 instâncias é apenas uma configuração do CustomInstance.txt ou é uma limitação da própria source?

  • O sistema foi desenvolvido para suportar um número maior de instâncias simultâneas?

  • Existe alguma forma de acessar esse sistema via Lua, ou a intenção é que ele seja utilizado apenas internamente?

Acredito que um sistema de instâncias mais flexível abriria muitas possibilidades para criação de conteúdo PvE, como dungeons, raids, torres, campanhas e eventos, sem a necessidade de duplicar mapas e mantendo um consumo muito menor de recursos no cliente.

Acabei de responder essa pergunta acima.

Vai ser adicionado ao Lua ainda.

Rivify Brasil Ltda

Holding de tecnologia, Software, Cloud, IA
e infraestrutura digital.

[email protected]  •  www.rivify.com.br

Av. Tiradentes, 960, 9.º andar, sala 2 — Luz
São Paulo/SP — CEP 01102-000
CNPJ 68.145.965/0001-06

Nos acompanhem nas redes @rivifybrasil

  • Autor
  • Licença Plus

Perfeito obrigado man !

2 horas atrás, José Silva disse:

Acabei de responder essa pergunta acima.

Vai ser adicionado ao Lua ainda.

Participe da conversa

Você pode publicar agora e se cadastrar depois. Se você tem uma conta, entre agora para publicar com sua conta.

Convidado
Responder a este tópico...

Conta

Navegação

Procurar

Procurar

Configurar notificações push do navegador

Chrome (Android)
  1. Toque no ícone de cadeado ao lado da barra de endereços.
  2. Toque em Permissões → Notificações.
  3. Ajuste sua preferência.
Chrome (Desktop)
  1. Clique no ícone de cadeado na barra de endereços.
  2. Selecione Configurações do site.
  3. Encontre Notificações e ajuste sua preferência.