aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/Monster.cpp
diff options
context:
space:
mode:
authordaoge <3523206925@qq.com>2026-03-03 03:04:10 +0800
committerGitHub <noreply@github.com>2026-03-03 03:04:10 +0800
commitb3feddfef372618c8a9d7a0abcaf18cfad866c18 (patch)
tree267761c3bb39241ba5c347bfbe2254d06686e287 /Minecraft.World/Monster.cpp
parent84c31a2331f7a0ec85b9d438992e244f60e5020f (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.cpp137
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