Skip to content

Commit 6ed7222

Browse files
committed
Hopefully options wheel works with our stuff. ><
1 parent bd9848e commit 6ed7222

7 files changed

Lines changed: 177 additions & 93 deletions

File tree

common/src/main/java/generations/gg/generations/core/generationscore/common/client/InteractWheelGuiFactoryProxy.kt

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,46 @@ import net.minecraft.network.chat.Component
3333
import java.util.*
3434
import org.joml.Vector3f
3535

36-
fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, changeFormData: Pair<Boolean, String>): InteractWheelGUI {
36+
fun createPokemonInteractGui(
37+
pokemonID: UUID,
38+
canMountShoulder: Boolean,
39+
canGiveHeld: Boolean,
40+
canGiveCosmetic: Boolean,
41+
canRide: Boolean,
42+
changeFormData: Pair<Boolean, String>): InteractWheelGUI {
43+
44+
val mountShoulder = InteractWheelOption(
45+
iconResource = cobblemonResource("textures/gui/interact/icon_shoulder.png"),
46+
tooltipText = "cobblemon.ui.interact.mount.shoulder",
47+
onPress = {
48+
if (canMountShoulder) {
49+
InteractPokemonPacket(pokemonID, InteractTypePokemon.SHOULDER).sendToServer()
50+
closeGUI()
51+
}
52+
}
53+
)
54+
val giveItem = InteractWheelOption(
55+
iconResource = cobblemonResource("textures/gui/interact/icon_held_item.png"),
56+
tooltipText = "cobblemon.ui.interact.give.item",
57+
onPress = {
58+
InteractPokemonPacket(pokemonID, InteractTypePokemon.HELD_ITEM).sendToServer()
59+
closeGUI()
60+
}
61+
)
62+
63+
val options: Multimap<Orientation, InteractWheelOption> = ArrayListMultimap.create()
64+
options.put(Orientation.NORTHWEST, giveItem)
65+
if (canMountShoulder) {
66+
options.put(Orientation.NORTHEAST, mountShoulder)
67+
}
68+
69+
createOption(pokemonID, changeFormData)?.also { options.put(Orientation.SOUTHWEST, it) }
70+
71+
CobblemonEvents.POKEMON_INTERACTION_GUI_CREATION.post(PokemonInteractionGUICreationEvent(pokemonID, canMountShoulder, true, false /* TOODO: is the items given cosmetic in thsi context? */, false /* TODO: I'm not even sure about this part. */, options))
72+
return InteractWheelGUI(options, Component.translatable("cobblemon.ui.interact.pokemon"))
73+
}
74+
75+
fun createOption(pokemonID: UUID, changeFormData: Pair<Boolean, String>): InteractWheelOption? {
3776
var path = ""
3877
var aspect = changeFormData.second
3978
var ttt = "Transform Pokemon"
@@ -63,48 +102,20 @@ fun createPokemonInteractGui(pokemonID: UUID, canMountShoulder: Boolean, changeF
63102
}
64103
else -> aspect
65104
}
66-
}
67105

68-
val fixedFormData = changeFormData.first to aspect
69-
val mountShoulder = InteractWheelOption(
70-
iconResource = cobblemonResource("textures/gui/interact/icon_shoulder.png"),
71-
tooltipText = "cobblemon.ui.interact.mount.shoulder",
72-
onPress = {
73-
if (canMountShoulder) {
74-
InteractPokemonPacket(pokemonID, InteractTypePokemon.SHOULDER).sendToServer()
106+
return InteractWheelOption(
107+
iconResource = GenerationsCore.id(path),
108+
tooltipText = ttt,
109+
onPress = {
110+
GenerationsNetwork.sendToServer(
111+
GensInteractPokemonPacket(pokemonID, aspect)
112+
)
75113
closeGUI()
76114
}
77-
}
78-
)
79-
val giveItem = InteractWheelOption(
80-
iconResource = cobblemonResource("textures/gui/interact/icon_held_item.png"),
81-
tooltipText = "cobblemon.ui.interact.give.item",
82-
onPress = {
83-
InteractPokemonPacket(pokemonID, InteractTypePokemon.HELD_ITEM).sendToServer()
84-
closeGUI()
85-
}
86-
)
87-
88-
val changeForm = InteractWheelOption(
89-
iconResource = GenerationsCore.id(path),
90-
tooltipText = ttt,
91-
onPress = {
92-
GenerationsNetwork.sendToServer(
93-
GensInteractPokemonPacket(pokemonID, false, fixedFormData)
94-
)
95-
closeGUI()
96-
}
97-
)
98-
val options: Multimap<Orientation, InteractWheelOption> = ArrayListMultimap.create()
99-
options.put(Orientation.NORTHWEST, giveItem)
100-
if (canMountShoulder) {
101-
options.put(Orientation.NORTHEAST, mountShoulder)
102-
}
103-
if (changeFormData.first) {
104-
options.put(Orientation.SOUTHEAST, changeForm)
115+
)
105116
}
106-
CobblemonEvents.POKEMON_INTERACTION_GUI_CREATION.post(PokemonInteractionGUICreationEvent(pokemonID, canMountShoulder, true, false /* TOODO: is the items given cosmetic in thsi context? */, false /* TODO: I'm not even sure about this part. */, options))
107-
return InteractWheelGUI(options, Component.translatable("cobblemon.ui.interact.pokemon"))
117+
118+
return null
108119
}
109120

110121
private fun closeGUI() {
Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,66 @@
11
package generations.gg.generations.core.generationscore.common.mixin;
22

3+
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviour;
4+
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourSettings;
5+
import com.cobblemon.mod.common.api.riding.behaviour.RidingBehaviourState;
6+
import com.cobblemon.mod.common.entity.PlatformType;
37
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity;
48
import generations.gg.generations.core.generationscore.common.network.packets.GensInteractPokemonUIPacket;
59
import generations.gg.generations.core.generationscore.common.util.PokemonEntityFunctionsKt;
10+
import generations.gg.generations.core.generationscore.common.world.entity.PokemonInteractProxy;
11+
import kotlin.jvm.functions.Function3;
612
import net.minecraft.server.level.ServerPlayer;
713
import net.minecraft.world.InteractionHand;
814
import net.minecraft.world.InteractionResult;
915
import net.minecraft.world.entity.player.Player;
16+
import net.minecraft.world.item.ItemStack;
17+
import org.jetbrains.annotations.NotNull;
1018
import org.spongepowered.asm.mixin.Mixin;
19+
import org.spongepowered.asm.mixin.Shadow;
1120
import org.spongepowered.asm.mixin.injection.At;
1221
import org.spongepowered.asm.mixin.injection.Inject;
22+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
1323
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1424
import kotlin.Pair;
1525

1626
@Mixin(PokemonEntity.class)
17-
public class PokemonEntityMixin {
18-
@Inject(method = "mobInteract", at = @At("HEAD"), cancellable = true)
19-
private void generations$customShoulderMega(Player player, InteractionHand hand, CallbackInfoReturnable<InteractionResult> cir) {
20-
PokemonEntity self = (PokemonEntity)(Object)this;
27+
public abstract class PokemonEntityMixin {
2128

22-
if (hand == InteractionHand.MAIN_HAND && player instanceof ServerPlayer serverPlayer && self.getPokemon().getOwnerPlayer() == player) {
23-
if (player.isShiftKeyDown()) {
24-
boolean canMount = self.canSitOnShoulder();
25-
boolean canChangeForm = PokemonEntityFunctionsKt.canChangeForm(self).getFirst();
26-
String aspect = PokemonEntityFunctionsKt.canChangeForm(self).getSecond();
29+
@Inject(method = "showInteractionWheel", at = @At("HEAD"), cancellable = true)
30+
private void showInteractionWheel(ServerPlayer player, ItemStack itemStack, CallbackInfo ci) {
31+
PokemonInteractProxy.showInteractWeheel((PokemonEntity) (Object) this, player, itemStack);
32+
ci.cancel();
33+
}
2734

28-
System.out.println(self.getAspects());
29-
if (!aspect.isEmpty() && self.getAspects().contains(aspect) || self.getAspects().contains("primal") || self.getAspects().contains("ultra-fusion")) {
30-
aspect = "revert";
31-
}
3235

33-
Pair<Boolean, String> changeFormData = new Pair<>(canChangeForm, aspect);
36+
// @Inject(method = "mobInteract", at = @At("HEAD"), cancellable = true)
37+
// private void generations$customShoulderMega(Player player, InteractionHand hand, CallbackInfoReturnable<InteractionResult> cir) {
38+
// PokemonEntity self = (PokemonEntity) (Object) this;
39+
//
40+
// if (hand == InteractionHand.MAIN_HAND && player instanceof ServerPlayer serverPlayer && self.getPokemon().getOwnerPlayer() == player) {
41+
// if (player.isShiftKeyDown()) {
42+
// boolean canMount = self.canSitOnShoulder();
43+
// boolean canChangeForm = PokemonEntityFunctionsKt.canChangeForm(self).getFirst();
44+
// String aspect = PokemonEntityFunctionsKt.canChangeForm(self).getSecond();
45+
//
46+
// System.out.println(self.getAspects());
47+
// if (!aspect.isEmpty() && self.getAspects().contains(aspect) || self.getAspects().contains("primal") || self.getAspects().contains("ultra-fusion")) {
48+
// aspect = "revert";
49+
// }
50+
//
51+
// Pair<Boolean, String> changeFormData = new Pair<>(canChangeForm, aspect);
52+
//
53+
// new GensInteractPokemonUIPacket(self.getUUID(), canMount, changeFormData).sendToPlayer(serverPlayer);
54+
// cir.setReturnValue(InteractionResult.SUCCESS);
55+
// return;
56+
// } else {
57+
// if (((PokemonEntityAccessor) self).invokeAttemptItemInteraction(serverPlayer, player.getItemInHand(hand))) {
58+
// cir.setReturnValue(InteractionResult.SUCCESS);
59+
// return;
60+
// }
61+
// }
62+
// }
63+
// }
64+
//
3465

35-
new GensInteractPokemonUIPacket(self.getUUID(), canMount, changeFormData).sendToPlayer(serverPlayer);
36-
cir.setReturnValue(InteractionResult.SUCCESS);
37-
return;
38-
} else {
39-
if (((PokemonEntityAccessor)self).invokeAttemptItemInteraction(serverPlayer, player.getItemInHand(hand))) {
40-
cir.setReturnValue(InteractionResult.SUCCESS);
41-
return;
42-
}
43-
}
44-
}
45-
}
4666
}

common/src/main/java/generations/gg/generations/core/generationscore/common/network/packets/GensInteractPokemonHandler.kt

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import com.cobblemon.mod.common.api.pokemon.feature.FlagSpeciesFeature
55
import com.cobblemon.mod.common.api.pokemon.feature.SpeciesFeature
66
import com.cobblemon.mod.common.api.pokemon.feature.StringSpeciesFeature
77
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
8-
import com.cobblemon.mod.common.util.party
9-
import com.cobblemon.mod.common.util.startWith
108
import generations.gg.generations.core.generationscore.common.util.applyCosmeticFeature
119
import generations.gg.generations.core.generationscore.common.util.removeCosmeticFeature
1210
import net.minecraft.server.MinecraftServer
@@ -16,26 +14,14 @@ object GensInteractPokemonHandler : ServerNetworkPacketHandler<GensInteractPokem
1614
override fun handle(packet: GensInteractPokemonPacket, server: MinecraftServer, player: ServerPlayer) {
1715
val pokemonEntity = player.serverLevel().getEntity(packet.pokemonID)
1816
if (pokemonEntity is PokemonEntity && !pokemonEntity.isBattleClone()) {
19-
if (packet.mountShoulder) {
20-
if (!pokemonEntity.canSitOnShoulder() || player.party().none { it == pokemonEntity.pokemon }) {
21-
return
22-
}
23-
pokemonEntity.tryMountingShoulder(player)
24-
} else if (packet.changeFormData.first) {
25-
if (packet.changeFormData.second == "revert") {
26-
pokemonEntity.pokemon.removeCosmeticFeature()
27-
} else {
28-
val feature: SpeciesFeature
29-
if (packet.changeFormData.second != "ultra") {
30-
feature = FlagSpeciesFeature(packet.changeFormData.second, true)
31-
} else {
32-
feature = StringSpeciesFeature("prism_fusion", packet.changeFormData.second)
33-
}
34-
35-
pokemonEntity.pokemon.applyCosmeticFeature(feature)
36-
}
17+
if (packet.changeFormData == "revert") {
18+
pokemonEntity.pokemon.removeCosmeticFeature()
3719
} else {
38-
pokemonEntity.offerHeldItem(player, player.mainHandItem)
20+
val feature: SpeciesFeature =
21+
if (packet.changeFormData != "ultra") FlagSpeciesFeature(packet.changeFormData, true)
22+
else StringSpeciesFeature("prism_fusion", packet.changeFormData)
23+
24+
pokemonEntity.pokemon.applyCosmeticFeature(feature)
3925
}
4026
}
4127
}

common/src/main/java/generations/gg/generations/core/generationscore/common/network/packets/GensInteractPokemonPacket.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@ import java.util.UUID
1818
* @author Village
1919
* @since January 7th, 2023
2020
*/
21-
class GensInteractPokemonPacket(val pokemonID: UUID, val mountShoulder: Boolean, val changeFormData: Pair<Boolean, String>) : NetworkPacket<GensInteractPokemonPacket> {
21+
class GensInteractPokemonPacket(val pokemonID: UUID, val changeFormData: String) : NetworkPacket<GensInteractPokemonPacket> {
2222
override val id = ID
2323
override fun encode(buffer: RegistryFriendlyByteBuf) {
2424
buffer.writeUUID(pokemonID)
25-
buffer.writeBoolean(mountShoulder)
26-
buffer.writeBoolean(changeFormData.first)
27-
buffer.writeString(changeFormData.second)
25+
buffer.writeString(changeFormData)
2826
}
2927
companion object {
3028
val ID = cobblemonResource("gens_interact_pokemon")
31-
fun decode(buffer: RegistryFriendlyByteBuf) = GensInteractPokemonPacket(buffer.readUUID(), buffer.readBoolean(), Pair(buffer.readBoolean(), buffer.readString()))
29+
fun decode(buffer: RegistryFriendlyByteBuf) = GensInteractPokemonPacket(buffer.readUUID(), buffer.readString())
3230
}
3331
}

common/src/main/java/generations/gg/generations/core/generationscore/common/network/packets/GensInteractPokemonUIPacket.kt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.cobblemon.mod.common.util.readUUID
99
import com.cobblemon.mod.common.util.writeString
1010
import com.cobblemon.mod.common.util.writeUUID
1111
import net.minecraft.network.RegistryFriendlyByteBuf
12+
import net.minecraft.world.item.Item
1213
import java.util.UUID
1314

1415
/**
@@ -19,19 +20,34 @@ import java.util.UUID
1920
* @author Village
2021
* @since January 7th, 2023
2122
*/
22-
class GensInteractPokemonUIPacket(val pokemonID: UUID, val canMountShoulder: Boolean, val changeFormData: Pair<Boolean, String>): NetworkPacket<GensInteractPokemonUIPacket> {
23+
class GensInteractPokemonUIPacket(
24+
val pokemonID: UUID,
25+
val canMountShoulder: Boolean,
26+
val canGiveHeld: Boolean,
27+
val canGiveCosmetic: Boolean,
28+
val canRide: Boolean,
29+
val changeFormData: Pair<Boolean, String>): NetworkPacket<GensInteractPokemonUIPacket> {
2330

2431
override val id = ID
2532

2633
override fun encode(buffer: RegistryFriendlyByteBuf) {
2734
buffer.writeUUID(pokemonID)
2835
buffer.writeBoolean(canMountShoulder)
36+
buffer.writeBoolean(canGiveHeld)
37+
buffer.writeBoolean(canGiveCosmetic)
38+
buffer.writeBoolean(canRide)
2939
buffer.writeBoolean(changeFormData.first)
3040
buffer.writeString(changeFormData.second)
3141
}
3242

3343
companion object {
3444
val ID = cobblemonResource("gens_interact_pokemon_ui")
35-
fun decode(buffer: RegistryFriendlyByteBuf) = GensInteractPokemonUIPacket(buffer.readUUID(), buffer.readBoolean(), Pair(buffer.readBoolean(), buffer.readString()))
45+
fun decode(buffer: RegistryFriendlyByteBuf) = GensInteractPokemonUIPacket(
46+
buffer.readUUID(),
47+
buffer.readBoolean(),
48+
buffer.readBoolean(),
49+
buffer.readBoolean(),
50+
buffer.readBoolean(),
51+
Pair(buffer.readBoolean(), buffer.readString()))
3652
}
3753
}

common/src/main/java/generations/gg/generations/core/generationscore/common/network/packets/GensInteractPokemonUIPacketHandler.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import net.minecraft.client.Minecraft
66

77
object GensInteractPokemonUIPacketHandler: ClientNetworkPacketHandler<GensInteractPokemonUIPacket> {
88
override fun handle(packet: GensInteractPokemonUIPacket, client: Minecraft) {
9-
client.setScreen(createPokemonInteractGui(packet.pokemonID, packet.canMountShoulder, packet.changeFormData))
9+
client.setScreen(createPokemonInteractGui(
10+
packet.pokemonID,
11+
packet.canMountShoulder,
12+
packet.canGiveHeld,
13+
packet.canGiveCosmetic,
14+
packet.canRide,
15+
packet.changeFormData))
1016
}
1117
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package generations.gg.generations.core.generationscore.common.world.entity;
2+
3+
import com.cobblemon.mod.common.CobblemonCosmeticItems
4+
import com.cobblemon.mod.common.entity.PlatformType
5+
import com.cobblemon.mod.common.entity.pokemon.PokemonEntity
6+
import com.cobblemon.mod.common.net.messages.client.ui.InteractPokemonUIPacket
7+
import com.cobblemon.mod.common.util.isInBattle
8+
import com.cobblemon.mod.common.util.party
9+
import net.minecraft.server.level.ServerPlayer
10+
import net.minecraft.world.item.ItemStack
11+
12+
object PokemonInteractProxy {
13+
@JvmStatic
14+
fun showInteractWeheel(pokemonEntity: PokemonEntity, player: ServerPlayer, itemStack: ItemStack) =
15+
pokemonEntity.run {
16+
if (pokemon.getOwnerPlayer() == player) {
17+
18+
val canRide = ifRidingAvailableSupply(false) { behaviour, settings, state ->
19+
if (platform != PlatformType.NONE) return@ifRidingAvailableSupply false
20+
if (tethering != null) return@ifRidingAvailableSupply false;
21+
if (seats.isEmpty()) return@ifRidingAvailableSupply false;
22+
if ((owner as? ServerPlayer)?.isInBattle() == true) return@ifRidingAvailableSupply false;
23+
if (this.owner != player && this.passengers.isEmpty()) return@ifRidingAvailableSupply false;
24+
return@ifRidingAvailableSupply behaviour.isActive(settings, state, this);
25+
}
26+
if (pokemon.getOwnerPlayer() == player) {
27+
val cosmeticItemDefinition = CobblemonCosmeticItems.findValidCosmeticForPokemonAndItem(
28+
player.level().registryAccess(),
29+
pokemon,
30+
itemStack
31+
)
32+
33+
InteractPokemonUIPacket(
34+
this.getUUID(),
35+
canSitOnShoulder() && pokemon in player.party(),
36+
!(pokemon.heldItem().isEmpty && itemStack.isEmpty),
37+
(!pokemon.cosmeticItem.isEmpty && itemStack.isEmpty) || cosmeticItemDefinition != null,
38+
canRide
39+
).sendToPlayer(player)
40+
} else if (!pokemon.isWild() && canRide) {
41+
player.isShiftKeyDown = false
42+
tryRidingPokemon(player)
43+
44+
}
45+
}
46+
}
47+
}

0 commit comments

Comments
 (0)