Primeira versão do plugin

This commit is contained in:
2025-11-03 23:08:12 -03:00
commit c246fb0187
28 changed files with 740 additions and 0 deletions

8
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

13
.idea/compiler.xml generated Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="backpack-infinita" />
</profile>
</annotationProcessing>
</component>
</project>

7
.idea/dictionaries/project.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<component name="ProjectDictionaryState">
<dictionary name="project">
<words>
<w>inventario</w>
</words>
</dictionary>
</component>

7
.idea/encodings.xml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

30
.idea/jarRepositories.xml generated Normal file
View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="papermc-repo" />
<option name="name" value="papermc-repo" />
<option name="url" value="https://repo.papermc.io/repository/maven-public/" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="purpur" />
<option name="name" value="purpur" />
<option name="url" value="https://repo.purpurmc.org/snapshots" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

15
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="KubernetesApiProvider"><![CDATA[{}]]></component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="21 (2)" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/backpack-infinita.iml" filepath="$PROJECT_DIR$/backpack-infinita.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

14
backpack-infinita.iml Normal file
View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>PAPER</platformType>
<platformType>ADVENTURE</platformType>
</autoDetectTypes>
<projectReimportVersion>1</projectReimportVersion>
</configuration>
</facet>
</component>
</module>

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>shop.morpheusnox</groupId>
<artifactId>backpack-infinita</artifactId>
<name>backpack-infinita</name>
<version>1.1</version>
<build>
<defaultGoal>clean package</defaultGoal>
<resources>
<resource>
<filtering>true</filtering>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>purpur</id>
<url>https://repo.purpurmc.org/snapshots</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.purpurmc.purpur</groupId>
<artifactId>purpur-api</artifactId>
<version>1.21.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

73
pom.xml Normal file
View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>shop.morpheusnox</groupId>
<artifactId>backpack-infinita</artifactId>
<version>1.1</version>
<packaging>jar</packaging>
<name>backpack-infinita</name>
<properties>
<java.version>21</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>purpur</id>
<url>https://repo.purpurmc.org/snapshots</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.purpurmc.purpur</groupId>
<artifactId>purpur-api</artifactId>
<version>1.21.10-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.44.1.0</version>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,187 @@
package shop.morpheusnox.backpackInfinita;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream;
import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class Backpack {
private final Player player;
private final Inventory inventoryView;
private final List<ItemStack> internalContents;
private int currentPage;
public static final int ITEMS_PER_PAGE = 45; // 54 slots no total - 9 para navegação
public Backpack(Player player) {
this.player = player;
this.inventoryView = Bukkit.createInventory(null, 54, "Mochila");
this.internalContents = new ArrayList<>();
this.currentPage = 0;
}
public Inventory getInventoryView() {
return inventoryView;
}
public List<ItemStack> getInternalContents() {
return internalContents;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalPages() {
return (int) Math.ceil((double) internalContents.size() / ITEMS_PER_PAGE);
}
public void open() {
inventoryView.clear();
int startIndex = currentPage * ITEMS_PER_PAGE;
int endIndex = Math.min(startIndex + ITEMS_PER_PAGE, internalContents.size());
for (int i = startIndex; i < endIndex; i++) {
ItemStack item = internalContents.get(i);
ItemStack displayItem = item.clone();
if (displayItem.getAmount() > displayItem.getMaxStackSize()) {
// Adiciona lore para mostrar a quantidade real
List<String> lore = displayItem.hasItemMeta() && displayItem.getItemMeta().hasLore() ? displayItem.getItemMeta().getLore() : new ArrayList<>();
lore.add("§7Quantidade: §a" + item.getAmount());
ItemMeta meta = displayItem.getItemMeta();
meta.setLore(lore);
displayItem.setItemMeta(meta);
displayItem.setAmount(displayItem.getMaxStackSize()); // Exibe o tamanho máximo da pilha na GUI
}
inventoryView.addItem(displayItem);
}
// Adiciona botões de navegação
addNavigationButtons();
player.openInventory(inventoryView);
}
private void addNavigationButtons() {
// Botão Página Anterior
ItemStack prevPage = new ItemStack(Material.ARROW);
ItemMeta prevMeta = prevPage.getItemMeta();
prevMeta.setDisplayName("§aPágina Anterior");
prevPage.setItemMeta(prevMeta);
inventoryView.setItem(45, prevPage);
// Informação da Página Atual
ItemStack pageInfo = new ItemStack(Material.PAPER);
ItemMeta infoMeta = pageInfo.getItemMeta();
infoMeta.setDisplayName("§ePágina " + (currentPage + 1) + "/" + (getTotalPages() == 0 ? 1 : getTotalPages()));
pageInfo.setItemMeta(infoMeta);
inventoryView.setItem(49, pageInfo);
// Botão Próxima Página
ItemStack nextPage = new ItemStack(Material.ARROW);
ItemMeta nextMeta = nextPage.getItemMeta();
nextMeta.setDisplayName("§aPróxima Página");
nextPage.setItemMeta(nextMeta);
inventoryView.setItem(53, nextPage);
}
public void nextPage() {
if (currentPage < getTotalPages() - 1) {
currentPage++;
open();
}
}
public void previousPage() {
if (currentPage > 0) {
currentPage--;
open();
}
}
public void addItem(ItemStack item) {
for (ItemStack existingItem : internalContents) {
if (existingItem.isSimilar(item)) {
existingItem.setAmount(existingItem.getAmount() + item.getAmount());
return;
}
}
internalContents.add(item.clone()); // Adiciona um clone para evitar modificar o itemstack original
}
public void removeItem(ItemStack itemToRemove) {
Iterator<ItemStack> iterator = internalContents.iterator();
while (iterator.hasNext()) {
ItemStack existingItem = iterator.next();
if (existingItem.isSimilar(itemToRemove)) {
if (existingItem.getAmount() <= itemToRemove.getAmount()) {
iterator.remove();
} else {
existingItem.setAmount(existingItem.getAmount() - itemToRemove.getAmount());
}
return;
}
}
}
public String toBase64() {
try {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream);
dataOutput.writeInt(internalContents.size());
for (ItemStack item : internalContents) {
// Armazena a quantidade original
int originalAmount = item.getAmount();
// Define a quantidade como 1 para serialização para evitar IllegalStateException
item.setAmount(1);
dataOutput.writeObject(item);
// Escreve a quantidade original separadamente
dataOutput.writeInt(originalAmount);
// Restaura a quantidade original (opcional, mas boa prática)
item.setAmount(originalAmount);
}
dataOutput.close();
return Base64Coder.encodeLines(outputStream.toByteArray());
} catch (Exception e) {
throw new IllegalStateException("Não foi possível salvar os itens da mochila.", e);
}
}
public void fromBase64(String data) throws IOException {
if (data == null || data.isEmpty()) {
return;
}
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
int size = dataInput.readInt();
for (int i = 0; i < size; i++) {
ItemStack item = (ItemStack) dataInput.readObject();
int trueAmount = dataInput.readInt();
item.setAmount(trueAmount);
internalContents.add(item);
}
dataInput.close();
} catch (ClassNotFoundException e) {
throw new IOException("Não foi possível decodificar o tipo da classe.", e);
}
}
}

View File

@@ -0,0 +1,34 @@
package shop.morpheusnox.backpackInfinita;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BackpackCommand implements CommandExecutor {
private final BackpackInfinita plugin;
public BackpackCommand(BackpackInfinita plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("Este comando só pode ser usado por jogadores.");
return true;
}
Player player = (Player) sender;
Backpack backpack = plugin.getPlayerBackpack(player);
backpack.open();
return true;
}
}

View File

@@ -0,0 +1,75 @@
package shop.morpheusnox.backpackInfinita;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public final class BackpackInfinita extends JavaPlugin {
private Database database;
private Map<UUID, Backpack> playerBackpacks;
@Override
public void onEnable() {
// Lógica de inicialização do plugin
this.database = new Database(this.getDataFolder());
this.playerBackpacks = new HashMap<>();
this.getCommand("backpack").setExecutor(new BackpackCommand(this));
this.getServer().getPluginManager().registerEvents(new BackpackListener(this), this);
}
@Override
public void onDisable() {
// Lógica de desligamento do plugin
// Salva todas as mochilas em cache no banco de dados
for (Map.Entry<UUID, Backpack> entry : playerBackpacks.entrySet()) {
savePlayerBackpack(entry.getKey(), entry.getValue());
}
}
public Database getDatabase() {
return database;
}
public Backpack getPlayerBackpack(Player player) {
UUID playerUUID = player.getUniqueId();
if (playerBackpacks.containsKey(playerUUID)) {
return playerBackpacks.get(playerUUID);
}
Backpack backpack = new Backpack(player);
try (PreparedStatement statement = getDatabase().getConnection().prepareStatement("SELECT items FROM backpacks WHERE uuid = ?")) {
statement.setString(1, playerUUID.toString());
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
backpack.fromBase64(resultSet.getString("items"));
}
} catch (SQLException | IOException e) {
e.printStackTrace();
}
playerBackpacks.put(playerUUID, backpack);
return backpack;
}
public void savePlayerBackpack(UUID playerUUID, Backpack backpack) {
try (PreparedStatement statement = getDatabase().getConnection().prepareStatement("REPLACE INTO backpacks (uuid, items) VALUES (?, ?)")) {
statement.setString(1, playerUUID.toString());
statement.setString(2, backpack.toBase64());
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void removePlayerBackpack(UUID playerUUID) {
playerBackpacks.remove(playerUUID);
}
}

View File

@@ -0,0 +1,134 @@
package shop.morpheusnox.backpackInfinita;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class BackpackListener implements Listener {
private final BackpackInfinita plugin;
public BackpackListener(BackpackInfinita plugin) {
this.plugin = plugin;
}
@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
if (!event.getView().getTitle().equals("Mochila")) {
return;
}
if (event.getCurrentItem() == null || event.getCurrentItem().getType().isAir()) {
return;
}
Player player = (Player) event.getWhoClicked();
Backpack backpack = plugin.getPlayerBackpack(player);
event.setCancelled(true);
ItemStack clickedItem = event.getCurrentItem().clone();
// Lida com cliques nos botões de navegação
if (event.getClickedInventory() == event.getView().getTopInventory()) {
if (event.getSlot() == 45) { // Botão Página Anterior
backpack.previousPage();
plugin.savePlayerBackpack(player.getUniqueId(), backpack);
backpack.open();
return;
} else if (event.getSlot() == 53) { // Botão Próxima Página
backpack.nextPage();
plugin.savePlayerBackpack(player.getUniqueId(), backpack);
backpack.open();
return;
} else if (event.getSlot() == 49) { // Botão Informação da Página
return; // Não interativo
}
}
// Lógica de transferência de itens
if (event.getClickedInventory() == event.getView().getTopInventory()) {
// Clicado na mochila (movendo para o inventário do jogador)
int internalIndex = backpack.getCurrentPage() * Backpack.ITEMS_PER_PAGE + event.getSlot();
if (internalIndex >= backpack.getInternalContents().size()) {
return; // Clicou em um slot vazio na página atual
}
ItemStack trueItem = backpack.getInternalContents().get(internalIndex).clone();
ItemStack itemToTransfer = trueItem.clone();
// Remove o lore antes de transferir para o inventário do jogador
ItemMeta meta = itemToTransfer.getItemMeta();
if (meta != null) {
if (meta.hasLore()) {
List<String> lore = meta.getLore();
lore.removeIf(line -> line.startsWith("§7Quantidade:"));
meta.setLore(lore);
}
if (meta.hasDisplayName()) {
meta.setDisplayName(null);
}
itemToTransfer.setItemMeta(meta);
}
int amountToTransfer = itemToTransfer.getMaxStackSize();
if (event.isShiftClick()) {
amountToTransfer = trueItem.getAmount();
}
itemToTransfer.setAmount(amountToTransfer);
// Tenta adicionar ao inventário do jogador
int remaining = player.getInventory().addItem(itemToTransfer).values().stream()
.mapToInt(ItemStack::getAmount).sum();
if (remaining < amountToTransfer) {
// Alguns itens foram transferidos
ItemStack removedFromBackpack = trueItem.clone();
removedFromBackpack.setAmount(amountToTransfer - remaining);
backpack.removeItem(removedFromBackpack);
}
} else {
// Clicado no inventário do jogador (movendo para a mochila)
backpack.addItem(clickedItem);
event.getWhoClicked().getInventory().removeItem(clickedItem);
}
// Atualiza a GUI da mochila
backpack.open();
plugin.savePlayerBackpack(player.getUniqueId(), backpack);
}
@EventHandler
public void onInventoryClose(InventoryCloseEvent event) {
if (!event.getView().getTitle().equals("Mochila")) {
return;
}
Player player = (Player) event.getPlayer();
Backpack backpack = plugin.getPlayerBackpack(player);
plugin.savePlayerBackpack(player.getUniqueId(), backpack);
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
Backpack backpack = plugin.getPlayerBackpack(player);
plugin.savePlayerBackpack(player.getUniqueId(), backpack);
plugin.removePlayerBackpack(player.getUniqueId());
}
}

View File

@@ -0,0 +1,41 @@
package shop.morpheusnox.backpackInfinita;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class Database {
private Connection connection;
public Database(File dataFolder) {
if (!dataFolder.exists()) {
dataFolder.mkdirs();
}
try {
Class.forName("org.sqlite.JDBC");
connection = DriverManager.getConnection("jdbc:sqlite:" + new File(dataFolder, "backpack.db").getAbsolutePath());
createTables();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
private void createTables() {
try (Statement statement = connection.createStatement()) {
statement.execute("CREATE TABLE IF NOT EXISTS backpacks (" +
"uuid TEXT PRIMARY KEY," +
"items TEXT"
+ ");");
} catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return connection;
}
}

View File

@@ -0,0 +1,9 @@
name: backpack-infinita
version: '1.1'
main: shop.morpheusnox.backpackInfinita.BackpackInfinita
api-version: '1.21'
commands:
backpack:
description: Mochila infinita pra você que fica sempre sem espaço no inventario.
usage: /backpack
aliases: [bp]

Binary file not shown.

View File

@@ -0,0 +1,9 @@
name: backpack-infinita
version: '1.1'
main: shop.morpheusnox.backpackInfinita.BackpackInfinita
api-version: '1.21'
commands:
backpack:
description: Mochila infinita pra você que fica sempre sem espaço no inventario.
usage: /backpack
aliases: [bp]

View File

@@ -0,0 +1,3 @@
artifactId=backpack-infinita
groupId=shop.morpheusnox
version=1.1

View File

@@ -0,0 +1,5 @@
shop/morpheusnox/backpackInfinita/Database.class
shop/morpheusnox/backpackInfinita/BackpackListener.class
shop/morpheusnox/backpackInfinita/Backpack.class
shop/morpheusnox/backpackInfinita/BackpackCommand.class
shop/morpheusnox/backpackInfinita/BackpackInfinita.class

View File

@@ -0,0 +1,5 @@
/home/morpheus/Downloads/backpack Infinita/src/main/java/shop/morpheusnox/backpackInfinita/Backpack.java
/home/morpheus/Downloads/backpack Infinita/src/main/java/shop/morpheusnox/backpackInfinita/BackpackCommand.java
/home/morpheus/Downloads/backpack Infinita/src/main/java/shop/morpheusnox/backpackInfinita/BackpackInfinita.java
/home/morpheus/Downloads/backpack Infinita/src/main/java/shop/morpheusnox/backpackInfinita/BackpackListener.java
/home/morpheus/Downloads/backpack Infinita/src/main/java/shop/morpheusnox/backpackInfinita/Database.java

Binary file not shown.