diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 6f8fdb3..e23e4e6 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -16,7 +16,7 @@ - + @@ -29,6 +29,7 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index bb59e99..ec33152 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/modules/WaypointShareSystem/build.gradle.kts b/modules/WaypointShareSystem/build.gradle.kts new file mode 100644 index 0000000..96a7dda --- /dev/null +++ b/modules/WaypointShareSystem/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("java") +} + +group = "de.nick" +version = "unspecified" + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(platform("org.junit:junit-bom:5.10.0")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/WaypointShareModule.kt b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/WaypointShareModule.kt new file mode 100644 index 0000000..6c9cd01 --- /dev/null +++ b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/WaypointShareModule.kt @@ -0,0 +1,20 @@ +package de.nick.waypointsharesystem + +import de.nick.waypointsharesystem.listener.ChatListener +import de.nick.waypointsharesystem.listener.InventoryClickListener +import net.derfarmer.moduleloader.modules.Module + +object WaypointShareModule : Module() { + override fun onEnable() { + println("EV WaypointShare loading") + register(ChatListener) + register(InventoryClickListener) + println("EV WaypointShare Enabled") + } + + override fun onDisable() { + } + + override fun onReload() { + } +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/ChatListener.kt b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/ChatListener.kt new file mode 100644 index 0000000..2dff03b --- /dev/null +++ b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/ChatListener.kt @@ -0,0 +1,101 @@ +package de.nick.waypointsharesystem.listener + +import de.nick.waypointsharesystem.WaypointShareModule +import de.nick.waypointsharesystem.utils.ShareInventory +import de.nick.waypointsharesystem.utils.SkullBuilder +import io.papermc.paper.event.player.AsyncChatEvent +import net.derfarmer.moduleloader.sendMSG +import net.derfarmer.playersystem.PlayerManager +import net.derfarmer.playersystem.utils.ItemBuilder +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer +import org.bukkit.Bukkit +import org.bukkit.Material +import org.bukkit.Sound +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import java.util.* + +object ChatListener : Listener { + + val playerWaypointMessages: HashMap = HashMap() + val playerWaypointWaiting = arrayListOf() + + @EventHandler + fun onChat(event: AsyncChatEvent) { + + val messageComponent = event.message() + val messagesString = PlainTextComponentSerializer.plainText().serialize(messageComponent) + + if (playerWaypointWaiting.contains(event.player)) { + playerWaypointWaiting.remove(event.player) + event.isCancelled = true + + val targetPlayer = Bukkit.getServer().getPlayer(messagesString) + + if (targetPlayer != null && targetPlayer.isOnline) { + + targetPlayer.sendMSG("") + targetPlayer.sendMSG("waypointshare.send.privat.message", event.player.name) + targetPlayer.sendMSG("waypointshare.send.privat.waypointmessage", getLastWaypointMessage(event.player.uniqueId).toString()) + targetPlayer.sendMSG("") + targetPlayer.playSound(targetPlayer.location, Sound.BLOCK_NOTE_BLOCK_BASS, 10.0F, 10.0F) + + event.player.sendMessage("§7Du hast §aerfolgreich §7den Waypoint an den Spieler §a" + targetPlayer.name + " §7geschickt") + return + } + event.player.sendMSG("waypointshare.player.notOnline", messagesString) + event.player.playSound(event.player.location, Sound.BLOCK_GLASS_BREAK, 10.0F, 10.0F) + } + + if (!messagesString.lowercase().startsWith("xaero-waypoint:")) return + + event.isCancelled = true + + playerWaypointMessages[event.player.uniqueId] = messagesString + + val sendInventory = ShareInventory().inventory + + + for (i in 0.. 26) { + sendInventory.setItem(i, ItemBuilder(Material.GRAY_STAINED_GLASS_PANE).setDisplayName(" ").build()) + } + + sendInventory.setItem(10, SkullBuilder() + .setDisplayName("§6Schicke den §e§lWaypoint §6an einen Freund") + .setSkullOwner("76cbae7246cc2c6e888587198c7959979666b4f5a4088f24e26e075f140ae6c3") + .build()) + + sendInventory.setItem(13, SkullBuilder() + .setDisplayName("§9Schicke den §b§lWaypoint §9an alle.") + .setSkullOwner("bdde594dead88b35bc21ad1ab238dcae411253e34a585d925258ce674c642617") + .build()) + + if (PlayerManager.getClanName(event.player).isBlank()) { + sendInventory.setItem(16, SkullBuilder() + .setDisplayName("§2Du bist leider in keinem Clan") + .setSkullOwner("4a2fe01a1f7d76f3cd6ddb53d5325a398ad748d718ae720a6bc23382867d6531") + .build()) + + + Bukkit.getRegionScheduler().execute(WaypointShareModule.plugin, event.player.location) { + event.player.openInventory(sendInventory) + } + return + } + + sendInventory.setItem(16, SkullBuilder() + .setDisplayName("§2Schicke den §a§lWaypoint §2nur an Clanmitglieder.") + .setSkullOwner("e730127542440ef0e18b4a2994fbd097e9529d59f6cedb57dbfd5fb6134a606d") + .build()) + + + Bukkit.getRegionScheduler().execute(WaypointShareModule.plugin, event.player.location) { + event.player.openInventory(sendInventory) + event.player.playSound(event.player.location, Sound.BLOCK_CHEST_OPEN, 10.0F, 10.0F) + } + } + fun getLastWaypointMessage(player: UUID): String? { + return playerWaypointMessages[player] + } +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/InventoryClickListener.kt b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/InventoryClickListener.kt new file mode 100644 index 0000000..98924e0 --- /dev/null +++ b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/listener/InventoryClickListener.kt @@ -0,0 +1,83 @@ +package de.nick.waypointsharesystem.listener + +import de.nick.waypointsharesystem.utils.ShareInventory +import net.derfarmer.moduleloader.sendMSG +import net.derfarmer.playersystem.PlayerManager +import net.derfarmer.playersystem.clan.ClanManager +import net.kyori.adventure.text.Component +import org.bukkit.Bukkit +import org.bukkit.Sound +import org.bukkit.entity.Player +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.inventory.InventoryClickEvent + +object InventoryClickListener : Listener { + + @EventHandler + fun onInventoryClick(event: InventoryClickEvent) { + + if (event.inventory.holder !is ShareInventory) return + + val player = event.whoClicked + if(player !is Player) return + + event.isCancelled = true + + val waypointMessage = ChatListener.getLastWaypointMessage(player.uniqueId) ?: return + + when(event.slot) { + 10 -> { + if (ChatListener.playerWaypointWaiting.contains(player)) { + player.closeInventory() + player.sendMSG("waypointshare.type.playername.inchat") + player.playSound(player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 10.0F, 10.0F) + player.closeInventory() + return + } + ChatListener.playerWaypointWaiting.add(player) + player.sendMSG("waypointshare.type.playername.inchat") + player.playSound(player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 10.0F, 10.0F) + player.closeInventory() + } + 13 -> { + ChatListener.playerWaypointMessages.remove(player.uniqueId) + + Bukkit.getOnlinePlayers().forEach { onlinePlayer -> + onlinePlayer.sendMSG("") + onlinePlayer.sendMSG("waypointshare.send.global.message", player.name) + onlinePlayer.sendMSG("waypointshare.waypointMessage", waypointMessage) + onlinePlayer.sendMSG("") + onlinePlayer.playSound(player.location, Sound.BLOCK_NOTE_BLOCK_BASS, 10.0F, 10.0F) + } + } + 16 -> { + ChatListener.playerWaypointMessages.remove(player.uniqueId) + if (PlayerManager.getClanName(player).isBlank()) { + + player.sendMSG("waypointshare.you.not.clan") + player.playSound(player.location, Sound.BLOCK_GLASS_BREAK, 10.0F, 10.0F) + return + } + + + val clan = PlayerManager.getClan(player) + + if (clan != null) { + + ClanManager.sendClanMessage(player, clan, Component.text("hat ein waypoint geteilt")) + ClanManager.sendClanMessage(player, clan, Component.text(waypointMessage)) + + Bukkit.getOnlinePlayers().forEach { onlinePlayer -> + if (PlayerManager.getClan(onlinePlayer) == PlayerManager.getClan(player)) { + onlinePlayer.playSound(onlinePlayer.location, Sound.BLOCK_NOTE_BLOCK_BASS, 10.0F, 10.0F) + } + } + } + + player.closeInventory() + + } + } + } +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/ShareInventory.kt b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/ShareInventory.kt new file mode 100644 index 0000000..524bc47 --- /dev/null +++ b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/ShareInventory.kt @@ -0,0 +1,13 @@ +package de.nick.waypointsharesystem.utils + +import net.kyori.adventure.text.Component +import org.bukkit.Bukkit +import org.bukkit.inventory.Inventory +import org.bukkit.inventory.InventoryHolder + +class ShareInventory : InventoryHolder { + override fun getInventory(): Inventory { + + return Bukkit.createInventory(this, 3*9, Component.text("WaypointShare")) + } +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/SkullBuilder.kt b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/SkullBuilder.kt new file mode 100644 index 0000000..e069fa8 --- /dev/null +++ b/modules/WaypointShareSystem/src/main/kotlin/de/nick/waypointsharesystem/utils/SkullBuilder.kt @@ -0,0 +1,194 @@ +package de.nick.waypointsharesystem.utils + +import org.bukkit.Bukkit +import org.bukkit.Color +import org.bukkit.FireworkEffect +import org.bukkit.Material +import org.bukkit.enchantments.Enchantment +import org.bukkit.inventory.ItemFlag +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.FireworkEffectMeta +import org.bukkit.inventory.meta.LeatherArmorMeta +import org.bukkit.inventory.meta.PotionMeta +import org.bukkit.inventory.meta.SkullMeta +import org.bukkit.potion.PotionEffect +import org.bukkit.potion.PotionEffectType +import org.bukkit.potion.PotionType +import java.net.MalformedURLException +import java.net.URL +import java.util.* + +class SkullBuilder { + private var itemStack: ItemStack? + private var amount = 1 + private var customModelData = 0 + private var potionDuration = 0 + private var potionAmplifier = 0 + private var name: String? = null + private var skullOwner: String? = null + private var uuid: UUID? = null + private var lore: List = ArrayList() + private val enchantments = HashMap() + private var color: Color? = null + private var potionEffectType: PotionEffectType? = null + private var potionType: PotionType? = null + private var unbreakable = false + private var hideFlags = false + private var glow = false + + constructor() { + this.itemStack = ItemStack(Material.PLAYER_HEAD) + } + + constructor(itemStack: ItemStack) { + this.itemStack = itemStack.clone() + } + + fun setAmount(amount: Int): SkullBuilder { + this.amount = amount + return this + } + + fun setCustomModelData(customModelData: Int): SkullBuilder { + this.customModelData = customModelData + return this + } + + fun setDisplayName(name: String?): SkullBuilder { + this.name = name + return this + } + + fun setSkullOwner(skullOwner: String?): SkullBuilder { + this.skullOwner = skullOwner + return this + } + + fun setSkullOwner(uuid: UUID?): SkullBuilder { + this.uuid = uuid + return this + } + + fun setLore(lore: List?): SkullBuilder { + this.lore = ArrayList(lore) + return this + } + + fun addEnchantment(enchantment: Enchantment, level: Int): SkullBuilder { + enchantments[enchantment] = level + return this + } + + fun setColor(color: Color?): SkullBuilder { + this.color = color + return this + } + + fun setPotionEffectType(potionEffectType: PotionEffectType?, duration: Int, amplifier: Int): SkullBuilder { + this.potionEffectType = potionEffectType + this.potionDuration = duration + this.potionAmplifier = amplifier + return this + } + + fun setPotionType(potionType: PotionType?): SkullBuilder { + this.potionType = potionType + return this + } + + fun setUnbreakable(unbreakable: Boolean): SkullBuilder { + this.unbreakable = unbreakable + return this + } + + fun setHideFlags(hideFlags: Boolean): SkullBuilder { + this.hideFlags = hideFlags + return this + } + + fun setGlow(glow: Boolean): SkullBuilder { + this.glow = glow + return this + } + + fun build(): ItemStack? { + checkNotNull(this.itemStack) { "ItemStack cannot be null" } + + itemStack!!.amount = this.amount + val itemMeta = itemStack!!.itemMeta + ?: throw IllegalStateException("ItemMeta cannot be null") + + itemMeta.isUnbreakable = unbreakable + + if (this.name != null) { + itemMeta.setDisplayName(this.name) + } + if (!lore.isEmpty()) { + itemMeta.lore = lore + } + + if (!enchantments.isEmpty()) { + for (enchantment in enchantments.keys) { + itemMeta.addEnchant(enchantment, enchantments[enchantment]!!, true) + } + } + + if (this.customModelData > 0) { + itemMeta.setCustomModelData(this.customModelData) + this.hideFlags = true + } + + if (this.hideFlags) { + itemMeta.addItemFlags(*ItemFlag.entries.toTypedArray()) + } + + + itemStack!!.setItemMeta(itemMeta) + + if (this.color != null) { + if (itemStack!!.type == Material.FIREWORK_STAR) { + val fireworkEffectMeta = itemStack!!.itemMeta as FireworkEffectMeta + val fireworkEffect = FireworkEffect.builder().withColor(color!!).build() + fireworkEffectMeta.effect = fireworkEffect + itemStack!!.setItemMeta(fireworkEffectMeta) + } else if (itemStack!!.itemMeta is LeatherArmorMeta) { + val leatherArmorMeta = itemStack!!.itemMeta as LeatherArmorMeta + leatherArmorMeta.setColor(this.color) + itemStack!!.setItemMeta(leatherArmorMeta) + } + } + + if (this.uuid != null && itemStack!!.itemMeta is SkullMeta) { + val skullMeta = itemStack!!.itemMeta as SkullMeta + val playerProfile = Bukkit.createPlayerProfile(uuid!!) + skullMeta.ownerProfile = playerProfile + itemStack!!.setItemMeta(skullMeta) + } + + if (this.skullOwner != null && itemStack!!.itemMeta is SkullMeta) { + val skullMeta = itemStack!!.itemMeta as SkullMeta + val playerProfile = Bukkit.createPlayerProfile(UUID.randomUUID()) + val playerTextures = playerProfile.textures + try { + playerTextures.skin = URL("http://textures.minecraft.net/texture/" + this.skullOwner) + } catch (e: MalformedURLException) { + e.printStackTrace() + } + playerProfile.setTextures(playerTextures) + skullMeta.ownerProfile = playerProfile + itemStack!!.setItemMeta(skullMeta) + } + + if (this.potionEffectType != null && itemStack!!.itemMeta is PotionMeta) { + val potionMeta = itemStack!!.itemMeta as PotionMeta + potionMeta.addCustomEffect( + PotionEffect(potionEffectType!!, this.potionDuration, this.potionAmplifier), + true + ) + itemStack!!.setItemMeta(potionMeta) + } + + + return this.itemStack + } +} \ No newline at end of file diff --git a/modules/WaypointShareSystem/src/main/resources/plugin.json b/modules/WaypointShareSystem/src/main/resources/plugin.json new file mode 100644 index 0000000..72e405f --- /dev/null +++ b/modules/WaypointShareSystem/src/main/resources/plugin.json @@ -0,0 +1,7 @@ +{ + "name": "WaypointShareModule", + "main": "de.nick.waypointsharesystem.WaypointShareModule", + "authors": [ + "nick" + ] +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 53a4fe7..71b34b4 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,4 +29,5 @@ include("modules:ElevatorSystem") include("modules:QuestSystem") include("modules:VoiceChatModule") include("modules:WebModule") +include("modules:WaypointShareSystem") include("modules:SpawnModule") \ No newline at end of file