the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}