From 6b7f1fb949064eb2b609750784344d43ed7438ad Mon Sep 17 00:00:00 2001 From: GearShocky Date: Wed, 5 Mar 2025 07:08:49 +0500 Subject: [PATCH] andr oid --- .../render/entity/RogueAndroidRenderer.kt | 23 +++++++ .../dbotthepony/mc/otm/entity/AndroidMelee.kt | 56 ++++++++++++++++++ .../ru/dbotthepony/mc/otm/registry/MNames.kt | 4 ++ .../mc/otm/registry/game/MEntityTypes.kt | 16 +++++ .../textures/entity/android/melee.png | Bin 0 -> 1850 bytes .../textures/entity/android/ranged.png | Bin 0 -> 1752 bytes 6 files changed, 99 insertions(+) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/RogueAndroidRenderer.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/entity/AndroidMelee.kt create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/entity/android/melee.png create mode 100644 src/main/resources/assets/overdrive_that_matters/textures/entity/android/ranged.png diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/RogueAndroidRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/RogueAndroidRenderer.kt new file mode 100644 index 000000000..ad7c1a5d4 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/entity/RogueAndroidRenderer.kt @@ -0,0 +1,23 @@ +package ru.dbotthepony.mc.otm.client.render.entity +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.core.ResourceLocation + +import net.minecraft.client.model.PlayerModel +import net.minecraft.client.renderer.entity.EntityRendererProvider +import net.minecraft.client.renderer.entity.HumanoidMobRenderer +import net.minecraft.client.model.geom.ModelLayers + +import net.minecraft.resources.ResourceLocation +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.Mob + + +class RogueAndroidRenderer(context: EntityRendererProvider.Context, private val entityType: EntityType, private val androidTexture: String) : + HumanoidMobRenderer>( + context, PlayerModel(context.bakeLayer(ModelLayers.PLAYER), false), 0.5f + ) { + + override fun getTextureLocation(entity: T): ResourceLocation { + return ResourceLocation(OverdriveThatMatters.MOD_ID, "textures/entity/android/$androidTexture.png") + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/entity/AndroidMelee.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/AndroidMelee.kt new file mode 100644 index 000000000..0df65bc77 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/entity/AndroidMelee.kt @@ -0,0 +1,56 @@ +package ru.dbotthepony.mc.otm.entity + +import net.minecraft.sounds.SoundEvent +import net.minecraft.sounds.SoundEvents +import net.minecraft.world.entity.EntityType +import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.ai.attributes.AttributeSupplier +import net.minecraft.world.entity.ai.attributes.Attributes +import net.minecraft.world.entity.ai.goal.LeapAtTargetGoal +import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal +import net.minecraft.world.entity.ai.goal.MeleeAttackGoal +import net.minecraft.world.entity.ai.goal.RandomLookAroundGoal +import net.minecraft.world.entity.ai.goal.WaterAvoidingRandomStrollGoal +import net.minecraft.world.entity.ai.goal.target.HurtByTargetGoal +import net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal +import net.minecraft.world.entity.ai.navigation.GroundPathNavigation +import net.minecraft.world.entity.ai.navigation.PathNavigation +import net.minecraft.world.entity.monster.Monster +import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.Level + +class AndroidMelee(type: EntityType, level: Level) : Monster(type, level) { + + override fun registerGoals() { + goalSelector.addGoal(8, RandomLookAroundGoal(this)) + goalSelector.addGoal(7, WaterAvoidingRandomStrollGoal(this, 0.8)) + goalSelector.addGoal(8, LookAtPlayerGoal(this, Player::class.java, 8f)) + goalSelector.addGoal(3, NearestAttackableTargetGoal(this, LivingEntity::class.java , true, true)) + goalSelector.addGoal(3, NearestAttackableTargetGoal(this, Player::class.java , true, true)) + + goalSelector.addGoal(1, LeapAtTargetGoal(this, 0.4f)) + goalSelector.addGoal(2, MeleeAttackGoal(this, 1.3, true)) + + targetSelector.addGoal(1, HurtByTargetGoal(this)) + } + + override fun getArmorSlots(): MutableIterable { + return super.getArmorSlots() + } + + override fun getHurtSound(damageSource: net.minecraft.world.damagesource.DamageSource): SoundEvent { + return SoundEvents.IRON_GOLEM_HURT + } + + override fun createNavigation(level: Level): PathNavigation = GroundPathNavigation(this, level) + + companion object { + fun createAttributes() : AttributeSupplier.Builder { + return createMonsterAttributes() + .add(Attributes.MAX_HEALTH, 16.0) + .add(Attributes.MOVEMENT_SPEED, 0.3) + .add(Attributes.ATTACK_DAMAGE, 3.0) + } + } +} 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 8d701847e..03e4d3d46 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -330,6 +330,10 @@ object MNames { const val BREAD_MONSTER = "bread_monster" const val LOADER = "loader" + const val ANDROID_MELEE = "android_melee" + const val ANDROID_RANGED = "android_melee" + const val ANDROID_OVERSEER = "android_melee" + const val PHANTOM_ATTRACTOR = "phantom_attractor" const val JUMP_BOOST = "jump_boost" const val ENDER_TELEPORTER = "ender_teleporter" diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt index 434309a70..af4a6b109 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/game/MEntityTypes.kt @@ -16,6 +16,7 @@ import net.neoforged.neoforge.event.entity.EntityAttributeCreationEvent import ru.dbotthepony.mc.otm.client.render.entity.BreadMonsterRenderer import ru.dbotthepony.mc.otm.client.render.entity.LoaderRenderer import ru.dbotthepony.mc.otm.client.render.entity.PlasmaProjectileRenderer +import ru.dbotthepony.mc.otm.client.render.entity.RogueAndroidRenderer import ru.dbotthepony.mc.otm.entity.* import ru.dbotthepony.mc.otm.registry.MDeferredRegister import ru.dbotthepony.mc.otm.registry.MNames @@ -57,6 +58,16 @@ object MEntityTypes { .build(MNames.LOADER) } + val ANDROID_MELEE: EntityType by registry.register(MNames.ANDROID_MELEE) { + EntityType.Builder.of(::AndroidMelee, MobCategory.MONSTER) + .sized(1.2f, 2.5f) + .eyeHeight(2.0f) + .passengerAttachments(2.5f) + .clientTrackingRange(12) + .build(MNames.ANDROID_MELEE) + } + + fun register(bus: IEventBus) { registry.register(bus) bus.addListener(this::registerAttributes) @@ -66,6 +77,7 @@ object MEntityTypes { private fun registerAttributes(event: EntityAttributeCreationEvent) { event.put(BREAD_MONSTER, BreadMonster.createAttributes().build()) event.put(LOADER, Loader.createAttributes().build()) + event.put(ANDROID_MELEE, Loader.createAttributes().build()) } @Suppress("unchecked_cast") @@ -80,6 +92,10 @@ object MEntityTypes { EntityRenderers.register(RIDEABLE_DUMMY, ::NoopRenderer) EntityRenderers.register(BREAD_MONSTER, ::BreadMonsterRenderer) EntityRenderers.register(LOADER, ::LoaderRenderer) + + EntityRenderers.register(ANDROID_MELEE) { context -> + RogueAndroidRenderer(context, ANDROID_MELEE, "melee") + } } } } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/entity/android/melee.png b/src/main/resources/assets/overdrive_that_matters/textures/entity/android/melee.png new file mode 100644 index 0000000000000000000000000000000000000000..bd54b990218662a8d267ae4aaefc114f5bcc5451 GIT binary patch literal 1850 zcmV-A2gUe_P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2Czv)K~#8N-I_g8 zWJeH$xd8;QV626^_;@(-Q%qLorhR5 zB4fI%v+Gq>_l$;F9gN}n`g$|OGWPf&s#6t}urd#|UhSPqu6K3C=OXXV%+PbU?{Q8I z>itV`mFbFTTX`T&y1l*KAu-mvA`&Q=54x$)hhl8sLgr)IL-%YyjZ7JosmsrwH$Q#( z!W*x9^#%+P!<&D8-faFp=!`Qa#u^3cx{4I$4TySsh~;eqsytPLg|0cRlcP9YaT(3j zI@(qqs0MWA|7(I8z*==e#O9)vXS4x2rHV38nTJ}h_Bt_+VW%2Lf%)VpOvO7D*P72^ zD^K|CfgIfpsOSbTtCJOpxu(i7g;7fh8R!a4P`p~31+Ho)g}FIS3)7l2)(JYRTq1g> z;!#EkH2^Z#?Wxul!%tPrr$oUXXH3jBinr+Il@CT4CHy)w*WPMvZ{PuXk9(n03I^<< z8NYn}w%x;+m<)LSJdZR@kV{1GwZV`r2ZfxUpKs32&bp%JK7c)~2FR%5)jZNP!P`bT zeXkg@AbmoQQTn`pZUgj|aq2UJv7VPTt$eNtn{D_;B~syT)~WToySp8|_NxI-VmZI& z{`rt&?3G@*So1wqK8QAKw!wy_4S0BXC=0-B#hhPrisdV^=8R=frkye6n=qpSGFg)@Ghb)u4RTgmSZN_^ z**xUAt2AJU(q(2du+qUw3o9*TtyRmE2A~a_Z6J2?p3bo$R{tH|=e&Ami=RGy>czt5 za?DN04;0nURK)i2qdNfdis8YW4OG$++Hol5pH7b2JjR3n>Jv{4XA#nBlbf! zV95j$Ccl-VY(i+)U=XZU6?H(pGxbea@H|V>jdEMzk8>w_AY>0vC-gT8)3 zHNayb>!C6lOFdNDF~-&sm3bJ;^Dty`Xl-riFq~6NqCp$eaV%{>>!kb?$JX=QW4vZe zZ9oi%!9%8W3XK;i@*s6vl-}1A6SW3gdaY%&;*Ker4lg3P>q^0&*pbbjbKMRWO8Z)RA8oSpf^BfGKZSVnsiY{517+IW|mFb zM+4k|(>0mIGugvy{%3K~HBm+nLpNb(O`rBLZ32z{Yv5GTn5j-5wv4v;<_&o^WeC9ws%3g^)Bpeg literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/overdrive_that_matters/textures/entity/android/ranged.png b/src/main/resources/assets/overdrive_that_matters/textures/entity/android/ranged.png new file mode 100644 index 0000000000000000000000000000000000000000..65d6b5993feed1d4a0a628f670902fdd87bd7dfc GIT binary patch literal 1752 zcmV;}1}FK6P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D22M#tK~#8N<(fTG zBu5a1xd8;fHa7NRiM1t1I>F*@5QM-*G8G|PH_!z*fD8;A4k1%F8R_fDH}S~Hs+sPY zh7I&0UUXGvR(8Iu>fYJj-CKtrzkFSYS65d9-FA3*IPm)V`W0o5G?Ve={@2Cho30#4AXp&(C@zgX(^0xZov8Z`Qqm0W+3Ca z8-N{#X+C7}qMD!va78$DTcnwc-U)b<2IQU3^Y?0iP5@&Vt|eOb(a>{`ART+gZifiZ zj{uA`li>}JD5wUg2@$@8Vq!WS5(?D-w@GM=k!CVD>Vl5FsQIi7a4~)YGWB@m$0X8B zhBqLK-$?@`N~HMK?kXnR70+7Fm8m$lQE1*-Q6h!P*IP?&XGq@Tand6-?66*3dXY(3 zwWB>>D-S=6^nMVr;qwApVub8(#d}T|x>qpxv@4k|@V^YN=9R6=AtHG3&ku{m-+Rk3 zSA0>+@~vG_I~JkcSTRD^qqTE>Oc7hrV_JEji>3)0&2!uoMj0zuccj<(HwH&Flfop-n;?G{uNcpf$&Nc^k202UQF_T$ z0_BIkCfu7tyXr(tCNDbq8CNl$BQrNZ_9$ZsL{x9}a4(VL)QE6T2gN-+JPhG6xvRCs+(*%!=a{5{^ z!lr|yG~npyXwnT>!#g2202@BfSV>hK932RZBzosP~Fb-B48EctWE&r9(hAF zUq@m?W*gPQbyT5@^YMf(%vr@ke99>*J~vX$-nEgn-* z^@hwgl#pwc2zpFr6%TjSfamAu6{-PTE6PV~$ZSK45TgPz@hL7dA7|(da#pdhiiP;H zc*uQcX+V#P%gkb66$h(WSj9qoty(r|0I?yn4T7CK)7jQz_2=*|=hZ!1JUKa8v4za( z7@LsK*L7&z~3Y&rhGW7qci z3B^l%#Ry%&CNVpMb~iJh0zV0vYJeK0F+Rp`0&b`xRS08jDyo8F=VIJuesDA2EoZNg z;hfHhxXt`f1IC_!|2@M{*S?jXh3GTn)vXK01Wp4|9qZ_nA{MU zW3t~H02Q0<#6}tOK!SVU3tWt--O9o=m!DXl%dam`5-Pvu@)H|n%!}Ulf-D|pLEAPU z^UWL3LlzISpiKFR^~R`C`5!`BBsR);KVkyyTMj6|~f7fUB8lZx5k(nN&1~AUzp>xJj&P}YQWeN;NnzZ zrpG{UfW&0>nubmnYyePfVR>b8b1zeLWp-r