#include "../Platform/stdafx.h" #include "../Headers/net.minecraft.world.level.tile.h" #include "../Headers/net.minecraft.world.level.h" #include "../Headers/net.minecraft.world.entity.h" #include "../Headers/net.minecraft.world.phys.h" #include "LeashItem.h" LeashItem::LeashItem(int id) : Item(id) {} bool LeashItem::useOn(std::shared_ptr itemInstance, std::shared_ptr player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ, bool bTestUseOnOnly) { int tile = level->getTile(x, y, z); if (Tile::tiles[tile] != NULL && Tile::tiles[tile]->getRenderShape() == Tile::SHAPE_FENCE) { if (bTestUseOnOnly) return bindPlayerMobsTest(player, level, x, y, z); if (level->isClientSide) { return true; } bindPlayerMobs(player, level, x, y, z); return true; } return false; } bool LeashItem::bindPlayerMobs(std::shared_ptr player, Level* level, int x, int y, int z) { // check if there is a knot at the given coordinate std::shared_ptr activeKnot = LeashFenceKnotEntity::findKnotAt(level, x, y, z); // look for entities that can be attached to the fence bool foundMobs = false; double range = 7; std::vector >* mobs = level->getEntitiesOfClass( typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); if (mobs != NULL) { for (AUTO_VAR(it, mobs->begin()); it != mobs->end(); ++it) { std::shared_ptr mob = std::dynamic_pointer_cast(*it); if (mob->isLeashed() && mob->getLeashHolder() == player) { if (activeKnot == NULL) { activeKnot = LeashFenceKnotEntity::createAndAddKnot(level, x, y, z); } mob->setLeashedTo(activeKnot, true); foundMobs = true; } } } return foundMobs; } // 4J-JEV: Similar to bindPlayerMobs, but doesn't actually bind mobs, bool LeashItem::bindPlayerMobsTest(std::shared_ptr player, Level* level, int x, int y, int z) { // look for entities that can be attached to the fence double range = 7; std::vector >* mobs = level->getEntitiesOfClass( typeid(Mob), AABB::newTemp(x - range, y - range, z - range, x + range, y + range, z + range)); if (mobs != NULL) { for (AUTO_VAR(it, mobs->begin()); it != mobs->end(); ++it) { std::shared_ptr mob = std::dynamic_pointer_cast(*it); if (mob->isLeashed() && mob->getLeashHolder() == player) return true; } } return false; }