Skip to content

Commit d90f8eb

Browse files
authored
Merge pull request RobertSkalko#193 from TUsama/backpack
fix backpack pick up issue, patch the mouse relocation after clicking…
2 parents 12f6431 + 49f19b2 commit d90f8eb

File tree

8 files changed

+79
-31
lines changed

8 files changed

+79
-31
lines changed

src/main/java/com/robertx22/mine_and_slash/capability/player/container/BackpackButton.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ public class BackpackButton extends ImageButton {
2323

2424
public BackpackButton(Backpacks.BackpackType type, int xPos, int yPos) {
2525
super(xPos, yPos, SX, SY, 0, 0, SY, new ResourceLocation("empty"), (button) -> {
26-
//MOUSEPOS.X = Minecraft.getInstance().mouseHandler.xpos(); todo this isnt working for some reason
27-
//MOUSEPOS.Y = Minecraft.getInstance().mouseHandler.ypos();
28-
//MOUSEPOS.SET_MOUSE = true;
2926
Packets.sendToServer(new OpenBackpackPacket(type));
3027
});
3128
this.type = type;
@@ -47,6 +44,13 @@ public void renderWidget(GuiGraphics gui, int mouseX, int mouseY, float delta) {
4744

4845
}
4946

47+
@Override
48+
public void onClick(double pMouseX, double pMouseY) {
49+
BackpackScreen.iMouseX = Minecraft.getInstance().mouseHandler.xpos();
50+
BackpackScreen.iMouseY = Minecraft.getInstance().mouseHandler.ypos();
51+
super.onClick(pMouseX, pMouseY);
52+
}
53+
5054
public void setModTooltip() {
5155
this.setTooltip(Tooltip.create(TextUTIL.mergeList(Arrays.asList(
5256
this.type.name.locName()

src/main/java/com/robertx22/mine_and_slash/capability/player/container/BackpackScreen.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
package com.robertx22.mine_and_slash.capability.player.container;
22

3+
import com.mojang.blaze3d.platform.InputConstants;
34
import com.robertx22.mine_and_slash.capability.player.data.Backpacks;
5+
import com.robertx22.mine_and_slash.mixin_ducks.MouseHandlerDuck;
46
import com.robertx22.mine_and_slash.mmorpg.SlashRef;
7+
import net.minecraft.client.Minecraft;
58
import net.minecraft.client.gui.GuiGraphics;
69
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
710
import net.minecraft.network.chat.Component;
811
import net.minecraft.resources.ResourceLocation;
912
import net.minecraft.world.entity.player.Inventory;
13+
import net.minecraftforge.client.event.ScreenEvent;
1014

1115
public class BackpackScreen extends AbstractContainerScreen<BackpackMenu> {
1216

1317

1418
public static final ResourceLocation BACKGROUND_LOCATION = new ResourceLocation(SlashRef.MODID, "textures/gui/master_bag.png");
1519

20+
public static double iMouseX = (double)(Minecraft.getInstance().getWindow().getScreenWidth() / 2);
21+
public static double iMouseY = (double)(Minecraft.getInstance().getWindow().getHeight() / 2);
22+
1623
public BackpackScreen(BackpackMenu pMenu, Inventory pPlayerInventory, Component txt) {
1724
super(pMenu, pPlayerInventory, Component.literal(""));
1825
this.imageWidth = 199;
@@ -33,16 +40,31 @@ protected void init() {
3340
y += 18;
3441
}
3542

43+
MouseHandlerDuck mouseHandler = (MouseHandlerDuck) Minecraft.getInstance().mouseHandler;
44+
//init() will be invoked when this screen be set to Minecraft.screen after the releaseMouse(), see setScreen();
45+
mouseHandler.setXPos(iMouseX);
46+
mouseHandler.setYPos(iMouseY);
47+
//from MouseHandler.class releaseMouse()
48+
InputConstants.grabOrReleaseMouse(this.minecraft.getWindow().getWindow(), 212993, iMouseX, iMouseY);
3649
}
3750

3851
public void render(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY, float pPartialTick) {
3952
this.renderBackground(pGuiGraphics);
4053
super.render(pGuiGraphics, pMouseX, pMouseY, pPartialTick);
4154
this.renderTooltip(pGuiGraphics, pMouseX, pMouseY);
4255

56+
}
4357

58+
@Override
59+
public void onClose() {
60+
super.onClose();
61+
//reset position
62+
iMouseX = (double)(Minecraft.getInstance().getWindow().getScreenWidth() / 2);
63+
iMouseY = (double)(Minecraft.getInstance().getWindow().getHeight() / 2);
4464
}
4565

66+
67+
4668
@Override
4769
protected void renderLabels(GuiGraphics pGuiGraphics, int pMouseX, int pMouseY) {
4870
// pGuiGraphics.drawString(this.font, this.title, this.titleLabelX, this.titleLabelY, 4210752, false);

src/main/java/com/robertx22/mine_and_slash/capability/player/data/Backpacks.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,26 +96,32 @@ public BackpackInventory getInv(BackpackType type) {
9696
}
9797

9898

99-
public void tryAutoPickup(Player p, ItemStack stack) {
99+
public boolean tryAutoPickup(Player p, ItemStack stack, boolean shouldPlaySound) {
100100

101101
if (p.getInventory().countItem(SlashItems.MASTER_BAG.get()) < 1) {
102-
return;
102+
return false;
103103
}
104-
104+
boolean result = false;
105105
for (BackpackType type : BackpackType.values()) {
106106
if (type.isValid(stack)) {
107107
var bag = getInv(type);
108108

109-
if (bag.hasFreeSlots()) {
109+
if (bag.canAddItem(stack)) {
110110
bag.addItem(stack.copy());
111111
stack.shrink(stack.getCount() + 10); // just in case
112-
SoundUtils.playSound(this.player, SoundEvents.ITEM_PICKUP);
113-
return;
112+
if (shouldPlaySound) SoundUtils.playSound(this.player, SoundEvents.ITEM_PICKUP);
113+
result = true;
114+
break;
114115
}
115116
}
116117
}
117118

119+
return result;
120+
121+
}
118122

123+
public boolean tryAutoPickup(Player p, ItemStack stack){
124+
return tryAutoPickup(p, stack, true);
119125
}
120126
// todo every time before you open backpack, it will replace locked slots with blocked slots that cant be clicked on and throw out/give items back
121127

src/main/java/com/robertx22/mine_and_slash/capability/player/data/PlayerConfigData.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -121,28 +121,10 @@ public boolean trySalvageOnPickup(Player player, ItemStack stack) {
121121

122122
if (doSalvage) {
123123
SoundUtils.playSound(player, SoundEvents.EXPERIENCE_ORB_PICKUP, 0.75F, 1.25F);
124-
stack.shrink(100);
124+
stack.shrink(stack.getCount() + 100);
125125
data.getSalvageResult(ex).forEach(e -> {
126126
Backpacks backpacks = Load.backpacks(player).getBackpacks();
127-
//copy tryAutoPickup() but without playing sound
128-
if (player.getInventory().countItem(SlashItems.MASTER_BAG.get()) >= 1) {
129-
for (Backpacks.BackpackType type : Backpacks.BackpackType.values()) {
130-
if (type.isValid(e)) {
131-
var bag = backpacks.getInv(type);
132-
133-
if (bag.hasFreeSlots()) {
134-
bag.addItem(e.copy());
135-
e.shrink(e.getCount() + 10);
136-
} else {
137-
PlayerUtils.giveItem(e, player);
138-
}
139-
}
140-
}
141-
142-
} else {
143-
PlayerUtils.giveItem(e, player);
144-
}
145-
backpacks.tryAutoPickup(player, stack);
127+
if (!backpacks.tryAutoPickup(player, e, false)) PlayerUtils.giveItem(e, player);
146128
});
147129
return true;
148130
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.robertx22.mine_and_slash.mixin_ducks;
2+
3+
public interface MouseHandlerDuck {
4+
void setXPos(double pos);
5+
void setYPos(double pos);
6+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.robertx22.mine_and_slash.mixins;
2+
3+
import com.robertx22.mine_and_slash.mixin_ducks.MouseHandlerDuck;
4+
import net.minecraft.client.MouseHandler;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Shadow;
7+
8+
@Mixin(value = MouseHandler.class)
9+
public class MouseHandlerMixin implements MouseHandlerDuck {
10+
11+
12+
@Shadow private double xpos;
13+
14+
@Shadow private double ypos;
15+
16+
@Override
17+
public void setXPos(double pos) {
18+
this.xpos = pos;
19+
}
20+
21+
@Override
22+
public void setYPos(double pos) {
23+
this.ypos = pos;
24+
}
25+
}

src/main/java/com/robertx22/mine_and_slash/mmorpg/event_registers/CommonEvents.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import net.minecraftforge.event.entity.living.LivingDeathEvent;
4444
import net.minecraftforge.event.entity.living.LivingEvent;
4545
import net.minecraftforge.event.entity.player.*;
46+
import net.minecraftforge.eventbus.api.EventPriority;
4647

4748
public class CommonEvents {
4849

@@ -166,7 +167,8 @@ public static void register() {
166167
}
167168
}
168169
}
169-
});
170+
}, EventPriority.HIGHEST);
171+
170172
ForgeEvents.registerForgeEvent(PlayerEvent.Clone.class, event ->
171173

172174
{

src/main/resources/mmorpg-mixins.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
"AccessorRenderType",
2727
"ItemGlintMixin",
2828
"ItemStackMixin",
29-
"WorldRendererMixin"
29+
"WorldRendererMixin",
30+
"MouseHandlerMixin"
3031
],
3132
"injectors": {
3233
"defaultRequire": 1

0 commit comments

Comments
 (0)