/** * Writes AbstractSkeleton DataManager arrow type data * Based on configured chance rates * @param skeleton To write data to */ private void registerArrowType(AbstractSkeleton skeleton){ try{ skeleton.getDataManager().register(SKELETON_ARROW, (byte) -1); for(int i = 0; i < ItemMBArrow.names.length; i++){ if(skeleton.getRNG().nextFloat() < BattlegearConfig.skeletonArrowSpawnRate[i]){ skeleton.getDataManager().set(SKELETON_ARROW, (byte) i); break; } } }catch (Exception ignored){} }
AbstractSkeleton skeleton = context.getContext(ContextKeys.ORIGIN, AbstractSkeleton.class); ItemStack stack = skeleton.getHeldItem(EnumHand.MAIN_HAND); if (stack.isEmpty() || stack.getItem() != Items.BOW) throw new LuaException("Not holding a bow"); skeleton.playSound(SoundEvents.ENTITY_SKELETON_SHOOT, 1.0F, 1.0F / (skeleton.getRNG().nextFloat() * 0.4F + 0.8F));
if (arrow.shootingEntity instanceof AbstractSkeleton) { AbstractSkeleton skeleton = (AbstractSkeleton) arrow.shootingEntity; if(skeleton.getAttackTarget() != null) { ItemStack type = getArrowForMob(skeleton); if (type.getItem() instanceof ItemArrow) { EntityArrow mbArrow = ((ItemArrow)type.getItem()).createArrow(skeleton.world, type, skeleton); if (!(mbArrow instanceof EntityTippedArrow)) { EntityLivingBase target = skeleton.getAttackTarget(); float pow = MathHelper.sqrt(skeleton.getDistanceSq(target.posX, target.getEntityBoundingBox().minY, target.posZ)) / 15F; pow = MathHelper.clamp(pow, 0.1F, 1.0F);
/** * Reads AbstractSkeleton DataManager arrow type data * @param skeleton To read data from * @return the arrow type */ private int getArrowType(AbstractSkeleton skeleton){ int type; try { type = skeleton.getDataManager().get(SKELETON_ARROW); }catch (Exception handled){ type = -1; } return type; }