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 "EntityRenderDispatcher.h"
3#include "..\Minecraft.World\net.minecraft.world.entity.projectile.h"
4#include "..\Minecraft.World\net.minecraft.world.entity.animal.h"
5#include "..\Minecraft.World\net.minecraft.world.entity.monster.h"
6#include "..\Minecraft.World\net.minecraft.world.entity.item.h"
7#include "..\Minecraft.World\net.minecraft.world.entity.global.h"
8#include "..\Minecraft.World\net.minecraft.world.entity.player.h"
9#include "..\Minecraft.World\net.minecraft.world.entity.boss.enderdragon.h"
10#include "..\Minecraft.World\net.minecraft.world.entity.npc.h"
11#include "..\Minecraft.World\net.minecraft.world.entity.h"
12#include "..\Minecraft.World\net.minecraft.world.level.h"
13#include "..\Minecraft.World\net.minecraft.world.level.tile.h"
14#include "..\Minecraft.World\net.minecraft.world.item.h"
15#include "..\Minecraft.World\net.minecraft.world.item.alchemy.h"
16#include "SpiderRenderer.h"
17#include "PigRenderer.h"
18#include "SheepRenderer.h"
19#include "CowRenderer.h"
20#include "WolfRenderer.h"
21#include "ChickenRenderer.h"
22#include "CreeperRenderer.h"
23#include "SlimeRenderer.h"
24#include "PlayerRenderer.h"
25#include "GhastRenderer.h"
26#include "SquidRenderer.h"
27#include "MobRenderer.h"
28#include "GiantMobRenderer.h"
29#include "EntityRenderer.h"
30#include "PaintingRenderer.h"
31#include "ArrowRenderer.h"
32#include "FireballRenderer.h"
33#include "ItemRenderer.h"
34#include "ItemSpriteRenderer.h"
35#include "TntRenderer.h"
36#include "FallingTileRenderer.h"
37#include "MinecartRenderer.h"
38#include "BoatRenderer.h"
39#include "FishingHookRenderer.h"
40#include "LightningBoltRenderer.h"
41#include "HumanoidMobRenderer.h"
42#include "DefaultRenderer.h"
43#include "EndermanRenderer.h"
44#include "ExperienceOrbRenderer.h"
45#include "SilverfishRenderer.h"
46#include "MushroomCowRenderer.h"
47#include "SnowmanRenderer.h"
48#include "LavaSlimeRenderer.h"
49#include "VillagerRenderer.h"
50#include "EnderDragonRenderer.h"
51#include "EnderCrystalRenderer.h"
52#include "BlazeRenderer.h"
53#include "SkeletonRenderer.h"
54#include "WitchRenderer.h"
55#include "WitherBossRenderer.h"
56#include "LeashKnotRenderer.h"
57#include "WitherSkullRenderer.h"
58#include "TntMinecartRenderer.h"
59#include "MinecartSpawnerRenderer.h"
60#include "HorseRenderer.h"
61#include "SpiderModel.h"
62#include "PigModel.h"
63#include "SheepModel.h"
64#include "CowModel.h"
65#include "WolfModel.h"
66#include "ChickenModel.h"
67#include "CreeperModel.h"
68#include "SlimeModel.h"
69#include "GhastModel.h"
70#include "SquidModel.h"
71#include "MinecartModel.h"
72#include "BoatModel.h"
73#include "HumanoidModel.h"
74#include "SheepFurModel.h"
75#include "SkeletonModel.h"
76#include "ModelHorse.h"
77#include "Options.h"
78#include "ItemFrameRenderer.h"
79#include "OcelotRenderer.h"
80#include "VillagerGolemRenderer.h"
81#include "OcelotModel.h"
82#include "ZombieRenderer.h"
83#include "BatRenderer.h"
84#include "CaveSpiderRenderer.h"
85
86double EntityRenderDispatcher::xOff = 0.0;
87double EntityRenderDispatcher::yOff = 0.0;
88double EntityRenderDispatcher::zOff = 0.0;
89
90EntityRenderDispatcher *EntityRenderDispatcher::instance = NULL;
91
92void EntityRenderDispatcher::staticCtor()
93{
94 instance = new EntityRenderDispatcher();
95}
96
97EntityRenderDispatcher::EntityRenderDispatcher()
98{
99 glEnable(GL_LIGHTING);
100 renderers[eTYPE_SPIDER] = new SpiderRenderer();
101 renderers[eTYPE_CAVESPIDER] = new CaveSpiderRenderer();
102 renderers[eTYPE_PIG] = new PigRenderer(new PigModel(), new PigModel(0.5f), 0.7f);
103 renderers[eTYPE_SHEEP] = new SheepRenderer(new SheepModel(), new SheepFurModel(), 0.7f);
104 renderers[eTYPE_COW] = new CowRenderer(new CowModel(), 0.7f);
105 renderers[eTYPE_MUSHROOMCOW] = new MushroomCowRenderer(new CowModel(), 0.7f);
106 renderers[eTYPE_WOLF] = new WolfRenderer(new WolfModel(), new WolfModel(), 0.5f);
107 renderers[eTYPE_CHICKEN] = new ChickenRenderer(new ChickenModel(), 0.3f);
108 renderers[eTYPE_OCELOT] = new OcelotRenderer(new OcelotModel(), 0.4f);
109 renderers[eTYPE_SILVERFISH] = new SilverfishRenderer();
110 renderers[eTYPE_CREEPER] = new CreeperRenderer();
111 renderers[eTYPE_ENDERMAN] = new EndermanRenderer();
112 renderers[eTYPE_SNOWMAN] = new SnowManRenderer();
113 renderers[eTYPE_SKELETON] = new SkeletonRenderer();
114 renderers[eTYPE_WITCH] = new WitchRenderer();
115 renderers[eTYPE_BLAZE] = new BlazeRenderer();
116 renderers[eTYPE_ZOMBIE] = new ZombieRenderer();
117 renderers[eTYPE_PIGZOMBIE] = new ZombieRenderer();
118 renderers[eTYPE_SLIME] = new SlimeRenderer(new SlimeModel(16), new SlimeModel(0), 0.25f);
119 renderers[eTYPE_LAVASLIME] = new LavaSlimeRenderer();
120 renderers[eTYPE_PLAYER] = new PlayerRenderer();
121 renderers[eTYPE_GIANT] = new GiantMobRenderer(new ZombieModel(), 0.5f, 6);
122 renderers[eTYPE_GHAST] = new GhastRenderer();
123 renderers[eTYPE_SQUID] = new SquidRenderer(new SquidModel(), 0.7f);
124 renderers[eTYPE_VILLAGER] = new VillagerRenderer();
125 renderers[eTYPE_VILLAGERGOLEM] = new VillagerGolemRenderer();
126 renderers[eTYPE_BAT] = new BatRenderer();
127
128 renderers[eTYPE_MOB] = new MobRenderer(new HumanoidModel(), 0.5f);
129
130 renderers[eTYPE_ENDERDRAGON] = new EnderDragonRenderer();
131 renderers[eTYPE_ENDER_CRYSTAL] = new EnderCrystalRenderer();
132
133 renderers[eTYPE_WITHERBOSS] = new WitherBossRenderer();
134
135 renderers[eTYPE_ENTITY] = new DefaultRenderer();
136 renderers[eTYPE_PAINTING] = new PaintingRenderer();
137 renderers[eTYPE_ITEM_FRAME] = new ItemFrameRenderer();
138 renderers[eTYPE_LEASHFENCEKNOT] = new LeashKnotRenderer();
139 renderers[eTYPE_ARROW] = new ArrowRenderer();
140 renderers[eTYPE_SNOWBALL] = new ItemSpriteRenderer(Item::snowBall);
141 renderers[eTYPE_THROWNENDERPEARL] = new ItemSpriteRenderer(Item::enderPearl);
142 renderers[eTYPE_EYEOFENDERSIGNAL] = new ItemSpriteRenderer(Item::eyeOfEnder);
143 renderers[eTYPE_THROWNEGG] = new ItemSpriteRenderer(Item::egg);
144 renderers[eTYPE_THROWNPOTION] = new ItemSpriteRenderer(Item::potion, PotionBrewing::THROWABLE_MASK);
145 renderers[eTYPE_THROWNEXPBOTTLE] = new ItemSpriteRenderer(Item::expBottle);
146 renderers[eTYPE_FIREWORKS_ROCKET] = new ItemSpriteRenderer(Item::fireworks);
147 renderers[eTYPE_LARGE_FIREBALL] = new FireballRenderer(2.0f);
148 renderers[eTYPE_SMALL_FIREBALL] = new FireballRenderer(0.5f);
149 renderers[eTYPE_DRAGON_FIREBALL] = new FireballRenderer(2.0f); // 4J Added TU9
150 renderers[eTYPE_WITHER_SKULL] = new WitherSkullRenderer();
151 renderers[eTYPE_ITEMENTITY] = new ItemRenderer();
152 renderers[eTYPE_EXPERIENCEORB] = new ExperienceOrbRenderer();
153 renderers[eTYPE_PRIMEDTNT] = new TntRenderer();
154 renderers[eTYPE_FALLINGTILE] = new FallingTileRenderer();
155
156 renderers[eTYPE_MINECART_TNT] = new TntMinecartRenderer();
157 renderers[eTYPE_MINECART_SPAWNER] = new MinecartSpawnerRenderer();
158 renderers[eTYPE_MINECART_RIDEABLE] = new MinecartRenderer();
159
160 renderers[eTYPE_MINECART_FURNACE] = new MinecartRenderer();
161 renderers[eTYPE_MINECART_CHEST] = new MinecartRenderer();
162 renderers[eTYPE_MINECART_HOPPER] = new MinecartRenderer();
163
164 renderers[eTYPE_BOAT] = new BoatRenderer();
165 renderers[eTYPE_FISHINGHOOK] = new FishingHookRenderer();
166
167 renderers[eTYPE_HORSE] = new HorseRenderer(new ModelHorse(), .75f);
168
169 renderers[eTYPE_LIGHTNINGBOLT] = new LightningBoltRenderer();
170 glDisable(GL_LIGHTING);
171
172 AUTO_VAR(itEnd, renderers.end());
173 for( classToRendererMap::iterator it = renderers.begin(); it != itEnd; it++ )
174 {
175 it->second->init(this);
176 }
177
178 isGuiRender = false; // 4J added
179}
180
181EntityRenderer *EntityRenderDispatcher::getRenderer(eINSTANCEOF e)
182{
183 if( (e & eTYPE_PLAYER) == eTYPE_PLAYER) e = eTYPE_PLAYER;
184 //EntityRenderer * r = renderers[e];
185 AUTO_VAR(it, renderers.find( e )); // 4J Stu - The .at and [] accessors insert elements if they don't exist
186
187 if( it == renderers.end() )
188 {
189 app.DebugPrintf("Couldn't find renderer for entity of type %d\n", e);
190 // New renderer mapping required in above table
191 __debugbreak();
192 }
193 /* 4J - not doing this hierarchical search anymore. We need to explicitly add renderers for any eINSTANCEOF type that we want to be able to render
194 if (it == renderers.end() && e != Entity::_class)
195 {
196 EntityRenderer *r = getRenderer(dynamic_cast<Entity::Class *>( e->getSuperclass() ));
197 renderers.insert( classToRendererMap::value_type( e, r ) );
198 return r;
199 //assert(false);
200 }*/
201 return it->second;
202}
203
204EntityRenderer *EntityRenderDispatcher::getRenderer(shared_ptr<Entity> e)
205{
206 return getRenderer(e->GetType());
207}
208
209void EntityRenderDispatcher::prepare(Level *level, Textures *textures, Font *font, shared_ptr<LivingEntity> player, shared_ptr<LivingEntity> crosshairPickMob, Options *options, float a)
210{
211 this->level = level;
212 this->textures = textures;
213 this->options = options;
214 this->cameraEntity = player;
215 this->font = font;
216 this->crosshairPickMob = crosshairPickMob;
217
218 if (player->isSleeping())
219 {
220 int t = level->getTile(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z));
221 if (t == Tile::bed_Id)
222 {
223 int data = level->getData(Mth::floor(player->x), Mth::floor(player->y), Mth::floor(player->z));
224
225 int direction = data & 3;
226 playerRotY = (float)(direction * 90 + 180);
227 playerRotX = 0;
228 }
229 } else {
230 playerRotY = player->yRotO + (player->yRot - player->yRotO) * a;
231 playerRotX = player->xRotO + (player->xRot - player->xRotO) * a;
232 }
233
234 shared_ptr<Player> pl = dynamic_pointer_cast<Player>(player);
235 if (pl->ThirdPersonView() == 2)
236 {
237 playerRotY += 180;
238 }
239
240 xPlayer = player->xOld + (player->x - player->xOld) * a;
241 yPlayer = player->yOld + (player->y - player->yOld) * a;
242 zPlayer = player->zOld + (player->z - player->zOld) * a;
243
244}
245
246void EntityRenderDispatcher::render(shared_ptr<Entity> entity, float a)
247{
248 double x = entity->xOld + (entity->x - entity->xOld) * a;
249 double y = entity->yOld + (entity->y - entity->yOld) * a;
250 double z = entity->zOld + (entity->z - entity->zOld) * a;
251
252 // Fix for #61057 - TU7: Gameplay: Boat is glitching when player float forward and turning.
253 // Fix to handle the case that yRot and yRotO wrap over the 0/360 line
254 float rotDiff = entity->yRot - entity->yRotO;
255 if( rotDiff > 180 || rotDiff < -180)
256 {
257 if(entity->yRot > entity->yRotO)
258 {
259 rotDiff = (entity->yRot - 360) - entity->yRotO;
260 }
261 else
262 {
263 rotDiff = entity->yRot - (entity->yRotO - 360);
264 }
265 }
266 float r = entity->yRotO + (rotDiff) * a;
267
268 int col = entity->getLightColor(a);
269 if (entity->isOnFire())
270 {
271 col = SharedConstants::FULLBRIGHT_LIGHTVALUE;
272 }
273 int u = col % 65536;
274 int v = col / 65536;
275 glMultiTexCoord2f(GL_TEXTURE1, u / 1.0f, v / 1.0f);
276 glColor4f(1, 1, 1, 1);
277
278 render(entity, x - xOff, y - yOff, z - zOff, r, a);
279}
280
281void EntityRenderDispatcher::render(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a, bool bItemFrame, bool bRenderPlayerShadow)
282{
283 EntityRenderer *renderer = getRenderer(entity);
284 if (renderer != NULL)
285 {
286 renderer->SetItemFrame(bItemFrame);
287
288 renderer->render(entity, x, y, z, rot, a);
289 renderer->postRender(entity, x, y, z, rot, a, bRenderPlayerShadow);
290 }
291}
292
293double EntityRenderDispatcher::distanceToSqr(double x, double y, double z)
294{
295 double xd = x - xPlayer;
296 double yd = y - yPlayer;
297 double zd = z - zPlayer;
298 return xd * xd + yd * yd + zd * zd;
299}
300
301Font *EntityRenderDispatcher::getFont()
302{
303 return font;
304}
305
306void EntityRenderDispatcher::registerTerrainTextures(IconRegister *iconRegister)
307{
308 //for (EntityRenderer<? extends Entity> renderer : renderers.values())
309 for(AUTO_VAR(it, renderers.begin()); it != renderers.end(); ++it)
310 {
311 EntityRenderer *renderer = it->second;
312 renderer->registerTerrainTextures(iconRegister);
313 }
314}
315
316void EntityRenderDispatcher::renderHitbox(shared_ptr<Entity> entity, double x, double y, double z, float rot, float a)
317{
318 glDepthMask(false);
319 glDisable(GL_TEXTURE_2D);
320 glDisable(GL_LIGHTING);
321 glDisable(GL_CULL_FACE);
322 glDisable(GL_BLEND);
323
324 glPushMatrix();
325 Tesselator *t = Tesselator::getInstance();
326
327 t->begin();
328 t->color(255, 255, 255, 32);
329
330 double wnx = -entity->bbWidth / 2;
331 double wnz = -entity->bbWidth / 2;
332 double enx = entity->bbWidth / 2;
333 double enz = -entity->bbWidth / 2;
334
335 double wsx = -entity->bbWidth / 2;
336 double wsz = entity->bbWidth / 2;
337 double esx = entity->bbWidth / 2;
338 double esz = entity->bbWidth / 2;
339
340 double top = entity->bbHeight;
341
342 t->vertex(x + wnx, y + top, z + wnz);
343 t->vertex(x + wnx, y, z + wnz);
344 t->vertex(x + enx, y, z + enz);
345 t->vertex(x + enx, y + top, z + enz);
346
347 t->vertex(x + esx, y + top, z + esz);
348 t->vertex(x + esx, y, z + esz);
349 t->vertex(x + wsx, y, z + wsz);
350 t->vertex(x + wsx, y + top, z + wsz);
351
352 t->vertex(x + enx, y + top, z + enz);
353 t->vertex(x + enx, y, z + enz);
354 t->vertex(x + esx, y, z + esz);
355 t->vertex(x + esx, y + top, z + esz);
356
357 t->vertex(x + wsx, y + top, z + wsz);
358 t->vertex(x + wsx, y, z + wsz);
359 t->vertex(x + wnx, y, z + wnz);
360 t->vertex(x + wnx, y + top, z + wnz);
361
362 t->end();
363 glPopMatrix();
364
365 glEnable(GL_TEXTURE_2D);
366 glEnable(GL_LIGHTING);
367 glEnable(GL_CULL_FACE);
368 glDisable(GL_BLEND);
369 glDepthMask(true);
370}