diff options
| author | daoge <3523206925@qq.com> | 2026-03-03 03:04:10 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-03 03:04:10 +0800 |
| commit | b3feddfef372618c8a9d7a0abcaf18cfad866c18 (patch) | |
| tree | 267761c3bb39241ba5c347bfbe2254d06686e287 /Minecraft.World/Monster.cpp | |
| parent | 84c31a2331f7a0ec85b9d438992e244f60e5020f (diff) | |
feat: TU19 (Dec 2014) Features & Content (#155)
* try to resolve merge conflict
* feat: TU19 (Dec 2014) Features & Content (#32)
* December 2014 files
* Working release build
* Fix compilation issues
* Add sound to Windows64Media
* Add DLC content and force Tutorial DLC
* Revert "Add DLC content and force Tutorial DLC"
This reverts commit 97a43994725008e35fceb984d5549df9c8cea470.
* Disable broken light packing
* Disable breakpoint during DLC texture map load
Allows DLC loading but the DLC textures are still broken
* Fix post build not working
* ...
* fix vs2022 build
* fix cmake build
---------
Co-authored-by: Loki <lokirautio@gmail.com>
Diffstat (limited to 'Minecraft.World/Monster.cpp')
| -rw-r--r-- | Minecraft.World/Monster.cpp | 137 |
1 files changed, 69 insertions, 68 deletions
diff --git a/Minecraft.World/Monster.cpp b/Minecraft.World/Monster.cpp index 627ce8d1..174a706c 100644 --- a/Minecraft.World/Monster.cpp +++ b/Minecraft.World/Monster.cpp @@ -2,7 +2,9 @@ #include "net.minecraft.world.h" #include "net.minecraft.world.phys.h" #include "net.minecraft.world.level.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" #include "net.minecraft.world.damagesource.h" #include "net.minecraft.world.effect.h" #include "net.minecraft.world.item.enchantment.h" @@ -11,40 +13,27 @@ #include "..\Minecraft.Client\Minecraft.h" - -void Monster::_init() -{ - attackDamage = 2; -} - Monster::Monster(Level *level) : PathfinderMob( level ) { - // 4J Stu - This function call had to be moved here from the Entity ctor to ensure that - // the derived version of the function is called - - // 4J Stu - Only the most derived classes should call this - //this->defineSynchedData(); - - _init(); - xpReward = Enemy::XP_REWARD_MEDIUM; } void Monster::aiStep() { - float br = getBrightness(1); - if (br > 0.5f) + updateSwingTime(); + float br = getBrightness(1); + if (br > 0.5f) { - noActionTime += 2; - } + noActionTime += 2; + } - PathfinderMob::aiStep(); + PathfinderMob::aiStep(); } void Monster::tick() { - PathfinderMob::tick(); - if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); + PathfinderMob::tick(); + if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); } shared_ptr<Entity> Monster::findAttackTarget() @@ -56,25 +45,26 @@ shared_ptr<Entity> Monster::findAttackTarget() } #endif - shared_ptr<Player> player = level->getNearestAttackablePlayer(shared_from_this(), 16); + shared_ptr<Player> player = level->getNearestAttackablePlayer(shared_from_this(), 16); if (player != NULL && canSee(player) ) return player; - return shared_ptr<Player>(); + return shared_ptr<Player>(); } -bool Monster::hurt(DamageSource *source, int dmg) +bool Monster::hurt(DamageSource *source, float dmg) { - if (PathfinderMob::hurt(source, dmg)) + if (isInvulnerable()) return false; + if (PathfinderMob::hurt(source, dmg)) { shared_ptr<Entity> sourceEntity = source->getEntity(); - if (rider.lock() == sourceEntity || riding == sourceEntity) return true; + if (rider.lock() == sourceEntity || riding == sourceEntity) return true; - if (sourceEntity != shared_from_this()) + if (sourceEntity != shared_from_this()) { - this->attackTarget = sourceEntity; - } - return true; - } - return false; + attackTarget = sourceEntity; + } + return true; + } + return false; } /** @@ -85,75 +75,86 @@ bool Monster::hurt(DamageSource *source, int dmg) */ bool Monster::doHurtTarget(shared_ptr<Entity> target) { - int dmg = attackDamage; - if (hasEffect(MobEffect::damageBoost)) - { - dmg += (3 << getEffect(MobEffect::damageBoost)->getAmplifier()); - } - if (hasEffect(MobEffect::weakness)) + float dmg = (float) getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue(); + int knockback = 0; + + + if ( target->instanceof(eTYPE_LIVINGENTITY) ) { - dmg -= (2 << getEffect(MobEffect::weakness)->getAmplifier()); + shared_ptr<LivingEntity> livingTarget = dynamic_pointer_cast<LivingEntity>(target); + dmg += EnchantmentHelper::getDamageBonus(dynamic_pointer_cast<LivingEntity>(shared_from_this()), livingTarget); + knockback += EnchantmentHelper::getKnockbackBonus(dynamic_pointer_cast<LivingEntity>(shared_from_this()), livingTarget); } - DamageSource *damageSource = DamageSource::mobAttack(dynamic_pointer_cast<Mob>( shared_from_this() ) ); - bool didHurt = target->hurt(damageSource, dmg); - delete damageSource; + boolean wasHurt = target->hurt(DamageSource::mobAttack(dynamic_pointer_cast<LivingEntity>(shared_from_this())), dmg); - if (didHurt) + if (wasHurt) { - int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast<Mob>(shared_from_this())); + if (knockback > 0) + { + target->push(-Mth::sin(yRot * PI / 180) * knockback * .5f, 0.1, Mth::cos(yRot * PI / 180) * knockback * .5f); + xd *= 0.6; + zd *= 0.6; + } + + int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast<LivingEntity>(shared_from_this())); if (fireAspect > 0) { target->setOnFire(fireAspect * 4); } - shared_ptr<Mob> mob = dynamic_pointer_cast<Mob>(target); - if (mob != NULL) + if (target->instanceof(eTYPE_LIVINGENTITY)) { - ThornsEnchantment::doThornsAfterAttack(shared_from_this(), mob, random); + shared_ptr<LivingEntity> livingTarget = dynamic_pointer_cast<LivingEntity>(target); + ThornsEnchantment::doThornsAfterAttack(shared_from_this(), livingTarget, random); } } - return didHurt; + return wasHurt; } void Monster::checkHurtTarget(shared_ptr<Entity> target, float distance) { - if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) + if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) { - attackTime = 20; - doHurtTarget(target); - } + attackTime = 20; + doHurtTarget(target); + } } float Monster::getWalkTargetValue(int x, int y, int z) { - return 0.5f - level->getBrightness(x, y, z); + return 0.5f - level->getBrightness(x, y, z); } bool Monster::isDarkEnoughToSpawn() { - int xt = Mth::floor(x); - int yt = Mth::floor(bb->y0); - int zt = Mth::floor(z); - if (level->getBrightness(LightLayer::Sky, xt, yt, zt) > random->nextInt(32)) return false; + int xt = Mth::floor(x); + int yt = Mth::floor(bb->y0); + int zt = Mth::floor(z); + if (level->getBrightness(LightLayer::Sky, xt, yt, zt) > random->nextInt(32)) return false; - int br = level->getRawBrightness(xt, yt, zt); + int br = level->getRawBrightness(xt, yt, zt); - if (level->isThundering()) + if (level->isThundering()) { - int tmp = level->skyDarken; - level->skyDarken = 10; - br = level->getRawBrightness(xt, yt, zt); - level->skyDarken = tmp; - } + int tmp = level->skyDarken; + level->skyDarken = 10; + br = level->getRawBrightness(xt, yt, zt); + level->skyDarken = tmp; + } - return br <= random->nextInt(8); + return br <= random->nextInt(8); } bool Monster::canSpawn() { - // 4J Stu - // Fix for #8265 - AI: Monsters will flash briefly on the screen around Monster Spawners when the game settings are set to Peaceful. - return isDarkEnoughToSpawn() && PathfinderMob::canSpawn() && level->difficulty > Difficulty::PEACEFUL; + return level->difficulty > Difficulty::PEACEFUL && isDarkEnoughToSpawn() && PathfinderMob::canSpawn(); +} + +void Monster::registerAttributes() +{ + PathfinderMob::registerAttributes(); + + getAttributes()->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE); }
\ No newline at end of file |
