the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 160 lines 4.1 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.world.h" 3#include "net.minecraft.world.phys.h" 4#include "net.minecraft.world.level.h" 5#include "net.minecraft.world.entity.ai.attributes.h" 6#include "net.minecraft.world.entity.player.h" 7#include "net.minecraft.world.entity.monster.h" 8#include "net.minecraft.world.damagesource.h" 9#include "net.minecraft.world.effect.h" 10#include "net.minecraft.world.item.enchantment.h" 11#include "Monster.h" 12 13#include "..\Minecraft.Client\Minecraft.h" 14 15 16Monster::Monster(Level *level) : PathfinderMob( level ) 17{ 18 xpReward = Enemy::XP_REWARD_MEDIUM; 19} 20 21void Monster::aiStep() 22{ 23 updateSwingTime(); 24 float br = getBrightness(1); 25 if (br > 0.5f) 26 { 27 noActionTime += 2; 28 } 29 30 PathfinderMob::aiStep(); 31} 32 33void Monster::tick() 34{ 35 PathfinderMob::tick(); 36 if (!level->isClientSide && (level->difficulty == Difficulty::PEACEFUL || Minecraft::GetInstance()->isTutorial() ) ) remove(); 37} 38 39shared_ptr<Entity> Monster::findAttackTarget() 40{ 41#ifndef _FINAL_BUILD 42 if(app.GetMobsDontAttackEnabled()) 43 { 44 return shared_ptr<Player>(); 45 } 46#endif 47 48 shared_ptr<Player> player = level->getNearestAttackablePlayer(shared_from_this(), 16); 49 if (player != NULL && canSee(player) ) return player; 50 return shared_ptr<Player>(); 51} 52 53bool Monster::hurt(DamageSource *source, float dmg) 54{ 55 if (isInvulnerable()) return false; 56 if (PathfinderMob::hurt(source, dmg)) 57 { 58 shared_ptr<Entity> sourceEntity = source->getEntity(); 59 if (rider.lock() == sourceEntity || riding == sourceEntity) return true; 60 61 if (sourceEntity != shared_from_this()) 62 { 63 attackTarget = sourceEntity; 64 } 65 return true; 66 } 67 return false; 68} 69 70/** 71* Performs hurt action, returns if successful 72* 73* @param target 74* @return 75*/ 76bool Monster::doHurtTarget(shared_ptr<Entity> target) 77{ 78 float dmg = (float) getAttribute(SharedMonsterAttributes::ATTACK_DAMAGE)->getValue(); 79 int knockback = 0; 80 81 82 if ( target->instanceof(eTYPE_LIVINGENTITY) ) 83 { 84 shared_ptr<LivingEntity> livingTarget = dynamic_pointer_cast<LivingEntity>(target); 85 dmg += EnchantmentHelper::getDamageBonus(dynamic_pointer_cast<LivingEntity>(shared_from_this()), livingTarget); 86 knockback += EnchantmentHelper::getKnockbackBonus(dynamic_pointer_cast<LivingEntity>(shared_from_this()), livingTarget); 87 } 88 89 boolean wasHurt = target->hurt(DamageSource::mobAttack(dynamic_pointer_cast<LivingEntity>(shared_from_this())), dmg); 90 91 if (wasHurt) 92 { 93 if (knockback > 0) 94 { 95 target->push(-Mth::sin(yRot * PI / 180) * knockback * .5f, 0.1, Mth::cos(yRot * PI / 180) * knockback * .5f); 96 xd *= 0.6; 97 zd *= 0.6; 98 } 99 100 int fireAspect = EnchantmentHelper::getFireAspect(dynamic_pointer_cast<LivingEntity>(shared_from_this())); 101 if (fireAspect > 0) 102 { 103 target->setOnFire(fireAspect * 4); 104 } 105 106 if (target->instanceof(eTYPE_LIVINGENTITY)) 107 { 108 shared_ptr<LivingEntity> livingTarget = dynamic_pointer_cast<LivingEntity>(target); 109 ThornsEnchantment::doThornsAfterAttack(shared_from_this(), livingTarget, random); 110 } 111 } 112 113 return wasHurt; 114} 115 116void Monster::checkHurtTarget(shared_ptr<Entity> target, float distance) 117{ 118 if (attackTime <= 0 && distance < 2.0f && target->bb->y1 > bb->y0 && target->bb->y0 < bb->y1) 119 { 120 attackTime = 20; 121 doHurtTarget(target); 122 } 123} 124 125float Monster::getWalkTargetValue(int x, int y, int z) 126{ 127 return 0.5f - level->getBrightness(x, y, z); 128} 129 130bool Monster::isDarkEnoughToSpawn() 131{ 132 int xt = Mth::floor(x); 133 int yt = Mth::floor(bb->y0); 134 int zt = Mth::floor(z); 135 if (level->getBrightness(LightLayer::Sky, xt, yt, zt) > random->nextInt(32)) return false; 136 137 int br = level->getRawBrightness(xt, yt, zt); 138 139 if (level->isThundering()) 140 { 141 int tmp = level->skyDarken; 142 level->skyDarken = 10; 143 br = level->getRawBrightness(xt, yt, zt); 144 level->skyDarken = tmp; 145 } 146 147 return br <= random->nextInt(8); 148} 149 150bool Monster::canSpawn() 151{ 152 return level->difficulty > Difficulty::PEACEFUL && isDarkEnoughToSpawn() && PathfinderMob::canSpawn(); 153} 154 155void Monster::registerAttributes() 156{ 157 PathfinderMob::registerAttributes(); 158 159 getAttributes()->registerAttribute(SharedMonsterAttributes::ATTACK_DAMAGE); 160}