From 074849a2d019402e64580325393a2aa388d353fc Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 20 Apr 2024 20:48:55 -0500 Subject: [PATCH 01/14] Update Version to v1.10.0 --- build.gradle.kts | 2 +- plugin/src/main/resources/plugin.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3e6ce22f..004b9055 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ plugins { } val pGroup = "us.teaminceptus.novaconomy" -val pVersion = "1.9.2-SNAPSHOT" +val pVersion = "1.10.0-SNAPSHOT" val pAuthor = "Team-Inceptus" sonarqube { diff --git a/plugin/src/main/resources/plugin.yml b/plugin/src/main/resources/plugin.yml index c4eb7ab0..0c7124c5 100644 --- a/plugin/src/main/resources/plugin.yml +++ b/plugin/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Novaconomy -version: 1.9.2 +version: 1.10.0 description: ${project.description} author: Team Inceptus load: POSTWORLD From 239f4c2087342a39046cfa1eed44f811b6eb6d42 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 20 Apr 2024 21:02:15 -0500 Subject: [PATCH 02/14] Create Corporation#isChild --- .../api/corporation/Corporation.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/corporation/Corporation.java b/api/src/main/java/us/teaminceptus/novaconomy/api/corporation/Corporation.java index d225e2eb..6a88ae78 100644 --- a/api/src/main/java/us/teaminceptus/novaconomy/api/corporation/Corporation.java +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/corporation/Corporation.java @@ -1089,6 +1089,46 @@ public boolean canSendMail(@NotNull OfflinePlayer p) { return getSetting(Settings.Corporation.OPEN_MAILBOX); } + /** + * Checks if this business is a child of this Corporation. + * @param b Business to check + * @return true if child, false otherwise + */ + public boolean isChild(@NotNull Business b) { + if (b == null) return false; + return children.contains(b); + } + + /** + * Checks if this business is a child of this Corporation. + * @param id Business ID to check + * @return true if child, false otherwise + */ + public boolean isChild(@NotNull UUID id) { + if (id == null) return false; + return children.stream().anyMatch(b -> b.getUniqueId().equals(id)); + } + + /** + * Checks if this business is a child of this Corporation. + * @param name Business Name to check, case sensitive + * @return true if child, false otherwise + */ + public boolean isChild(@NotNull String name) { + if (name == null) return false; + return children.stream().anyMatch(b -> b.getName().equals(name)); + } + + /** + * Checks if this player owns a business inside this Corporation. This will return false if {@link #isOwner(OfflinePlayer)} returns true. + * @param p Player to check + * @return true if child, false otherwise + */ + public boolean isChild(@NotNull OfflinePlayer p) { + if (p == null) return false; + return children.stream().anyMatch(b -> b.getOwner().equals(p)); + } + @Override public boolean equals(Object o) { if (this == o) return true; From 99ac0a93a81efce5bdd0c538c26efa3d44766c83 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 20 Apr 2024 21:02:32 -0500 Subject: [PATCH 03/14] Add Corporation Experience on Mail --- plugin/src/main/java/us/teaminceptus/novaconomy/Events.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/Events.java b/plugin/src/main/java/us/teaminceptus/novaconomy/Events.java index 51b149e0..27701953 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/Events.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/Events.java @@ -411,6 +411,9 @@ public void mail(PlayerEditBookEvent e) { run = () -> { p.getInventory().removeItem(book); c.sendMail(mail); + + if (!c.isChild(p) && !c.isOwner(p)) + c.addExperience(25); }; break; } From 15b5d6914a73cf43263997346ccb1ee3d6a0a354 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 4 May 2024 16:33:38 -0500 Subject: [PATCH 04/14] Add 1.20.5 Support (Closes #146) - Upgrade ShadowJar to Fork - Upgrade Remapper Plugin - Update CI JDKs to 21 - Add 1.20.5 Wrapper Classes --- .github/workflows/build.yml | 26 +-- build.gradle.kts | 4 +- nms/1_18_R1/build.gradle.kts | 2 +- nms/1_18_R2/build.gradle.kts | 2 +- nms/1_19_R1/build.gradle.kts | 2 +- nms/1_19_R2/build.gradle.kts | 2 +- nms/1_19_R3/build.gradle.kts | 2 +- nms/1_20_R1/build.gradle.kts | 2 +- nms/1_20_R2/build.gradle.kts | 2 +- nms/1_20_R3/build.gradle.kts | 2 +- nms/1_20_R4/build.gradle.kts | 39 +++++ .../v1_20_R4/NBTWrapper1_20_R4.java | 155 ++++++++++++++++++ .../v1_20_R4/NovaInventory1_20_R4.java | 31 ++++ .../v1_20_R4/PacketHandler1_20_R4.java | 40 +++++ .../novaconomy/v1_20_R4/Wrapper1_20_R4.java | 137 ++++++++++++++++ plugin/build.gradle.kts | 10 +- settings.gradle.kts | 3 +- 17 files changed, 435 insertions(+), 26 deletions(-) create mode 100644 nms/1_20_R4/build.gradle.kts create mode 100644 nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NBTWrapper1_20_R4.java create mode 100644 nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NovaInventory1_20_R4.java create mode 100644 nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/PacketHandler1_20_R4.java create mode 100644 nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/Wrapper1_20_R4.java diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 71fc9a2e..62ccb155 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,11 +17,11 @@ jobs: steps: - uses: actions/checkout@v4 - uses: gradle/wrapper-validation-action@v2 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - name: Change Permissions run: chmod +x ./gradlew @@ -36,10 +36,10 @@ jobs: name: Test Project steps: - uses: actions/checkout@v4 - - name: Setup JDK 17 + - name: Setup JDK 21 uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '21' distribution: 'temurin' cache: 'gradle' - name: Change Permissions @@ -62,6 +62,8 @@ jobs: java-version: 17 - version: 1.20.4 java-version: 17 + - version: 1.20.5 + java-version: 21 name: Test Plugin on MC ${{ matrix.version }} steps: @@ -77,7 +79,7 @@ jobs: - name: Build Plugin run: ./gradlew clean assemble - name: Test Plugin - ${{ matrix.version }} - uses: GamerCoder215/TestMC@v1.0.1 + uses: GamerCoder215/TestMC@v1 with: path: 'plugin/build/libs/novaconomy-*.jar' runtime: 'paper' @@ -92,7 +94,7 @@ jobs: strategy: fail-fast: false matrix: - java-version: [8, 11, 16, 17] + java-version: [8, 11, 16, 17, 21] name: Build Java ${{ matrix.java-version }} steps: @@ -116,11 +118,11 @@ jobs: name: Create Artifacts steps: - uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - name: Change Permissions run: chmod +x ./gradlew @@ -145,11 +147,11 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - name: Cache SonarCloud packages uses: actions/cache@v4 @@ -174,11 +176,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: '17' + java-version: '21' cache: 'gradle' - name: Change Permissions run: chmod +x ./gradlew diff --git a/build.gradle.kts b/build.gradle.kts index 004b9055..7674f1b7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { kotlin("jvm") version "1.9.23" id("org.sonarqube") version "4.0.0.2929" - id("com.github.johnrengelman.shadow") version "8.1.1" apply false + id("io.github.goooler.shadow") version "8.1.7" apply false java `maven-publish` @@ -96,7 +96,7 @@ val jvmVersion = JavaVersion.VERSION_1_8 subprojects { apply() apply(plugin = "org.sonarqube") - apply(plugin = "com.github.johnrengelman.shadow") + apply(plugin = "io.github.goooler.shadow") apply(plugin = "org.jetbrains.kotlin.jvm") dependencies { diff --git a/nms/1_18_R1/build.gradle.kts b/nms/1_18_R1/build.gradle.kts index b7544cc7..5fb86c24 100644 --- a/nms/1_18_R1/build.gradle.kts +++ b/nms/1_18_R1/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.18.1" diff --git a/nms/1_18_R2/build.gradle.kts b/nms/1_18_R2/build.gradle.kts index 1fd2b004..ec203a23 100644 --- a/nms/1_18_R2/build.gradle.kts +++ b/nms/1_18_R2/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.18.2" diff --git a/nms/1_19_R1/build.gradle.kts b/nms/1_19_R1/build.gradle.kts index 7155776e..f5fa8ddd 100644 --- a/nms/1_19_R1/build.gradle.kts +++ b/nms/1_19_R1/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.19.2" diff --git a/nms/1_19_R2/build.gradle.kts b/nms/1_19_R2/build.gradle.kts index 6ad01160..c330bf15 100644 --- a/nms/1_19_R2/build.gradle.kts +++ b/nms/1_19_R2/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.19.3" diff --git a/nms/1_19_R3/build.gradle.kts b/nms/1_19_R3/build.gradle.kts index c21a76a5..9e6ba3ad 100644 --- a/nms/1_19_R3/build.gradle.kts +++ b/nms/1_19_R3/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.19.4" diff --git a/nms/1_20_R1/build.gradle.kts b/nms/1_20_R1/build.gradle.kts index 2f135ae1..f38cfbc2 100644 --- a/nms/1_20_R1/build.gradle.kts +++ b/nms/1_20_R1/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.20.1" diff --git a/nms/1_20_R2/build.gradle.kts b/nms/1_20_R2/build.gradle.kts index be0fcead..9a8cdeea 100644 --- a/nms/1_20_R2/build.gradle.kts +++ b/nms/1_20_R2/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.20.2" diff --git a/nms/1_20_R3/build.gradle.kts b/nms/1_20_R3/build.gradle.kts index d8892594..32676bd9 100644 --- a/nms/1_20_R3/build.gradle.kts +++ b/nms/1_20_R3/build.gradle.kts @@ -2,7 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import io.github.patrick.gradle.remapper.RemapTask plugins { - id("io.github.patrick.remapper") version "1.4.0" + id("io.github.patrick.remapper") version "1.4.1" } val mcVersion = "1.20.3" diff --git a/nms/1_20_R4/build.gradle.kts b/nms/1_20_R4/build.gradle.kts new file mode 100644 index 00000000..509bef73 --- /dev/null +++ b/nms/1_20_R4/build.gradle.kts @@ -0,0 +1,39 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import io.github.patrick.gradle.remapper.RemapTask + +plugins { + id("io.github.patrick.remapper") version "1.4.1" +} + +val mcVersion = "1.20.5" + +dependencies { + api(project(":novaconomy-abstract")) + api(project(":novaconomy-api")) + + compileOnly("org.spigotmc:spigot:$mcVersion-R0.1-SNAPSHOT:remapped-mojang") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 +} + +tasks { + assemble { + dependsOn("remap") + } + + jar.configure { + enabled = false + } + + remap { + dependsOn("shadowJar") + + inputTask.set(getByName("shadowJar")) + version.set(mcVersion) + action.set(RemapTask.Action.MOJANG_TO_SPIGOT) + archiveName.set("${project.name}-${project.version}.jar") + } +} \ No newline at end of file diff --git a/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NBTWrapper1_20_R4.java b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NBTWrapper1_20_R4.java new file mode 100644 index 00000000..983b401d --- /dev/null +++ b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NBTWrapper1_20_R4.java @@ -0,0 +1,155 @@ +package us.teaminceptus.novaconomy.v1_20_R4; + +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataContainer; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.util.io.BukkitObjectOutputStream; +import us.teaminceptus.novaconomy.abstraction.NBTWrapper; +import us.teaminceptus.novaconomy.api.NovaConfig; +import us.teaminceptus.novaconomy.api.util.Product; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.UUID; + +final class NBTWrapper1_20_R4 extends NBTWrapper { + + public NBTWrapper1_20_R4(ItemStack item) { + super(item); + } + + @Override + public String getFullTag() { + return item.getItemMeta().getAsString(); + } + + @Override + public String getString(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + return container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.STRING); + } + + @Override + public void set(String key, String value) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.STRING, value); + item.setItemMeta(meta); + } + + @Override + public int getInt(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + return container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.INTEGER); + } + + @Override + public void set(String key, int value) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.INTEGER, value); + item.setItemMeta(meta); + } + + @Override + public UUID getUUID(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + long[] array = container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.LONG_ARRAY); + return new UUID(array[0], array[1]); + } + + @Override + public void set(String key, UUID id) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.LONG_ARRAY, new long[] {id.getMostSignificantBits(), id.getLeastSignificantBits()}); + item.setItemMeta(meta); + } + + @Override + public double getDouble(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + return container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.DOUBLE); + } + + @Override + public void set(String key, double value) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.DOUBLE, value); + item.setItemMeta(meta); + } + + @Override + public boolean getBoolean(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + return container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.BOOLEAN); + } + + @Override + public void set(String key, boolean value) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.BOOLEAN, value); + item.setItemMeta(meta); + } + + @Override + public Product getProduct(String key) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + try { + ByteArrayInputStream bis = new ByteArrayInputStream( + container.get(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.BYTE_ARRAY) + ); + BukkitObjectInputStream ois = new BukkitObjectInputStream(bis); + Product p = (Product) ois.readObject(); + + ois.close(); + return p; + } catch (IOException | ClassNotFoundException e) { + NovaConfig.print(e); + return null; + } + } + + @Override + public void set(String key, Product product) { + ItemMeta meta = item.getItemMeta(); + PersistentDataContainer container = meta.getPersistentDataContainer(); + + try { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + BukkitObjectOutputStream oos = new BukkitObjectOutputStream(bos); + oos.writeObject(product); + oos.close(); + + container.set(new NamespacedKey(NovaConfig.getPlugin(), key), PersistentDataType.BYTE_ARRAY, bos.toByteArray()); + } catch (IOException e) { + NovaConfig.print(e); + } + + item.setItemMeta(meta); + } + +} diff --git a/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NovaInventory1_20_R4.java b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NovaInventory1_20_R4.java new file mode 100644 index 00000000..1261a8b0 --- /dev/null +++ b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/NovaInventory1_20_R4.java @@ -0,0 +1,31 @@ +package us.teaminceptus.novaconomy.v1_20_R4; + +import com.google.common.collect.ImmutableMap; +import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftInventoryCustom; +import us.teaminceptus.novaconomy.abstraction.NovaInventory; + +import java.util.HashMap; +import java.util.Map; + +final class NovaInventory1_20_R4 extends CraftInventoryCustom implements NovaInventory{ + + private final Map attributes = new HashMap<>(); + + public NovaInventory1_20_R4(String id, String name, int size) { + super(null, size, name); + + setAttribute("_id", id); + setAttribute("_name", name); + } + + @Override + public Map getAttribtes() { + return ImmutableMap.copyOf(attributes); + } + + @Override + public void setAttribute(String key, Object value) { + attributes.put(key, value); + } + +} diff --git a/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/PacketHandler1_20_R4.java b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/PacketHandler1_20_R4.java new file mode 100644 index 00000000..b8f4c558 --- /dev/null +++ b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/PacketHandler1_20_R4.java @@ -0,0 +1,40 @@ +package us.teaminceptus.novaconomy.v1_20_R4; + +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import net.minecraft.network.protocol.Packet; +import org.bukkit.entity.Player; +import us.teaminceptus.novaconomy.util.NovaUtil; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.function.Predicate; + +final class PacketHandler1_20_R4 extends ChannelDuplexHandler { + + public static final Map>> PACKET_HANDLERS = new HashMap<>(); + + private final Player p; + + public PacketHandler1_20_R4(Player p) { + this.p = p; + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object packetO) throws Exception { + if (!(packetO instanceof Packet packet)) { + super.channelRead(ctx, packetO); + return; + } + + Predicate> handler = PACKET_HANDLERS.get(p.getUniqueId()); + if (handler != null) NovaUtil.sync(() -> { + boolean success = handler.test(packet); + if (success) PACKET_HANDLERS.remove(p.getUniqueId()); + }); + + super.channelRead(ctx, packetO); + } + +} diff --git a/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/Wrapper1_20_R4.java b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/Wrapper1_20_R4.java new file mode 100644 index 00000000..cfcaa0a7 --- /dev/null +++ b/nms/1_20_R4/src/main/java/us/teaminceptus/novaconomy/v1_20_R4/Wrapper1_20_R4.java @@ -0,0 +1,137 @@ +package us.teaminceptus.novaconomy.v1_20_R4; + +import io.netty.channel.Channel; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import net.minecraft.core.BlockPos; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; +import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; +import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerCommonPacketListenerImpl; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.Ageable; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Fire; +import org.bukkit.craftbukkit.v1_20_R4.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerInteractEvent; +import us.teaminceptus.novaconomy.abstraction.NBTWrapper; +import us.teaminceptus.novaconomy.abstraction.NovaInventory; +import us.teaminceptus.novaconomy.abstraction.Wrapper; +import us.teaminceptus.novaconomy.api.NovaConfig; + +import java.lang.reflect.Field; +import java.util.function.Consumer; + +final class Wrapper1_20_R4 implements Wrapper { + + @Override + public int getCommandVersion() { return 2; } + + @Override + public void sendActionbar(Player p, String message) { + sendActionbar(p, new TextComponent(message)); + } + + @Override + public void sendActionbar(Player p, BaseComponent component) { + p.spigot().sendMessage(ChatMessageType.ACTION_BAR, component); + } + + @Override + public boolean isAgeable(Block b) { + return b.getBlockData() instanceof Ageable; + } + + @Override + public void removeItem(PlayerInteractEvent e) { + e.getPlayer().getEquipment().setItem(e.getHand(), null); + } + + @Override + public boolean isCrop(Material m) { + BlockData d = m.createBlockData(); + return d instanceof Ageable && !(d instanceof Fire); + } + + @Override + public NovaInventory createInventory(String id, String name, int size) { + return new NovaInventory1_20_R4(id, name, size); + } + + @Override + public NBTWrapper createNBTWrapper(org.bukkit.inventory.ItemStack item) { + return new NBTWrapper1_20_R4(item); + } + + @Override + public void addPacketInjector(Player p) { + ServerPlayer sp = ((CraftPlayer) p).getHandle(); + + try { + Field connection = ServerCommonPacketListenerImpl.class.getDeclaredField("c"); + connection.setAccessible(true); + Channel ch = ((Connection) connection.get(sp.connection)).channel; + + if (ch.pipeline().get(PACKET_INJECTOR_ID) != null) return; + ch.pipeline().addAfter("decoder", PACKET_INJECTOR_ID, new PacketHandler1_20_R4(p)); + } catch (ReflectiveOperationException e) { + NovaConfig.print(e); + } + } + + @Override + public void removePacketInjector(Player p) { + ServerPlayer sp = ((CraftPlayer) p).getHandle(); + + try { + Field connection = ServerCommonPacketListenerImpl.class.getDeclaredField("c"); + connection.setAccessible(true); + Channel ch = ((Connection) connection.get(sp.connection)).channel; + + if (ch.pipeline().get(PACKET_INJECTOR_ID) == null) return; + ch.pipeline().remove(PACKET_INJECTOR_ID); + } catch (ReflectiveOperationException e) { + NovaConfig.print(e); + } + } + + @Override + public void sendSign(Player p, Consumer lines) { + addPacketInjector(p); + + Location l = p.getLocation(); + BlockPos pos = new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ()); + BlockState old = ((CraftWorld) l.getWorld()).getHandle().getBlockState(pos); + + ClientboundBlockUpdatePacket sent1 = new ClientboundBlockUpdatePacket(pos, Blocks.OAK_SIGN.defaultBlockState()); + ((CraftPlayer) p).getHandle().connection.send(sent1); + + ClientboundOpenSignEditorPacket sent2 = new ClientboundOpenSignEditorPacket(pos, true); + ((CraftPlayer) p).getHandle().connection.send(sent2); + + PacketHandler1_20_R4.PACKET_HANDLERS.put(p.getUniqueId(), packetO -> { + if (!(packetO instanceof ServerboundSignUpdatePacket packet)) return false; + + ClientboundBlockUpdatePacket sent3 = new ClientboundBlockUpdatePacket(pos, old); + ((CraftPlayer) p).getHandle().connection.send(sent3); + + lines.accept(packet.getLines()); + return true; + }); + } + + @Override + public void openBook(Player p, org.bukkit.inventory.ItemStack book) { + p.openBook(book); + } + +} diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 5c45a61b..98fba8d5 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -26,7 +26,8 @@ val versions = mapOf( "1_19_R3" to 17, "1_20_R1" to 17, "1_20_R2" to 17, - "1_20_R3" to 17 + "1_20_R3" to 17, + "1_20_R4" to 21 ) dependencies { @@ -64,8 +65,11 @@ dependencies { tasks { compileJava { - if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17)) - versions.filterValues { it >= 17 }.keys.forEach { dependsOn(project(":novaconomy-$it").tasks["assemble"]) } + for (version in versions) { + if (JavaVersion.current().isCompatibleWith(JavaVersion.toVersion(version.value)) && version.value >= 17) { + dependsOn(project(":novaconomy-${version.key}").tasks["assemble"]) + } + } } register("sourcesJar", Jar::class.java) { diff --git a/settings.gradle.kts b/settings.gradle.kts index 94544b16..93ec920d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -40,7 +40,8 @@ mapOf( "1_19_R3" to 17, "1_20_R1" to 17, "1_20_R2" to 17, - "1_20_R3" to 17 + "1_20_R3" to 17, + "1_20_R4" to 21 ).forEach { val id = it.key val minJava = it.value From 2bddf001637b838ad050c8d2eaa47cc04210150b Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 4 May 2024 16:33:58 -0500 Subject: [PATCH 05/14] Draft Business Copyright API --- .../novaconomy/api/business/Business.java | 33 +++ .../api/business/BusinessCopyright.java | 201 ++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/business/Business.java b/api/src/main/java/us/teaminceptus/novaconomy/api/business/Business.java index 2b63a253..94119497 100644 --- a/api/src/main/java/us/teaminceptus/novaconomy/api/business/Business.java +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/business/Business.java @@ -1717,6 +1717,39 @@ public boolean canSendMail(@NotNull OfflinePlayer p) { return getSetting(Settings.Business.OPEN_MAILBOX); } + /** + * Gets all the items copyrighted by this Business. + * @return All Copyrighted Items + */ + @NotNull + public Set getCopyrightedItems() { + return ImmutableSet.copyOf(BusinessCopyright.getAllItems().entrySet() + .stream() + .filter(e -> e.getValue().equals(this)) + .map(Map.Entry::getKey) + .collect(Collectors.toSet())); + } + + /** + * Registers an item as being copyrighted under this business. + * @param item Item to register + * @throws IllegalStateException if the item is already copyrighted + */ + public void registerCopyright(@NotNull ItemStack item) throws IllegalStateException { + if (item == null) return; + BusinessCopyright.setOwner(item, this); + } + + /** + * Gets whether this Business is the owner of an item. + * @param item Item to check + * @return true if owner, else false + */ + public boolean isOwner(@Nullable ItemStack item) { + if (item == null) return false; + return BusinessCopyright.getOwner(item) == this; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java b/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java new file mode 100644 index 00000000..ca2be518 --- /dev/null +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java @@ -0,0 +1,201 @@ +package us.teaminceptus.novaconomy.api.business; + +import com.google.common.collect.ImmutableMap; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.util.io.BukkitObjectOutputStream; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import us.teaminceptus.novaconomy.api.NovaConfig; + +import java.io.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.AbstractMap; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * Represents the Business Copyright registry. + */ +@SuppressWarnings("unchecked") +public final class BusinessCopyright { + + private static final Map registry = new HashMap<>(); + + private BusinessCopyright() {} + + static { + read(); + } + + /** + * Gets an immutable copy of the entire copyright registry. + * @return An immutable copy of the registry. + */ + @NotNull + public static Map getAllItems() { + return ImmutableMap.copyOf(registry.entrySet().stream() + .map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), Business.byId(entry.getValue()))) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + } + + /** + * Returns the business that owns the specified item. + * @param item The item to check. + * @return The business that owns the item, or null if the item is not owned by any business. + */ + @Nullable + public static Business getOwner(@Nullable ItemStack item) { + if (item == null) return null; + + ItemStack item0 = item.clone(); + item0.setAmount(1); + return Business.byId(registry.get(item0)); + } + + /** + * Checks if the specified item is registered in the copyright registry. + * @param item The item to check. + * @return true if the item is registered, false otherwise + */ + public static boolean isRegistered(@Nullable ItemStack item) { + if (item == null) return false; + + ItemStack item0 = item.clone(); + item0.setAmount(1); + + return registry.containsKey(item0); + } + + /** + * Sets the owner of the specified item. + * @param item The item to set the owner of. + * @param business The business to set as the owner. + * @throws IllegalArgumentException if item or business is null + * @throws IllegalStateException if the item is already claimed + */ + public static void setOwner(@NotNull ItemStack item, @NotNull Business business) throws IllegalArgumentException, IllegalStateException { + if (item == null) throw new IllegalArgumentException("item cannot be null"); + if (business == null) throw new IllegalArgumentException("business cannot be null"); + if (isRegistered(item)) throw new IllegalStateException("item is already owned"); + + ItemStack item0 = item.clone(); + item0.setAmount(1); + + registry.put(item0, business.getUniqueId()); + write(); + } + + /** + * Removes the owner of the specified item. + * @param item The item to remove the owner of + * @throws IllegalArgumentException if item is null + */ + public static void removeOwner(@NotNull ItemStack item) throws IllegalArgumentException { + if (item == null) throw new IllegalArgumentException("item cannot be null"); + + ItemStack item0 = item.clone(); + item0.setAmount(1); + + registry.remove(item0); + write(); + } + + // I/O + + private static void checkTable() throws SQLException { + Connection db = NovaConfig.getConfiguration().getDatabaseConnection(); + + db.createStatement().execute("CREATE TABLE IF NOT EXISTS business_copyright (" + + "item MEDIUMBLOB NOT NULL, " + + "business CHAR(36) NOT NULL, " + + "PRIMARY KEY (item))"); + } + + private static void read() { + try { + if (NovaConfig.getConfiguration().isDatabaseEnabled()) { + checkTable(); + readDB(); + } else + readFile(); + } catch (Exception e) { + NovaConfig.print(e); + } + } + + private static void readDB() throws SQLException, IOException, ClassNotFoundException { + Connection db = NovaConfig.getConfiguration().getDatabaseConnection(); + ResultSet rs = db.createStatement().executeQuery("SELECT * FROM business_copyright"); + + while (rs.next()) { + ByteArrayInputStream bais = new ByteArrayInputStream(rs.getBytes("item")); + BukkitObjectInputStream bois = new BukkitObjectInputStream(bais); + + ItemStack item = (ItemStack) bois.readObject(); + UUID business = UUID.fromString(rs.getString("business")); + + registry.put(item, business); + bois.close(); + } + + rs.close(); + } + + private static void readFile() throws IOException, ClassNotFoundException { + File registryFile = new File(NovaConfig.getBusinessesFolder(), "copyright.dat"); + if (!registryFile.exists()) return; + + FileInputStream fis = new FileInputStream(registryFile); + BukkitObjectInputStream bois = new BukkitObjectInputStream(fis); + + Map map = (Map) bois.readObject(); + registry.putAll(map); + } + + private static void write() { + try { + if (NovaConfig.getConfiguration().isDatabaseEnabled()) { + checkTable(); + writeDB(); + } else + writeFile(); + } catch (Exception e) { + NovaConfig.print(e); + } + } + + private static void writeDB() throws SQLException, IOException { + Connection db = NovaConfig.getConfiguration().getDatabaseConnection(); + + for (Map.Entry entry : registry.entrySet()) { + PreparedStatement ps = db.prepareStatement("INSERT INTO business_copyright VALUES (?, ?)"); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + BukkitObjectOutputStream boos = new BukkitObjectOutputStream(baos); + boos.writeObject(entry.getKey()); + boos.close(); + + ps.setBytes(1, baos.toByteArray()); + ps.setString(2, entry.getValue().toString()); + ps.executeUpdate(); + ps.close(); + } + } + + private static void writeFile() throws IOException { + File registryFile = new File(NovaConfig.getBusinessesFolder(), "copyright.dat"); + if (!registryFile.exists()) registryFile.createNewFile(); + + FileOutputStream fos = new FileOutputStream(registryFile); + BukkitObjectOutputStream boos = new BukkitObjectOutputStream(fos); + boos.writeObject(registry); + boos.close(); + } + +} From a01b4a2f6d83f1fa08740469a65203a1b1c41f7c Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 4 May 2024 16:34:05 -0500 Subject: [PATCH 06/14] Fix Minor Vault Bugs --- .../java/us/teaminceptus/novaconomy/vault/VaultEconomy.java | 4 ++-- .../java/us/teaminceptus/novaconomy/vault/VaultRegistry.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java index 882d09f2..ed9e8bb1 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java @@ -157,14 +157,14 @@ public EconomyResponse bankHas(String name, double amount) { public EconomyResponse bankWithdraw(String name, double amount) { Economy econ = Economy.byName(name); Bank.removeBalance(econ, amount); - return new VaultEconomyResponse(0, Bank.getBalance(Economy.byName(name))); + return new VaultEconomyResponse(amount, Bank.getBalance(Economy.byName(name))); } @Override public EconomyResponse bankDeposit(String name, double amount) { Economy econ = Economy.byName(name); Bank.addBalance(econ, amount); - return new VaultEconomyResponse(0, Bank.getBalance(Economy.byName(name))); + return new VaultEconomyResponse(amount, Bank.getBalance(Economy.byName(name))); } @Override diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultRegistry.java b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultRegistry.java index d5d9d318..75a6c798 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultRegistry.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultRegistry.java @@ -53,7 +53,7 @@ private static Economy getVaultEconomy() { private static void inject() { Plugin plugin = NovaConfig.getPlugin(); if (getVaultEconomy() == null) { - plugin.getLogger().info("VaultEconomy is disabled in the config - Registering All Economies..."); + plugin.getLogger().warning("VaultEconomy is disabled in the config - Registering All Economies..."); for (RegisteredServiceProvider rsp : Bukkit.getServicesManager().getRegistrations(net.milkbowl.vault.economy.Economy.class)) if (rsp.getProvider() instanceof VaultEconomy) @@ -70,7 +70,7 @@ private static void inject() { Economy main = Economy.getEconomies().stream().sorted(Comparator.comparing(Economy::getName)).collect(Collectors.toList()).get(0); Bukkit.getServicesManager().register(net.milkbowl.vault.economy.Economy.class, new VaultEconomy(main), plugin, ServicePriority.High); - plugin.getLogger().info("Registered All Economies, Main Economy is: " + main.getName() + " (" + main.getUniqueId() + ")"); + plugin.getLogger().warning("Registered All Economies, Main Economy is: " + main.getName() + " (" + main.getUniqueId() + ")"); } else { Economy econ = getVaultEconomy(); From 25a13f5a90c1bc17d602be5756b9400a5d14d386 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sun, 19 May 2024 16:39:25 -0500 Subject: [PATCH 07/14] Update to 1.20.6 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 62ccb155..f5b554eb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,7 +62,7 @@ jobs: java-version: 17 - version: 1.20.4 java-version: 17 - - version: 1.20.5 + - version: 1.20.6 java-version: 21 name: Test Plugin on MC ${{ matrix.version }} @@ -79,7 +79,7 @@ jobs: - name: Build Plugin run: ./gradlew clean assemble - name: Test Plugin - ${{ matrix.version }} - uses: GamerCoder215/TestMC@v1 + uses: gmitch215/TestMC@v1 with: path: 'plugin/build/libs/novaconomy-*.jar' runtime: 'paper' From da572ec141371c6ebd1c863e5b2735f3e9024b9f Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sun, 19 May 2024 16:39:32 -0500 Subject: [PATCH 08/14] Add Business Copyright Configuration --- .../novaconomy/api/NovaConfig.java | 28 +++++++++++++++++++ .../teaminceptus/novaconomy/Novaconomy.java | 22 +++++++++++++++ plugin/src/main/resources/config.yml | 9 ++++++ 3 files changed, 59 insertions(+) diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/NovaConfig.java b/api/src/main/java/us/teaminceptus/novaconomy/api/NovaConfig.java index acbe83ff..25e5627a 100644 --- a/api/src/main/java/us/teaminceptus/novaconomy/api/NovaConfig.java +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/NovaConfig.java @@ -392,6 +392,11 @@ static FileConfiguration loadConfig() { if (!config.isBoolean("Business.Advertising.Enabled")) config.set("Business.Advertising.Enabled", true); if (!config.isDouble("Business.Advertising.ClickReward") && !config.isInt("Business.Advertising.ClickReward")) config.set("Business.Advertising.ClickReward", 5D); + if (!config.isConfigurationSection("Business.Copyright")) config.createSection("Business.Copyright"); + if (!config.isBoolean("Business.Copyright.Enabled")) config.set("Business.Copyright.Enabled", true); + if (!config.isDouble("Business.Copyright.Cost") && !config.isInt("Business.Copyright.Cost")) + config.set("Business.Copyright.Cost", 1000); + // Database if (!config.isConfigurationSection("Database")) config.createSection("Database"); @@ -1306,5 +1311,28 @@ default boolean isIgnoredTax(OfflinePlayer p) { */ boolean canBypassMaxNegativeAmount(@NotNull OfflinePlayer p); + /** + * Whether Business Copyright is enabled. + * @return true if enabled, else false + */ + boolean isBusinessCopyrightEnabled(); + + /** + * Sets whether Business Copyright is enabled. + * @param enabled true if enabled, else false + */ + void setBusinessCopyrightEnabled(boolean enabled); + + /** + * Fetches the cost of a Business Copyright. + * @return Cost of Business Copyright + */ + double getBusinessCopyrightCost(); + + /** + * Sets the cost of a Business Copyright. + * @param cost Cost of Business Copyright + */ + void setBusinessCopyrightCost(double cost); } \ No newline at end of file diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/Novaconomy.java b/plugin/src/main/java/us/teaminceptus/novaconomy/Novaconomy.java index 04fd836d..864d524e 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/Novaconomy.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/Novaconomy.java @@ -2605,4 +2605,26 @@ public boolean canBypassMaxNegativeAmount(@NotNull OfflinePlayer p) { return isIncludedIn(functionality.getStringList("NegativeBalances.BypassMax"), p); } + @Override + public boolean isBusinessCopyrightEnabled() { + return config.getBoolean("Business.Copryright.Enabled", false); + } + + @Override + public void setBusinessCopyrightEnabled(boolean enabled) { + config.set("Business.Copryright.Enabled", enabled); + saveConfig(); + } + + @Override + public double getBusinessCopyrightCost() { + return config.getDouble("Business.Copryright.Cost", 1000.0); + } + + @Override + public void setBusinessCopyrightCost(double cost) { + config.set("Business.Copryright.Cost", cost); + saveConfig(); + } + } \ No newline at end of file diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index ce589b23..4b79f8ea 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -306,6 +306,15 @@ Business: # The Economy is randomly selected, and this value is multiplied by its conversion scale ClickReward: 5 + # Business Copyright Settings + Copyright: + + # Whether Business Copyright is Enabled + Enabled: true + + # The base cost of a Business Copyright. This is multiplied by the economy's conversion scale. + Cost: 1000.0 + # Corporation Section Corporation: From 9cf92005999444a8383173aa8f4716ca4c2b2959 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Sat, 25 May 2024 13:09:48 -0500 Subject: [PATCH 09/14] Fix `VaultEconomy#has` (Fixes #148) --- .../java/us/teaminceptus/novaconomy/vault/VaultEconomy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java index ed9e8bb1..0eddaadd 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/vault/VaultEconomy.java @@ -94,7 +94,7 @@ public double getBalance(String playerName, String world) { @Override public boolean has(String playerName, double amount) { - return getBalance(playerName) == amount; + return getBalance(playerName) >= amount; } @Override From 76805688fd64347b7296fbe9efc22405fb22290c Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Mon, 27 May 2024 17:45:21 -0500 Subject: [PATCH 10/14] Update config.yml --- plugin/src/main/resources/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 4b79f8ea..3cf460ac 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -307,6 +307,8 @@ Business: ClickReward: 5 # Business Copyright Settings + # + # Copyright is ignored if the businesses are in the same Corporation. Existing products are grandfathered in and are not affected, but newer products are. Copyright: # Whether Business Copyright is Enabled From 38815561493c974fdddcace7b2669d543862f1a4 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Mon, 27 May 2024 17:45:33 -0500 Subject: [PATCH 11/14] Add Rest of Translations --- api/src/main/resources/lang/novaconomy.properties | 5 +++++ api/src/main/resources/lang/novaconomy_de.properties | 5 +++++ api/src/main/resources/lang/novaconomy_es.properties | 5 +++++ api/src/main/resources/lang/novaconomy_fi.properties | 5 +++++ api/src/main/resources/lang/novaconomy_fr.properties | 5 +++++ api/src/main/resources/lang/novaconomy_id.properties | 5 +++++ api/src/main/resources/lang/novaconomy_it.properties | 5 +++++ api/src/main/resources/lang/novaconomy_ja.properties | 5 +++++ api/src/main/resources/lang/novaconomy_ko.properties | 5 +++++ api/src/main/resources/lang/novaconomy_nb.properties | 5 +++++ api/src/main/resources/lang/novaconomy_pt.properties | 5 +++++ api/src/main/resources/lang/novaconomy_ru.properties | 5 +++++ api/src/main/resources/lang/novaconomy_sv.properties | 5 +++++ api/src/main/resources/lang/novaconomy_zh.properties | 5 +++++ 14 files changed, 70 insertions(+) diff --git a/api/src/main/resources/lang/novaconomy.properties b/api/src/main/resources/lang/novaconomy.properties index a4600f10..a87b39de 100644 --- a/api/src/main/resources/lang/novaconomy.properties +++ b/api/src/main/resources/lang/novaconomy.properties @@ -544,6 +544,11 @@ error.argument.target=Please provide a valid target. error.player.cannot_send_mail=You are not allowed to send mail to this entity. constants.settings.name.open_mailbox=Open Mailbox settings.open_mailbox=Whether this entity can receive mail. +constants.business.copyright=Copyrighted Items +success.business.add_copyright=Successfully registered the item for copyright! +error.business.already_copyright=This item is already copyrighted and owned by %s. +error.business.cant_copyright=This item is too ambigous and is disallowed for copyright. +error.business.product_copyright=This product is copyrighted and cannot be registered. diff --git a/api/src/main/resources/lang/novaconomy_de.properties b/api/src/main/resources/lang/novaconomy_de.properties index d92b6a84..af62aa65 100644 --- a/api/src/main/resources/lang/novaconomy_de.properties +++ b/api/src/main/resources/lang/novaconomy_de.properties @@ -543,6 +543,11 @@ error.argument.target=Bitte geben Sie ein g\u00FCltiges Ziel an. error.player.cannot_send_mail=Es ist Ihnen nicht gestattet, E-Mails an diese Entit\u00E4t zu senden. constants.settings.name.open_mailbox=Postfach \u00F6ffnen settings.open_mailbox=Ob diese Entit\u00E4t E-Mails empfangen kann. +constants.business.copyright=Urheberrechtlich Gesch\u00FCtzte Artikel +success.business.add_copyright=Der Artikel wurde erfolgreich urheberrechtlich gesch\u00FCtzt! +error.business.already_copyright=Dieses Element ist bereits urheberrechtlich gesch\u00FCtzt und Eigentum von %s. +error.business.cant_copyright=Dieses Element ist zu mehrdeutig und urheberrechtlich nicht zul\u00E4ssig. +error.business.product_copyright=Dieses Produkt ist urheberrechtlich gesch\u00FCtzt und kann nicht registriert werden. diff --git a/api/src/main/resources/lang/novaconomy_es.properties b/api/src/main/resources/lang/novaconomy_es.properties index d33d5a5b..6e621675 100644 --- a/api/src/main/resources/lang/novaconomy_es.properties +++ b/api/src/main/resources/lang/novaconomy_es.properties @@ -543,6 +543,11 @@ error.argument.target=Proporcione un objetivo v\u00E1lido. error.player.cannot_send_mail=No se le permite enviar correo a esta entidad. constants.settings.name.open_mailbox=Abrir Buz\u00F3n settings.open_mailbox=Si esta entidad puede recibir correo. +constants.business.copyright=Art\u00EDculos con Derechos de Autor +success.business.add_copyright=Se registr\u00F3 correctamente el art\u00EDculo con derechos de autor! +error.business.already_copyright=Este art\u00EDculo ya tiene derechos de autor y es propiedad de %s. +error.business.cant_copyright=Este art\u00EDculo es demasiado ambiguo y no est\u00E1 permitido por derechos de autor. +error.business.product_copyright=Este producto tiene derechos de autor y no se puede registrar. diff --git a/api/src/main/resources/lang/novaconomy_fi.properties b/api/src/main/resources/lang/novaconomy_fi.properties index edc29f4c..13698a2e 100644 --- a/api/src/main/resources/lang/novaconomy_fi.properties +++ b/api/src/main/resources/lang/novaconomy_fi.properties @@ -544,6 +544,11 @@ error.argument.target=Anna kelvollinen kohde. error.player.cannot_send_mail=Et saa l\u00E4hett\u00E4\u00E4 s\u00E4hk\u00F6postia t\u00E4lle taholle. constants.settings.name.open_mailbox=Avaa Postilaatikko settings.open_mailbox=Voiko t\u00E4m\u00E4 taho vastaanottaa postia. +constants.business.copyright=Tekij\u00E4noikeudella Suojatut Kohteet +success.business.add_copyright=Kohteen rekister\u00F6inti tekij\u00E4noikeuksiin onnistui! +error.business.already_copyright=T\u00E4m\u00E4 kohde on jo tekij\u00E4noikeudella suojattu ja sen omistaa %s. +error.business.cant_copyright=T\u00E4m\u00E4 kohde on liian moniselitteinen, ja se on kielletty tekij\u00E4noikeussuojan vuoksi. +error.business.product_copyright=T\u00E4m\u00E4 tuote on tekij\u00E4noikeudella suojattu, eik\u00E4 sit\u00E4 voi rekister\u00F6id\u00E4. diff --git a/api/src/main/resources/lang/novaconomy_fr.properties b/api/src/main/resources/lang/novaconomy_fr.properties index 33bf61ea..15003a9f 100644 --- a/api/src/main/resources/lang/novaconomy_fr.properties +++ b/api/src/main/resources/lang/novaconomy_fr.properties @@ -543,6 +543,11 @@ error.argument.target=Veuillez fournir une cible valide. error.player.cannot_send_mail=Vous n'\u00EAtes pas autoris\u00E9 \u00E0 envoyer du courrier \u00E0 cette entit\u00E9. constants.settings.name.open_mailbox=Ouvrir la bo\u00EEte aux lettres settings.open_mailbox=Si cette entit\u00E9 peut recevoir du courrier. +constants.business.copyright=Articles Prot\u00E9g\u00E9s par le Droit D'auteur +success.business.add_copyright=L'article a \u00E9t\u00E9 enregistr\u00E9 avec succ\u00E8s pour le droit d'auteur! +error.business.already_copyright=Cet \u00E9l\u00E9ment est d\u00E9j\u00E0 prot\u00E9g\u00E9 par copyright et appartient \u00E0 %s. +error.business.cant_copyright=Cet \u00E9l\u00E9ment est trop ambigu et n'est pas autoris\u00E9 pour des raisons de droit d'auteur. +error.business.product_copyright=Ce produit est prot\u00E9g\u00E9 par le droit d'auteur et ne peut pas \u00EAtre enregistr\u00E9. diff --git a/api/src/main/resources/lang/novaconomy_id.properties b/api/src/main/resources/lang/novaconomy_id.properties index 48863c55..86bb8bc3 100644 --- a/api/src/main/resources/lang/novaconomy_id.properties +++ b/api/src/main/resources/lang/novaconomy_id.properties @@ -543,6 +543,11 @@ error.argument.target=Harap berikan target yang valid. error.player.cannot_send_mail=Anda tidak diperbolehkan mengirim email ke entitas ini. constants.settings.name.open_mailbox=Buka Kotak Surat settings.open_mailbox=Apakah entitas ini dapat menerima email. +constants.business.copyright=Item Berhak Cipta +success.business.add_copyright=Berhasil mendaftarkan item untuk hak cipta! +error.business.already_copyright=Item ini sudah memiliki hak cipta dan dimiliki oleh %s. +error.business.cant_copyright=Item ini terlalu ambigu dan tidak diizinkan karena hak cipta. +error.business.product_copyright=Produk ini memiliki hak cipta dan tidak dapat didaftarkan. diff --git a/api/src/main/resources/lang/novaconomy_it.properties b/api/src/main/resources/lang/novaconomy_it.properties index f3f91326..77cb8822 100644 --- a/api/src/main/resources/lang/novaconomy_it.properties +++ b/api/src/main/resources/lang/novaconomy_it.properties @@ -543,6 +543,11 @@ error.argument.target=Fornisci un obiettivo valido. error.player.cannot_send_mail=Anda tidak diperbolehkan mengirim email ke entitas ini.... constants.settings.name.open_mailbox=Apri la Casella di Posta settings.open_mailbox=Indica se questa entit\u00E0 pu\u00F2 ricevere posta. +constants.business.copyright=Articoli Protetti da Copyright +success.business.add_copyright=Registrazione dell'articolo per il copyright riuscita! +error.business.already_copyright=Questo elemento \u00E8 gi\u00E0 protetto da copyright ed \u00E8 di propriet\u00E0 di %s. +error.business.cant_copyright=Item ini terlalu ambigu dan tidak diizinkan karena hak cipta.... +error.business.product_copyright=Questo prodotto \u00E8 protetto da copyright e non pu\u00F2 essere registrato. diff --git a/api/src/main/resources/lang/novaconomy_ja.properties b/api/src/main/resources/lang/novaconomy_ja.properties index c3a11123..00f90154 100644 --- a/api/src/main/resources/lang/novaconomy_ja.properties +++ b/api/src/main/resources/lang/novaconomy_ja.properties @@ -544,6 +544,11 @@ error.argument.target=\u6709\u52B9\u306A\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u63 error.player.cannot_send_mail=\u3053\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u306B\u30E1\u30FC\u30EB\u3092\u9001\u4FE1\u3059\u308B\u3053\u3068\u306F\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093. constants.settings.name.open_mailbox=\u30E1\u30FC\u30EB\u30DC\u30C3\u30AF\u30B9\u3092\u958B\u304F settings.open_mailbox=\u3053\u306E\u30A8\u30F3\u30C6\u30A3\u30C6\u30A3\u304C\u30E1\u30FC\u30EB\u3092\u53D7\u4FE1\u3067\u304D\u308B\u304B\u3069\u3046\u304B. +constants.business.copyright=\u8457\u4F5C\u6A29\u3067\u4FDD\u8B77\u3055\u308C\u305F\u30A2\u30A4\u30C6\u30E0 +success.business.add_copyright=\u30A2\u30A4\u30C6\u30E0\u306E\u8457\u4F5C\u6A29\u767B\u9332\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F. +error.business.already_copyright=\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u3059\u3067\u306B\u8457\u4F5C\u6A29\u3067\u4FDD\u8B77\u3055\u308C\u3066\u304A\u308A\u3001%s \u304C\u6240\u6709\u3057\u3066\u3044\u307E\u3059. +error.business.cant_copyright=\u3053\u306E\u9805\u76EE\u306F\u66D6\u6627\u3059\u304E\u308B\u305F\u3081\u3001\u8457\u4F5C\u6A29\u4E0A\u8A31\u53EF\u3055\u308C\u3066\u3044\u307E\u305B\u3093. +error.business.product_copyright=\u3053\u306E\u88FD\u54C1\u306F\u8457\u4F5C\u6A29\u3067\u4FDD\u8B77\u3055\u308C\u3066\u3044\u308B\u305F\u3081\u3001\u767B\u9332\u3067\u304D\u307E\u305B\u3093. diff --git a/api/src/main/resources/lang/novaconomy_ko.properties b/api/src/main/resources/lang/novaconomy_ko.properties index 445be9e8..856c87b6 100644 --- a/api/src/main/resources/lang/novaconomy_ko.properties +++ b/api/src/main/resources/lang/novaconomy_ko.properties @@ -542,6 +542,11 @@ error.argument.target=\uC720\uD6A8\uD55C \uB300\uC0C1\uC744 \uC785\uB825\uD558\u error.player.cannot_send_mail=\uC774 \uC5D4\uD130\uD2F0\uC5D0 \uBA54\uC77C\uC744 \uBCF4\uB0BC \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. constants.settings.name.open_mailbox=\uC6B0\uD3B8\uD568 \uC5F4\uAE30 settings.open_mailbox=\uC774 \uC5D4\uD130\uD2F0\uAC00 \uBA54\uC77C\uC744 \uBC1B\uC744 \uC218 \uC788\uB294\uC9C0 \uC5EC\uBD80\uC785\uB2C8\uB2E4. +constants.business.copyright=\uC800\uC791\uAD8C\uC774 \uC788\uB294 \uD56D\uBAA9 +success.business.add_copyright=\uC800\uC791\uAD8C \uD56D\uBAA9 \uB4F1\uB85D\uC774 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4! +error.business.already_copyright=\u3053\u306E\u30A2\u30A4\u30C6\u30E0\u306F\u3059\u3067\u306B\u8457\u4F5C\u6A29\u3067\u4FDD\u8B77\u3055\u308C\u3066\u304A\u308A\u3001%s \u304C\u6240\u6709\u3057\u3066\u3044\u307E\u3059\u3002... +error.business.cant_copyright=\uC774 \uD56D\uBAA9\uC740 \uB108\uBB34 \uBAA8\uD638\uD558\uC5EC \uC800\uC791\uAD8C\uC73C\uB85C \uC778\uD574 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. +error.business.product_copyright=\uBCF8 \uC0C1\uD488\uC740 \uC800\uC791\uAD8C\uC774 \uC788\uB294 \uC0C1\uD488\uC73C\uB85C \uB4F1\uB85D\uC774 \uBD88\uAC00\uB2A5\uD569\uB2C8\uB2E4. diff --git a/api/src/main/resources/lang/novaconomy_nb.properties b/api/src/main/resources/lang/novaconomy_nb.properties index 3ddc1b63..e3109610 100644 --- a/api/src/main/resources/lang/novaconomy_nb.properties +++ b/api/src/main/resources/lang/novaconomy_nb.properties @@ -543,6 +543,11 @@ error.argument.target=Oppgi et gyldig m\u00E5l. error.player.cannot_send_mail=Du har ikke lov til \u00E5 sende e-post til denne enheten. constants.settings.name.open_mailbox=\u00C5pne Postkasse settings.open_mailbox=Om denne enheten kan motta post. +constants.business.copyright=Opphavsrettsbeskyttede Varer +success.business.add_copyright=Varen er registrert for opphavsrett! +error.business.already_copyright=Dette elementet er allerede opphavsrettsbeskyttet og eid av %s. +error.business.cant_copyright=Dette elementet er for tvetydig og er ikke tillatt for opphavsrett. +error.business.product_copyright=Dette produktet er opphavsrettsbeskyttet og kan ikke registreres. diff --git a/api/src/main/resources/lang/novaconomy_pt.properties b/api/src/main/resources/lang/novaconomy_pt.properties index 788bf072..34c74319 100644 --- a/api/src/main/resources/lang/novaconomy_pt.properties +++ b/api/src/main/resources/lang/novaconomy_pt.properties @@ -543,6 +543,11 @@ error.argument.target=Forne\u00E7a uma meta v\u00E1lida. error.player.cannot_send_mail=Voc\u00EA n\u00E3o tem permiss\u00E3o para enviar e-mails para esta entidade. constants.settings.name.open_mailbox=Abrir Caixa de Correio settings.open_mailbox=Se esta entidade pode receber correio. +constants.business.copyright=Itens Protegidos por Direitos Autorais +success.business.add_copyright=Registrou o item com sucesso para direitos autorais! +error.business.already_copyright=Este item j\u00E1 possui direitos autorais e \u00E9 propriedade de %s. +error.business.cant_copyright=Este item \u00E9 muito amb\u00EDguo e n\u00E3o \u00E9 permitido por direitos autorais. +error.business.product_copyright=Este produto est\u00E1 protegido por direitos autorais e n\u00E3o pode ser registrado. diff --git a/api/src/main/resources/lang/novaconomy_ru.properties b/api/src/main/resources/lang/novaconomy_ru.properties index 2f6e3f2c..e45455b8 100644 --- a/api/src/main/resources/lang/novaconomy_ru.properties +++ b/api/src/main/resources/lang/novaconomy_ru.properties @@ -543,6 +543,11 @@ error.argument.target=\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u0434\u0435\u0 error.player.cannot_send_mail=\u0412\u0430\u043C \u043D\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u043F\u043E\u0447\u0442\u0443 \u044D\u0442\u043E\u043C\u0443 \u043E\u0431\u044A\u0435\u043A\u0442\u0443. constants.settings.name.open_mailbox=\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u043F\u043E\u0447\u0442\u043E\u0432\u044B\u0439 \u044F\u0449\u0438\u043A settings.open_mailbox=\u041C\u043E\u0436\u0435\u0442 \u043B\u0438 \u044D\u0442\u043E\u0442 \u043E\u0431\u044A\u0435\u043A\u0442 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u043F\u043E\u0447\u0442\u0443. +constants.business.copyright=\u041E\u0431\u044A\u0435\u043A\u0442\u044B, \u0437\u0430\u0449\u0438\u0449\u0435\u043D\u043D\u044B\u0435 \u0430\u0432\u0442\u043E\u0440\u0441\u043A\u0438\u043C \u043F\u0440\u0430\u0432\u043E\u043C +success.business.add_copyright=\u041E\u0431\u044A\u0435\u043A\u0442 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u043D \u043D\u0430 \u0437\u0430\u0449\u0438\u0442\u0443 \u0430\u0432\u0442\u043E\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0430\u0432! +error.business.already_copyright=\u042D\u0442\u043E\u0442 \u043E\u0431\u044A\u0435\u043A\u0442 \u0443\u0436\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043D \u0430\u0432\u0442\u043E\u0440\u0441\u043A\u0438\u043C \u043F\u0440\u0430\u0432\u043E\u043C \u0438 \u043F\u0440\u0438\u043D\u0430\u0434\u043B\u0435\u0436\u0438\u0442 %s. +error.business.cant_copyright=\u042D\u0442\u043E\u0442 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0434\u0432\u0443\u0441\u043C\u044B\u0441\u043B\u0435\u043D\u0435\u043D \u0438 \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D \u0438\u0437-\u0437\u0430 \u0430\u0432\u0442\u043E\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0430\u0432. +error.business.product_copyright=Este produto est\u00E1 protegido por direitos autorais e n\u00E3o pode ser registrado.... diff --git a/api/src/main/resources/lang/novaconomy_sv.properties b/api/src/main/resources/lang/novaconomy_sv.properties index 312c3a92..3b7c6b2f 100644 --- a/api/src/main/resources/lang/novaconomy_sv.properties +++ b/api/src/main/resources/lang/novaconomy_sv.properties @@ -543,6 +543,11 @@ error.argument.target=Ange ett giltigt m\u00E5l. error.player.cannot_send_mail=Du f\u00E5r inte skicka e-post till denna enhet. constants.settings.name.open_mailbox=\u00D6ppna Mailbox settings.open_mailbox=Om denna enhet kan ta emot post. +constants.business.copyright=Upphovsr\u00E4ttsskyddade F\u00F6rem\u00E5l +success.business.add_copyright=Varan har registrerats f\u00F6r upphovsr\u00E4tt! +error.business.already_copyright=Det h\u00E4r objektet \u00E4r redan upphovsr\u00E4ttsskyddat och \u00E4gs av %s. +error.business.cant_copyright=Det h\u00E4r objektet \u00E4r f\u00F6r tvetydigt och \u00E4r inte till\u00E5tet f\u00F6r upphovsr\u00E4tt. +error.business.product_copyright=Denna produkt \u00E4r upphovsr\u00E4ttsskyddad och kan inte registreras. diff --git a/api/src/main/resources/lang/novaconomy_zh.properties b/api/src/main/resources/lang/novaconomy_zh.properties index 4efce351..6f22640a 100644 --- a/api/src/main/resources/lang/novaconomy_zh.properties +++ b/api/src/main/resources/lang/novaconomy_zh.properties @@ -544,6 +544,11 @@ error.argument.target=\u8BF7\u63D0\u4F9B\u6709\u6548\u7684\u76EE\u6807. error.player.cannot_send_mail=\u60A8\u65E0\u6743\u5411\u8BE5\u5B9E\u4F53\u53D1\u9001\u90AE\u4EF6. constants.settings.name.open_mailbox=\u6253\u5F00\u90AE\u7BB1 settings.open_mailbox=\u8BE5\u5B9E\u4F53\u662F\u5426\u53EF\u4EE5\u63A5\u6536\u90AE\u4EF6. +constants.business.copyright=\u53D7\u7248\u6743\u4FDD\u62A4\u7684\u7269\u54C1 +success.business.add_copyright=\u8BE5\u5546\u54C1\u7248\u6743\u767B\u8BB0\u6210\u529F! +error.business.already_copyright=\u8BE5\u9879\u76EE\u5DF2\u53D7\u7248\u6743\u4FDD\u62A4\u5E76\u5F52 %s \u6240\u6709. +error.business.cant_copyright=\u8BE5\u9879\u76EE\u8FC7\u4E8E\u542B\u7CCA, \u4E0D\u5141\u8BB8\u83B7\u5F97\u7248\u6743. +error.business.product_copyright=\u672C\u4EA7\u54C1\u53D7\u7248\u6743\u4FDD\u62A4, \u65E0\u6CD5\u6CE8\u518C. From b339508e54cc8b43c155cfccd3fad2a15ebf951d Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Mon, 27 May 2024 17:45:47 -0500 Subject: [PATCH 12/14] Create NovaPlayer#canAfford(double) --- .../novaconomy/api/player/NovaPlayer.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/player/NovaPlayer.java b/api/src/main/java/us/teaminceptus/novaconomy/api/player/NovaPlayer.java index 83cfb757..58ec3de5 100644 --- a/api/src/main/java/us/teaminceptus/novaconomy/api/player/NovaPlayer.java +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/player/NovaPlayer.java @@ -42,6 +42,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; /** @@ -409,6 +410,29 @@ public boolean canAfford(@Nullable Economy econ, double amount, boolean allowDeb } } + /** + * Whether this NovaPlayer can afford an amount from any economy. + * @param amount Amount to buy at, converted into all other economies using {@link Economy#getConversionScale()} + * @return true if can afford, else false + */ + public boolean canAfford(double amount) { + return canAfford(amount, false); + } + + /** + * Whether this NovaPlayer can afford an amount from any economy. + * @param amount Amount to buy at, converted into all other economies using {@link Economy#getConversionScale()} + * @param allowDebt Whether to allow debt. This will be ignored if {@link NovaConfig#isNegativeBalancesEnabled()} returns false. + * @return true if can afford, else false + */ + public boolean canAfford(double amount, boolean allowDebt) { + AtomicBoolean afford = new AtomicBoolean(false); + for (Economy econ : Economy.getEconomies()) + if (canAfford(econ, amount * econ.getConversionScale(), allowDebt)) afford.set(true); + + return afford.get(); + } + /** * Gets whether this NovaPlayer is currently in debt. * @param econ Economy to use From ce9e1f89c2c7484521b6e823611973d996e1f3f7 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Mon, 27 May 2024 17:45:54 -0500 Subject: [PATCH 13/14] Create BusinessCopyright#isDisallowed --- .../api/business/BusinessCopyright.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java b/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java index ca2be518..febc9c5b 100644 --- a/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java +++ b/api/src/main/java/us/teaminceptus/novaconomy/api/business/BusinessCopyright.java @@ -1,7 +1,9 @@ package us.teaminceptus.novaconomy.api.business; import com.google.common.collect.ImmutableMap; +import org.bukkit.inventory.ItemFlag; 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.jetbrains.annotations.NotNull; @@ -76,13 +78,14 @@ public static boolean isRegistered(@Nullable ItemStack item) { * Sets the owner of the specified item. * @param item The item to set the owner of. * @param business The business to set as the owner. - * @throws IllegalArgumentException if item or business is null + * @throws IllegalArgumentException if item or business is null, or {@link #isDisallowed(ItemStack)} returns true * @throws IllegalStateException if the item is already claimed */ public static void setOwner(@NotNull ItemStack item, @NotNull Business business) throws IllegalArgumentException, IllegalStateException { if (item == null) throw new IllegalArgumentException("item cannot be null"); if (business == null) throw new IllegalArgumentException("business cannot be null"); if (isRegistered(item)) throw new IllegalStateException("item is already owned"); + if (isDisallowed(item)) throw new IllegalArgumentException("item is banned from copyright"); ItemStack item0 = item.clone(); item0.setAmount(1); @@ -106,6 +109,33 @@ public static void removeOwner(@NotNull ItemStack item) throws IllegalArgumentEx write(); } + /** + * Gets whether the specified item is disallowed from being registered. + *

+ * An item is disallowed if: + *
    + *
  • {@link ItemStack#hasItemMeta()} returns false
  • + *
  • {@link ItemStack#getEnchantments()} has a size less than three
  • + *
+ * + * These rules will not apply if one of the following happens: + *
    + *
  • {@link ItemMeta#hasLore()} returns true
  • + *
  • {@link ItemMeta#getItemFlags()} is not empty
  • + *
+ * @param item The item to check + * @return true if the item is disallowed, false otherwise + */ + public static boolean isDisallowed(@NotNull ItemStack item) { + if (!item.hasItemMeta()) return true; + + // Automatic False + if (item.getItemMeta().hasLore()) return false; + if (!item.getItemMeta().getItemFlags().isEmpty()) return false; + + return item.getEnchantments().size() < 3; + } + // I/O private static void checkTable() throws SQLException { From 2b0db8a4098926f3c8a06bdef7de3b3f4b3d4b03 Mon Sep 17 00:00:00 2001 From: Gregory Mitchell <54124162+gmitch215@users.noreply.github.com> Date: Mon, 27 May 2024 17:46:05 -0500 Subject: [PATCH 14/14] Add Business Copyright GUI & Implementation --- .../abstraction/CommandWrapper.java | 86 +++++++++++++++++++ .../novaconomy/util/inventory/Generator.java | 70 ++++++++++++++- .../novaconomy/CommandWrapperV2.java | 7 ++ .../novaconomy/CommandWrapperV1.java | 22 +++++ .../teaminceptus/novaconomy/GUIManager.java | 30 ++++++- 5 files changed, 209 insertions(+), 6 deletions(-) diff --git a/abstraction/src/main/java/us/teaminceptus/novaconomy/abstraction/CommandWrapper.java b/abstraction/src/main/java/us/teaminceptus/novaconomy/abstraction/CommandWrapper.java index c44409b5..077c5d28 100644 --- a/abstraction/src/main/java/us/teaminceptus/novaconomy/abstraction/CommandWrapper.java +++ b/abstraction/src/main/java/us/teaminceptus/novaconomy/abstraction/CommandWrapper.java @@ -31,6 +31,7 @@ import us.teaminceptus.novaconomy.api.SortingType; import us.teaminceptus.novaconomy.api.bank.Bank; import us.teaminceptus.novaconomy.api.business.Business; +import us.teaminceptus.novaconomy.api.business.BusinessCopyright; import us.teaminceptus.novaconomy.api.business.BusinessStatistics; import us.teaminceptus.novaconomy.api.business.Rating; import us.teaminceptus.novaconomy.api.corporation.Corporation; @@ -772,6 +773,12 @@ default void addProduct(Player p, double price) { return; } + Corporation c = b.getParentCorporation(); + if (BusinessCopyright.isRegistered(pr) && (c == null || !c.equals(BusinessCopyright.getOwner(pr).getParentCorporation()))) { + messages.sendMessage(p, "error.business.product_copyright"); + return; + } + Economy econ = Economy.first(); NovaInventory inv = genGUI(36, pr.hasItemMeta() && pr.getItemMeta().hasDisplayName() ? pr.getItemMeta().getDisplayName() : capitalize(pr.getType().name().replace('_', ' '))); @@ -4462,4 +4469,83 @@ default void mailbox(Player p, Corporation c) { NovaSound.ITEM_BOOK_PAGE_TURN.play(p); } + default void businessCopyright(Player p) { + if (!p.hasPermission("novaconomy.user.business")) { + messages.sendMessage(p, ERROR_PERMISSION_ARGUMENT); + return; + } + + if (!Business.exists(p)) { + messages.sendError(p, "error.business.none"); + return; + } + + Business b = Business.byOwner(p); + + NovaInventory inv = Generator.generateBusinessCopyright(b, SortingType.MATERIAL_TYPE_ASCENDING, p).get(0); + p.openInventory(inv); + NovaSound.BLOCK_ENDER_CHEST_OPEN.play(p); + } + + default void registerBusinessCopyright(Player p) { + if (!p.hasPermission("novaconomy.user.business")) { + messages.sendMessage(p, ERROR_PERMISSION_ARGUMENT); + return; + } + + if (!Business.exists(p)) { + messages.sendError(p, "error.business.none"); + return; + } + + Business b = Business.byOwner(p); + + if (p.getItemInHand() == null || p.getItemInHand().getType() == Material.AIR) { + messages.sendError(p, "error.argument.item.hold"); + return; + } + + ItemStack item = p.getItemInHand().clone(); + item.setAmount(1); + + if (BusinessCopyright.isDisallowed(item)) { + messages.sendError(p, "error.business.cant_copyright"); + return; + } + + if (BusinessCopyright.isRegistered(item)) { + messages.sendError(p, "error.business.already_copyright", ChatColor.GOLD + BusinessCopyright.getOwner(item).getName()); + return; + } + + if (!b.isProduct(item)) { + messages.sendError(p, "error.argument.item"); + return; + } + + NovaPlayer np = new NovaPlayer(p); + if (!np.canAfford(NovaConfig.getConfiguration().getBusinessCopyrightCost(), NovaConfig.getConfiguration().getWhenNegativeAllowPurchaseProducts())) { + messages.sendError(p, "error.market.not_enough_money"); + return; + } + + NovaInventory inv = InventorySelector.confirm(p, cInv -> { + BusinessCopyright.setOwner(item, b); + messages.sendSuccess(p, "success.business.add_copyright"); + p.closeInventory(); + }); + + inv.setItem(11, economyWheel(p)); + inv.setItem(13, item); + + double cost = NovaConfig.getConfiguration().getBusinessCopyrightCost(); + inv.setItem(15, Items.builder(Material.GOLD_BLOCK, + meta -> meta.setDisplayName(format(get(p, "constants.price"), cost, "")) + )); + + + p.openInventory(inv); + NovaSound.ENTITY_ARROW_HIT_PLAYER.playSuccess(p); + } + } diff --git a/abstraction/src/main/java/us/teaminceptus/novaconomy/util/inventory/Generator.java b/abstraction/src/main/java/us/teaminceptus/novaconomy/util/inventory/Generator.java index ccc8d146..e1a538b8 100644 --- a/abstraction/src/main/java/us/teaminceptus/novaconomy/util/inventory/Generator.java +++ b/abstraction/src/main/java/us/teaminceptus/novaconomy/util/inventory/Generator.java @@ -42,8 +42,6 @@ import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiConsumer; -import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -192,11 +190,21 @@ public static List generateBusinessData(Business b, Player viewer } ); + ItemStack copyright = builder( + Material.PAPER, + meta -> meta.setDisplayName(ChatColor.AQUA + get(viewer, "constants.business.copyright")), + nbt -> { + nbt.setID("business:copyright"); + nbt.set(BUSINESS_TAG, b.getUniqueId()); + } + ); + if (b.isOwner(viewer)) { inv.setItem(16, mailbox); inv.setItem(17, invites); inv.setItem(26, advInfo); inv.setItem(27, supplyChests); + inv.setItem(36, copyright); inv.setItem(53, settings); } @@ -1732,6 +1740,64 @@ public static NovaInventory confirmMail(@NotNull Mail mail, @NotNull Player view return inv; } + public static List generateBusinessCopyright(@NotNull Business b, SortingType sorter, Player viewer) { + List invs = new ArrayList<>(); + Set copyrighted = b.getCopyrightedItems(); + + int limit = Math.max(((copyrighted.size() - 1) / 26) + 1, 1); + for (int i = 0; i < limit; i++) { + final int fI = i; + + NovaInventory inv = genGUI(54, b.getName() + " | " + get(viewer, "constants.business.copyright")); + inv.setCancelled(); + + inv.setAttribute("sorting_type", Material.class); + inv.setAttribute("sorting_function", (Function, NovaInventory>) + s -> generateBusinessCopyright(b, sorter, viewer).get(fI)); + + inv.setItem(4, b.getPublicIcon()); + inv.setItem(18, sorter(sorter)); + + List items = copyrighted.stream() + .sorted(Comparator.comparing(ItemStack::getType, sorter)) + .collect(Collectors.toList()) + .subList(i * 26, Math.min((i + 1) * 26, copyrighted.size())); + + for (ItemStack item : items) + inv.addItem(builder(item, + meta -> { + List lore = meta.hasLore() ? new ArrayList<>(meta.getLore()) : new ArrayList<>(); + lore.add(" "); + lore.add(ChatColor.YELLOW + get(viewer, "constants.click_remove")); + + meta.setLore(lore); + }, + nbt -> { + nbt.setID("business:remove_copyright"); + nbt.set(BUSINESS_TAG, b.getUniqueId()); + nbt.set(PRODUCT_TAG, b.getProduct(item)); + }) + ); + + inv.setItem(46, builder(BACK, nbt -> { + nbt.setID("business:click"); + nbt.set(BUSINESS_TAG, b.getUniqueId()); + })); + + if (limit > 1) { + if (i > 0) + inv.setItem(47, Items.prev(STORED)); + + if (i < (limit - 1)) + inv.setItem(53, Items.next(STORED)); + } + + invs.add(inv); + } + + return invs; + } + // Utilities public static void modelData(@NotNull ItemStack item, int data) { diff --git a/nms/1_13_R2/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV2.java b/nms/1_13_R2/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV2.java index 4faf6f09..254c8785 100644 --- a/nms/1_13_R2/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV2.java +++ b/nms/1_13_R2/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV2.java @@ -616,6 +616,13 @@ public void removeAdvertising(Player p) { @Subcommand({"mailbox", "mail"}) public void mailbox(Player p) { wrapper.mailbox(p, Business.byOwner(p)); } + + @Subcommand("copyright") + @DefaultFor("business copyright") + public void businessCopyright(Player p) { wrapper.businessCopyright(p); } + + @Subcommand({"copyright register", "copyright add"}) + public void addBusinessCopyright(Player p) { wrapper.registerBusinessCopyright(p); } } @Command({"nbank", "bank", "globalbank", "gbank"}) diff --git a/nms/1_8_R1/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV1.java b/nms/1_8_R1/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV1.java index 3178f771..2913f14a 100644 --- a/nms/1_8_R1/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV1.java +++ b/nms/1_8_R1/src/main/java/us/teaminceptus/novaconomy/CommandWrapperV1.java @@ -1142,6 +1142,28 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String mailbox(p, Business.byOwner(p)); break; } + case "copright": { + if (!(sender instanceof Player)) return false; + Player p = (Player) sender; + + if (args.length < 2) { + businessCopyright(p); + return false; + } + + switch (args[1].toLowerCase()) { + case "add": + case "register": { + registerBusinessCopyright(p); + break; + } + default: { + messages.sendMessage(p, "error.argument"); + return false; + } + } + break; + } default: { messages.sendMessage(sender, "error.argument"); return false; diff --git a/plugin/src/main/java/us/teaminceptus/novaconomy/GUIManager.java b/plugin/src/main/java/us/teaminceptus/novaconomy/GUIManager.java index 47d8c574..bef86f83 100644 --- a/plugin/src/main/java/us/teaminceptus/novaconomy/GUIManager.java +++ b/plugin/src/main/java/us/teaminceptus/novaconomy/GUIManager.java @@ -25,10 +25,7 @@ import us.teaminceptus.novaconomy.api.auction.AuctionHouse; import us.teaminceptus.novaconomy.api.auction.AuctionProduct; import us.teaminceptus.novaconomy.api.bank.Bank; -import us.teaminceptus.novaconomy.api.business.Business; -import us.teaminceptus.novaconomy.api.business.BusinessProduct; -import us.teaminceptus.novaconomy.api.business.BusinessStatistics; -import us.teaminceptus.novaconomy.api.business.Rating; +import us.teaminceptus.novaconomy.api.business.*; import us.teaminceptus.novaconomy.api.corporation.Corporation; import us.teaminceptus.novaconomy.api.corporation.CorporationPermission; import us.teaminceptus.novaconomy.api.corporation.CorporationRank; @@ -2179,6 +2176,31 @@ static Map> items() { p.openInventory(Generator.generateMailbox(o, SortingType.MAIL_DATE_ASCENDING, p).get(0)); NovaSound.ITEM_BOOK_PAGE_TURN.play(p); }) + .put("business:remove_copyright", (e, inv) -> { + Player p = (Player) e.getWhoClicked(); + ItemStack item = e.getCurrentItem(); + NBTWrapper nbt = of(item); + + Business b = getBusiness(item); + Product bp = nbt.getProduct(PRODUCT_TAG); + + NovaInventory confirm = confirm(p, cInv -> { + BusinessCopyright.removeOwner(bp.getItem()); + p.openInventory(generateBusinessCopyright(b, SortingType.MATERIAL_TYPE_ASCENDING, p).get(0)); + NovaSound.ENTITY_ARROW_HIT_PLAYER.playSuccess(p); + }); + + confirm.setItem(13, bp.getItem()); + p.openInventory(confirm); + }) + .put("business:copyright", (e, inv) -> { + Player p = (Player) e.getWhoClicked(); + ItemStack item = e.getCurrentItem(); + Business b = getBusiness(item); + + p.openInventory(generateBusinessCopyright(b, SortingType.MATERIAL_TYPE_ASCENDING, p).get(0)); + NovaSound.BLOCK_CHEST_OPEN.play(p); + }) .build(); static final Map> CLICK_INVENTORIES = ImmutableMap.>builder()