Compare commits

...

8 Commits

Author SHA1 Message Date
Auxilor
162558b1c2 Updated to 6.43.3 2022-10-03 13:44:28 +01:00
Auxilor
10f9e8dce0 Fixed Skull 2022-10-03 13:44:17 +01:00
Will FP
b02943d7ff Merge pull request #204
Fix: Skull texture out of bounds error
2022-10-03 13:42:39 +01:00
Auxilor
40ad970ffa Updated to 6.43.2 2022-10-03 13:00:02 +01:00
Auxilor
aefdfa786d Fixed menu rendering bugs 2022-10-03 12:59:54 +01:00
MillionthOdin16
1cf08955a0 Additional check for bounds error
explanation in comment
2022-10-02 19:33:37 -04:00
Auxilor
4077a4c28b Updated to 6.43.1 2022-10-02 20:01:30 +01:00
Auxilor
6c375ef297 Fixed changing held item edge case 2022-10-02 20:01:23 +01:00
8 changed files with 106 additions and 43 deletions

View File

@@ -107,7 +107,7 @@ public interface MenuBuilder extends PageBuilder {
* @return The builder.
*/
default MenuBuilder addPage(@NotNull final Page page) {
return this.addComponent(MenuLayer.TOP, 1, 1, page);
return this.addComponent(MenuLayer.UPPER, 1, 1, page);
}
/**

View File

@@ -79,7 +79,7 @@ public final class PageChanger implements GUIComponent {
return null;
}
if (page >= maxPage - 1 && this.direction == Direction.FORWARDS) {
if (page >= maxPage && this.direction == Direction.FORWARDS) {
return null;
}

View File

@@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack
class EcoMenu(
private val rows: Int,
private val columns: Int,
private val componentsAtPoints: Map<GUIPosition, List<OffsetComponent>>,
private val components: LayeredComponents,
private val title: String,
private val onClose: List<CloseHandler>,
private val onRender: List<(Player, Menu) -> Unit>,
@@ -28,38 +28,19 @@ class EcoMenu(
private val menuEventHandlers: List<MenuEventHandler<*>>,
private val allowsChangingHeldItem: Boolean
) : Menu {
private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?, menu: Menu?): Slot {
private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?): Slot {
if (row < 1 || row > this.rows || column < 1 || column > this.columns) {
return emptyFillerSlot
}
val guiPosition = GUIPosition(row, column)
val components = componentsAtPoints[guiPosition] ?: return emptyFillerSlot
for (component in components) {
val found = if (player != null && menu != null) component.component.getSlotAt(
component.rowOffset,
component.columnOffset,
player,
menu
) else component.component.getSlotAt(
component.rowOffset,
component.columnOffset
)
if (found != null) {
return found
}
}
return emptyFillerSlot
return components.getSlotAt(row, column, player, this)
}
override fun getSlot(row: Int, column: Int): Slot =
getPossiblyReactiveSlot(row, column, null, null)
getPossiblyReactiveSlot(row, column, null)
override fun getSlot(row: Int, column: Int, player: Player, menu: Menu): Slot =
getPossiblyReactiveSlot(row, column, player, menu)
getPossiblyReactiveSlot(row, column, player)
override fun open(player: Player): Inventory {
val inventory = if (columns == 9) {

View File

@@ -86,7 +86,7 @@ class EcoMenuBuilder(
}
override fun build(): Menu {
val layeredComponents = mutableMapOf<MenuLayer, MutableMap<GUIPosition, MutableList<OffsetComponent>>>()
val layeredComponents = LayeredComponents()
// 5 nested for loops? Shut up. Silence. Quiet.
for (layer in MenuLayer.values()) {
@@ -107,11 +107,14 @@ class EcoMenuBuilder(
val point = GUIPosition(row, column)
layeredComponents.computeIfAbsent(layer) { mutableMapOf() }
.computeIfAbsent(point) { mutableListOf() } += OffsetComponent(
component,
rowOffset,
columnOffset
layeredComponents.addOffsetComponent(
layer,
point,
OffsetComponent(
component,
rowOffset,
columnOffset
)
)
}
}
@@ -119,18 +122,10 @@ class EcoMenuBuilder(
}
}
val componentsAtPoints = mutableMapOf<GUIPosition, MutableList<OffsetComponent>>()
for (menuLayer in MenuLayer.values()) {
for ((anchor, offsetComponents) in layeredComponents[menuLayer] ?: emptyMap()) {
componentsAtPoints[anchor] = offsetComponents
}
}
return EcoMenu(
rows,
columns,
componentsAtPoints,
layeredComponents,
title,
onClose,
onRender,

View File

@@ -0,0 +1,46 @@
package com.willfp.eco.internal.gui.menu
import com.willfp.eco.core.gui.menu.Menu
import com.willfp.eco.core.gui.menu.MenuLayer
import com.willfp.eco.core.gui.slot.Slot
import org.bukkit.entity.Player
class LayeredComponents {
private val layers = mutableMapOf<MenuLayer, Map<GUIPosition, List<OffsetComponent>>>()
fun getSlotAt(row: Int, column: Int, player: Player?, menu: Menu): Slot {
val guiPosition = GUIPosition(row, column)
for (layer in MenuLayer.values().reversed()) {
val componentsAtPoints = layers[layer] ?: continue
val components = componentsAtPoints[guiPosition] ?: continue
for (component in components) {
val found = if (player != null) component.component.getSlotAt(
component.rowOffset,
component.columnOffset,
player,
menu
) else component.component.getSlotAt(
component.rowOffset,
component.columnOffset
)
if (found != null) {
return found
}
}
}
return emptyFillerSlot
}
fun addOffsetComponent(layer: MenuLayer, position: GUIPosition, component: OffsetComponent) {
val inLayer = layers[layer]?.toMutableMap() ?: mutableMapOf()
val atPosition = inLayer[position]?.toMutableList() ?: mutableListOf()
atPosition.add(component)
inLayer[position] = atPosition
layers[layer] = inLayer
}
}

View File

@@ -29,7 +29,27 @@ var SkullMeta.texture: String?
setProfile.isAccessible = true
}
if (base64 == null) {
/* This length check below was lost in the conversion. For some reason the base64
* string is length 8 when this is called pretty frequently, causing an
* out of bounds exception.
*
* Could not pass event EntityPotionEffectEvent to Talismans v5.116.0
* java.lang.StringIndexOutOfBoundsException: begin -12, end 8, length 8
* at java.lang.String.checkBoundsBeginEnd(String.java:4604) ~[?:?]
* at java.lang.String.substring(String.java:2707) ~[?:?]
* at java.lang.String.substring(String.java:2680) ~[?:?]
* at com.willfp.eco.internal.spigot.proxy.v1_19_R1.common.SkullKt.setTexture(Skull.kt:36)
*
if (base64.length < 20) {
return
}
*
* ^ Update to this comment: a length 8 string ("textures") was being sent
* because the get() method wasn't working right. This has been fixed, but the
* check needs to remain implemented.
*/
if (base64 == null || base64.length < 20) {
setProfile.invoke(this, null)
} else {
val uuid = UUID(

View File

@@ -125,6 +125,27 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
event.isCancelled = true
}
@EventHandler(
priority = EventPriority.HIGHEST
)
fun preventMovingHeld(event: InventoryClickEvent) {
val player = event.player
val rendered = player.renderedInventory ?: return
if (rendered.menu.allowsChangingHeldItem()) {
return
}
if (event.clickedInventory !is PlayerInventory) {
return
}
if (event.slot == player.inventory.heldItemSlot) {
event.isCancelled = true
}
}
@EventHandler(
priority = EventPriority.LOW
)

View File

@@ -1,3 +1,3 @@
version = 6.43.0
version = 6.43.3
plugin-name = eco
kotlin.code.style = official