diff --git a/CodeWalker.Core/CodeWalker.Core.csproj b/CodeWalker.Core/CodeWalker.Core.csproj index 8e9c9ae..c44e460 100644 --- a/CodeWalker.Core/CodeWalker.Core.csproj +++ b/CodeWalker.Core/CodeWalker.Core.csproj @@ -152,6 +152,7 @@ + diff --git a/CodeWalker.Core/World/Weapon.cs b/CodeWalker.Core/World/Weapon.cs new file mode 100644 index 0000000..344c250 --- /dev/null +++ b/CodeWalker.Core/World/Weapon.cs @@ -0,0 +1,48 @@ +using CodeWalker.GameFiles; +using SharpDX; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace CodeWalker.World +{ + [TypeConverter(typeof(ExpandableObjectConverter))] public class Weapon + { + public string Name { get; set; } = string.Empty; + public MetaHash NameHash { get; set; } = 0;//base weapon name hash + public MetaHash ModelHash { get; set; } = 0;//weapon model name hash, can be _hi + + public YmapEntityDef RenderEntity = new YmapEntityDef(); //placeholder entity object for rendering + + public Vector3 Position { get; set; } = Vector3.Zero; + public Quaternion Rotation { get; set; } = Quaternion.Identity; + + + public void Init(string name, GameFileCache gfc, bool hidef = true) + { + Name = name; + var modelnamel = name.ToLowerInvariant(); + MetaHash modelhash = JenkHash.GenHash(modelnamel); + MetaHash modelhashhi = JenkHash.GenHash(modelnamel + "_hi"); + var ydrhash = hidef ? modelhashhi : modelhash; + + NameHash = modelhash; + ModelHash = ydrhash; + + + UpdateEntity(); + } + + + public void UpdateEntity() + { + RenderEntity.SetPosition(Position); + RenderEntity.SetOrientation(Rotation); + } + + } +} diff --git a/Rendering/Renderer.cs b/Rendering/Renderer.cs index 523644d..a06adea 100644 --- a/Rendering/Renderer.cs +++ b/Rendering/Renderer.cs @@ -2749,6 +2749,23 @@ namespace CodeWalker.Rendering } + public void RenderWeapon(Weapon weapon, ClipMapEntry animClip = null) + { + + YdrFile ydr = gameFileCache.GetYdr(weapon.ModelHash); + if (ydr == null) + { + ydr = gameFileCache.GetYdr(weapon.NameHash);//fallback to low def version? + } + + if ((ydr != null) && (ydr.Loaded) && (ydr.Drawable != null)) + { + var d = ydr.Drawable; + var txdhash = weapon.NameHash; + + RenderDrawable(d, null, weapon.RenderEntity, txdhash, null, null, animClip); + } + } diff --git a/World/CutsceneForm.cs b/World/CutsceneForm.cs index d19a375..fa4e686 100644 --- a/World/CutsceneForm.cs +++ b/World/CutsceneForm.cs @@ -471,7 +471,7 @@ namespace CodeWalker.World var pos = Position; var rot = Rotation; - var animate = (obj.Ped != null) || (obj.Prop != null) || (obj.Vehicle != null); + var animate = (obj.Ped != null) || (obj.Prop != null) || (obj.Vehicle != null) || (obj.Weapon != null); if (animate) { ycd.CutsceneMap.TryGetValue(obj.AnimHash, out cme); @@ -483,6 +483,7 @@ namespace CodeWalker.World pos = pos + rot.Multiply(obj.Position); rot = rot * obj.Rotation; } + obj.AnimClip = cme; } if (obj.Ped != null) { @@ -494,16 +495,19 @@ namespace CodeWalker.World { obj.Prop.Position = pos; obj.Prop.Orientation = rot; - obj.AnimClip = cme; } if (obj.Vehicle != null) { obj.Vehicle.Position = pos; obj.Vehicle.Rotation = rot; obj.Vehicle.UpdateEntity(); - obj.AnimClip = cme; } - + if (obj.Weapon != null) + { + obj.Weapon.Position = pos; + obj.Weapon.Rotation = rot; + obj.Weapon.UpdateEntity(); + } } } @@ -537,6 +541,10 @@ namespace CodeWalker.World { renderer.RenderVehicle(obj.Vehicle, obj.AnimClip); } + if (obj.Weapon != null) + { + renderer.RenderWeapon(obj.Weapon, obj.AnimClip); + } } } @@ -1054,6 +1062,7 @@ namespace CodeWalker.World public Ped Ped { get; set; } public YmapEntityDef Prop { get; set; } public Vehicle Vehicle { get; set; } + public Weapon Weapon { get; set; } public MetaHash AnimHash { get; set; } public ClipMapEntry AnimClip { get; set; } @@ -1179,7 +1188,12 @@ namespace CodeWalker.World private void InitWeapon(CutWeaponModelObject weap, GameFileCache gfc) { + var name = weap.StreamingName.ToString(); + Weapon = new Weapon(); + Weapon.Init(name, gfc); + + AnimHash = weap.StreamingName; } private void InitHiddenModel(CutHiddenModelObject hid, GameFileCache gfc)