MixinMobEntity.java 4 KB
Newer Older
1 2
package com.owlmaddie.mixin;

3
import com.owlmaddie.chat.ChatDataManager;
4
import com.owlmaddie.chat.EntityChatData;
5
import com.owlmaddie.chat.PlayerData;
6
import com.owlmaddie.network.ServerPackets;
7
import net.minecraft.entity.mob.MobEntity;
8
import net.minecraft.entity.passive.TameableEntity;
9
import net.minecraft.entity.passive.VillagerEntity;
10
import net.minecraft.entity.player.PlayerEntity;
11
import net.minecraft.item.Item;
12
import net.minecraft.item.ItemStack;
13
import net.minecraft.item.Items;
14 15 16 17 18 19 20
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.util.ActionResult;
import net.minecraft.util.Hand;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
21 22 23 24 25

/**
 * The {@code MixinMobEntity} mixin class exposes the goalSelector field from the MobEntity class.
 */
@Mixin(MobEntity.class)
26 27 28 29
public class MixinMobEntity {

    @Inject(method = "interact", at = @At(value = "RETURN"))
    private void onItemGiven(PlayerEntity player, Hand hand, CallbackInfoReturnable<ActionResult> cir) {
30 31 32 33 34 35 36 37 38 39
        // Only process interactions on the server side
        if (player.getWorld().isClient()) {
            return;
        }

        // Only process interactions for the main hand
        if (hand != Hand.MAIN_HAND) {
            return;
        }

40 41 42
        ItemStack itemStack = player.getStackInHand(hand);
        MobEntity thisEntity = (MobEntity) (Object) this;

43 44
        // Don't interact with Villagers (avoid issues with trade UI) OR Tameable (i.e. sit / no-sit)
        if (thisEntity instanceof VillagerEntity || thisEntity instanceof TameableEntity) {
45 46 47
            return;
        }

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
        // Determine if the item is a bucket
        // We don't want to interact on buckets
        Item item = itemStack.getItem();
        if (item == Items.BUCKET ||
                item == Items.WATER_BUCKET ||
                item == Items.LAVA_BUCKET ||
                item == Items.POWDER_SNOW_BUCKET ||
                item == Items.MILK_BUCKET ||
                item == Items.PUFFERFISH_BUCKET ||
                item == Items.SALMON_BUCKET ||
                item == Items.COD_BUCKET ||
                item == Items.TROPICAL_FISH_BUCKET ||
                item == Items.AXOLOTL_BUCKET ||
                item == Items.TADPOLE_BUCKET) {
            return;
        }

65 66
        // Get chat data for entity
        ChatDataManager chatDataManager = ChatDataManager.getServerInstance();
67
        EntityChatData entityData = chatDataManager.getOrCreateChatData(thisEntity.getUuidAsString());
68
        PlayerData playerData = entityData.getPlayerData(player.getDisplayName().getString());
69

70
        // Check if the player successfully interacts with an item
71 72 73 74 75 76
        if (player instanceof ServerPlayerEntity) {
            // Player has item in hand
            if (!itemStack.isEmpty()) {
                ServerPlayerEntity serverPlayer = (ServerPlayerEntity) player;
                String itemName = itemStack.getItem().getName().getString();
                int itemCount = itemStack.getCount();
77

78 79 80 81 82 83 84 85 86
                // Decide verb
                String action_verb = " shows ";
                if (cir.getReturnValue().isAccepted()) {
                    action_verb = " gives ";
                }

                // Prepare a message about the interaction
                String giveItemMessage = "<" + serverPlayer.getName().getString() +
                        action_verb + "you " + itemCount + " " + itemName + ">";
87

88 89
                if (!entityData.characterSheet.isEmpty() && entityData.auto_generated < chatDataManager.MAX_AUTOGENERATE_RESPONSES) {
                    ServerPackets.generate_chat("N/A", entityData, serverPlayer, thisEntity, giveItemMessage, true);
90
                }
91

92
            } else if (itemStack.isEmpty() && playerData.friendship == 3) {
93 94
                // Player's hand is empty, Ride your best friend!
                player.startRiding(thisEntity, true);
95 96 97
            }
        }
    }
98
}