1
1
package singh .akaalroop .meowmeals .mixin ;
2
2
3
+ import net .minecraft .entity .EntityStatuses ;
4
+ import net .minecraft .entity .effect .StatusEffectInstance ;
5
+ import net .minecraft .entity .effect .StatusEffects ;
6
+ import net .minecraft .entity .passive .CatEntity ;
7
+ import net .minecraft .entity .player .PlayerEntity ;
3
8
import net .minecraft .item .ItemStack ;
9
+ import net .minecraft .item .Items ;
10
+ import net .minecraft .particle .ParticleTypes ;
4
11
import net .minecraft .registry .Registries ;
12
+ import net .minecraft .text .MutableText ;
13
+ import net .minecraft .text .Text ;
5
14
import net .minecraft .util .ActionResult ;
15
+ import net .minecraft .util .Formatting ;
6
16
import net .minecraft .util .Identifier ;
7
17
import org .spongepowered .asm .mixin .Mixin ;
18
+ import org .spongepowered .asm .mixin .Shadow ;
19
+ import org .spongepowered .asm .mixin .Unique ;
8
20
import org .spongepowered .asm .mixin .injection .At ;
9
21
import org .spongepowered .asm .mixin .injection .Inject ;
10
22
import org .spongepowered .asm .mixin .injection .callback .CallbackInfoReturnable ;
11
- import net .minecraft .entity .passive .CatEntity ;
12
- import net .minecraft .entity .player .PlayerEntity ;
23
+
13
24
14
25
@ Mixin (CatEntity .class )
15
- public class CatEntityMixin {
26
+ public abstract class CatEntityMixin {
27
+
28
+ @ Shadow
29
+ protected abstract void tryTame (PlayerEntity player );
30
+
31
+ @ Unique
32
+ private void sendMeowMealsMessage (PlayerEntity player , String text , Formatting colour ) {
33
+ MutableText message = Text .literal ("[MeowMeals] " )
34
+ .formatted (Formatting .GOLD )
35
+ .append (Text .literal (text ).formatted (colour ));
36
+ player .sendMessage (message , false );
37
+ }
16
38
17
39
@ Inject (method = "isBreedingItem" , at = @ At ("HEAD" ), cancellable = true )
18
40
private void isBreedingItem (ItemStack stack , CallbackInfoReturnable <Boolean > cir ) {
19
- if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "cat_food_tin" )))) {
20
- cir .setReturnValue (true );
21
- }
22
- else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "fish_feast" )))) {
23
- cir .setReturnValue (true );
24
- }
25
- else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "meat_feast" )))) {
26
- cir .setReturnValue (true );
27
- }
28
- else if (stack .isOf (Registries .ITEM .get (Identifier .of ("minecraft" , "tropical_fish" )))) {
29
- cir .setReturnValue (true );
30
- }
31
- else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "smoked_rabbit" )))) {
32
- cir .setReturnValue (true );
41
+ String [] items = {
42
+ "cat_food_tin" ,
43
+ "fish_feast" ,
44
+ "meat_feast" ,
45
+ "smoked_rabbit"
46
+ };
47
+ for (String item : items ) {
48
+ if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , item )))) {
49
+ cir .setReturnValue (true );
50
+ return ;
51
+ }
33
52
}
34
- else if (stack .isOf (Registries .ITEM .get (Identifier .of ("minecraft" , "cooked_rabbit" )))) {
53
+ if (stack .isOf (Registries .ITEM .get (Identifier .of ("minecraft" , "tropical_fish" ))) ||
54
+ stack .isOf (Registries .ITEM .get (Identifier .of ("minecraft" , "cooked_rabbit" )))) {
35
55
cir .setReturnValue (true );
36
56
}
37
57
}
@@ -40,32 +60,169 @@ else if (stack.isOf(Registries.ITEM.get(Identifier.of("minecraft", "cooked_rabbi
40
60
@ Inject (method = "interactMob" , at = @ At ("HEAD" ), cancellable = true )
41
61
private void onInteractMob (PlayerEntity player , net .minecraft .util .Hand hand , CallbackInfoReturnable <ActionResult > cir ) {
42
62
ItemStack stack = player .getStackInHand (hand );
43
- if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "cat_food_tin" )))) {
44
- CatEntity cat = (CatEntity )(Object )this ;
63
+ CatEntity cat = (CatEntity ) (Object ) this ;
64
+ if (cat .getHealth () < cat .getMaxHealth () || !cat .isTamed () || cat .isBaby () || !cat .hasStatusEffect (StatusEffects .SATURATION ) || !cat .hasStatusEffect (StatusEffects .JUMP_BOOST ) || !cat .hasStatusEffect (StatusEffects .SPEED )) {
65
+ if (!cat .getWorld ().isClient ()) {
66
+ if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "cat_food_tin" )))) {
67
+ var actioned = false ;
68
+ // Heal the cat if it’s hurt
69
+ if (cat .getHealth () < cat .getMaxHealth ()) {
70
+ cat .heal (6.0f ); // 3 hearts
71
+ actioned = true ;
72
+ }
45
73
46
- // Heal the cat if it’s hurt
47
- if (cat .getHealth () < cat .getMaxHealth ()) {
48
- cat .heal (6.0f ); // 3 hearts
49
- }
74
+ // Tame the cat if it’s not already tamed
75
+ if (!cat .isTamed ()) {
76
+ cat .setOwner (player );
77
+ cat .setSitting (true );
78
+ cat .getWorld ().sendEntityStatus (cat , EntityStatuses .ADD_POSITIVE_PLAYER_REACTION_PARTICLES );
79
+ sendMeowMealsMessage (player , "Your cat liked that so much that it's now tamed! 🐱" , Formatting .GREEN );
80
+ actioned = true ;
81
+ }
50
82
51
- // Tame the cat if it’s not already tamed
52
- if (!cat .isTamed ()) {
53
- cat .setTamed (true , true );
54
- cat .setOwner (player );
55
- }
83
+ // Set in love if tamed and adult
84
+ if (cat .isTamed () && !cat .isBaby () && cat .isReadyToBreed ()) {
85
+ cat .setLoveTicks (600 ); // 30 seconds of love mode, 1 tick = 50 ms, so 20 ticks = 1 second, so 600 ticks / 20 = 30
86
+ sendMeowMealsMessage (player , "Your cat is now in love mode! 🥰" , Formatting .RED );
87
+ actioned = true ;
88
+ }
56
89
57
- // Set in love if tamed and adult
58
- if (cat . isTamed () && ! cat . isBaby () ) {
59
- cat . setLoveTicks ( 600 ); // 30 seconds of love mode, 1 tick = 50ms so 20 ticks = 1 second, so 600 ticks / 20 = 30
60
- }
90
+ // Consume one item from the stack
91
+ if (! player . getAbilities (). creativeMode && actioned ) {
92
+ stack . decrement ( 1 );
93
+ }
61
94
62
- // Consume one item from stack
63
- if (!player .getAbilities ().creativeMode ) {
64
- stack .decrement (1 );
65
- }
95
+ cir .setReturnValue (ActionResult .SUCCESS ); // or ActionResult.PASS / FAIL depending on logic
96
+ cir .cancel ();
97
+ } else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "fish_feast" )))) {
98
+ var actioned = false ;
99
+ // Heal the cat if it’s hurt
100
+ if (cat .getHealth () < cat .getMaxHealth ()) {
101
+ cat .heal (5.0f ); // 2.5 hearts
102
+ actioned = true ;
103
+ }
104
+
105
+ // Tame the cat if it’s not already tamed
106
+ if (!cat .isTamed ()) {
107
+ tryTame (player );
108
+ actioned = true ;
109
+ }
110
+
111
+ // Breed
112
+ if (cat .isTamed () && !cat .isBaby () && cat .isReadyToBreed ()) {
113
+ cat .setLoveTicks (600 );
114
+ sendMeowMealsMessage (player , "Your cat is now in love mode! 🥰" , Formatting .RED );
115
+ actioned = true ;
116
+ }
117
+
118
+ // ✨ Add potion effects
119
+ if (!cat .hasStatusEffect (StatusEffects .SPEED ) && cat .isTamed ()) {
120
+ cat .addStatusEffect (new StatusEffectInstance (StatusEffects .SPEED , 400 , 0 ));
121
+ sendMeowMealsMessage (player , "Your cat feels energised! ✨" , Formatting .GREEN );
122
+ actioned = true ;
123
+ } else if (actioned ) {
124
+ cat .getWorld ().addParticle (
125
+ ParticleTypes .HEART ,
126
+ cat .getX (), cat .getY () + 1 , cat .getZ (),
127
+ 0.0 , 0.1 , 0.0
128
+ );
129
+ sendMeowMealsMessage (player , "The cat enjoyed that! 🐟" , Formatting .YELLOW );
130
+ }
131
+
132
+ // Consume item
133
+ if (!player .getAbilities ().creativeMode && actioned ) {
134
+ stack .decrement (1 );
135
+ player .getInventory ().insertStack (new ItemStack (Items .BOWL ));
136
+ }
137
+
138
+ cir .setReturnValue (ActionResult .SUCCESS );
139
+ cir .cancel ();
140
+ } else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "meat_feast" )))) {
141
+ var actioned = false ;
142
+ // Heal the cat if it’s hurt
143
+ if (cat .getHealth () < cat .getMaxHealth ()) {
144
+ cat .heal (8.0f ); // 4 hearts
145
+ actioned = true ;
146
+ }
66
147
67
- cir .setReturnValue (ActionResult .SUCCESS ); // or ActionResult.PASS / FAIL depending on logic
68
- cir .cancel ();
148
+ // Tame the cat if it’s not already tamed
149
+ if (!cat .isTamed ()) {
150
+ tryTame (player );
151
+ actioned = true ;
152
+ }
153
+
154
+ // Breed
155
+ if (cat .isTamed () && !cat .isBaby () && cat .isReadyToBreed ()) {
156
+ cat .setLoveTicks (600 );
157
+ sendMeowMealsMessage (player , "Your cat is now in love mode! 🥰" , Formatting .RED );
158
+ actioned = true ;
159
+ }
160
+
161
+ // ✨ Add potion effects
162
+ if (!cat .hasStatusEffect (StatusEffects .SATURATION ) && cat .isTamed ()) {
163
+ cat .addStatusEffect (new StatusEffectInstance (StatusEffects .SATURATION , 400 , 0 ));
164
+ sendMeowMealsMessage (player , "Your cat feels more full! 😋" , Formatting .GREEN );
165
+ actioned = true ;
166
+ } else if (actioned ) {
167
+ cat .getWorld ().addParticle (
168
+ ParticleTypes .HEART ,
169
+ cat .getX (), cat .getY () + 1 , cat .getZ (),
170
+ 0.0 , 0.1 , 0.0
171
+ );
172
+ sendMeowMealsMessage (player , "The cat enjoyed that! 🍗" , Formatting .YELLOW );
173
+ }
174
+
175
+ // Consume item
176
+ if (!player .getAbilities ().creativeMode && actioned ) {
177
+ stack .decrement (1 );
178
+ player .getInventory ().insertStack (new ItemStack (Items .BOWL ));
179
+ }
180
+ cir .setReturnValue (ActionResult .SUCCESS );
181
+ cir .cancel ();
182
+ } else if (stack .isOf (Registries .ITEM .get (Identifier .of ("meowmeals" , "smoked_rabbit" )))) {
183
+ var actioned = false ;
184
+ // Heal the cat if it’s hurt
185
+ if (cat .getHealth () < cat .getMaxHealth ()) {
186
+ cat .heal (4.0f ); // 2 hearts
187
+ actioned = true ;
188
+ }
189
+
190
+ // Tame the cat if it’s not already tamed
191
+ if (!cat .isTamed ()) {
192
+ tryTame (player );
193
+ actioned = true ;
194
+ }
195
+
196
+ // Breed
197
+ if (cat .isTamed () && !cat .isBaby () && cat .isReadyToBreed ()) {
198
+ cat .setLoveTicks (600 );
199
+ sendMeowMealsMessage (player , "Your cat is now in love mode! 🥰" , Formatting .RED );
200
+ actioned = true ;
201
+ }
202
+
203
+ // ✨ Add potion effects
204
+ if (!cat .hasStatusEffect (StatusEffects .JUMP_BOOST ) && cat .isTamed ()) {
205
+ cat .addStatusEffect (new StatusEffectInstance (StatusEffects .JUMP_BOOST , 400 , 0 ));
206
+ sendMeowMealsMessage (player , "Your cat feels bouncier, like a rabbit! 🐇" , Formatting .GREEN );
207
+ actioned = true ;
208
+ } else if (actioned ) {
209
+ cat .getWorld ().addParticle (
210
+ ParticleTypes .HEART ,
211
+ cat .getX (), cat .getY () + 1 , cat .getZ (),
212
+ 0.0 , 0.1 , 0.0
213
+ );
214
+ sendMeowMealsMessage (player , "The cat enjoyed that! 😋" , Formatting .YELLOW );
215
+ }
216
+
217
+ // Consume item
218
+ if (!player .getAbilities ().creativeMode && actioned ) {
219
+ stack .decrement (1 );
220
+ }
221
+
222
+ cir .setReturnValue (ActionResult .SUCCESS );
223
+ cir .cancel ();
224
+ }
225
+ }
69
226
}
70
227
}
71
228
}
0 commit comments