Replies: 15 comments 39 replies
-
In fact, since I referenced #25814, might as well show how fickle this is on the examples from that issue:
Creature 19163 has no movementId, so let's look at the models used: And yet, only one sniffed case matched these numbers. But it did match them, 6.9444 is not a number you just randomly decide to type. But why the other ones didn't?.. Do Blizzard also have a speed override in CreatureModelData?.. In CreatureDisplayInfo?.. It's so strange... |
Beta Was this translation helpful? Give feedback.
-
After all 2.5 and 8 are indeed default values, we need to expect they will be used in thousands of cases but also expect that they are wrong because Let's discuss that c) case. Why don't you think those Walk 0 and Run 0 are not for case I mentioned in #25814 (comment)?
Fuck. SELECT entry,modelid1,modelid2,modelid3,modelid4,speed_walk,speed_run,movementid FROM creature_Template WHERE movementid=150 To many uses different speed than 1.6 & 1.42857 but that's ok. They're mostly heroic entries(heroic entries mostly are not updated) or TBC or not updated or unused \ not spawned transform templates, etc. We can update lots of them from sniffs, not all but more than half of those 150 SELECT entry,NAME,modelid1,modelid2,modelid3,modelid4,speed_walk,speed_run,movementid FROM creature_Template WHERE movementid=150 AND (speed_walk BETWEEN 0.9 AND 1.1 OR speed_run BETWEEN 1.13 AND 1.15)#entry iN (25618)#name like '%evidence marker%'#modelid4 between 18579 and 18582 --
I probably miss something but from where those speeds are taken? I checked that case, it's interesting because one creature uses 4 models and 3 of them uses different speed. I checked all creatures with those models and turned out speed matches. Of course some of those creatures were not updated from sniffs but mostly few or more creatures with the same model used same speed. So speed is linked directly to model id and also to movementId and not to creature_template and model ids as I was thinking before(if creature_template speed is 0 = take speed from model, if !=0 = take speed from creature_template) What do you think? |
Beta Was this translation helpful? Give feedback.
-
Current values are human-readable because those are real values(1.28 is just slighly faster than normal run speed, 1.7 is pretty fast, 4 is rocket, 15 is space shuttle) |
Beta Was this translation helpful? Give feedback.
-
Ugh
I checked them from sniffs |
Beta Was this translation helpful? Give feedback.
-
Nice. Sad thing is movementId is used only by 5k creatures (1 / 6) SELECT entry,NAME,modelid1,speed_walk,speed_run,movementid FROM creature_Template WHERE movementid=60
|
Beta Was this translation helpful? Give feedback.
-
(87, 4, 4.75 |
Beta Was this translation helpful? Give feedback.
-
So what exactly is the deal with the facing stuff there. and from what dbc does that value come from exactly and it is a override value for the TurnRate field in update object? |
Beta Was this translation helpful? Give feedback.
-
They changed speed at least in 121
|
Beta Was this translation helpful? Give feedback.
-
(64, 1, 1, 0, ''), -> (64, 1, 0, 0, ''), |
Beta Was this translation helpful? Give feedback.
-
Have you heard something about scaling with level bounding radius + combat reach and linked to entry combat reach and bounding radius for tameable(not yet tamed) creatures? |
Beta Was this translation helpful? Give feedback.
-
I checked values of 335 using both current 335 and master DB, sometimes classic+ sniffs (119, 2.7, 7.2, 0, '2.5 7.2 in classic sniffs, don't have 3xx sniff atm, still used only by one creature, why 2.7?'), [2] UpdateType: CreateObject2 Maybe walk 2.5? entry name movementid speed_walk speed_run
------ ---------- ---------- ---------- -----------
33651 VX-001 421 1 1.14286
34108 VX-001 (1) 421 1 1.14286 Quite possible was changed at some point or DB value is initially wrong (254, 10, 28, 0, ''), entry name movementid speed_walk speed_run
------ ------ ---------- ---------- -----------
29884 Gymer 254 4 4 entry name movementid speed_walk speed_run
------ -------------------------- ---------- ---------- -----------
161268 Jrokgar 254 1 1.14286
47467 Brotherhood Flying Machine 254 1 1.14286
52597 Wings of Aviana 254 1 1.14286
52621 Wings of Aviana 254 1 1.14286
148117 Grong 254 1 1.14286
155328 Spud 254 1 1.14286
144638 Grong the Revenant 254 4.8 4
147550 Harvester 254 4.8 4
143579 Spud 254 4.8 4
153989 Model W 254 4.8 4
144637 Grong 254 4.8 4
143590 Donk 254 4.8 4
29884 Gymer 254 4 4 ServerToClient: SMSG_UPDATE_OBJECT (0x4715) Length: 233 ConnIdx: 2 Time: 06/17/2012 00:50:35.090 Number: 182401 Few new (238, NULL, 22, 0, 'Walk is unk, run speed taken from creature which uses mount with this movementId'), |
Beta Was this translation helpful? Give feedback.
-
Haha entry name walkspeed runspeed movementid
------ ---------------------------------------- --------- -------- ------------
25189 Riding Horse (Brown) (16 Speed) 0 16 199
25191 Riding Horse (White Stallion) (16 Speed) 0 16 199 |
Beta Was this translation helpful? Give feedback.
-
Looks like creatures does not always take run_speed from mount's movementId I didn't stored more examples, will add later This case is really weird, I have only 1 4xx sniff with Garadar Wolf Rider. Speed of Telaari Elekk Rider is 1.38571 in several sniffs entry modelid1 modelid2 modelid3 modelid4 speed_walk speed_run WalkSpeed RunSpeed WalkSpeed RunSpeed movementid NAME
------ -------- -------- -------- -------- ---------- --------- --------- -------- --------- -------- ---------- ---------------------
19069 18509 0 0 0 1.2 1.14286 (NULL) (NULL) (NULL) (NULL) 0 Garadar Riding Wolf
19072 18511 0 0 0 1.2 1.14286 0 1.38571 0 9.7 140 Telaar Elekk Mount entry mount MountCreatureID speed_walk speed_run WalkSpeed RunSpeed WalkSpeed RunSpeed movementid name
------ ------ --------------- ---------- --------- --------- -------- --------- -------- ---------- ---------------------
19068 18509 0 1 1.38571 (NULL) (NULL) (NULL) (NULL) 0 Garadar Wolf Rider
19071 18511 0 1 1.38571 (NULL) (NULL) (NULL) (NULL) 0 Telaari Elekk Rider Defenders and riders uses same models entry modelid1 modelid2 modelid3 modelid4 speed_walk speed_run WalkSpeed RunSpeed WalkSpeed RunSpeed movementid NAME
------ -------- -------- -------- -------- ---------- --------- --------- -------- --------- -------- ---------- --------------------
18489 17971 18506 18507 18508 1 1.14286 (NULL) (NULL) (NULL) (NULL) 0 Garadar Defender
19068 17971 18506 18507 18508 1 1.38571 (NULL) (NULL) (NULL) (NULL) 0 Garadar Wolf Rider Some of Kor'kron Vanguards are obviously mounted to the second mount because there's no other mount with model 14336. Their mount model is randomized but speed does not match. 25194 also is spawned in game as vehicle, with speed from movementId entry modelid1 modelid2 modelid3 modelid4 speed_walk speed_run WalkSpeed RunSpeed WalkSpeed RunSpeed movementid NAME
------ -------- -------- -------- -------- ---------- --------- --------- -------- --------- -------- ---------- ----------------------
14539 14575 0 0 0 1 1.38571 0 1.38571 0 9.7 140 Swift Timber Wolf
25194 14336 14334 14574 14575 1 2.28571 0 2.28571 0 16 199 Kor'kron Riding Wolf entry mount MountCreatureID speed_walk speed_run WalkSpeed RunSpeed WalkSpeed RunSpeed movementid name
------ ------ --------------- ---------- --------- --------- -------- --------- -------- ---------- -------------------
27553 0 0 1 1.38571 (NULL) (NULL) (NULL) (NULL) 0 Kor'kron Vanguard entry guid path_id mount MountCreatureID bytes1 bytes2 emote visibilityDistanceType auras name
------ ------ ------- ------ --------------- ------ ------ ------ ---------------------- ------ -------------------
27553 111212 0 14574 0 0 1 0 0 (NULL) Kor'kron Vanguard
27553 111218 1112180 14574 0 0 1 0 0 Kor'kron Vanguard [13] Walk Speed: 2.5 [14] Walk Speed: 2.5 [9] Walk Speed: 2.5 [13] UpdateType: CreateObject1
[13] GUID: Full: 0xF1306BA100002320 Type: Creature Entry: 27553 Low: 8992
[13] Object Type: 3 (Unit)
[13] Has GameObject Rotation: False
[13] Has AnimKits: False
[13] Has Attacking Target: False
[13] Self: False
[13] Has Vehicle Data: False
[13] Living: True
[13] Unknown array size: 0
[13] Has GameObject Position: False
[13] Has Stationary Position: False
[13] Transport: False
[13] Lacks orientation: False
[13] Movement Flags: 1 (Forward)
[13] Has MovementInfo spline: True
[13] Lacks pitch: True
[13] Has Spline Data: True
[13] Has Fall Data: False
[13] Lacks spline elevation: True
[13] Has Transport Data: False
[13] Lacks timestamp: False
[13] Has extended spline data: True
[13] Spline Mode: 0 (Linear)
[13] Has spline start time: False
[13] Spline Waypoints: 6
[13] Has spline vertical acceleration: False
[13] Spline type: Normal
[13] Spline flags: 3145728 (Unknown5, Walkmode)
[13] RunBack Speed: 4.5
[13] SwimBack Speed: 2.5
[13] Spline Time: 20
[13] [0] Spline Waypoint: X: 4915.338 Y: 1279.6483 Z: 225.59161
[13] [1] Spline Waypoint: X: 4915.9707 Y: 1278.874 Z: 225.59161
[13] [2] Spline Waypoint: X: 4920.2617 Y: 1273.623 Z: 225.23846
[13] [3] Spline Waypoint: X: 4921.3716 Y: 1272.2559 Z: 225.22162
[13] [4] Spline Waypoint: X: 4932.0703 Y: 1265.8212 Z: 225.39421
[13] [5] Spline Waypoint: X: 4932.0703 Y: 1265.8212 Z: 225.39421
[13] Spline Duration Multiplier Next: 1
[13] Spline Full Time: 2171
[13] Spline Duration Multiplier: 1
[13] Spline Id: 76443649
[13] Spline Endpoint:: X: 4932.0703 Y: 1265.8212 Z: 225.39421
[13] Pitch Speed: 3.141592741012573242
[13] Swim Speed: 4.72221994400024414
[13] Walk Speed: 2.5
[13] Time: 3362060837
[13] FlyBack Speed: 3.141592741012573242
[13] Turn Speed: 7
[13] Run Speed: 9.699999809265136718
[13] Fly Speed: 4.5
GUID 2: Full: 0xF1306BA100002320 Type: Creature Entry: 27553 Low: 8992
[13] Position: X: 4915.9707 Y: 1278.874 Z: 225.59161
[13] Orientation: 5.3975
[13] OBJECT_FIELD_GUID: Full: 0xF1306BA100002320 Type: Creature Entry: 27553 Low: 8992
[13] OBJECT_FIELD_TYPE: 9
[13] OBJECT_FIELD_ENTRY: 27553
[13] OBJECT_FIELD_SCALE_X: 1
[13] UNIT_FIELD_BYTES_0: 0/1/0/1
[13] UNIT_FIELD_HEALTH: 42540
[13] UNIT_FIELD_MAXHEALTH: 42540/5.9611E-41
[13] UNIT_FIELD_LEVEL: 75/1.05E-43
[13] UNIT_FIELD_FACTIONTEMPLATE: 2054/2.878E-42 (2054)
[13] UNIT_VIRTUAL_ITEM_SLOT_ID: 34682/4.86E-41
[13] UNIT_VIRTUAL_ITEM_SLOT_ID + 1: 12452/1.7449E-41
[13] UNIT_FIELD_FLAGS: 32768
[13] UNIT_FIELD_FLAGS_2: 2048
[13] UNIT_FIELD_BASEATTACKTIME: 2000/2.803E-42
[13] UNIT_FIELD_BASEATTACKTIME + 1: 2000/2.803E-42
[13] UNIT_FIELD_BOUNDINGRADIUS: 0.3906
[13] UNIT_FIELD_COMBATREACH: 1.5749999
[13] UNIT_FIELD_DISPLAYID: 23864/3.344E-41
[13] UNIT_FIELD_NATIVEDISPLAYID: 23864/3.344E-41
[13] UNIT_FIELD_MOUNTDISPLAYID: 14336/2.0089E-41
[13] UNIT_FIELD_BYTES_1: 0/0/1/0
[13] UNIT_MOD_CAST_SPEED: 1065353216/1
[13] UNIT_MOD_CAST_HASTE: 1065353216/1
[13] UNIT_FIELD_BYTES_2: 1/1/0/0
[13] UNIT_FIELD_HOVERHEIGHT: 1
[14] UpdateType: CreateObject1
[14] GUID: Full: 0xF1306BA100002321 Type: Creature Entry: 27553 Low: 8993
[14] Object Type: 3 (Unit)
[14] Has GameObject Rotation: False
[14] Has AnimKits: False
[14] Has Attacking Target: False
[14] Self: False
[14] Has Vehicle Data: False
[14] Living: True
[14] Unknown array size: 0
[14] Has GameObject Position: False
[14] Has Stationary Position: False
[14] Transport: False
[14] Lacks orientation: False
[14] Movement Flags: 1 (Forward)
[14] Has MovementInfo spline: True
[14] Lacks pitch: True
[14] Has Spline Data: True
[14] Has Fall Data: False
[14] Lacks spline elevation: True
[14] Has Transport Data: False
[14] Lacks timestamp: False
[14] Has extended spline data: True
[14] Spline Mode: 0 (Linear)
[14] Has spline start time: False
[14] Spline Waypoints: 4
[14] Has spline vertical acceleration: False
[14] Spline type: Normal
[14] Spline flags: 3145728 (Unknown5, Walkmode)
[14] RunBack Speed: 4.5
[14] SwimBack Speed: 2.5
[14] Spline Time: 20
[14] [0] Spline Waypoint: X: 4919.812 Y: 1282.776 Z: 226.48846
[14] [1] Spline Waypoint: X: 4920.373 Y: 1281.9482 Z: 226.48846
[14] [2] Spline Waypoint: X: 4930.3213 Y: 1272.7078 Z: 226.13947
[14] [3] Spline Waypoint: X: 4930.3213 Y: 1272.7078 Z: 226.13947
[14] Spline Duration Multiplier Next: 1
[14] Spline Full Time: 1650
[14] Spline Duration Multiplier: 1
[14] Spline Id: 76443650
[14] Spline Endpoint:: X: 4930.3213 Y: 1272.7078 Z: 226.13947
[14] Pitch Speed: 3.141592741012573242
[14] Swim Speed: 4.72221994400024414
[14] Walk Speed: 2.5
[14] Time: 3362060837
[14] FlyBack Speed: 3.141592741012573242
[14] Turn Speed: 7
[14] Run Speed: 9.699999809265136718
[14] Fly Speed: 4.5
GUID 2: Full: 0xF1306BA100002321 Type: Creature Entry: 27553 Low: 8993
[14] Position: X: 4920.3735 Y: 1281.9485 Z: 226.51437
[14] Orientation: 5.3079786
[14] OBJECT_FIELD_GUID: Full: 0xF1306BA100002321 Type: Creature Entry: 27553 Low: 8993
[14] OBJECT_FIELD_TYPE: 9
[14] OBJECT_FIELD_ENTRY: 27553
[14] OBJECT_FIELD_SCALE_X: 1
[14] UNIT_FIELD_BYTES_0: 0/1/0/1
[14] UNIT_FIELD_HEALTH: 42540
[14] UNIT_FIELD_MAXHEALTH: 42540/5.9611E-41
[14] UNIT_FIELD_LEVEL: 75/1.05E-43
[14] UNIT_FIELD_FACTIONTEMPLATE: 2054/2.878E-42 (2054)
[14] UNIT_VIRTUAL_ITEM_SLOT_ID: 30181/4.2293E-41
[14] UNIT_VIRTUAL_ITEM_SLOT_ID + 1: 12452/1.7449E-41
[14] UNIT_FIELD_FLAGS: 32768
[14] UNIT_FIELD_FLAGS_2: 2048
[14] UNIT_FIELD_BASEATTACKTIME: 2000/2.803E-42
[14] UNIT_FIELD_BASEATTACKTIME + 1: 2000/2.803E-42
[14] UNIT_FIELD_BOUNDINGRADIUS: 0.3906
[14] UNIT_FIELD_COMBATREACH: 1.5749999
[14] UNIT_FIELD_DISPLAYID: 23864/3.344E-41
[14] UNIT_FIELD_NATIVEDISPLAYID: 23864/3.344E-41
[14] UNIT_FIELD_MOUNTDISPLAYID: 14575/2.0424E-41
[14] UNIT_FIELD_BYTES_1: 0/0/1/0
[14] UNIT_MOD_CAST_SPEED: 1065353216/1
[14] UNIT_MOD_CAST_HASTE: 1065353216/1
[14] UNIT_FIELD_BYTES_2: 1/1/0/0
[14] UNIT_FIELD_HOVERHEIGHT: 1
[9] UpdateType: CreateObject1
[9] GUID: Full: 0xF1306BA10043EEBE Type: Creature Entry: 27553 Low: 4452030
[9] Object Type: 3 (Unit)
[9] Has GameObject Rotation: False
[9] Has AnimKits: False
[9] Has Attacking Target: False
[9] Self: False
[9] Has Vehicle Data: False
[9] Living: True
[9] Unknown array size: 0
[9] Has GameObject Position: False
[9] Has Stationary Position: False
[9] Transport: False
[9] Lacks orientation: False
[9] Movement Flags: 1 (Forward)
[9] Has MovementInfo spline: True
[9] Lacks pitch: True
[9] Has Spline Data: True
[9] Has Fall Data: False
[9] Lacks spline elevation: True
[9] Has Transport Data: False
[9] Lacks timestamp: False
[9] Has extended spline data: True
[9] Spline Mode: 0 (Linear)
[9] Has spline start time: False
[9] Spline Waypoints: 4
[9] Has spline vertical acceleration: False
[9] Spline type: Normal
[9] Spline flags: 3145728 (Unknown5, Walkmode)
[9] RunBack Speed: 4.5
[9] SwimBack Speed: 2.5
[9] Spline Time: 824
[9] [0] Spline Waypoint: X: 4937.2065 Y: 1258.5166 Z: 225.79083
[9] [1] Spline Waypoint: X: 4937.134 Y: 1259.5139 Z: 225.79083
[9] [2] Spline Waypoint: X: 4938.4463 Y: 1241.5406 Z: 226.04083
[9] [3] Spline Waypoint: X: 4938.4463 Y: 1241.5406 Z: 226.04083
[9] Spline Duration Multiplier Next: 1
[9] Spline Full Time: 1859
[9] Spline Duration Multiplier: 1
[9] Spline Id: 213233153
[9] Spline Endpoint:: X: 4938.4463 Y: 1241.5406 Z: 226.04083
[9] Pitch Speed: 3.141592741012573242
[9] Swim Speed: 4.72221994400024414
[9] Walk Speed: 2.5
[9] Time: 4216388466
[9] FlyBack Speed: 3.141592741012573242
[9] Turn Speed: 7
[9] Run Speed: 9.699999809265136718
[9] Fly Speed: 4.5
GUID 2: Full: 0xF1306BA10043EEBE Type: Creature Entry: 27553 Low: 4452030
[9] Position: X: 4937.6973 Y: 1251.7987 Z: 225.89815
[9] Orientation: 4.785285
[9] OBJECT_FIELD_GUID: Full: 0xF1306BA10043EEBE Type: Creature Entry: 27553 Low: 4452030
[9] OBJECT_FIELD_TYPE: 9
[9] OBJECT_FIELD_ENTRY: 27553
[9] OBJECT_FIELD_SCALE_X: 1
[9] UNIT_FIELD_BYTES_0: 0/1/0/1
[9] UNIT_FIELD_HEALTH: 39760
[9] UNIT_FIELD_MAXHEALTH: 39760/5.5716E-41
[9] UNIT_FIELD_LEVEL: 73/1.02E-43
[9] UNIT_FIELD_FACTIONTEMPLATE: 2054/2.878E-42 (2054)
[9] UNIT_VIRTUAL_ITEM_SLOT_ID: 30181/4.2293E-41
[9] UNIT_VIRTUAL_ITEM_SLOT_ID + 1: 12452/1.7449E-41
[9] UNIT_FIELD_FLAGS: 32768
[9] UNIT_FIELD_FLAGS_2: 2048
[9] UNIT_FIELD_BASEATTACKTIME: 2000/2.803E-42
[9] UNIT_FIELD_BASEATTACKTIME + 1: 2000/2.803E-42
[9] UNIT_FIELD_BOUNDINGRADIUS: 0.3906
[9] UNIT_FIELD_COMBATREACH: 1.5749999
[9] UNIT_FIELD_DISPLAYID: 23867/3.3445E-41
[9] UNIT_FIELD_NATIVEDISPLAYID: 23867/3.3445E-41
[9] UNIT_FIELD_MOUNTDISPLAYID: 14574/2.0423E-41
[9] UNIT_FIELD_BYTES_1: 0/0/1/0
[9] UNIT_MOD_CAST_SPEED: 1065353216/1
[9] UNIT_MOD_CAST_HASTE: 1065353216/1
[9] UNIT_FIELD_BYTES_2: 1/1/0/0
[9] UNIT_FIELD_HOVERHEIGHT: 1 |
Beta Was this translation helpful? Give feedback.
-
10.1.7 added WalkSpeed and RunSpeed to CreatureModelData.db2 |
Beta Was this translation helpful? Give feedback.
-
wait that's good news, does this mean we can finally implement correct walk/run speeds attached to MovementID? |
Beta Was this translation helpful? Give feedback.
-
I've been sitting on this info for a long while, but wasn't posting it because it wasn't handling 100% of the cases. Over time I made some other discoveries, which brought it closer to that goal, but still not quite there. So take this with a small grain of salt.
CreatureMovementInfo
This DBC appeared in WotLK. If you were to look at it, you would discover that it has hundreds of rows with the same single value of 0. This is a clear sign that some columns of this table are "serverside" - hidden from the DBCs because the client doesn't need them, but nevertheless present and used by the server. The only value that's in there for the client is the rate of smooth facing changes, added mainly to let the client draw the creature's model sloooooowly turning around instead of changing the orientation almost instantaneously, which looks especially weird with large enemies (Flame Leviathan from Ulduar, for example).
So what columns are we missing? The answer can yet again be gleamed from the few WowEdit screenshots we have:
Let me bring your attention to the "Movement Override" groupbox. You can see that the "Walk" and "Run" textboxes are readonly there. That means you can't edit them directly, their data comes from elsewhere, and is there just for display, just like with "Aggro Radius" groupbox directly above it - its values come from the Radius (CreatureRadius?) record that's selected from the dropdown combobox, and the textboxes are there just for convenient display, but if you want to actually edit them - you press the "Copy" or "Edit" buttons.
So where does the data for "Walk" and "Run" "overrides" come from? From the CreatureMovementInfo record, which is selectable by clicking the button directly above them.
So, the two columns of data that we're missing in CreatureMovementInfo are the walk and run speed overrides.
But what does this give us, you might ask, this data is serverside and we don't have access to it. Which is true... But we can extrapolate it.
Filling CreatureMovementInfo
So here's what I did. I went through every CreatureMovementInfo record, I selected the rows from our `creature_template` that had that that CreatureMovementInfo ID in `movementId`. I filtered out all the rows that had blatantly default values (2.5 walk, 8 run, aka speed_walk=1, speed_run=1.14286), which most likely means they were never filled from sniffs. And then I looked at the speed_walk and speed_run values in the remaining rows, and almost always there were a few non-default values that were dominating the results.
Sometimes there was only one value dominating - either the walk or the run speed, and the other one was varying. But it's easily explainable: the values in the screenshot are "overrides", so they were using the value of 0 to specify that that speed (either walk or run) should not be overridden.
So I started writing them down. And before long, a pattern emerged:
Do you see what's happening here? They're SORTED. First by run speed, then by walk speed, in ascending order.
How did this happen? The most likely explainable would be that until WotLK they had the ability to specify these speed overrides on every creature separately. With WotLK (or whenever they decided to create that CreatureMovementInfo table), they wanted to organize it a bit better, and also add the turn rate modifier there (which got bundled with the client), so they took all the existing data, grouped it up, sorted it by run speed, then by walk speed, and generated the contents for CreatureMovementInfo table, and every Creature record got the respective MovementInfo assigned via ID instead of raw speed values.
So I kept going. Knowing that there's a pattern considerably sped up the process.
And so, without further ado, here's the data:
`SmoothFacingChaseRate` column is filled directly from .dbc/.db2. This table is meant as a direct replacement to that DBC.
The pattern of rows being ordered only holds up until `SmoothFacingChaseRate` starts changing. This is to be expected, the aforementioned mass-conversion happened before this new column saw any use by designers. All the new rows must either be combinations of walk/run speeds that were never encountered before, or already existing walk/run speeds but now with a non-default `SmoothFacingChaseRate`. Or, you know, it's also possible that someone could've created a duplicate row if they failed to find the one they wanted in the list.
NULL
means I couldn't definitively source that value from anywhere. The new records that got added after the mass-conversion are sparsely used, so there isn't much examples to base the data upon. And those creatures that do happen to use them often don't have the speeds sniffed. So NULLs get more and more prevalent the further it goes. I added comments to the table to describe why the certain values are missing.However the vast majority of creatures use the early rows, for which the data is abundant.
WotLK uses only rows up until and including ID 821.
Why is this info valuable?
For one simple reason: `creature_template`.`movementId` comes from cache. Therefore, unless someone manually tampered with it, it's 100% correct. And so with this data we can correct the speeds of thousands of creatures at once.
So how is a creature's speed determined?
(auras are completely neglected here, this thread is solely about base speeds)
It's based on 3 factors:
1. Whether the creature is mounted
Believe it or not - when a creature mounts up - its speed changes to that of the mount. Just like that, without any auras. Examine sniffs to find this out for yourself.
Mount's speed is determined in the same way. If the mount's `creature_template` record has `movementId` - it uses the speed from CreatureMovementInfo, unless it's 0 ("don't override"). Otherwise - the (sort of) model speed is used.
Hold up. Did I say "mount's creature_template record"? What? Don't we use CreatureDisplayInfo for mounts?
Yup, my dear viewer, we are doing it wrong. Mounts aren't just models, mounts are creatures in and of itself. They're already used as such for mounting auras, which reference the Creature record via MiscValue. The rest of the mounted creatures in the game should do the same. Here, in their scripting system, you can see that the parameter for "Unit(s) mount a creature" is a "Creature" record.
This means that, yes, all the data we have for creature mounts in `*_addon*` tables is essentially wrong, and needs to be switched from CreatureDisplayInfo ID to the appropriate mount's `creature_template`.`entry`. This is further complicated by the fact that there can be multiple Creature records using the same mount model, and they can have different CreatureMovementInfo assigned, and each would need to be examined separately to determine which one should be chosen for the speeds to match.
This also means that if a mount has multiple models - a random one should be chosen for the creature, much like the way mounting auras work.
2. Whether the creature has a CreatureMovementInfo record assigned
This is fairly straightforward. If the creature is not mounted - it uses its own `creature_template`.`movementId`. If that CreatureMovementInfo's speed override is 0 - this step is skipped. If it's not 0 - that's the speed the creature will have.
3. Which model is used by the creature (sort of)
And this is where the main difficulty comes. And the problem I described in the intro. That "(sort of)" part. But we'll get to it later.
For now, let's figure out how the fuck does the speed depend on the model.
Here's the thing... Models have movement speeds embedded in them.
Models have animations. Each animation has a field that contains the movement speed it's supposed to be played at. I.e. the speed the animation was created for. If the creature's real speed is higher or lower - it needs to be appropriately slowed down or sped up.
So, what we can do, is load the model, find the animations sequences corresponding to "walk" and "run" animations (or "fly walk", "fly run", or maybe there are more. Or maybe they even depend on animation tier. I haven't tried digging that deep), and look up their movement speeds. Loading the models every time is expensive, so it would be easier to load this data once and then fill `creature_model_info` with that data in the new columns.
And... this works. In some cases.
The problem
This. This is the main hurdle that I failed to overcome. I could not figure out why do SOME sniffed creatures match the speed of their model, and SOME sniffed creatures - did not.
Those that did not - most often had the default 2.5 walk, 8 run speeds. As if it was forced to be default somehow. But I just don't know how.
But those that did - matched the model speeds exactly. And those speeds are often obscure ones, like 2.2222 or 6.94444. It's not the kind of speed you would enter in a textbox for no reason. But sometimes only one of the two speeds (walk and run) would match:
And sometimes it would be all over the place, like this example, where the CreatureMovementInfo override doesn't match at all, but the model's walk speed matches, but run speed doesn't:
Here's an example of a mounted creature (the last column is meant to be named "Mount Override Speed:" and show the mount's CreatureMovementInfo's values, but for that I need to select a Creature from which to take that info from, so it became a combobox):
Nothing matches the run speed, right? But we have several options for the mount's Creature record:
If we were to pick Naxxramas Deathcharger, then the run speed would match, but the walk speed wouldn't:
And here's another mounted example from the same Naxxramas, but here the RIDER's CreatureMovementInfo override matches perfectly, but the mount's one doesn't (for walk):
So it's basically a mess. It does work for most cases, tho:
But then sometimes it randomly doesn't:
Outdated
Outdated
Outdated
Perhaps the application I wrote for this doesn't consider something, like the auras being applied in the middle of a fight. Needs laborious manual checking.
Or perhaps the problem is in that I only have MoP+ sniffs, but I'm testing it against WotLK DBCs and creature_templates. I wish I had WotLK sniffs.
Epilogue
For now, this is all I have. I'm at an impasse. At first glance it looks like it should work perfectly, but as you start examining it in details - all kinds of imperfections start sticking out. But where it does work - it works beautifully. As that quote goes: "60% of the time, it works every time"...
Maybe you can test it better, given that you have WotLK sniffs. I only have a bunch of data grabbed with Lua's GetUnitSpeed from Classic, which needs a lot of cleanup to be useful (while run/flight/swim speeds were nice and tidy, "current" speed was all over the place, as it's calculated based on spline's distance divided by duration).
Even if my theories about how final movement speed is determined are ultimately incorrect, you can still extract a lot of usefulness from my CreatureMovementInfo data research.
P.S. Please, for the love of all that is holy, stop putting speed multipliers into `creature_template` and just store the data there in yards/sec. It looks SO MUCH BETTER. "8" is a much more sensible number than "1.14286", "30" than "4.28571", etc. You can still multiply then by speed rates from config, nothing inhibits that.
Ref #25814
Beta Was this translation helpful? Give feedback.
All reactions