🤔 Para Refletir :
"Saber a hora de parar é quase tão importante quanto saber a hora de começar"
- Ricky O Bardo

RPG Maker MV [RM MV] Como checar se o inventário está cheio?

Hermanoteu Masculino

Novato
Membro
Membro
Eu vou. Tu vais. Ele vai.
Juntou-se
20 de Julho de 2021
Postagens
13
Bravecoins
41
Meus queridos,
estou usando o plugin YEP_CoreEngine e nele tenho a opção de limitar meu inventário para 20 itens no máximo. Acontece que se eu acionar um evento de tesouro padrão com o inventário cheio, aquele item não será adicionado ao inventário (por óbvio), mas eu não terei como pegá-lo em outro momento já que o tesouro ativa a Switch Local. Eu quero que o item seja pego e a Switch Local acionada somente se houver espaço no meu inventário, mas não sei como colocar isso em uma condição. Algo semelhante a isso:
Condição >Script >$gameParty.numItems("todos itens possuídos") <= 20 >+item & Switch Local A on.

Existe uma forma simples de colocar a quantidade de todos os itens possuídos em uma $gameVariables?
Ou algo totalmente diferente, mas que funcione?
Desde já agradeço.
 
Olá!

Não precisa verificar na com um código inteiro, pode fazer somente com eventos, usando apenas duas variáveis reaproveitaveis:
Código:
◆Controlar Variáveis:#0002 Temp-Item-Atual = O número de Poção
◆Mudar Itens:Poção + 1
◆Controlar Variáveis:#0003 Compara-Quantidade = O número de Poção
◆Se:Compara-Quantidade > Temp-Item-Atual
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada!
  ◆Controlar Switches Locais:A = ON
  ◆
:Se Não
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada, mas seu inventário está cheio.
  ◆Controlar Variáveis:#0002 Temp-Item-Atual = 0
  ◆Controlar Variáveis:#0003 Compara-Quantidade = 0
  ◆
:Fim

Ou mais simples:
Código:
◆Controlar Variáveis:#0002 Temp-Item-Atual = O número de Poção
◆Mudar Itens:Poção + 1
◆Controlar Variáveis:#0003 Compara-Quantidade = O número de Poção
◆Se:Temp-Item-Atual = Compara-Quantidade
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada, mas seu inventário está cheio.
  ◆
:Se Não
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada!
  ◆Controlar Switches Locais:A = ON
  ◆
:Fim

Estou usando o RMMV em Português, mas se você estiver usando em inglês por causa das varias tutoriais eu edito aqui pra facilitar.
 
Obrigado pela rapidez! Eu estava agora mesmo pensando em fazer algo assim, como comparar oldCount e newCount. Aí veio sua mensagem e confirmou. Excelente!
 
Só não se esqueça de que isso vale apenas para um item do mesmo tipo.

Se tiver que "encontrar" mais itens de um mesmo tipo, tem que fazer uma subtração e memorizar a sobra.
Dai fazer com que esse baú de tenha uma variável própria pra que de a quantidade de itens que sobrar depois.

Existe um Plugin pra RMMV ou era um Script de VXAce que permitia um sistema de Variáveis locais, o que seria uma mão na roda.

Mas não acho necessário tanto "realismo" em um jogo.
 
Não, não tenho essa intenção de deixar mais complexo. Aliás, acabei de testar aqui e descobri que o limite do Plugin é sobre o mesmo item, por exemplo, se eu colocar o limite = 20, poderei ter 20 poções e 20 antídotos, totalizando 40 itens. Por isso queria uma linha que correspondesse a todos os itens para minha condição, pois queria um limite de 20 ao todo. Até existem outros plugins que limitam o inventário por inteiro, mas são burlados quando abrimos o processamento de loja e não são compatíveis com o plugin de armazém que uso também (WAY_StorageSystem).
Mas obrigado! Se eu achar uma solução, posto aqui. 👍
 
Eu até posso escrever um Plugin (Meia boca), mas não estou dispondo de tempo e provavelmente já deve existir.
Por enquanto posso te explicar como eu faria com Eventos.

Crie um Evento Comum e nomeio de Itens-Checar-Limite, não defina nenhum disparador (Início), nele crie uma variavel que vai ser o limite padrão, pra caso você queira mudar depois durante o jogo (aumento da bolsa como em alguns jogos).
Em seguida liste apenas os itens que deverão ocupar espaço, e que um por vez some uma variável, exemplo:
Código:
◆Comentário:Defina o limite aqui:
◆Controlar Variáveis:#0021 Inventário-Limite = 50
◆Comentário:Inclua os itens à considerar aqui:
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Poção
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Água Mágica
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Elixir
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Pena de Fenix
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Antidoto
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Super Poção

No evento baú:
Código:
◆Mudar Itens:Poção + 1
◆Evento Comum:Itens-Checar-Limite
◆Se:Inventário-Calculados ≥ Inventário-Limite
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada, mas seu inventário está cheio.
  ◆
:Se Não
  ◆Texto:Nenhum, Janela, Inferior
  :     :Poção encontrada!
  ◆Controlar Switches Locais:A = ON
  ◆
:Fim

Essa é uma versão simplificada, tem como fazer a verificação da Condição no próprio Evento Comum, mas vai necessitar de pelo menos mais uma variável que você deve definir em todo evento baú antes de chamar este evento e um pouco de Javascript para pegar o nome do item pela ID.

E se seguir essa ideia, pode mesclar carregar itens com armas e armaduras fazendo com que o jogador tenha o limite e seja forçado à balancear o que pretende levar em alguma missão.
O problema é que as armaduras podem ser desequipadas e o evento não aconteceria, então você também vai precisar somar o que está equipado, o que não compensa fazer por eventos.

Em geral, mesmo pra fazer um Plugin, considerar todos os fatores tornará sujeito aos prováveis Glitches
 
Última edição:
Passando pra lembrar que se algum dia você precisar escrever código com tamanho diretamente proporcional ao tamanho do problema, provavelmente o código está ruim (vide memes sobre o YandereDev)

Isso aqui, por exemplo:
◆Comentário:Inclua os itens à considerar aqui:
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Poção
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Água Mágica
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Elixir
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Pena de Fenix
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Antidoto
◆Controlar Variáveis:#0022 Inventário-Calculados += O número de Super Poção

Você vai precisar de uma linha pra cada item no jogo. Não tem cabimento.



Você pode facilmente contar os itens no inventário com uma script call: $gameParty.items().length. Tem também pra armas, armaduras, equipamentos em geral (armas + armaduras) e tudo junto:
Código:
$gameParty.items().length      # Itens
$gameParty.weapons().length    # Armas
$gameParty.armors().length     # Armaduras
$gameParty.equipItems().length # Armas + armaduras
$gameParty.allItems().length   # Tudo

Dito isso, você pode até verificar esse valor numa condição antes de adicionar os itens, mas ainda é uma solução meio tosca. Sugiro buscar um plugin mesmo.
 
Muito obrigado aos dois DevWithCoffee e Brandt.
Toda solução é muito bem recebida, eu queria abreviar, mas para criar um item esporádico terei que somar item por item em um evento comum mesmo, uma vez que essa script call conta quantos "itemId" estão presentes, por exemplo, se eu tiver 1 poção, 2 antídotos e colocar $gameParty.items().length em uma variável, o valor dela será 2 e não 3.
O ruim é que não sei como lidar ainda com o processamento de loja e o armazém (WAY_StorageSystem) que me possibilitarão jogar itens no inventário além do limite estipulado, mas esse é outro problema.
Quando eu menos esperar, acharei uma solução, aí eu trago aqui. :wine:
 
@Brandt
Obrigado pela dicas, mas só pra constar, o método que usei por eventos foi justamente por não ter outro meio se não este para contabilizar os itens, caso contrário eu teria que explicar JavaScript também.

Em geral eu pretendia fazer um Plugin onde o desenvolvedor poderia limitar todos os itens, mas um parâmetros seria inserido as ID dos itens que deveriam ser desconsiderados, divididos com vírgula.
Assim eu faria uma função que contasse esses itens em uma variável que seria o valor subtraído do $gameParty.items().length ao comparar com o total.

@Hermanoteu
Está certo, isso só conta os tipos de itens, presumo que pra verificar separadamente cada item eu tenha que verificar com isso:
$gameParty._items[ID]

Por exemplo (Editado, estava bem errado):
Código:
var itemCount = 0;
for (i=0;i<$gameParty.items().length;i++) {
    itemCount += $gameParty._items[$gameParty.items()[i].id];
}

Se for verificar se o item está em uma lista à desconsiderar:
Código:
var desconsiderar=[1,2,4,10];
var itemCount = 0;
for (i=0;i<$gameParty.items().length;i++) {
    (!desconsiderar.includes(i))? "" : itemCount += $gameParty._items[$gameParty.items()[i].id];
}

Se puder esperar eu posso escrever um Plugin assim, como eu disse antes, mas provavelmente já deve existir e que provavelmente funcionaria bem melhor.
 
Última edição:
@DevWithCoffee
@Brandt
Obrigado pela dicas, mas só pra constar, o método que usei por eventos foi justamente por não ter outro meio se não este para contabilizar os itens, caso contrário eu teria que explicar JavaScript também.

Em geral eu pretendia fazer um Plugin onde o desenvolvedor poderia limitar todos os itens, mas um parâmetros seria inserido as ID dos itens que deveriam ser desconsiderados, divididos com vírgula.
Assim eu faria uma função que contasse esses itens em uma variável que seria o valor subtraído do $gameParty.items().length ao comparar com o total.

@Hermanoteu
Está certo, isso só conta os tipos de itens, presumo que pra verificar separadamente cada item eu tenha que verificar com isso:
$gameParty._items[ID]

Por exemplo:
Código:
var itemCount = 0;
for (i=0;i<$gameParty.items().length;i++) {
    itemCount += $gameParty._items[i];
}

Se for verificar se o item está em uma lista à desconsiderar:
Código:
var itemCount = 0;
for (i=0;i<$gameParty.items().length;i++) {
    (!a.includes(i))? "" : itemCount += $gameParty._items[i];
}

Se puder esperar eu posso escrever um Plugin assim, como eu disse antes, mas provavelmente já deve existir e que provavelmente funcionaria bem melhor.

Mas nada te impede de usar o que eu já fiz com Javascript:
Código:
◆Control Variables:#0021 Inventário-Limite = $gameParty.items().length

Então, estava garimpando e constatei que existe o MrTS_LimitedInventory, qual atende muito bem o que estou procurando, o melhor é que ele inclui algumas script calls que resolvem meu problema para checar se o inventário está cheio. Mas é incompatível com meu plano. A graça de ter um baú, armazém ou coisa parecida é que ele trabalhe com um inventário limitado, afinal um precisa do outro, por qual motivo eu guardaria os itens em um armário se minha mochila fosse infinita? Pretendo fazer algo como os jogos de Harvest Moon nesse sentido. Se eu conseguisse torná-lo compatível com WAY_StorageSystem e com o Processamento de loja, estaria tudo perfeito. Não sou programador, eu conseguia entender algum padrão no RGSS3, mas Javascript para mim é uma coisa de outro mundo.
Uma espécie de Addon que os torne compatíveis resolveria meu problema.
 
por exemplo, se eu tiver 1 poção, 2 antídotos e colocar $gameParty.items().length em uma variável, o valor dela será 2 e não 3.
Puts, passou batido na hora de ver as definições aqui. Ainda assim dá pra se virar com JS mesmo:
Código:
$gameParty.items().map($gameParty.numItems).reduce((r, v) => r + v)

(Pra dar uma alternativa de uma linha pro que o o @DevWithCoffee mandou aí)

O mesmo funciona pros demais "containers".

De forma geral, você nunca precisa repetir o mesmo comando pra cada item no banco de dados, se precisar mesmo é sinal que o que você quer seria melhor feito usando um plugin/script.

Obrigado pela dicas, mas só pra constar, o método que usei por eventos foi justamente por não ter outro meio se não este para contabilizar os itens, caso contrário eu teria que explicar JavaScript também.

Eu entendo, mas concorda que é uma solução ruim? Não faz mal estar sem tempo pra explicar as coisas por completo, mas nesses casos acho melhor direcionar o cara para buscar uma solução boa do que jogar uma ruim como alternativa.
 
(Pra dar uma alternativa de uma linha pro que o o @DevWithCoffee mandou aí)
Na verdade mesmo essa que eu fiz nem está certa por que está lendo a posição do Array e não a id dos Objects (Items).
Eu corrigi, mas na verdade eu precisaria só ler os objetos:
Código:
var itemCount=0;
for (inventory in $gameParty._items) {
    itemCount += $gameParty._items[inventory];
}

Ou em uma única linha para usar no campo script do controle de variaveis:
var itemCount=0;for(inventory in $gameParty._items){itemCount += $gameParty._items[inventory];}

Código:
◆Control Variables:#0022 Inventário-Calculados = var itemCount=0;for (inventory in $gameParty._items){itemCount += $gameParty._items[inventory];}



Em geral eu não tenho como discordar disso pela sua experiência:
Eu entendo, mas concorda que é uma solução ruim? Não faz mal estar sem tempo pra explicar as coisas por completo, mas nesses casos acho melhor direcionar o cara para buscar uma solução boa do que jogar uma ruim como alternativa.
Presumo que pelo que já conversamos você é profissional (trabalha com isso).

Já em particular ao meu ver, usar os comandos padrões do Rpg Maker não é algo "ruim", só é mais trabalhoso, talvez eu pense assim por ter usado muito o Rm2k.
Nem sempre o desenvolvedor de jogos precisa se aprofundar em programação por estar focado em desenvolver o jogo, eu sei que é meio estranho entender a minha percepção de uma ferramenta para crianças e adolescentes criarem um JRPG.


Editado:
Obrigado por me mostrar essa método @Brandt, então corri atrás de entender e notei que é possível fazer com Object, presumo que tenha ficado mais simples com o mesmo resultado:
Código:
Object.values($gameParty._items).reduce((r, v) => r + v)
 
Última edição:
Voltar
Topo Inferior