Skip to content

Commit 15a68ab

Browse files
Merge pull request #1 from Spacexplorer11/fix-codacy-issues
Fix codacy issues and also fixes a bug which didn't allow cats to unsit after being tamed using a custom item. This was because the code wouldn't fallback to vanilla functionality, however now it does, meaning if none of my custom code runs, it will fallback to vanilla now! It also fixes a bug where the cat would spam the love messages when feeding a baby.
2 parents 3425da2 + 452cee7 commit 15a68ab

File tree

6 files changed

+84
-168
lines changed

6 files changed

+84
-168
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ loom_version=1.10-SNAPSHOT
1111
fabric_kotlin_version=1.13.3+kotlin.2.1.21
1212

1313
# Mod Properties
14-
mod_version=1.0.1
14+
mod_version=1.0.2
1515
maven_group=singh.akaalroop.meowmeals
1616
archives_base_name=meowmeals
1717

src/client/kotlin/singh/akaalroop/meowmeals/MeowMealsClient.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package singh.akaalroop.meowmeals
22

33
import net.fabricmc.api.ClientModInitializer
44

5+
// This is to set up client only logic
56
object MeowMealsClient : ClientModInitializer {
67
override fun onInitializeClient() {
78
// This entrypoint is suitable for setting up client-specific logic, such as rendering.

src/client/kotlin/singh/akaalroop/meowmeals/MeowMealsDataGenerator.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package singh.akaalroop.meowmeals
33
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint
44
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator
55

6+
// This to generate data for the mod
67
object MeowMealsDataGenerator : DataGeneratorEntrypoint {
78
override fun onInitializeDataGenerator(fabricDataGenerator: FabricDataGenerator) {
89
}

src/main/java/singh/akaalroop/meowmeals/mixin/CatEntityMixin.java

Lines changed: 79 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,25 @@
77
import net.minecraft.entity.player.PlayerEntity;
88
import net.minecraft.item.ItemStack;
99
import net.minecraft.item.Items;
10-
import net.minecraft.particle.ParticleTypes;
1110
import net.minecraft.registry.Registries;
1211
import net.minecraft.text.MutableText;
1312
import net.minecraft.text.Text;
1413
import net.minecraft.util.ActionResult;
1514
import net.minecraft.util.Formatting;
1615
import net.minecraft.util.Identifier;
1716
import org.spongepowered.asm.mixin.Mixin;
18-
import org.spongepowered.asm.mixin.Shadow;
1917
import org.spongepowered.asm.mixin.Unique;
2018
import org.spongepowered.asm.mixin.injection.At;
2119
import org.spongepowered.asm.mixin.injection.Inject;
2220
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
2321

22+
import static net.minecraft.sound.SoundEvents.ENTITY_CAT_EAT;
23+
import static singh.akaalroop.meowmeals.MeowMeals.MOD_ID;
24+
2425

2526
@Mixin(CatEntity.class)
2627
public abstract class CatEntityMixin {
2728

28-
@Shadow
29-
protected abstract void tryTame(PlayerEntity player);
30-
3129
@Unique
3230
private void sendMeowMealsMessage(PlayerEntity player, String text, Formatting colour) {
3331
MutableText message = Text.literal("[MeowMeals] ")
@@ -36,6 +34,11 @@ private void sendMeowMealsMessage(PlayerEntity player, String text, Formatting c
3634
player.sendMessage(message, false);
3735
}
3836

37+
@Unique
38+
private void sendMeowMealsBreedingMessage(PlayerEntity player) {
39+
sendMeowMealsMessage(player, "Your cat is now in love mode! 🥰", Formatting.RED);
40+
}
41+
3942
@Inject(method = "isBreedingItem", at = @At("HEAD"), cancellable = true)
4043
private void isBreedingItem(ItemStack stack, CallbackInfoReturnable<Boolean> cir) {
4144
String[] items = {
@@ -45,7 +48,7 @@ private void isBreedingItem(ItemStack stack, CallbackInfoReturnable<Boolean> cir
4548
"smoked_rabbit"
4649
};
4750
for (String item : items) {
48-
if (stack.isOf(Registries.ITEM.get(Identifier.of("meowmeals", item)))) {
51+
if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, item)))) {
4952
cir.setReturnValue(true);
5053
return;
5154
}
@@ -56,172 +59,87 @@ private void isBreedingItem(ItemStack stack, CallbackInfoReturnable<Boolean> cir
5659
}
5760
}
5861

59-
// Hook into interactMob instead, since it has the player and hand info.
62+
6063
@Inject(method = "interactMob", at = @At("HEAD"), cancellable = true)
6164
private void onInteractMob(PlayerEntity player, net.minecraft.util.Hand hand, CallbackInfoReturnable<ActionResult> cir) {
6265
ItemStack stack = player.getStackInHand(hand);
6366
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-
}
73-
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-
}
82-
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-
}
89-
90-
// Consume one item from the stack
91-
if (!player.getAbilities().creativeMode && actioned) {
92-
stack.decrement(1);
93-
}
94-
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-
}
14767

148-
// Tame the cat if it’s not already tamed
149-
if (!cat.isTamed()) {
150-
tryTame(player);
151-
actioned = true;
152-
}
68+
if (!cat.getWorld().isClient()) {
69+
boolean actioned = false;
70+
71+
// Cat Food Tin
72+
if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "cat_food_tin")))) {
73+
if (cat.getHealth() < cat.getMaxHealth()) {
74+
cat.heal(6.0f);
75+
actioned = true;
76+
} else if (!cat.isTamed()) {
77+
cat.setOwner(player);
78+
cat.setSitting(true);
79+
cat.getWorld().sendEntityStatus(cat, EntityStatuses.ADD_POSITIVE_PLAYER_REACTION_PARTICLES);
80+
sendMeowMealsMessage(player, "Your cat liked that so much that it's now tamed! 🐱", Formatting.YELLOW);
81+
actioned = true;
82+
} else if (cat.isTamed() && !cat.isInLove() && cat.getBreedingAge() == 0) {
83+
cat.lovePlayer(player);
84+
sendMeowMealsBreedingMessage(player);
85+
actioned = true;
86+
}
15387

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-
}
88+
// Fish Feast
89+
} else if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "fish_feast")))) {
90+
if (cat.getHealth() < cat.getMaxHealth()) {
91+
cat.heal(5.0f);
92+
actioned = true;
93+
} else if (cat.isTamed() && !cat.isInLove() && cat.getBreedingAge() == 0) {
94+
cat.lovePlayer(player);
95+
sendMeowMealsBreedingMessage(player);
96+
actioned = true;
97+
} else if (!cat.hasStatusEffect(StatusEffects.SPEED)) {
98+
cat.addStatusEffect(new StatusEffectInstance(StatusEffects.SPEED, 400, 0));
99+
sendMeowMealsMessage(player, "Your cat feels energised! ✨", Formatting.GREEN);
100+
actioned = true;
101+
}
102+
// Meat Feast
103+
} else if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "meat_feast")))) {
104+
if (cat.getHealth() < cat.getMaxHealth()) {
105+
cat.heal(8.0f);
106+
actioned = true;
107+
} else if (cat.isTamed() && !cat.isInLove() && cat.getBreedingAge() == 0) {
108+
cat.lovePlayer(player);
109+
sendMeowMealsBreedingMessage(player);
110+
actioned = true;
111+
} else if (!cat.hasStatusEffect(StatusEffects.SATURATION)) {
112+
cat.addStatusEffect(new StatusEffectInstance(StatusEffects.SATURATION, 400, 0));
113+
sendMeowMealsMessage(player, "Your cat feels more full! 😋", Formatting.GREEN);
114+
actioned = true;
115+
}
160116

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-
}
117+
// Smoked Rabbit
118+
} else if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "smoked_rabbit")))) {
119+
if (cat.getHealth() < cat.getMaxHealth()) {
120+
cat.heal(4.0f);
121+
actioned = true;
122+
} else if (cat.isTamed() && !cat.isInLove() && cat.getBreedingAge() == 0) {
123+
cat.lovePlayer(player);
124+
sendMeowMealsBreedingMessage(player);
125+
actioned = true;
126+
} else if (!cat.hasStatusEffect(StatusEffects.JUMP_BOOST)) {
127+
cat.addStatusEffect(new StatusEffectInstance(StatusEffects.JUMP_BOOST, 400, 0));
128+
sendMeowMealsMessage(player, "Your cat feels bouncier, like a rabbit! 🐇", Formatting.GREEN);
129+
actioned = true;
130+
}
131+
}
174132

175-
// Consume item
176-
if (!player.getAbilities().creativeMode && actioned) {
177-
stack.decrement(1);
133+
if (actioned) {
134+
if (!player.getAbilities().creativeMode) {
135+
stack.decrement(1);
136+
if (stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "fish_feast")))
137+
|| stack.isOf(Registries.ITEM.get(Identifier.of(MOD_ID, "meat_feast")))) {
178138
player.getInventory().insertStack(new ItemStack(Items.BOWL));
179139
}
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();
224140
}
141+
cat.playSound(ENTITY_CAT_EAT, 1.0F, 1.0F);
142+
cir.setReturnValue(ActionResult.SUCCESS);
225143
}
226144
}
227145
}

src/main/kotlin/singh/akaalroop/meowmeals/MeowMeals.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ import net.minecraft.text.Text
1414
import net.minecraft.util.Identifier
1515
import org.slf4j.LoggerFactory
1616

17+
// This is all the code run when the mod is initialised
1718
object MeowMeals : ModInitializer {
18-
private const val MOD_ID = "meowmeals"
19+
const val MOD_ID: String = "meowmeals"
1920
private val logger = LoggerFactory.getLogger(MOD_ID)
2021
private val MEOWMEALS_GROUP = RegistryKey.of(
2122
RegistryKeys.ITEM_GROUP,

src/main/kotlin/singh/akaalroop/meowmeals/items/CatFoodTin.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)