Skip to content

Commit

Permalink
Add Cheat Mode to Nova Item Menu
Browse files Browse the repository at this point in the history
  • Loading branch information
Javahase committed Jul 31, 2023
1 parent 80cb5f4 commit 1c36c69
Show file tree
Hide file tree
Showing 8 changed files with 244 additions and 153 deletions.
2 changes: 2 additions & 0 deletions nova/src/main/kotlin/xyz/xenondevs/nova/item/DefaultItems.kt
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ object DefaultGuiItems {
val NUMBER = registerUnnamedHiddenCoreItem("gui_number")
val MINUS = registerUnnamedHiddenCoreItem("gui_minus")
val TP_SEARCH = registerUnnamedHiddenCoreItem("gui_tp_search")
val TP_CHEATING_ON = registerUnnamedHiddenCoreItem("gui_tp_cheating_on", "menu.nova.items.cheat_mode_item")
val TP_CHEATING_OFF = registerUnnamedHiddenCoreItem("gui_tp_cheating_off", "menu.nova.items.cheat_mode_item")
val TP_ARROW_LEFT_BTN_OFF = registerUnnamedHiddenCoreItem("gui_tp_arrow_left_btn_off")
val TP_ARROW_LEFT_BTN_ON = registerUnnamedHiddenCoreItem("gui_tp_arrow_left_btn_on")
val TP_ARROW_RIGHT_BTN_OFF = registerUnnamedHiddenCoreItem("gui_tp_arrow_right_btn_off")
Expand Down
21 changes: 20 additions & 1 deletion nova/src/main/kotlin/xyz/xenondevs/nova/item/ItemCategories.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import org.bukkit.entity.Player
import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import xyz.xenondevs.invui.item.ItemProvider
import xyz.xenondevs.invui.item.ItemWrapper
import xyz.xenondevs.invui.item.builder.setDisplayName
Expand All @@ -20,10 +21,13 @@ import xyz.xenondevs.nova.initialize.InitFun
import xyz.xenondevs.nova.initialize.InitializationStage
import xyz.xenondevs.nova.initialize.InternalInit
import xyz.xenondevs.nova.ui.menu.item.ItemMenu
import xyz.xenondevs.nova.ui.menu.item.creative.ItemsWindow
import xyz.xenondevs.nova.ui.menu.item.recipes.handleRecipeChoiceItemClick
import xyz.xenondevs.nova.util.addItemCorrectly
import xyz.xenondevs.nova.util.data.getConfigurationSectionList
import xyz.xenondevs.nova.util.data.getResourceAsStream
import xyz.xenondevs.nova.util.item.ItemUtils
import xyz.xenondevs.nova.util.item.novaItem
import java.io.File
import java.io.InputStream
import java.util.logging.Level
Expand Down Expand Up @@ -152,7 +156,22 @@ internal class CategorizedItem(val id: String) : AbstractItem() {
override fun getItemProvider() = itemWrapper

override fun handleClick(clickType: ClickType, player: Player, event: InventoryClickEvent) {
handleRecipeChoiceItemClick(player, clickType, event, this@CategorizedItem.itemWrapper)
if (player in ItemsWindow.cheaters && player.hasPermission("nova.command.give")) {
if (clickType == ClickType.MIDDLE) {
player.setItemOnCursor(itemStack.clone().apply { amount = novaItem?.maxStackSize ?: type.maxStackSize })
} else if (clickType.isShiftClick) {
player.inventory.addItemCorrectly(itemStack)
} else if (clickType == ClickType.NUMBER_KEY) {
player.inventory.setItem(event.hotbarButton, itemStack)
} else if (clickType.isMouseClick) {
if (player.itemOnCursor.isSimilar(itemStack))
player.setItemOnCursor(player.itemOnCursor.apply { amount = (amount + 1).coerceAtMost(novaItem?.maxStackSize ?: maxStackSize) })
else
player.setItemOnCursor(itemStack)
}
} else {
handleRecipeChoiceItemClick(player, clickType, event, this@CategorizedItem.itemWrapper)
}
}

override fun hashCode(): Int {
Expand Down
26 changes: 26 additions & 0 deletions nova/src/main/kotlin/xyz/xenondevs/nova/ui/item/ToggleItem.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package xyz.xenondevs.nova.ui.item

import org.bukkit.entity.Player
import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryClickEvent
import xyz.xenondevs.invui.item.ItemProvider
import xyz.xenondevs.invui.item.impl.AbstractItem

internal class ToggleItem(
var state: Boolean,
val on: ItemProvider,
val off: ItemProvider,
val onToggle: (Boolean) -> Boolean
) : AbstractItem() {

override fun getItemProvider(): ItemProvider {
return if (state) on else off
}

override fun handleClick(clickType: ClickType, player: Player, event: InventoryClickEvent) {
if (onToggle(!state)) {
state = !state
notifyWindows()
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package xyz.xenondevs.nova.ui.menu.item.creative

import io.ktor.server.config.ConfigLoader.Companion.load
import me.xdrop.fuzzywuzzy.FuzzySearch
import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.NamespacedKey
import org.bukkit.entity.Player
import org.bukkit.event.inventory.ClickType
import org.bukkit.event.inventory.InventoryClickEvent
import org.bukkit.persistence.PersistentDataType
import xyz.xenondevs.invui.gui.Gui
import xyz.xenondevs.invui.gui.PagedGui
import xyz.xenondevs.invui.gui.ScrollGui
Expand All @@ -19,18 +22,22 @@ import xyz.xenondevs.invui.window.AnvilWindow
import xyz.xenondevs.invui.window.Window
import xyz.xenondevs.invui.window.changeTitle
import xyz.xenondevs.invui.window.type.context.setTitle
import xyz.xenondevs.nova.NOVA
import xyz.xenondevs.nova.i18n.LocaleManager
import xyz.xenondevs.nova.item.DefaultGuiItems
import xyz.xenondevs.nova.item.ItemCategories
import xyz.xenondevs.nova.item.ItemCategories.OBTAINABLE_ITEMS
import xyz.xenondevs.nova.item.ItemCategory
import xyz.xenondevs.nova.item.logic.ItemListener.logic
import xyz.xenondevs.nova.ui.item.AnvilTextItem
import xyz.xenondevs.nova.ui.item.ToggleItem
import xyz.xenondevs.nova.ui.item.clickableItem
import xyz.xenondevs.nova.ui.menu.item.ItemMenu
import xyz.xenondevs.nova.ui.overlay.character.gui.DefaultGuiTextures
import xyz.xenondevs.nova.util.component.adventure.move
import xyz.xenondevs.nova.util.component.adventure.moveToStart
import xyz.xenondevs.nova.util.playClickSound
import java.util.*

private val TAB_BUTTON_TEXTURES = arrayOf(
DefaultGuiTextures.ITEMS_0,
Expand All @@ -40,6 +47,8 @@ private val TAB_BUTTON_TEXTURES = arrayOf(
DefaultGuiTextures.ITEMS_4
)

private const val GIVE_PERMISSION = "nova.command.give"

internal class ItemsWindow(val player: Player) : ItemMenu {

private var currentWindow: Window? = null
Expand All @@ -49,6 +58,19 @@ internal class ItemsWindow(val player: Player) : ItemMenu {
.setDisplayName(Component.translatable("menu.nova.items.search-item"))
) { openSearchWindow() }

private val toggleCheatModeItem = ToggleItem(
player in cheaters,
DefaultGuiItems.TP_CHEATING_ON.createClientsideItemBuilder().setDisplayName(Component.translatable("menu.nova.items.cheat_mode.on")),
DefaultGuiItems.TP_CHEATING_OFF.createClientsideItemBuilder().setDisplayName(Component.translatable("menu.nova.items.cheat_mode.off")),
) {
if (player.hasPermission(GIVE_PERMISSION)) {
player.persistentDataContainer.set(CHEAT_MODE_KEY, PersistentDataType.BOOLEAN, it)
if (it) cheaters += player else cheaters -= player
return@ToggleItem true
}
return@ToggleItem false
}

private val openMainWindowItem = clickableItem(
DefaultGuiItems.ARROW_1_UP.createClientsideItemBuilder()
.setDisplayName(Component.translatable("menu.nova.items.search.back", NamedTextColor.GRAY))
Expand Down Expand Up @@ -118,6 +140,19 @@ internal class ItemsWindow(val player: Player) : ItemMenu {
tabPagesGui.setContent(tabButtons)

updateFilteredItems()
if (player.hasPermission(GIVE_PERMISSION)) {
if (player !in cheaters && player.persistentDataContainer.get(CHEAT_MODE_KEY, PersistentDataType.BOOLEAN) ?: false) {
cheaters += player
toggleCheatModeItem.state = true
toggleCheatModeItem.notifyWindows()
}
} else {
if (player in cheaters) {
cheaters -= player
toggleCheatModeItem.state = false
toggleCheatModeItem.notifyWindows()
}
}
}

private fun handleTabPageChange(newTab: Int) {
Expand Down Expand Up @@ -206,11 +241,12 @@ internal class ItemsWindow(val player: Player) : ItemMenu {
return ScrollGui.items()
.setStructure(
"x x x x x x x x s",
"x x x x x x x x c",
"x x x x x x x x u",
"x x x x x x x x .",
"x x x x x x x x d"
)
.addIngredient('s', openSearchItem)
.addIngredient('c', toggleCheatModeItem)
.setContent(category.items)
.build()
}
Expand Down Expand Up @@ -264,4 +300,8 @@ internal class ItemsWindow(val player: Player) : ItemMenu {

}

companion object {
val CHEAT_MODE_KEY = NamespacedKey(NOVA, "cheat_mode")
val cheaters = Collections.newSetFromMap(WeakHashMap<Player, Boolean>())
}
}
2 changes: 2 additions & 0 deletions nova/src/main/resources/assets/nova/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
"menu.nova.items.search.clear": "Clear search",
"menu.nova.items.search-item": "Search...",
"menu.nova.items.category.misc": "Miscellaneous",
"menu.nova.items.cheat_mode.on": "Cheat-Mode: On",
"menu.nova.items.cheat_mode.off": "Cheat-Mode: Off",
"menu.nova.recipe": "Crafting Guide",
"menu.nova.recipe.back": "Back",
"menu.nova.recipe.item_info": "Item Info",
Expand Down
Loading

0 comments on commit 1c36c69

Please sign in to comment.