Здорово, миньоны!
Хочу вам рассказать о пасхалке, добавленной в Alfheim AlexSocol(автор) еще давно. Она светилась на просторах интернета, однако почему-то до сих пор не появлялась на русских игровых форумах, посвященным теме майнкрафта.
Пасхалочка связана с луком "Катастрофа Феба"(см.ниже) - реликвией, которая выпадает с флюгеля 3-го уровня на момент его третьего убийства.
Сам по себе - лук примечателен тем, что он не требует стрел, как это делают остальное оружие аналогичного типа. Его основной расходник - мана, который варьируется в прогрессии от 100 до 1000 за выстрел в соответствии с силой натягивания лука. Также лук имеет свою способность, как и остальные реликвии - при выстреле в звездное небо луч маны выпадает в виде световых столбов, которые наносят урон.

Пасхалка заключается в том, что можно придать новый внешний вид реликвии, переименовав его в
"i'm a banana"
(регистр букв не важен)
в результате чего он будет выглядеть следующим образом:

Изменения после переименования:
Новая уникальная модель реликвии (иконка не изменяется)
Новые цветные эффекты при выстреле
BANANAAA!!!
На этом все. Спасибо за прочтение, пытался выдавить из этого все, что только можно. Надеюсь вы сможете удивить своего тиммейта после прочтения моей статьи, показав ему свой банан.
Показать содержимоеСкрыть содержимое
class ItemMoonlightBow: ItemBow(), IRelic {
lateinit var icons: Array<IIcon>
lateinit var moonD: IIcon
lateinit var moons: Array<IIcon>
lateinit var bownana: IIcon
init {
creativeTab = AlfheimTab
maxDamage = 0
maxStackSize = 1
setFull3D()
unlocalizedName = "MoonlightBow"
}
override fun getAttributeModifiers(stack: ItemStack): Multimap<String, AttributeBase> {
val attrib = super.getAttributeModifiers(stack)
val uuid = UUID(unlocalizedName.hashCode().toLong(), 0)
attrib.put(SharedMonsterAttributes.attackDamage.attributeUnlocalizedName, AttributeModifier(uuid, "Weapon modifier", 5.0, 0))
return attrib as Multimap<String, AttributeBase>
}
override fun onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer): ItemStack {
if (isRightPlayer(player, stack))
player.setItemInUse(stack, getMaxItemUseDuration(stack))
return stack
}
override fun isItemTool(stack: ItemStack) = true
override fun getMaxItemUseDuration(stack: ItemStack) = 72000
override fun getItemUseAction(stack: ItemStack) = EnumAction.bow
override fun onUsingTick(stack: ItemStack, player: EntityPlayer, count: Int) {
if (player.worldObj.isRemote) {
val v = Vector3()
val l = player.lookVec
val look = Vector3()
val p = Vector3.fromEntity(player).add(0, 1.62, 0)
val ds = arrayOf(0.3, 0.8)
val moon = isLookingAtMoon(player.entityWorld, player, mc.timer.renderPartialTicks, false)
var r = 0.1f * if (moon) 3 else 1
var g = 0.85f
var b = if (moon) g else 0.1f
if (!moon && stack.displayName.lowercase().trim() == "i'm a banana") {
r = 0.95f
g = 0.95f
b = 0.1f
}
for (d in ds) {
for (i in 1..36) {
v.set(0.0, d, 0.0)
v.rotate(i * 10.0, Vector3.oZ)
v.rotate(player.rotationPitch.D, Vector3.oX)
v.rotate(-player.rotationYaw.D, Vector3.oY)
v.add(look.set(l).mul(if (d == 0.3) 1.75 else 1.0)).add(p)
Botania.proxy.wispFX(player.worldObj, v.x, v.y, v.z, r, g, b, if (d == 0.3) 0.1f else 0.25f, 0f, 0.1f)
}
}
}
}
override fun onPlayerStoppedUsing(stack: ItemStack, world: World, player: EntityPlayer, itemInUse: Int) {
if (!isRightPlayer(player, stack)) return
val m = maxDmg / 10
val i = ((getMaxItemUseDuration(stack) - itemInUse) * chargeVelocityMultiplier).I
if (i < m) return
val rank = (i - m) / 5
var dmg = min(maxDmg, m + rank * 2).F
var mana = min(maxDmg * 10, maxDmg + rank * 20) * 5
var life = min(150, 5 + i * 4)
var dispersion = 1f
var speed = 2.5f
if (dmg >= maxDmg && isLookingAtMoon(world, player, 0f, false)) {
dmg = -1f
mana = 20000
life = 200
dispersion = 0f
speed = 5f
}
if (ManaItemHandler.requestManaExactForTool(stack, player, mana, true)) {
val arrow = EntityMagicArrow(world, player)
arrow.shoot(player, player.rotationPitch, player.rotationYaw, 0f, speed, dispersion)
arrow.damage = dmg
arrow.rotationYaw = player.rotationYaw
arrow.rotation = MathHelper.wrapAngleTo180_float(-player.rotationYaw + 180)
arrow.banana = dmg != -1f && stack.displayName.lowercase().trim() == "i'm a banana"
if (dmg != -1f) {
val j = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack)
if (j > 0) arrow.damage *= j * 0.1f + 1f
arrow.damage += player.getEntityAttribute(SharedMonsterAttributes.attackDamage).attributeValue.F
}
arrow.life = life
if (!world.isRemote)
world.spawnEntityInWorld(arrow)
player.playSoundAtEntity("random.bow", 1f, 1f / (Item.itemRand.nextFloat() * 0.4f + 1.2f) + 0.5f)
}
}
val chargeVelocityMultiplier: Float
get() = AlfheimConfigHandler.moonbowVelocity
val maxDmg: Int
get() = AlfheimConfigHandler.moonbowMaxDmg
override fun addInformation(stack: ItemStack, player: EntityPlayer, list: MutableList<Any?>, adv: Boolean) {
// list.add(StatCollector.translateToLocalFormatted("${getUnlocalizedNameInefficiently(stack)}.desc", 2 * EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack)))
// list.add("")
ItemRelic.addBindInfo(list, stack, player)
super.addInformation(stack, player, list, adv)
}
override fun registerIcons(reg: IIconRegister) {
itemIcon = reg.registerIcon("${ModInfo.MODID}:PhoebusBow")
moonD = reg.registerIcon("${ModInfo.MODID}:MoonBow")
bownana = reg.registerIcon("${ModInfo.MODID}:Bownana")
icons = Array(4) {
reg.registerIcon("${ModInfo.MODID}:PhoebusBow_${it + 1}")
}
moons = Array(4) {
reg.registerIcon("${ModInfo.MODID}:MoonBow_${it + 1}")
}
}
override fun getItemIconForUseDuration(dur: Int) = icons[dur]
override fun getIcon(stack: ItemStack, renderPass: Int, player: EntityPlayer?, usingItem: ItemStack?, useRemaining: Int): IIcon {
val m = maxDmg / 10
val j = (((stack.maxItemUseDuration - useRemaining) * chargeVelocityMultiplier - m) / 5) * 2 + m
var iconD = itemIcon
var iconA = icons
var moon = false
if (player != |) {
if (isLookingAtMoon(player.worldObj, player, mc.timer.renderPartialTicks, false)) {
moon = true
iconD = moonD
iconA = moons
}
}
return if (!moon && stack.displayName.lowercase().trim() == "i'm a banana")
bownana
else if (usingItem == |) {
iconD
} else if (j >= maxDmg) {
iconA[3]
} else if (j >= maxDmg / 3f * 2f) {
iconA[2]
} else if (j > maxDmg / 3f) {
iconA[1]
} else {
if (j > 0) iconA[0] else iconD
}
}Также, для тех, кому нужно - оставляю исходники реликвии.
Те, кто не понимает что такое обфускация - даже не открывайте.
Если я что-то упустил - поправьте меня, буду благодарен!
