Primeira versão do plugin
This commit is contained in:
8
.idea/.gitignore
generated
vendored
Normal file
8
.idea/.gitignore
generated
vendored
Normal 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
13
.idea/compiler.xml
generated
Normal 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
7
.idea/dictionaries/project.xml
generated
Normal 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
7
.idea/encodings.xml
generated
Normal 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
30
.idea/jarRepositories.xml
generated
Normal 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
15
.idea/misc.xml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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
6
.idea/vcs.xml
generated
Normal 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
14
backpack-infinita.iml
Normal 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>
|
||||
57
dependency-reduced-pom.xml
Normal file
57
dependency-reduced-pom.xml
Normal 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
73
pom.xml
Normal 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>
|
||||
187
src/main/java/shop/morpheusnox/backpackInfinita/Backpack.java
Normal file
187
src/main/java/shop/morpheusnox/backpackInfinita/Backpack.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
9
src/main/resources/plugin.yml
Normal file
9
src/main/resources/plugin.yml
Normal 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]
|
||||
BIN
target/backpack-infinita-1.1.jar
Normal file
BIN
target/backpack-infinita-1.1.jar
Normal file
Binary file not shown.
9
target/classes/plugin.yml
Normal file
9
target/classes/plugin.yml
Normal 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]
|
||||
BIN
target/classes/shop/morpheusnox/backpackInfinita/Backpack.class
Normal file
BIN
target/classes/shop/morpheusnox/backpackInfinita/Backpack.class
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
target/classes/shop/morpheusnox/backpackInfinita/Database.class
Normal file
BIN
target/classes/shop/morpheusnox/backpackInfinita/Database.class
Normal file
Binary file not shown.
3
target/maven-archiver/pom.properties
Normal file
3
target/maven-archiver/pom.properties
Normal file
@@ -0,0 +1,3 @@
|
||||
artifactId=backpack-infinita
|
||||
groupId=shop.morpheusnox
|
||||
version=1.1
|
||||
@@ -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
|
||||
@@ -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
|
||||
BIN
target/original-backpack-infinita-1.1.jar
Normal file
BIN
target/original-backpack-infinita-1.1.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user