1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
|
package at.hannibal2.skyhanni.features.garden
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent
import at.hannibal2.skyhanni.features.garden.visitor.VisitorAPI
import at.hannibal2.skyhanni.test.command.ErrorManager
import at.hannibal2.skyhanni.utils.DisplayTableEntry
import at.hannibal2.skyhanni.utils.InventoryUtils
import at.hannibal2.skyhanni.utils.ItemCategory
import at.hannibal2.skyhanni.utils.ItemUtils
import at.hannibal2.skyhanni.utils.ItemUtils.getInternalName
import at.hannibal2.skyhanni.utils.ItemUtils.getItemCategoryOrNull
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.ItemUtils.itemName
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NEUInternalName
import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
import at.hannibal2.skyhanni.utils.NEUItems.getPrice
import at.hannibal2.skyhanni.utils.NumberUtil
import at.hannibal2.skyhanni.utils.RenderUtils.renderRenderables
import at.hannibal2.skyhanni.utils.renderables.Renderable
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class AnitaMedalProfit {
private val config get() = GardenAPI.config.anitaShop
private var display = emptyList<Renderable>()
companion object {
var inInventory = false
}
enum class MedalType(val displayName: String, val factorBronze: Int) {
GOLD("§6Gold medal", 8),
SILVER("§fSilver medal", 2),
BRONZE("§cBronze medal", 1),
;
}
private fun getMedal(name: String) = MedalType.entries.firstOrNull { it.displayName == name }
@SubscribeEvent
fun onInventoryClose(event: InventoryCloseEvent) {
inInventory = false
}
@SubscribeEvent
fun onInventoryOpen(event: InventoryFullyOpenedEvent) {
if (!config.medalProfitEnabled) return
if (event.inventoryName != "Anita") return
if (VisitorAPI.inInventory) return
inInventory = true
val table = mutableListOf<DisplayTableEntry>()
for ((slot, item) in event.inventoryItems) {
try {
readItem(slot, item, table)
} catch (e: Throwable) {
ErrorManager.logErrorWithData(
e, "Error in AnitaMedalProfit while reading item '${item.itemName}'",
"item" to item,
"name" to item.itemName,
"inventory name" to InventoryUtils.openInventoryName(),
)
}
}
val newList = mutableListOf<Renderable>()
newList.add(Renderable.string("§eMedal Profit"))
newList.add(LorenzUtils.fillTable(table, padding = 5, itemScale = 0.7))
display = newList
}
private fun readItem(slot: Int, item: ItemStack, table: MutableList<DisplayTableEntry>) {
val itemName = getItemName(item) ?: return
if (itemName == " ") return
if (itemName == "§cClose") return
if (itemName == "§eUnique Gold Medals") return
if (itemName == "§aMedal Trades") return
val fullCost = getFullCost(getRequiredItems(item))
if (fullCost < 0) return
val (name, amount) = ItemUtils.readItemAmount(itemName) ?: return
var internalName = NEUInternalName.fromItemNameOrNull(name)
if (internalName == null) {
internalName = item.getInternalName()
}
val itemPrice = internalName.getPrice() * amount
if (itemPrice < 0) return
val profit = itemPrice - fullCost
val profitFormat = NumberUtil.format(profit)
val color = if (profit > 0) "§6" else "§c"
val hover = listOf(
itemName,
"",
"§7Item price: §6${NumberUtil.format(itemPrice)} ",
// TODO add more exact material cost breakdown
"§7Material cost: §6${NumberUtil.format(fullCost)} ",
"§7Final profit: §6${profitFormat} ",
)
table.add(
DisplayTableEntry(
itemName,
"$color$profitFormat",
profit,
internalName,
hover,
highlightsOnHoverSlots = listOf(slot)
)
)
}
private fun getItemName(item: ItemStack): String {
val name = item.name
val isEnchantedBook = item.getItemCategoryOrNull() == ItemCategory.ENCHANTED_BOOK
return if (isEnchantedBook) {
item.itemName
} else name
}
private fun getFullCost(requiredItems: MutableList<String>): Double {
val jacobTicketPrice = "JACOBS_TICKET".asInternalName().getPrice()
var otherItemsPrice = 0.0
for (rawItemName in requiredItems) {
val pair = ItemUtils.readItemAmount(rawItemName)
if (pair == null) {
ErrorManager.logErrorStateWithData(
"Error in Anita Medal Contest", "Could not read item amount",
"rawItemName" to rawItemName,
)
continue
}
val (name, amount) = pair
val medal = getMedal(name)
otherItemsPrice += if (medal != null) {
val bronze = medal.factorBronze * amount
bronze * jacobTicketPrice
} else {
NEUInternalName.fromItemName(name).getPrice() * amount
}
}
return otherItemsPrice
}
private fun getRequiredItems(item: ItemStack): MutableList<String> {
val items = mutableListOf<String>()
var next = false
for (line in item.getLore()) {
if (line == "§7Cost") {
next = true
continue
}
if (next) {
if (line == "") {
next = false
continue
}
items.add(line.replace("§8 ", " §8"))
}
}
return items
}
@SubscribeEvent
fun onBackgroundDraw(event: GuiRenderEvent.ChestGuiOverlayRenderEvent) {
if (inInventory) {
config.medalProfitPos.renderRenderables(
display,
extraSpace = 5,
posLabel = "Anita Medal Profit"
)
}
}
@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(3, "garden.anitaMedalProfitEnabled", "garden.anitaShop.medalProfitEnabled")
event.move(3, "garden.anitaMedalProfitPos", "garden.anitaShop.medalProfitPos")
}
}
|