Skip to content

Commit cc9d53c

Browse files
I fixed a typo and added effects.
1 parent 9da58ad commit cc9d53c

File tree

4 files changed

+199
-42
lines changed

4 files changed

+199
-42
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Visit the [**Wiki**](https://github.com/Spacexplorer11/Meow_Meals/wiki) for:
3333

3434
## ⬇️ How to download?
3535

36-
That's really easy! Just head over to my [modrinth mod page]() to download!
36+
That's really easy! Just head over to my [Modrinth mod page](https://modrinth.com/mod/meow-meals) to download!
3737
Or if you prefer, you can download the mod from the latest release [here!](https://github.com/spacexplorer11/meow_meals/releases/latest)
3838
**If you download the mod directly, make sure to have the dependencies or it won't work!**
3939

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
44
networkTimeout=10000
55
validateDistributionUrl=true
66
zipStoreBase=GRADLE_USER_HOME
Lines changed: 196 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,57 @@
11
package singh.akaalroop.meowmeals.mixin;
22

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;
38
import net.minecraft.item.ItemStack;
9+
import net.minecraft.item.Items;
10+
import net.minecraft.particle.ParticleTypes;
411
import net.minecraft.registry.Registries;
12+
import net.minecraft.text.MutableText;
13+
import net.minecraft.text.Text;
514
import net.minecraft.util.ActionResult;
15+
import net.minecraft.util.Formatting;
616
import net.minecraft.util.Identifier;
717
import org.spongepowered.asm.mixin.Mixin;
18+
import org.spongepowered.asm.mixin.Shadow;
19+
import org.spongepowered.asm.mixin.Unique;
820
import org.spongepowered.asm.mixin.injection.At;
921
import org.spongepowered.asm.mixin.injection.Inject;
1022
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
11-
import net.minecraft.entity.passive.CatEntity;
12-
import net.minecraft.entity.player.PlayerEntity;
23+
1324

1425
@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+
}
1638

1739
@Inject(method = "isBreedingItem", at = @At("HEAD"), cancellable = true)
1840
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+
}
3352
}
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")))) {
3555
cir.setReturnValue(true);
3656
}
3757
}
@@ -40,32 +60,169 @@ else if (stack.isOf(Registries.ITEM.get(Identifier.of("minecraft", "cooked_rabbi
4060
@Inject(method = "interactMob", at = @At("HEAD"), cancellable = true)
4161
private void onInteractMob(PlayerEntity player, net.minecraft.util.Hand hand, CallbackInfoReturnable<ActionResult> cir) {
4262
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+
}
4573

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+
}
5082

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+
}
5689

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+
}
6194

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+
}
66147

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+
}
69226
}
70227
}
71228
}

src/main/resources/data/tutorial/recipe/meat_feast_recipe.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
}
2121
},
2222
"result": {
23-
"item": "meowmeals:meat_feast",
23+
"id": "meowmeals:meat_feast",
2424
"count": 1
2525
}
2626
}

0 commit comments

Comments
 (0)