Skip to content

Commit d696798

Browse files
committed
Safe access to the offer list (#118 #120)
Signed-off-by: Hendrix-Shen <[email protected]>
1 parent 92b6034 commit d696798

File tree

8 files changed

+55
-38
lines changed

8 files changed

+55
-38
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.plusls.MasaGadget.api.fake;
2+
3+
import net.minecraft.world.item.trading.MerchantOffers;
4+
5+
public interface AbstractVillagerAccessor {
6+
MerchantOffers masa_gadget$safeGetOffers();
7+
}

src/main/java/com/plusls/MasaGadget/impl/feature/entityInfo/VillageTradeEnchantedBookInfo.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.plusls.MasaGadget.impl.feature.entityInfo;
22

33
import com.google.common.collect.Lists;
4+
import com.plusls.MasaGadget.api.fake.AbstractVillagerAccessor;
45
import com.plusls.MasaGadget.util.PcaSyncProtocol;
56
import net.minecraft.ChatFormatting;
67
import net.minecraft.client.Minecraft;
@@ -43,7 +44,7 @@ public class VillageTradeEnchantedBookInfo {
4344

4445
List<Component> ret = Lists.newArrayList();
4546

46-
for (MerchantOffer tradeOffer : villager.getOffers()) {
47+
for (MerchantOffer tradeOffer : ((AbstractVillagerAccessor) (villager)).masa_gadget$safeGetOffers()) {
4748
ItemStack sellItem = tradeOffer.getResult();
4849
ItemStackCompat sellItemCompat = ItemStackCompat.of(sellItem);
4950

src/main/java/com/plusls/MasaGadget/impl/feature/entityInfo/VillagerNextRestockTimeInfo.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.plusls.MasaGadget.impl.feature.entityInfo;
22

3+
import com.plusls.MasaGadget.api.fake.AbstractVillagerAccessor;
34
import com.plusls.MasaGadget.mixin.accessor.AccessorVillager;
45
import com.plusls.MasaGadget.util.PcaSyncProtocol;
56
import net.minecraft.ChatFormatting;
@@ -61,7 +62,7 @@ public class VillagerNextRestockTimeInfo {
6162
// 因为刁民的需要补货的函数,会检查当前货物是否被消耗,从使用的角度只需要关心当前货物是否用完
6263
private static boolean needsRestock(@NotNull Villager villagerEntity) {
6364
if (villagerEntity.getVillagerData().getProfession() != VillagerProfession.NONE) {
64-
for (MerchantOffer offer : villagerEntity.getOffers()) {
65+
for (MerchantOffer offer : ((AbstractVillagerAccessor) (villagerEntity)).masa_gadget$safeGetOffers()) {
6566
if (offer.isOutOfStock()) {
6667
return true;
6768
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.plusls.MasaGadget.mixin;
2+
3+
import com.plusls.MasaGadget.api.fake.AbstractVillagerAccessor;
4+
import net.minecraft.world.entity.npc.AbstractVillager;
5+
import net.minecraft.world.item.trading.MerchantOffers;
6+
import org.spongepowered.asm.mixin.Mixin;
7+
import org.spongepowered.asm.mixin.Shadow;
8+
9+
//#if MC > 12006
10+
//$$ import org.jetbrains.annotations.Nullable;
11+
//#endif
12+
13+
@Mixin(AbstractVillager.class)
14+
public abstract class MixinAbstractVillager implements AbstractVillagerAccessor {
15+
//#if MC > 12006
16+
//$$ @Shadow
17+
//$$ @Nullable
18+
//$$ protected MerchantOffers offers;
19+
//$$ @Shadow
20+
//$$ protected abstract void updateTrades();
21+
//#else
22+
@Shadow
23+
public abstract MerchantOffers getOffers();
24+
//#endif
25+
26+
@Override
27+
public MerchantOffers masa_gadget$safeGetOffers() {
28+
//#if MC > 12006
29+
//$$ if (this.offers == null) {
30+
//$$ this.offers = new MerchantOffers();
31+
//$$ this.updateTrades();
32+
//$$ }
33+
//$$
34+
//$$ return this.offers;
35+
//#else
36+
return this.getOffers();
37+
//#endif
38+
}
39+
}

src/main/java/com/plusls/MasaGadget/mixin/mod_tweak/tweakeroo/inventoryPreviewSupportTradeOfferList/MixinAbstractVillager.java

-8
This file was deleted.

src/main/java/com/plusls/MasaGadget/mixin/mod_tweak/tweakeroo/inventoryPreviewSupportTradeOfferList/MixinRenderUtils.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.plusls.MasaGadget.mixin.mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList;
22

3+
import com.plusls.MasaGadget.api.fake.AbstractVillagerAccessor;
34
import com.plusls.MasaGadget.game.Configs;
45
import com.plusls.MasaGadget.impl.generic.HitResultHandler;
56
import com.plusls.MasaGadget.util.ModId;
@@ -74,12 +75,12 @@ private static Container renderTradeOfferList(Container inv) {
7475

7576
SimpleContainer simpleInventory = new SimpleContainer(MixinRenderUtils.masa_gadget$maxTradeOfferSize);
7677

77-
for (MerchantOffer tradeOffer : abstractVillager.getOffers()) {
78-
for (int i = 0; i < simpleInventory.getContainerSize(); ++i) {
78+
for (MerchantOffer tradeOffer : ((AbstractVillagerAccessor) (abstractVillager)).masa_gadget$safeGetOffers()) {
79+
for (int i = 0; i < simpleInventory.getContainerSize(); i++) {
7980
ItemStack itemStack = simpleInventory.getItem(i);
8081

8182
if (itemStack.isEmpty()) {
82-
simpleInventory.setItem(i, tradeOffer.getResult().copy());
83+
simpleInventory.setItem(i, tradeOffer.getResult());
8384
break;
8485
}
8586
}

src/main/resources/masa_gadget_mod.mixins.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"compatibilityLevel": "JAVA_8",
66
"plugin": "top.hendrixshen.magiclib.impl.mixin.MagicMixinPlugin",
77
"client": [
8+
"MixinAbstractVillager",
89
"MixinConnection",
910
"accessor.AccessorAbstractMinecartContainer",
1011
"accessor.AccessorAbstractVillager",
@@ -50,7 +51,6 @@
5051
"mod_tweak.tweakeroo.inventoryPreviewSupportSelect.MixinInGameHud",
5152
"mod_tweak.tweakeroo.inventoryPreviewSupportSelect.MixinInventoryOverlay",
5253
"mod_tweak.tweakeroo.inventoryPreviewSupportShulkerBoxItemEntity.MixinRenderUtils",
53-
"mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinAbstractVillager",
5454
"mod_tweak.tweakeroo.inventoryPreviewSupportTradeOfferList.MixinRenderUtils",
5555
"mod_tweak.tweakeroo.inventoryPreviewSyncDataClientOnly.MixinClientPacketListener",
5656
"mod_tweak.tweakeroo.inventoryPreviewUseCache.MixinMixinRenderUtils"

versions/1.21.0-fabric/src/main/java/com/plusls/MasaGadget/mixin/mod_tweak/tweakeroo/inventoryPreviewSupportTradeOfferList/MixinAbstractVillager.java

-24
This file was deleted.

0 commit comments

Comments
 (0)