- 38
- 2
- 1
Всем добра.
Совсем недавно руки мои добрались до миксинов, потому я мало чего в них понимаю.
Я создал миксин с классом FoodData, встроенным в Player. Теперь я хочу через Player как-то вытянуть ту информацию, которую я занес в фуддату (для дебага), но упорно не понимаю, как именно это сделать, потому как миксин игрока не видит то, что я добавил. Код:
Прошу разъяснить, как и что бы мне такого сделать, чтобы нормально читать все написанное в миксинах. Заодно хочу спросить, где удобнее располагать весь код - в Player или FoodData, потому как затем мне нужно будет вытащить все данные для использования в ui чтобы отобразить их в качестве прогрессбаров.
А еще я хочу после поменять те данные, которые передает конструктор еды (добавить значения тех полей, которые я внес в FoodData) и заставить eat() принимать эти значения, что, в теории, вызовет ту же проблему, что я описывал выше. Стою на коленях, моля о советах.
Совсем недавно руки мои добрались до миксинов, потому я мало чего в них понимаю.
Я создал миксин с классом FoodData, встроенным в Player. Теперь я хочу через Player как-то вытянуть ту информацию, которую я занес в фуддату (для дебага), но упорно не понимаю, как именно это сделать, потому как миксин игрока не видит то, что я добавил. Код:
FoodDataMixin:
@Mixin(FoodData.class)
public abstract class FoodDataMixin implements IPlayerDietContainer {
private float proteins = 20;
public float the_most_complete_food_mod$getValue(int pId) {
return switch (pId) {
case 0 -> this.proteins;
...
default ->
throw new NullPointerException("\nat PlayerDietContainer.getValue(): \nTried to get value with Id other from 0 to 6.");
};
}
...
}
PlayerMixin:
@Mixin(Player.class)
public abstract class PlayerMixin {
@Shadow protected FoodData foodData;
private Player self() {
return (Player) (Object) this;
}
private FoodData selfFoodData() {
return (FoodData) this.foodData;
}
@Inject(method = "tick", at = @At("TAIL"))
private void writeProteins(CallbackInfo ci) {
if(!self().level().isClientSide()) {
self().sendSystemMessage(Component.literal("Proteins level is: " + selfFoodData().the_most_complete_food_mod$getValue(0)));
}
}
@Inject(method = "drop(Lnet/minecraft/world/item/ItemStack;ZZ)Lnet/minecraft/world/entity/item/ItemEntity;", at = @At("TAIL"))
private void increaseProteins(ItemStack pDroppedItem, boolean pDropAround, boolean pIncludeThrowerName, CallbackInfoReturnable<ItemEntity> cir) {
if (pDroppedItem.getItem() == Items.DIAMOND) {
selfFoodData().the_most_complete_food_mod$increaseValue(0, 0.5f);
} else {
selfFoodData().the_most_complete_food_mod$decreaseValue(0, 0.5f);
}
}
}
А еще я хочу после поменять те данные, которые передает конструктор еды (добавить значения тех полей, которые я внес в FoodData) и заставить eat() принимать эти значения, что, в теории, вызовет ту же проблему, что я описывал выше. Стою на коленях, моля о советах.


