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 "..\Minecraft.World\Mth.h"
3#include "..\Minecraft.World\net.minecraft.world.entity.animal.h"
4#include "ModelHorse.h"
5#include "ModelPart.h"
6
7ModelHorse::ModelHorse()
8{
9 texWidth = 128;
10 texHeight = 128;
11
12 // TODO: All rotation magic numbers in this method
13 Body = new ModelPart(this, 0, 34);
14 Body->addBox(-5.f, -8.f, -19.f, 10, 10, 24);
15 Body->setPos(0.f, 11.f, 9.f);
16
17 TailA = new ModelPart(this, 44, 0);
18 TailA->addBox(-1.f, -1.f, 0.f, 2, 2, 3);
19 TailA->setPos(0.f, 3.f, 14.f);
20 setRotation(TailA, -1.134464f, 0.f, 0.f);
21
22 TailB = new ModelPart(this, 38, 7);
23 TailB->addBox(-1.5f, -2.f, 3.f, 3, 4, 7);
24 TailB->setPos(0.f, 3.f, 14.f);
25 setRotation(TailB, -1.134464f, 0.f, 0.f);
26
27 TailC = new ModelPart(this, 24, 3);
28 TailC->addBox(-1.5f, -4.5f, 9.f, 3, 4, 7);
29 TailC->setPos(0.f, 3.f, 14.f);
30 setRotation(TailC, -1.40215f, 0.f, 0.f);
31
32 Leg1A = new ModelPart(this, 78, 29);
33 Leg1A->addBox(-2.5f, -2.f, -2.5f, 4, 9, 5);
34 Leg1A->setPos(4.f, 9.f, 11.f);
35
36 Leg1B = new ModelPart(this, 78, 43);
37 Leg1B->addBox(-2.f, 0.f, -1.5f, 3, 5, 3);
38 Leg1B->setPos(4.f, 16.f, 11.f);
39
40 Leg1C = new ModelPart(this, 78, 51);
41 Leg1C->addBox(-2.5f, 5.1f, -2.f, 4, 3, 4);
42 Leg1C->setPos(4.f, 16.f, 11.f);
43
44 Leg2A = new ModelPart(this, 96, 29);
45 Leg2A->addBox(-1.5f, -2.f, -2.5f, 4, 9, 5);
46 Leg2A->setPos(-4.f, 9.f, 11.f);
47
48 Leg2B = new ModelPart(this, 96, 43);
49 Leg2B->addBox(-1.f, 0.f, -1.5f, 3, 5, 3);
50 Leg2B->setPos(-4.f, 16.f, 11.f);
51
52 Leg2C = new ModelPart(this, 96, 51);
53 Leg2C->addBox(-1.5f, 5.1f, -2.f, 4, 3, 4);
54 Leg2C->setPos(-4.f, 16.f, 11.f);
55
56 Leg3A = new ModelPart(this, 44, 29);
57 Leg3A->addBox(-1.9f, -1.f, -2.1f, 3, 8, 4);
58 Leg3A->setPos(4.f, 9.f, -8.f);
59
60 Leg3B = new ModelPart(this, 44, 41);
61 Leg3B->addBox(-1.9f, 0.f, -1.6f, 3, 5, 3);
62 Leg3B->setPos(4.f, 16.f, -8.f);
63
64 Leg3C = new ModelPart(this, 44, 51);
65 Leg3C->addBox(-2.4f, 5.1f, -2.1f, 4, 3, 4);
66 Leg3C->setPos(4.f, 16.f, -8.f);
67
68 Leg4A = new ModelPart(this, 60, 29);
69 Leg4A->addBox(-1.1f, -1.f, -2.1f, 3, 8, 4);
70 Leg4A->setPos(-4.f, 9.f, -8.f);
71
72 Leg4B = new ModelPart(this, 60, 41);
73 Leg4B->addBox(-1.1f, 0.f, -1.6f, 3, 5, 3);
74 Leg4B->setPos(-4.f, 16.f, -8.f);
75
76 Leg4C = new ModelPart(this, 60, 51);
77 Leg4C->addBox(-1.6f, 5.1f, -2.1f, 4, 3, 4);
78 Leg4C->setPos(-4.f, 16.f, -8.f);
79
80 Head = new ModelPart(this, 0, 0);
81 Head->addBox(-2.5f, -10.f, -1.5f, 5, 5, 7);
82 Head->setPos(0.f, 4.f, -10.f);
83 setRotation(Head, 0.5235988f, 0.f, 0.f);
84
85 UMouth = new ModelPart(this, 24, 18);
86 UMouth->addBox(-2.f, -10.f, -7.f, 4, 3, 6);
87 UMouth->setPos(0.f, 3.95f, -10.f);
88 setRotation(UMouth, 0.5235988f, 0.f, 0.f);
89
90 LMouth = new ModelPart(this, 24, 27);
91 LMouth->addBox(-2.f, -7.f, -6.5f, 4, 2, 5);
92 LMouth->setPos(0.f, 4.f, -10.f);
93 setRotation(LMouth, 0.5235988f, 0.f, 0.f);
94
95 Head->addChild(UMouth);
96 Head->addChild(LMouth);
97
98 Ear1 = new ModelPart(this, 0, 0);
99 Ear1->addBox(0.45f, -12.f, 4.f, 2, 3, 1);
100 Ear1->setPos(0.f, 4.f, -10.f);
101 setRotation(Ear1, 0.5235988f, 0.f, 0.f);
102
103 Ear2 = new ModelPart(this, 0, 0);
104 Ear2->addBox(-2.45f, -12.f, 4.f, 2, 3, 1);
105 Ear2->setPos(0.f, 4.f, -10.f);
106 setRotation(Ear2, 0.5235988f, 0.f, 0.f);
107
108 MuleEarL = new ModelPart(this, 0, 12);
109 MuleEarL->addBox(-2.f, -16.f, 4.f, 2, 7, 1);
110 MuleEarL->setPos(0.f, 4.f, -10.f);
111 setRotation(MuleEarL, 0.5235988f, 0.f, 0.2617994f);
112
113 MuleEarR = new ModelPart(this, 0, 12);
114 MuleEarR->addBox(0.f, -16.f, 4.f, 2, 7, 1);
115 MuleEarR->setPos(0.f, 4.f, -10.f);
116 setRotation(MuleEarR, 0.5235988f, 0.f, -0.2617994f);
117
118 Neck = new ModelPart(this, 0, 12);
119 Neck->addBox(-2.05f, -9.8f, -2.f, 4, 14, 8);
120 Neck->setPos(0.f, 4.f, -10.f);
121 setRotation(Neck, 0.5235988f, 0.f, 0.f);
122
123 Bag1 = new ModelPart(this, 0, 34);
124 Bag1->addBox(-3.f, 0.f, 0.f, 8, 8, 3);
125 Bag1->setPos(-7.5f, 3.f, 10.f);
126 setRotation(Bag1, 0.f, 1.570796f, 0.f);
127
128 Bag2 = new ModelPart(this, 0, 47);
129 Bag2->addBox(-3.f, 0.f, 0.f, 8, 8, 3);
130 Bag2->setPos(4.5f, 3.f, 10.f);
131 setRotation(Bag2, 0.f, 1.570796f, 0.f);
132
133 Saddle = new ModelPart(this, 80, 0);
134 Saddle->addBox(-5.f, 0.f, -3.f, 10, 1, 8);
135 Saddle->setPos(0.f, 2.f, 2.f);
136
137 SaddleB = new ModelPart(this, 106, 9);
138 SaddleB->addBox(-1.5f, -1.f, -3.f, 3, 1, 2);
139 SaddleB->setPos(0.f, 2.f, 2.f);
140
141 SaddleC = new ModelPart(this, 80, 9);
142 SaddleC->addBox(-4.f, -1.f, 3.f, 8, 1, 2);
143 SaddleC->setPos(0.f, 2.f, 2.f);
144
145 SaddleL2 = new ModelPart(this, 74, 0);
146 SaddleL2->addBox(-0.5f, 6.f, -1.f, 1, 2, 2);
147 SaddleL2->setPos(5.f, 3.f, 2.f);
148
149 SaddleL = new ModelPart(this, 70, 0);
150 SaddleL->addBox(-0.5f, 0.f, -0.5f, 1, 6, 1);
151 SaddleL->setPos(5.f, 3.f, 2.f);
152
153 SaddleR2 = new ModelPart(this, 74, 4);
154 SaddleR2->addBox(-0.5f, 6.f, -1.f, 1, 2, 2);
155 SaddleR2->setPos(-5.f, 3.f, 2.f);
156
157 SaddleR = new ModelPart(this, 80, 0);
158 SaddleR->addBox(-0.5f, 0.f, -0.5f, 1, 6, 1);
159 SaddleR->setPos(-5.f, 3.f, 2.f);
160
161 SaddleMouthL = new ModelPart(this, 74, 13);
162 SaddleMouthL->addBox(1.5f, -8.f, -4.f, 1, 2, 2);
163 SaddleMouthL->setPos(0.f, 4.f, -10.f);
164 setRotation(SaddleMouthL, 0.5235988f, 0.f, 0.f);
165
166 SaddleMouthR = new ModelPart(this, 74, 13);
167 SaddleMouthR->addBox(-2.5f, -8.f, -4.f, 1, 2, 2);
168 SaddleMouthR->setPos(0.f, 4.f, -10.f);
169 setRotation(SaddleMouthR, 0.5235988f, 0.f, 0.f);
170
171 SaddleMouthLine = new ModelPart(this, 44, 10);
172 SaddleMouthLine->addBox(2.6f, -6.f, -6.f, 0, 3, 16);
173 SaddleMouthLine->setPos(0.f, 4.f, -10.f);
174
175 SaddleMouthLineR = new ModelPart(this, 44, 5);
176 SaddleMouthLineR->addBox(-2.6f, -6.f, -6.f, 0, 3, 16);
177 SaddleMouthLineR->setPos(0.f, 4.f, -10.f);
178
179 Mane = new ModelPart(this, 58, 0);
180 Mane->addBox(-1.f, -11.5f, 5.f, 2, 16, 4);
181 Mane->setPos(0.f, 4.f, -10.f);
182 setRotation(Mane, 0.5235988f, 0.f, 0.f);
183
184 HeadSaddle = new ModelPart(this, 80, 12);
185 HeadSaddle->addBox(-2.5f, -10.1f, -7.f, 5, 5, 12, 0.2f);
186 HeadSaddle->setPos(0.f, 4.f, -10.f);
187 setRotation(HeadSaddle, 0.5235988f, 0.f, 0.f);
188
189 // 4J added - compile now to avoid random performance hit first time cubes are rendered
190 Head->compile(1.0f/16.0f);;
191 UMouth->compile(1.0f/16.0f);;
192 LMouth->compile(1.0f/16.0f);;
193 Ear1->compile(1.0f/16.0f);;
194 Ear2->compile(1.0f/16.0f);;
195 MuleEarL->compile(1.0f/16.0f);;
196 MuleEarR->compile(1.0f/16.0f);;
197 Neck->compile(1.0f/16.0f);;
198 HeadSaddle->compile(1.0f/16.0f);;
199 Mane->compile(1.0f/16.0f);;
200
201 Body->compile(1.0f/16.0f);;
202 TailA->compile(1.0f/16.0f);;
203 TailB->compile(1.0f/16.0f);;
204 TailC->compile(1.0f/16.0f);;
205
206 Leg1A->compile(1.0f/16.0f);;
207 Leg1B->compile(1.0f/16.0f);;
208 Leg1C->compile(1.0f/16.0f);;
209
210 Leg2A->compile(1.0f/16.0f);;
211 Leg2B->compile(1.0f/16.0f);;
212 Leg2C->compile(1.0f/16.0f);;
213
214 Leg3A->compile(1.0f/16.0f);;
215 Leg3B->compile(1.0f/16.0f);;
216 Leg3C->compile(1.0f/16.0f);;
217
218 Leg4A->compile(1.0f/16.0f);;
219 Leg4B->compile(1.0f/16.0f);;
220 Leg4C->compile(1.0f/16.0f);;
221
222 Bag1->compile(1.0f/16.0f);;
223 Bag2->compile(1.0f/16.0f);;
224
225 Saddle->compile(1.0f/16.0f);;
226 SaddleB->compile(1.0f/16.0f);;
227 SaddleC->compile(1.0f/16.0f);;
228
229 SaddleL->compile(1.0f/16.0f);;
230 SaddleL2->compile(1.0f/16.0f);;
231
232 SaddleR->compile(1.0f/16.0f);;
233 SaddleR2->compile(1.0f/16.0f);;
234
235 SaddleMouthL->compile(1.0f/16.0f);;
236 SaddleMouthR->compile(1.0f/16.0f);;
237
238 SaddleMouthLine->compile(1.0f/16.0f);;
239 SaddleMouthLineR->compile(1.0f/16.0f);;
240}
241
242
243void ModelHorse::render(shared_ptr<Entity> entity, float time, float r, float bob, float yRot, float xRot, float scale, bool usecompiled)
244{
245 shared_ptr<EntityHorse> entityhorse = dynamic_pointer_cast<EntityHorse>(entity);
246
247 int type = entityhorse->getType();
248 float eating = entityhorse->getEatAnim(0);
249 bool adult = (entityhorse->isAdult());
250 bool saddled = adult && entityhorse->isSaddled();
251 bool chested = adult && entityhorse->isChestedHorse();
252 bool largeEars = type == EntityHorse::TYPE_DONKEY || type == EntityHorse::TYPE_MULE;
253 float sizeFactor = entityhorse->getFoalScale();
254
255 bool rider = (entityhorse->rider.lock() != NULL);
256
257 if (saddled)
258 {
259 HeadSaddle->render(scale, usecompiled);
260 Saddle->render(scale, usecompiled);
261 SaddleB->render(scale, usecompiled);
262 SaddleC->render(scale, usecompiled);
263 SaddleL->render(scale, usecompiled);
264 SaddleL2->render(scale, usecompiled);
265 SaddleR->render(scale, usecompiled);
266 SaddleR2->render(scale, usecompiled);
267 SaddleMouthL->render(scale, usecompiled);
268 SaddleMouthR->render(scale, usecompiled);
269
270 if (rider)
271 {
272 SaddleMouthLine->render(scale, usecompiled);
273 SaddleMouthLineR->render(scale, usecompiled);
274 }
275 }
276
277 // render legs
278 if (!adult)
279 {
280 glPushMatrix();
281 glScalef(sizeFactor, .5f + sizeFactor * .5f, sizeFactor);
282 glTranslatef(0, .95f * (1.0f - sizeFactor), 0);
283 }
284 Leg1A->render(scale, usecompiled);
285 Leg1B->render(scale, usecompiled);
286 Leg1C->render(scale, usecompiled);
287
288 Leg2A->render(scale, usecompiled);
289 Leg2B->render(scale, usecompiled);
290 Leg2C->render(scale, usecompiled);
291
292 Leg3A->render(scale, usecompiled);
293 Leg3B->render(scale, usecompiled);
294 Leg3C->render(scale, usecompiled);
295
296 Leg4A->render(scale, usecompiled);
297 Leg4B->render(scale, usecompiled);
298 Leg4C->render(scale, usecompiled);
299 if (!adult)
300 {
301 glPopMatrix();
302
303 glPushMatrix();
304 glScalef(sizeFactor, sizeFactor, sizeFactor);
305 glTranslatef(0, 1.35f * (1.0f - sizeFactor), 0);
306 }
307 // render body
308 Body->render(scale, usecompiled);
309 TailA->render(scale, usecompiled);
310 TailB->render(scale, usecompiled);
311 TailC->render(scale, usecompiled);
312 Neck->render(scale, usecompiled);
313 Mane->render(scale, usecompiled);
314 if (!adult)
315 {
316 glPopMatrix();
317
318 glPushMatrix();
319 float headScale = .5f + (sizeFactor * sizeFactor) * .5f;
320 glScalef(headScale, headScale, headScale);
321 if (eating <= 0)
322 {
323 glTranslatef(0, 1.35f * (1.0f - sizeFactor), 0);
324 }
325 else
326 {
327 glTranslatef(0, .9f * (1.0f - sizeFactor) * eating + (1.35f * (1.0f - sizeFactor)) * (1.0f - eating), .15f * (1.0f - sizeFactor) * eating);
328 }
329 }
330 // render head
331 if (largeEars)
332 {
333 MuleEarL->render(scale, usecompiled);
334 MuleEarR->render(scale, usecompiled);
335 }
336 else
337 {
338 Ear1->render(scale, usecompiled);
339 Ear2->render(scale, usecompiled);
340 }
341 Head->render(scale, usecompiled);
342 if (!adult)
343 {
344 glPopMatrix();
345 }
346 if (chested)
347 {
348 Bag1->render(scale, usecompiled);
349 Bag2->render(scale, usecompiled);
350 }
351}
352
353void ModelHorse::setRotation(ModelPart *model, float x, float y, float z)
354{
355 model->xRot = x;
356 model->yRot = y;
357 model->zRot = z;
358}
359
360float ModelHorse::rotlerp(float from, float to, float a)
361{
362 float diff = to - from;
363 while (diff < -180)
364 diff += 360;
365 while (diff >= 180)
366 diff -= 360;
367 return from + a * diff;
368}
369
370void ModelHorse::prepareMobModel(shared_ptr<LivingEntity> mob, float wp, float ws, float a)
371{
372 Model::prepareMobModel(mob, wp, ws, a);
373
374 float bodyRot = rotlerp(mob->yBodyRotO, mob->yBodyRot, a);
375 float headRot = rotlerp(mob->yHeadRotO, mob->yHeadRot, a);
376 float headRotx = (mob->xRotO + (mob->xRot - mob->xRotO) * a);
377 float headRotMinusBodyRot = headRot - bodyRot;
378
379 // TODO: Magic numbers
380 float HeadXRot = (headRotx / 57.29578f);
381 if (headRotMinusBodyRot > 20.f) {
382 headRotMinusBodyRot = 20.f;
383 }
384 if (headRotMinusBodyRot < -20.f) {
385 headRotMinusBodyRot = -20.f;
386 }
387
388 /**
389 * f = distance walked f1 = speed 0 - 1 f2 = timer
390 */
391 if (ws > 0.2f)
392 {
393 HeadXRot = HeadXRot + (cos(wp * 0.4f) * 0.15f * ws);
394 }
395
396 shared_ptr<EntityHorse> entityhorse = dynamic_pointer_cast<EntityHorse>(mob);
397
398 float eating = entityhorse->getEatAnim(a);
399 float standing = entityhorse->getStandAnim(a);
400 float iStanding = 1.0f - standing;
401 float openMouth = entityhorse->getMouthAnim(a);
402 bool tail = entityhorse->tailCounter != 0;
403 bool saddled = entityhorse->isSaddled();
404 bool rider = entityhorse->rider.lock() != NULL;
405 float bob = mob->tickCount + a;
406
407 float legAnim1 = cos((wp * 0.6662f) + 3.141593f);
408 float legXRotAnim = legAnim1 * 0.8f * ws;
409
410 Head->y = 4.0f;
411 Head->z = -10.f;
412 TailA->y = 3.f;
413 TailB->z = 14.f;
414 Bag2->y = 3.f;
415 Bag2->z = 10.f;
416 Body->xRot = 0.f;
417
418 // TODO: Fix these magical numbers
419 Head->xRot = 0.5235988f + (HeadXRot);
420 Head->yRot = (headRotMinusBodyRot / 57.29578f);// fixes SMP bug
421
422 // interpolate positions and rotations based on current eating and standing animations
423 {
424 // TODO: Magic numbers
425 Head->xRot = standing * ((15 * Mth::DEGRAD) + (HeadXRot)) + eating * 2.18166f + (1.0f - max(standing, eating)) * Head->xRot;
426 Head->yRot = standing * (headRotMinusBodyRot / 57.29578f) + (1.0f - max(standing, eating)) * Head->yRot;
427
428 Head->y = standing * -6.f + eating * 11.0f + (1.0f - max(standing, eating)) * Head->y;
429 Head->z = standing * -1.f + eating * -10.f + (1.0f - max(standing, eating)) * Head->z;
430
431 TailA->y = standing * 9.f + iStanding * TailA->y;
432 TailB->z = standing * 18.f + iStanding * TailB->z;
433 Bag2->y = standing * 5.5f + iStanding * Bag2->y;
434 Bag2->z = standing * 15.f + iStanding * Bag2->z;
435 Body->xRot = standing * (-45 / 57.29578f) + iStanding * Body->xRot;
436 }
437
438 Ear1->y = Head->y;
439 Ear2->y = Head->y;
440 MuleEarL->y = Head->y;
441 MuleEarR->y = Head->y;
442 Neck->y = Head->y;
443 UMouth->y = 0 + .02f;
444 LMouth->y = 0;
445 Mane->y = Head->y;
446
447 Ear1->z = Head->z;
448 Ear2->z = Head->z;
449 MuleEarL->z = Head->z;
450 MuleEarR->z = Head->z;
451 Neck->z = Head->z;
452 UMouth->z = 0 + .02f - openMouth * 1;
453 LMouth->z = 0 + openMouth * 1;
454 Mane->z = Head->z;
455
456 Ear1->xRot = Head->xRot;
457 Ear2->xRot = Head->xRot;
458 MuleEarL->xRot = Head->xRot;
459 MuleEarR->xRot = Head->xRot;
460 Neck->xRot = Head->xRot;
461 UMouth->xRot = 0 - (PI * .03f) * openMouth;
462 LMouth->xRot = 0 + (PI * .05f) * openMouth;
463
464 Mane->xRot = Head->xRot;
465
466 Ear1->yRot = Head->yRot;
467 Ear2->yRot = Head->yRot;
468 MuleEarL->yRot = Head->yRot;
469 MuleEarR->yRot = Head->yRot;
470 Neck->yRot = Head->yRot;
471 UMouth->yRot = 0;
472 LMouth->yRot = 0;
473 Mane->yRot = Head->yRot;
474
475 // (if chested)
476 Bag1->xRot = legXRotAnim / 5.f;
477 Bag2->xRot = -legXRotAnim / 5.f;
478
479 /**
480 * knee joints Leg1 and Leg4 use LLegXRot Leg2 and Leg3 use RLegXRot
481 */
482 {
483 float r90 = PI * .5f;
484 float r270 = PI * 1.5f;
485 float r300 = -60 * Mth::DEGRAD;
486 float standAngle = 15 * Mth::DEGRAD * standing;
487 float bobValue = Mth::cos((bob * 0.6f) + 3.141593f);
488
489 Leg3A->y = -2.f * standing + 9.f * iStanding;
490 Leg3A->z = -2.f * standing + -8.f * iStanding;
491 Leg4A->y = Leg3A->y;
492 Leg4A->z = Leg3A->z;
493
494 Leg1B->y = Leg1A->y + (Mth::sin(r90 + standAngle + iStanding * (-legAnim1 * 0.5f * ws)) * 7.f);
495 Leg1B->z = Leg1A->z + (Mth::cos(r270 + standAngle + iStanding * (-legAnim1 * 0.5f * ws)) * 7.f);
496
497 Leg2B->y = Leg2A->y + (Mth::sin(r90 + standAngle + iStanding * (legAnim1 * 0.5f * ws)) * 7.f);
498 Leg2B->z = Leg2A->z + (Mth::cos(r270 + standAngle + iStanding * (legAnim1 * 0.5f * ws)) * 7.f);
499
500 float rlegRot = (r300 + bobValue) * standing + legXRotAnim * iStanding;
501 float llegRot = (r300 + -bobValue) * standing + -legXRotAnim * iStanding;
502 Leg3B->y = Leg3A->y + (Mth::sin(r90 + rlegRot) * 7.f);
503 Leg3B->z = Leg3A->z + (Mth::cos(r270 + rlegRot) * 7.f);
504
505 Leg4B->y = Leg4A->y + (Mth::sin(r90 + llegRot) * 7.f);
506 Leg4B->z = Leg4A->z + (Mth::cos(r270 + llegRot) * 7.f);
507
508 Leg1A->xRot = standAngle + (-legAnim1 * 0.5f * ws) * iStanding;
509 Leg1B->xRot = (-5 * Mth::DEGRAD) * standing + ((-legAnim1 * 0.5f * ws) - max(0.0f, legAnim1 * .5f * ws)) * iStanding;
510 Leg1C->xRot = Leg1B->xRot;
511
512 Leg2A->xRot = standAngle + (legAnim1 * 0.5f * ws) * iStanding;
513 Leg2B->xRot = (-5 * Mth::DEGRAD) * standing + ((legAnim1 * 0.5f * ws) - max(0.0f, -legAnim1 * .5f * ws)) * iStanding;
514 Leg2C->xRot = Leg2B->xRot;
515
516 Leg3A->xRot = rlegRot;
517 Leg3B->xRot = (Leg3A->xRot + PI * max(0.0f, (.2f + bobValue * .2f))) * standing + (legXRotAnim + max(0.0f, legAnim1 * 0.5f * ws)) * iStanding;
518 Leg3C->xRot = Leg3B->xRot;
519
520 Leg4A->xRot = llegRot;
521 Leg4B->xRot = (Leg4A->xRot + PI * max(0.0f, (.2f - bobValue * .2f))) * standing + (-legXRotAnim + max(0.0f, -legAnim1 * 0.5f * ws)) * iStanding;
522 Leg4C->xRot = Leg4B->xRot;
523 }
524
525 Leg1C->y = Leg1B->y;
526 Leg1C->z = Leg1B->z;
527 Leg2C->y = Leg2B->y;
528 Leg2C->z = Leg2B->z;
529 Leg3C->y = Leg3B->y;
530 Leg3C->z = Leg3B->z;
531 Leg4C->y = Leg4B->y;
532 Leg4C->z = Leg4B->z;
533
534 if (saddled)
535 {
536
537 Saddle->y = standing * .5f + iStanding * 2.f;
538 Saddle->z = standing * 11.f + iStanding * 2.f;
539
540 SaddleB->y = Saddle->y;
541 SaddleC->y = Saddle->y;
542 SaddleL->y = Saddle->y;
543 SaddleR->y = Saddle->y;
544 SaddleL2->y = Saddle->y;
545 SaddleR2->y = Saddle->y;
546 Bag1->y = Bag2->y;
547
548 SaddleB->z = Saddle->z;
549 SaddleC->z = Saddle->z;
550 SaddleL->z = Saddle->z;
551 SaddleR->z = Saddle->z;
552 SaddleL2->z = Saddle->z;
553 SaddleR2->z = Saddle->z;
554 Bag1->z = Bag2->z;
555
556 Saddle->xRot = Body->xRot;
557 SaddleB->xRot = Body->xRot;
558 SaddleC->xRot = Body->xRot;
559
560 SaddleMouthLine->y = Head->y;
561 SaddleMouthLineR->y = Head->y;
562 HeadSaddle->y = Head->y;
563 SaddleMouthL->y = Head->y;
564 SaddleMouthR->y = Head->y;
565
566 SaddleMouthLine->z = Head->z;
567 SaddleMouthLineR->z = Head->z;
568 HeadSaddle->z = Head->z;
569 SaddleMouthL->z = Head->z;
570 SaddleMouthR->z = Head->z;
571
572 SaddleMouthLine->xRot = HeadXRot;
573 SaddleMouthLineR->xRot = HeadXRot;
574 HeadSaddle->xRot = Head->xRot;
575 SaddleMouthL->xRot = Head->xRot;
576 SaddleMouthR->xRot = Head->xRot;
577 HeadSaddle->yRot = Head->yRot;
578 SaddleMouthL->yRot = Head->yRot;
579 SaddleMouthLine->yRot = Head->yRot;
580 SaddleMouthR->yRot = Head->yRot;
581 SaddleMouthLineR->yRot = Head->yRot;
582
583 if (rider) {
584 // TODO: Magic number (smells like radians :D)
585 SaddleL->xRot = -60 / 57.29578f;
586 SaddleL2->xRot = -60 / 57.29578f;
587 SaddleR->xRot = -60 / 57.29578f;
588 SaddleR2->xRot = -60 / 57.29578f;
589
590 SaddleL->zRot = 0.f;
591 SaddleL2->zRot = 0.f;
592 SaddleR->zRot = 0.f;
593 SaddleR2->zRot = 0.f;
594 } else {
595 SaddleL->xRot = legXRotAnim / 3.f;
596 SaddleL2->xRot = legXRotAnim / 3.f;
597 SaddleR->xRot = legXRotAnim / 3.f;
598 SaddleR2->xRot = legXRotAnim / 3.f;
599
600 SaddleL->zRot = legXRotAnim / 5.f;
601 SaddleL2->zRot = legXRotAnim / 5.f;
602 SaddleR->zRot = -legXRotAnim / 5.f;
603 SaddleR2->zRot = -legXRotAnim / 5.f;
604 }
605 }
606
607 // TODO: Magic number
608 float tailMov = -1.3089f + (ws * 1.5f);
609 if (tailMov > 0)
610 {
611 tailMov = 0;
612 }
613
614 if (tail)
615 {
616 TailA->yRot = Mth::cos(bob * 0.7f);
617 tailMov = 0;
618 }
619 else
620 {
621 TailA->yRot = 0.f;
622 }
623 TailB->yRot = TailA->yRot;
624 TailC->yRot = TailA->yRot;
625
626 TailB->y = TailA->y;
627 TailC->y = TailA->y;
628 TailB->z = TailA->z;
629 TailC->z = TailA->z;
630
631 // TODO: Magic number
632 TailA->xRot = tailMov;
633 TailB->xRot = tailMov;
634 TailC->xRot = -0.2618f + tailMov;
635}