From 313f9cb39dcd35ac9eae4ce7f926db5c34d5b305 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 23 Aug 2023 14:24:43 +0700 Subject: [PATCH] Swim Boosters android feature, electromotor crafting component --- .../mc/otm/datagen/ResearchData.kt | 70 ++++++++++++++++-- .../mc/otm/datagen/lang/English.kt | 2 + .../mc/otm/datagen/lang/Russian.kt | 2 + .../datagen/recipes/CraftingTableRecipes.kt | 9 ++- .../otm/android/AndroidResearchDescription.kt | 8 ++ .../android/feature/SwimBoostersFeature.kt | 39 ++++++++++ .../mc/otm/config/AndroidConfig.kt | 4 + .../mc/otm/registry/AndroidFeatures.kt | 1 + .../ru/dbotthepony/mc/otm/registry/MItems.kt | 3 + .../ru/dbotthepony/mc/otm/registry/MNames.kt | 1 + .../textures/item/component/electromotor.png | Bin 0 -> 2437 bytes 11 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/SwimBoostersFeature.kt create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/item/component/electromotor.png diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt index 84b4d166a..c2397a2ec 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/ResearchData.kt @@ -43,6 +43,45 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang serializer.accept(IMPROVED_LIMBS) + val SWIM_BOOSTERS = AndroidResearchType.Builder(modLocation(MNames.SWIM_BOOSTERS)) + .withExperience(26) + .withDescription(AndroidResearchDescriptions.SWIM_BOOSTERS.Instance(0)) + .addPrerequisite(IMPROVED_LIMBS) + .addPrerequisite(AIR_BAGS) + .addFeatureResult(AndroidFeatures.SWIM_BOOSTERS) + .withIcon(ResearchIcons.ICON_LIMB_OVERCLOCKING) + .addItem(MItemTags.TRITANIUM_PLATES, 2) + .addItem(MItemTags.COPPER_WIRES, 2) + .addItem(MItems.ELECTROMOTOR, 2) + .build() + + serializer.accept(SWIM_BOOSTERS) + + val SWIM_BOOSTERS_2 = AndroidResearchType.Builder(modLocation(MNames.SWIM_BOOSTERS + "_2")) + .withExperience(30) + .withDescription(AndroidResearchDescriptions.SWIM_BOOSTERS.Instance(1)) + .addPrerequisite(SWIM_BOOSTERS) + .addFeatureLevel(AndroidFeatures.SWIM_BOOSTERS) + .withIcon(ResearchIcons.ICON_LIMB_OVERCLOCKING) + .addItem(MItemTags.GOLD_WIRES, 8) + .addItem(MItems.ELECTROMOTOR, 2) + .build() + + serializer.accept(SWIM_BOOSTERS_2) + + val SWIM_BOOSTERS_3 = AndroidResearchType.Builder(modLocation(MNames.SWIM_BOOSTERS + "_3")) + .withExperience(30) + .withDescription(AndroidResearchDescriptions.SWIM_BOOSTERS.Instance(2)) + .addPrerequisite(SWIM_BOOSTERS_2) + .addFeatureLevel(AndroidFeatures.SWIM_BOOSTERS) + .withIcon(ResearchIcons.ICON_LIMB_OVERCLOCKING) + .addItem(MItemTags.CARBON_PLATES, 8) + .addItem(MItemTags.TRITANIUM_NUGGETS, 4) + .addItem(MItemTags.COPPER_WIRES, 2) + .build() + + serializer.accept(SWIM_BOOSTERS_3) + val STEP_ASSIST = AndroidResearchType.Builder(modLocation(MNames.STEP_ASSIST)) .withExperience(24) .addFeatureResult(AndroidFeatures.STEP_ASSIST) @@ -384,7 +423,7 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang } add(limbList[0], "Limb Overclocking %s") { - russian("Разгон Конечностей %s") + russian("Разгон конечностей %s") } add(limbList[0], "description", "Boosts mobility by %s%% and attack speed by %s%%") { @@ -392,7 +431,7 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang } add(AIR_BAGS, "Air Bags") { - russian("Воздушные Мешки") + russian("Воздушные мешки") } add(NANOBOTS, "Nanobots") { russian("Наноботы") @@ -415,7 +454,7 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang } add(NANOBOTS_ARMOR, "Nanobots Armor") { - russian("Броня из Наноботов") + russian("Броня из наноботов") } add(NANOBOTS_ARMOR, "description", "Allows nanobots to align themselves in cell shape, reducing incoming damage by a %% by absorbing impacts") { russian("Позволяет наноботам выстраиваться в клеточную структуру, уменьшая внешний урон на определённый проект путём поглощения ударов") @@ -429,35 +468,50 @@ fun addResearchData(serializer: Consumer, lang: MatteryLang } add(armorStrengthList[0], "Nanobots Armor Strength %s") { - russian("Сила Слоя Брони Наноботов %s") + russian("Сила слоя брони наноботов %s") } add(armorStrengthList[0], "description", "Increases impact absorption strength of nanobots") { russian("Увеличивает поглощающею силу брони наноботов") } add(EXTENDED_REACH, "Extended Reach") { - russian("Удлинённые Манипуляторы") + russian("Удлинённые манипуляторы") } add(EXTENDED_REACH, "description", "Increases block interaction distance") { russian("Увеличивает радиус взаимодействия с блоками") } add(IMPROVED_LIMBS, "Improved Limbs") { - russian("Улучшенные Конечности") + russian("Улучшенные конечности") } add(IMPROVED_LIMBS, "description", "Allows limbs to be upgraded") { russian("Позволяет улучшать конечности") } + add(SWIM_BOOSTERS, "Swim Boosters") { + russian("Плавательные лопасти") + } + add(SWIM_BOOSTERS, "description", "Increases swimming speed by %s%%") { + russian("Ускоряет скорость плавания на %s%%") + } + + add(SWIM_BOOSTERS_2, "Swim Boosters 2") { + russian("Плавательные Лопасти 2") + } + + add(SWIM_BOOSTERS_3, "Swim Boosters 3") { + russian("Плавательные Лопасти 3") + } + add(STEP_ASSIST, "Step Assist") { - russian("Помощь Подъёма") + russian("Помощь подъёма") } add(STEP_ASSIST, "description", "Allows unit to step up whole blocks") { russian("Позволяет переступать полные блоки") } add(ITEM_MAGNET, "Item Magnet") { - russian("Предметный Магнит") + russian("Предметный магнит") } add(ITEM_MAGNET, "description0", "Pulls nearby items while active") { russian("Притягивает ближайшие предметы пока активен") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 0933e3658..c7cdbd1d1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -605,6 +605,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.ADVANCED_CONTROL_CIRCUIT, "Advanced Control Circuit") add(MItems.QUANTUM_TRANSCEIVER, "Quantum Transceiver") add(MItems.ELECTROMAGNET, "Electromagnet") + add(MItems.ELECTROMOTOR, "Electromotor") add(MItems.MIRROR_COMPOUND, "Mirror Compound") add(MItems.MIRROR, "Mirror") add(MItems.MIRROR, "description", "I can clearly see my own reflection in this mirror") @@ -704,6 +705,7 @@ private fun androidFeatures(provider: MatteryLanguageProvider) { add(AndroidFeatures.NIGHT_VISION, "Night Vision") add(AndroidFeatures.NANOBOTS_ARMOR, "Nanobots Armor") add(AndroidFeatures.ITEM_MAGNET, "Item Magnet") + add(AndroidFeatures.SWIM_BOOSTERS, "Swim Boosters") add(AndroidFeatures.STEP_ASSIST, "Step Assist") add(AndroidFeatures.JUMP_BOOST, "Jump Boost") add(AndroidFeatures.ENDER_TELEPORTER, "Ender Teleporter") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt index 1bd3e87b8..228ad6d08 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/Russian.kt @@ -607,6 +607,7 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.ADVANCED_CONTROL_CIRCUIT, "Продвинутая схема управления") add(MItems.QUANTUM_TRANSCEIVER, "Квантовый передатчик") add(MItems.ELECTROMAGNET, "Электромагнит") + add(MItems.ELECTROMOTOR, "Электромотор") add(MItems.MIRROR_COMPOUND, "Набор выплавки зеркала") add(MItems.MIRROR, "Зеркало") add(MItems.MIRROR, "description", "Я могу очень отчётливо видеть своё отражение в этом зеркале") @@ -706,6 +707,7 @@ private fun androidFeatures(provider: MatteryLanguageProvider) { add(AndroidFeatures.NIGHT_VISION, "Ночное зрение") add(AndroidFeatures.NANOBOTS_ARMOR, "Броня из наноботов") add(AndroidFeatures.ITEM_MAGNET, "Предметный магнит") + add(AndroidFeatures.SWIM_BOOSTERS, "Плавательные лопасти") add(AndroidFeatures.STEP_ASSIST, "Помощник подъёма") add(AndroidFeatures.JUMP_BOOST, "Усилитель прыжка") add(AndroidFeatures.ENDER_TELEPORTER, "Телепортатор края") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 6741a9151..889871d11 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -161,7 +161,14 @@ fun addCraftingTableRecipes(consumer: Consumer) { MatteryRecipe(MItems.ELECTROMAGNET, category = RecipeCategory.MISC) .row(MItemTags.COPPER_WIRES, Tags.Items.INGOTS_IRON, MItemTags.COPPER_WIRES) - .unlockedBy(Tags.Items.ENDER_PEARLS) + .unlockedBy(Tags.Items.INGOTS_IRON) + .build(consumer) + + MatteryRecipe(MItems.ELECTROMOTOR, category = RecipeCategory.MISC) + .rowB(MItems.ELECTROMAGNET) + .row(MItems.ELECTROMAGNET, Tags.Items.INGOTS_IRON, MItems.ELECTROMAGNET) + .row(MItemTags.COPPER_WIRES, Tags.Items.INGOTS_IRON, MItemTags.COPPER_WIRES) + .unlockedBy(MItems.ELECTROMAGNET) .build(consumer) MatteryRecipe(MItems.ENERGY_SERVO, category = RecipeCategory.MISC) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDescription.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDescription.kt index 402c46eac..5c071f633 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDescription.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchDescription.kt @@ -43,6 +43,14 @@ object AndroidResearchDescriptions { )) } } + val SWIM_BOOSTERS: AndroidResearchDescription.Leveled by registrar.register("swim_boosters") { + AndroidResearchDescription.Leveled { _, list, level -> + list.add(TranslatableComponent( + "android_research.overdrive_that_matters.swim_boosters.description", + TextComponent("%.1f".format(AndroidConfig.SWIM_BOOSTERS * (1 + level) * 100.0)).withStyle(ChatFormatting.YELLOW) + )) } + } + val ITEM_MAGNET: AndroidResearchDescription.Singleton by registrar.register("item_magnet") { AndroidResearchDescription.singleton { TranslatableComponent("otm.gui.power_cost_per_tick", AndroidConfig.Magnet.POWER_DRAW.formatPower(formatAsReadable = ShiftPressedCond).copy().withStyle(ChatFormatting.YELLOW)) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/SwimBoostersFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/SwimBoostersFeature.kt new file mode 100644 index 000000000..24aaebbce --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/SwimBoostersFeature.kt @@ -0,0 +1,39 @@ +package ru.dbotthepony.mc.otm.android.feature + +import net.minecraft.client.gui.GuiGraphics +import net.minecraft.world.entity.ai.attributes.AttributeModifier +import net.minecraftforge.common.ForgeMod +import ru.dbotthepony.mc.otm.android.AndroidSwitchableFeature +import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability +import ru.dbotthepony.mc.otm.client.render.ResearchIcons +import ru.dbotthepony.mc.otm.config.AndroidConfig +import ru.dbotthepony.mc.otm.core.math.RGBAColor +import ru.dbotthepony.mc.otm.registry.AndroidFeatures +import java.util.* + +class SwimBoostersFeature(android: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.SWIM_BOOSTERS, android) { + override fun applyModifiers() { + if (!ForgeMod.SWIM_SPEED.isPresent || !isActive) + return + + val attr = ply.getAttribute(ForgeMod.SWIM_SPEED.get()) ?: return + + attr.removeModifier(MODIFIER_ID) + attr.addPermanentModifier(AttributeModifier(MODIFIER_ID, type.displayName.toString(), (level + 1) * AndroidConfig.SWIM_BOOSTERS, AttributeModifier.Operation.ADDITION)) + } + + override fun removeModifiers() { + if (!ForgeMod.SWIM_SPEED.isPresent) + return + + ply.getAttribute(ForgeMod.SWIM_SPEED.get())?.removeModifier(MODIFIER_ID) + } + + override fun renderIcon(graphics: GuiGraphics, x: Float, y: Float, width: Float, height: Float, color: RGBAColor) { + ResearchIcons.ICON_LIMB_OVERCLOCKING.render(graphics, x, y, width, height, color = color) + } + + companion object { + private val MODIFIER_ID = UUID.fromString("4a3ffa46-47a8-a03f-857d-f5c2b2c8f2f6") + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/config/AndroidConfig.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/config/AndroidConfig.kt index 73d1b105e..09bcdb1c5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/config/AndroidConfig.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/config/AndroidConfig.kt @@ -68,6 +68,10 @@ object AndroidConfig : AbstractConfig("androids") { .comment("First, fall damage is reduced by flat resistance (this), then reduced by percentage resistance") .defineInRange("FALL_DAMAGE_REDUCTION_PER_LEVEL_F", 1.5, 0.0, Float.MAX_VALUE.toDouble()) + val SWIM_BOOSTERS: Double by builder + .comment("Increase per level") + .defineInRange("SWIM_BOOSTERS", 0.25, 0.0, Float.MAX_VALUE.toDouble()) + object EnderTeleporter { init { builder.comment("Ender Teleporter ability").push("EnderTeleporter") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt index bfaf0ed4b..eb4b7cb9c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidFeatures.kt @@ -12,6 +12,7 @@ object AndroidFeatures { val AIR_BAGS: AndroidFeatureType by registry.register(MNames.AIR_BAGS) { AndroidFeatureType(::DummyAndroidFeature) } val STEP_ASSIST: AndroidFeatureType by registry.register(MNames.STEP_ASSIST) { AndroidFeatureType(::StepAssistFeature) } + val SWIM_BOOSTERS: AndroidFeatureType by registry.register(MNames.SWIM_BOOSTERS) { AndroidFeatureType(::SwimBoostersFeature) } val LIMB_OVERCLOCKING: AndroidFeatureType by registry.register(MNames.LIMB_OVERCLOCKING) { AndroidFeatureType(::LimbOverclockingFeature) } val ATTACK_BOOST: AndroidFeatureType by registry.register(MNames.ATTACK_BOOST) { AndroidFeatureType(::AttackBoostFeature) } val NANOBOTS_REGENERATION: AndroidFeatureType by registry.register(MNames.NANOBOTS_REGENERATION) { AndroidFeatureType(::NanobotsRegenerationFeature) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index ea35f1291..29da8121d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -452,6 +452,7 @@ object MItems { val QUANTUM_TRANSCEIVER: Item by registry.register("quantum_transceiver") { Item(DEFAULT_PROPERTIES) } val ELECTROMAGNET: Item by registry.register("electromagnet") { Item(DEFAULT_PROPERTIES) } + val ELECTROMOTOR: Item by registry.register("electromotor") { Item(DEFAULT_PROPERTIES) } val MIRROR_COMPOUND: Item by registry.register("mirror_compound") { Item(DEFAULT_PROPERTIES) } val MIRROR: Item by registry.register("mirror") { object : Item(DEFAULT_PROPERTIES) { override fun appendHoverText( @@ -488,6 +489,7 @@ object MItems { ::QUANTUM_TRANSCEIVER, ::ELECTROMAGNET, + ::ELECTROMOTOR, ::MIRROR_COMPOUND, ::MIRROR, @@ -514,6 +516,7 @@ object MItems { ::MATTER_TRANSFORM_MATRIX, ::QUANTUM_TRANSCEIVER, ::ELECTROMAGNET, + ::ELECTROMOTOR, ::MIRROR_COMPOUND, ::MIRROR, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt index 260392508..8fac6557d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -196,6 +196,7 @@ object MNames { // android features and research const val AIR_BAGS = "air_bags" const val STEP_ASSIST = "step_assist" + const val SWIM_BOOSTERS = "swim_boosters" const val LIMB_OVERCLOCKING = "limb_overclocking" const val LIMB_OVERCLOCKING_1 = "limb_overclocking_1" diff --git a/src/main/resources/assets/overdrive_that_matters/textures/item/component/electromotor.png b/src/main/resources/assets/overdrive_that_matters/textures/item/component/electromotor.png new file mode 100644 index 0000000000000000000000000000000000000000..d36635b4d3d72a5dd2644f4bd55341d6da866d5b GIT binary patch literal 2437 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