This is some pretty cool research, have you seen anything that would cause this problem:
If a model has vertices weighted to > 41 nodes, then the vertices will stretch.
I could give you examples if you want.
Nope, I did this research a long time ago. If you could tell me where in the model structures this value is located, I could check it out. I barely know anything about modeling, just some direct3d stuff which helped greatly with this. Is a node another name for a single vertex?
Skarma, post all future information in this thread and edit the OP to include a link to that post. This way we can keep all of your information together under one release thread and people wont have to go searching for each one.
edit: If you want me to give the thread a better name, just let me know.
Last edited by Con; September 21st, 2009 at 07:16 PM.
This reminded me of a program I made to automatically build tag definitions from guerilla exported text files. It was originally built for kornmans old C# tag interface, but i've repurposed it to build definitions for OS. So the output isn't quite what you need but it might help somewhat.
Things to note though, it doesn't put any pads or flag/enum values and it doesn't check for duplicate names. No error checking and such either, so no guarantees or warranties :P.
Link.
Use empty/new tags when you export from guerilla, and its best to not export from guerilla with one of every block and sub block added as guerilla crashes if you do.
Typical I/O:
In
outCode:biped untitled 3 flags word flags 0 bounding radius real 0.000000 bounding offset real point 3d 0.000000 0.000000 0.000000 origin offset real point 3d 0.000000 0.000000 0.000000 acceleration scale real 0.000000 model tag reference mod2 animation graph tag reference antr collision model tag reference coll physics tag reference phys modifier shader tag reference shdr creation effect tag reference effe render bounding radius real 0.000000 A in enum none B in enum none C in enum none D in enum none hud text message index short integer 0 forced shader permuation index short integer 0 attachments block 1 element 0 type tag reference ÿÿÿÿ marker string primary scale enum none secondary scale enum none change color enum none end element 0 widgets block 1 element 0 reference tag reference ÿÿÿÿ end element 0 functions block 1 element 0 flags long flags 0 period real 0.000000 scale period by enum none function enum one scale function by enum none wobble function enum one wobble period real 0.000000 wobble magnitude real 0.000000 square wave threshold real fraction 0.000000 step count short integer 0 map to enum linear sawtooth count short integer 0 add enum none scale result by enum none bounds mode enum clip bounds fraction bounds 0.000000 0.000000 turn off with short block index NONE -1 scale by real 0.000000 usage string end element 0 change colors block 1 element 0 darken by enum none scale by enum none scale flags long flags 0 color lower bound real rgb color 0.000000 0.000000 0.000000 color upper bound real rgb color 0.000000 0.000000 0.000000 permutations block 1 element 0 weight real 0.000000 color lower bound real rgb color 0.000000 0.000000 0.000000 color upper bound real rgb color 0.000000 0.000000 0.000000 end element 0 end element 0 predicted resources block 1 element 0 type enum bitmap resource index short integer 0 tag index long integer 0 end element 0 flags long flags 0 default team enum none constant sound volume enum silent rider damage fraction real 0.000000 integrated light toggle tag reference effe A in enum none B in enum none C in enum none D in enum none camera field of view angle 0.000000 camera stiffness real 0.000000 camera marker name string camera submerged marker name string pitch auto-level angle 0.000000 pitch range angle bounds 0.000000 0.000000 camera tracks block 1 element 0 track tag reference trak end element 0 seat acceleration scale real vector 3d 0.000000 0.000000 0.000000 soft ping threshold real 0.000000 soft ping interrupt time real 0.000000 hard ping threshold real 0.000000 hard ping interrupt time real 0.000000 hard death threshold real 0.000000 feign death threshold real 0.000000 feign death time real 0.000000 distance of evade anim real 0.000000 distance of dive anim real 0.000000 stunned movement threshold real 0.000000 feign death chance real 0.000000 feign repeat chance real 0.000000 spawned actor tag reference actv spawned actor count short integer bounds 0 0 spawned velocity real 0.000000 aiming velocity maximum angle 0.000000 aiming acceleration maximum angle 0.000000 casual aiming modifier real fraction 0.000000 looking velocity maximum angle 0.000000 looking acceleration maximum angle 0.000000 AI vehicle radius real 0.000000 AI danger radius real 0.000000 melee damage tag reference jpt! motion sensor blip size enum medium NEW HUD INTERFACES block 1 element 0 unit hud interface tag reference unhi end element 0 dialogue variants block 1 element 0 variant number short integer 0 dialogue tag reference udlg end element 0 grenade velocity real 0.000000 grenade type enum human fragmentation grenade count short integer 0 powered seats block 1 element 0 driver powerup time real 0.000000 driver powerdown time real 0.000000 end element 0 weapons block 1 element 0 weapon tag reference weap end element 0 seats block 1 element 0 flags long flags 0 label string marker name string acceleration scale real vector 3d 0.000000 0.000000 0.000000 yaw rate real 0.000000 pitch rate real 0.000000 camera marker name string camera submerged marker name string pitch auto-level angle 0.000000 pitch range angle bounds 0.000000 0.000000 camera tracks block 1 element 0 track tag reference trak end element 0 unit hud interface block 1 element 0 unit hud interface tag reference unhi end element 0 hud text message index short integer 0 yaw minimum angle 0.000000 yaw maximum angle 0.000000 built-in gunner tag reference actv end element 0 moving turning speed angle 0.000000 flags long flags 0 stationary turning threshold angle 0.000000 A in enum none B in enum none C in enum none D in enum none DON'T USE tag reference jpt! bank angle angle 0.000000 bank apply time real 0.000000 bank decay time real 0.000000 pitch ratio real 0.000000 max velocity real 0.000000 max sidestep velocity real 0.000000 acceleration real 0.000000 deceleration real 0.000000 angular velocity maximum angle 0.000000 angular acceleration maximum angle 0.000000 crouch velocity modifier real 0.000000 maximum slope angle angle 0.000000 downhill falloff angle angle 0.000000 downhill cutoff angle angle 0.000000 downhill velocity scale real 0.000000 uphill falloff angle angle 0.000000 uphill cutoff angle angle 0.000000 uphill velocity scale real 0.000000 footsteps tag reference foot jump velocity real 0.000000 maximum soft landing time real 0.000000 maximum hard landing time real 0.000000 minimum soft landing velocity real 0.000000 minimum hard landing velocity real 0.000000 maximum hard landing velocity real 0.000000 death hard landing velocity real 0.000000 standing camera height real 0.000000 crouching camera height real 0.000000 crouch transition time real 0.000000 standing collision height real 0.000000 crouching collision height real 0.000000 collision radius real 0.000000 autoaim width real 0.000000 contact points block 1 element 0 marker name string end element 0
Code:#pragma region biped struct biped_group { #pragma region Attachments struct attachments_block { TAG_FIELD(tag_reference, type, "����"); TAG_FIELD(tag_string, marker); TAG_FIELD(_enum, primary_scale); TAG_FIELD(_enum, secondary_scale); TAG_FIELD(_enum, change_color); }; #pragma endregion #pragma region Widgets struct widgets_block { TAG_FIELD(tag_reference, reference, "����"); }; #pragma endregion #pragma region Functions struct functions_block { TAG_FIELD(long_flags, flags); TAG_FIELD(real, period); TAG_FIELD(_enum, scale_period_by); TAG_FIELD(_enum, function); TAG_FIELD(_enum, scale_function_by); TAG_FIELD(_enum, wobble_function); TAG_FIELD(real, wobble_period); TAG_FIELD(real, wobble_magnitude); TAG_FIELD(real_fraction, square_wave_threshold); TAG_FIELD(int16, step_count); TAG_FIELD(_enum, map_to); TAG_FIELD(int16, sawtooth_count); TAG_FIELD(_enum, add); TAG_FIELD(_enum, scale_result_by); TAG_FIELD(_enum, bounds_mode); TAG_FIELD(tag_string, bounds); TAG_FIELD(int16, turn_off_with); TAG_FIELD(real, scale_by); TAG_FIELD(tag_string, usage); }; #pragma endregion #pragma region Change Colors struct change_colors_block { #pragma region Permutations struct permutations_block { TAG_FIELD(real, weight); TAG_FIELD(real_rgb_color, color_lower_bound); TAG_FIELD(real_rgb_color, color_upper_bound); }; #pragma endregion TAG_FIELD(_enum, darken_by); TAG_FIELD(_enum, scale_by); TAG_FIELD(long_flags, scale_flags); TAG_FIELD(real_rgb_color, color_lower_bound); TAG_FIELD(real_rgb_color, color_upper_bound); TAG_TBLOCK(permutations, permutations_block); }; #pragma endregion #pragma region Predicted Resources struct predicted_resources_block { TAG_FIELD(_enum, type); TAG_FIELD(int16, resource_index); TAG_FIELD(int32, tag_index); }; #pragma endregion #pragma region Camera Tracks struct camera_tracks_block { TAG_FIELD(tag_reference, track, "trak"); }; #pragma endregion #pragma region NEW HUD INTERFACES struct new_hud_interfaces_block { TAG_FIELD(tag_reference, unit_hud_interface, "unhi"); }; #pragma endregion #pragma region Dialogue Variants struct dialogue_variants_block { TAG_FIELD(int16, variant_number); TAG_FIELD(tag_reference, dialogue, "udlg"); }; #pragma endregion #pragma region Powered Seats struct powered_seats_block { TAG_FIELD(real, driver_powerup_time); TAG_FIELD(real, driver_powerdown_time); }; #pragma endregion #pragma region Weapons struct weapons_block { TAG_FIELD(tag_reference, weapon, "weap"); }; #pragma endregion #pragma region Seats struct seats_block { #pragma region Camera Tracks struct camera_tracks_block { TAG_FIELD(tag_reference, track, "trak"); }; #pragma endregion #pragma region Unit Hud Interface struct unit_hud_interface_block { TAG_FIELD(tag_reference, unit_hud_interface, "unhi"); }; #pragma endregion TAG_FIELD(long_flags, flags); TAG_FIELD(tag_string, label); TAG_FIELD(tag_string, marker_name); TAG_FIELD(real_vector3d, acceleration_scale); TAG_FIELD(real, yaw_rate); TAG_FIELD(real, pitch_rate); TAG_FIELD(tag_string, camera_marker_name); TAG_FIELD(tag_string, camera_submerged_marker_name); TAG_FIELD(angle, pitch_auto_level); TAG_FIELD(angle_bounds, pitch_range); TAG_TBLOCK(camera_tracks, camera_tracks_block); TAG_TBLOCK(unit_hud_interface, unit_hud_interface_block); TAG_FIELD(int16, hud_text_message_index); TAG_FIELD(angle, yaw_minimum); TAG_FIELD(angle, yaw_maximum); TAG_FIELD(tag_reference, built_in_gunner, "actv"); }; #pragma endregion #pragma region Contact Points struct contact_points_block { TAG_FIELD(tag_string, marker_name); }; #pragma endregion #pragma region Fields TAG_FIELD(word_flags, flags); TAG_FIELD(real, bounding_radius); TAG_FIELD(real_point3d, bounding_offset); TAG_FIELD(real_point3d, origin_offset); TAG_FIELD(real, acceleration_scale); TAG_FIELD(tag_reference, model, "mod2"); TAG_FIELD(tag_reference, animation_graph, "antr"); TAG_FIELD(tag_reference, collision_model, "coll"); TAG_FIELD(tag_reference, physics, "phys"); TAG_FIELD(tag_reference, modifier_shader, "shdr"); TAG_FIELD(tag_reference, creation_effect, "effe"); TAG_FIELD(real, render_bounding_radius); TAG_FIELD(_enum, a_in); TAG_FIELD(_enum, b_in); TAG_FIELD(_enum, c_in); TAG_FIELD(_enum, d_in); TAG_FIELD(int16, hud_text_message_index); TAG_FIELD(int16, forced_shader_permuation_index); TAG_TBLOCK(attachments, attachments_block); TAG_TBLOCK(widgets, widgets_block); TAG_TBLOCK(functions, functions_block); TAG_TBLOCK(change_colors, change_colors_block); TAG_TBLOCK(predicted_resources, predicted_resources_block); TAG_FIELD(long_flags, flags); TAG_FIELD(_enum, default_team); TAG_FIELD(_enum, constant_sound_volume); TAG_FIELD(real, rider_damage_fraction); TAG_FIELD(tag_reference, integrated_light_toggle, "effe"); TAG_FIELD(_enum, a_in); TAG_FIELD(_enum, b_in); TAG_FIELD(_enum, c_in); TAG_FIELD(_enum, d_in); TAG_FIELD(angle, camera_field_of_view); TAG_FIELD(real, camera_stiffness); TAG_FIELD(tag_string, camera_marker_name); TAG_FIELD(tag_string, camera_submerged_marker_name); TAG_FIELD(angle, pitch_auto_level); TAG_FIELD(angle_bounds, pitch_range); TAG_TBLOCK(camera_tracks, camera_tracks_block); TAG_FIELD(real_vector3d, seat_acceleration_scale); TAG_FIELD(real, soft_ping_threshold); TAG_FIELD(real, soft_ping_interrupt_time); TAG_FIELD(real, hard_ping_threshold); TAG_FIELD(real, hard_ping_interrupt_time); TAG_FIELD(real, hard_death_threshold); TAG_FIELD(real, feign_death_threshold); TAG_FIELD(real, feign_death_time); TAG_FIELD(real, distance_of_evade_anim); TAG_FIELD(real, distance_of_dive_anim); TAG_FIELD(real, stunned_movement_threshold); TAG_FIELD(real, feign_death_chance); TAG_FIELD(real, feign_repeat_chance); TAG_FIELD(tag_reference, spawned_actor, "actv"); TAG_FIELD(short_bounds, spawned_actor_count); TAG_FIELD(real, spawned_velocity); TAG_FIELD(angle, aiming_velocity_maximum); TAG_FIELD(angle, aiming_acceleration_maximum); TAG_FIELD(real_fraction, casual_aiming_modifier); TAG_FIELD(angle, looking_velocity_maximum); TAG_FIELD(angle, looking_acceleration_maximum); TAG_FIELD(real, ai_vehicle_radius); TAG_FIELD(real, ai_danger_radius); TAG_FIELD(tag_reference, melee_damage, "jpt!"); TAG_FIELD(_enum, motion_sensor_blip_size); TAG_TBLOCK(new_hud_interfaces, new_hud_interfaces_block); TAG_TBLOCK(dialogue_variants, dialogue_variants_block); TAG_FIELD(real, grenade_velocity); TAG_FIELD(_enum, grenade_type); TAG_FIELD(int16, grenade_count); TAG_TBLOCK(powered_seats, powered_seats_block); TAG_TBLOCK(weapons, weapons_block); TAG_TBLOCK(seats, seats_block); TAG_FIELD(angle, moving_turning_speed); TAG_FIELD(long_flags, flags); TAG_FIELD(angle, stationary_turning_threshold); TAG_FIELD(_enum, a_in); TAG_FIELD(_enum, b_in); TAG_FIELD(_enum, c_in); TAG_FIELD(_enum, d_in); TAG_FIELD(tag_reference, don_t_use, "jpt!"); TAG_FIELD(angle, bank_angle); TAG_FIELD(real, bank_apply_time); TAG_FIELD(real, bank_decay_time); TAG_FIELD(real, pitch_ratio); TAG_FIELD(real, max_velocity); TAG_FIELD(real, max_sidestep_velocity); TAG_FIELD(real, acceleration); TAG_FIELD(real, deceleration); TAG_FIELD(angle, angular_velocity_maximum); TAG_FIELD(angle, angular_acceleration_maximum); TAG_FIELD(real, crouch_velocity_modifier); TAG_FIELD(angle, maximum_slope_angle); TAG_FIELD(angle, downhill_falloff_angle); TAG_FIELD(angle, downhill_cutoff_angle); TAG_FIELD(real, downhill_velocity_scale); TAG_FIELD(angle, uphill_falloff_angle); TAG_FIELD(angle, uphill_cutoff_angle); TAG_FIELD(real, uphill_velocity_scale); TAG_FIELD(tag_reference, footsteps, "foot"); TAG_FIELD(real, jump_velocity); TAG_FIELD(real, maximum_soft_landing_time); TAG_FIELD(real, maximum_hard_landing_time); TAG_FIELD(real, minimum_soft_landing_velocity); TAG_FIELD(real, minimum_hard_landing_velocity); TAG_FIELD(real, maximum_hard_landing_velocity); TAG_FIELD(real, death_hard_landing_velocity); TAG_FIELD(real, standing_camera_height); TAG_FIELD(real, crouching_camera_height); TAG_FIELD(real, crouch_transition_time); TAG_FIELD(real, standing_collision_height); TAG_FIELD(real, crouching_collision_height); TAG_FIELD(real, collision_radius); TAG_FIELD(real, autoaim_width); TAG_TBLOCK(contact_points, contact_points_block); #pragma endregion }; #pragma endregion
Last edited by FireScythe; September 22nd, 2009 at 12:55 PM.
The only thing holding me back from using it. In Guerilla, some of the variable names are cutoff, so I might use it for those. I'm OCD when it comes to getting struct member offsets correct, which is why I like doing it manually and double check everything. I was even thinking about making a function to compare my struct sizes to the actual structs sizes, just to be sure I didn't miss anything lol!
I got a weird system going on for reversing tags lol First I open Halo CE and start a server. Then I use a function I wrote that iterates through the map tag index thats loaded in virtual memory and prints out the addresses of every tag of a specified taggroup and it's tag path. Then I open a tag group I want to reverse in Guerilla and go to the address in a memory hex editor that was printed out for the equivelent tag I opened in guerilla. The reason I don't just view the tags in a binary hex editor, is because guerillas tag format is not the same as when its compiled into the map and makes it confusing. Plus seeing where the pointers actually point to in memory is very helpful, I don't have to go using magic algos, I can just go to the pointer address.
For finding unknowns and padding, I changed variables in guerilla, saved the tag as a different name, then open both tags in a binary hex editor and switch back and forth looking for the changes lol. The way I do it is actually quite efficient for me even though it sounds rough
I've reversed quite a few tags already, it's just a slow process when there are so many different tags and tag blocks. I will post all completed ones.
Thanks for the info and app FireScythe. It will come in handy. Maybe you want to help with my Forge project, seeing as you are a very good coder.or maybe not
Last edited by Skarma; September 22nd, 2009 at 02:21 PM.
There are currently 2 users browsing this thread. (0 members and 2 guests)
Bookmarks