static void AttachWeapon(Weapon weapon, Entity weaponObject) { var weaponGroup = weapon.Group; var info = WeaponsAttachDetails.Single(wad => wad.WeaponGroup == weaponGroup); var positionOffset = WeaponOffset.Get(weapon.Hash, WeaponOffset.OffsetType.Position); var rotationOffset = WeaponOffset.Get(weapon.Hash, WeaponOffset.OffsetType.Rotation); var position = new Vector3( info.Position.X + positionOffset.X, info.Position.Y + positionOffset.Y, info.Position.Z + positionOffset.Z); var rotation = new Vector3( info.Rotation.X + rotationOffset.X, info.Rotation.Y + rotationOffset.Y, info.Rotation.Z + rotationOffset.Z); weaponObject.AttachTo(Game.PlayerPed.Bones[info.Bone], position, rotation); Debug.WriteLine($"[{ResourceName}]Attach {weapon.Hash}({weapon.Group}) to {info.Bone}, {position}, {rotation}"); }
public WeaponOnBack() { _previousWeaponInHand = Game.PlayerPed.Weapons[WeaponHash.Unarmed]; Tick += UpdateWeaponsOnBackAsync; Tick += LoadWeaponAsset; Tick += ReAttachWeapons; API.RegisterCommand("wob", new Action <int, List <object>, string>((source, args, raw) => { try { var commandArg1 = args[0].ToString().ToLower(); var weapon = _latestWeaponOnBack; var weaponObject = _latestWeaponObjectOnBack; switch (commandArg1) { case "pos": case "position": var position = new Vector3( float.Parse(args[1].ToString()) / 100, float.Parse(args[2].ToString()) / 100, float.Parse(args[3].ToString()) / 100); WeaponOffset.Set(weapon.Hash, WeaponOffset.OffsetType.Position, position); AttachWeapon(weapon, weaponObject); Debug.WriteLine($"[{ResourceName}]{GameModeName}:{ResourceName}:CommandSucceed: {raw}"); TriggerEvent($"{GameModeName}:{ResourceName}:CommandSucceed", raw); break; case "rot": case "rotation": var rotation = new Vector3( float.Parse(args[1].ToString()), float.Parse(args[2].ToString()), float.Parse(args[3].ToString())); WeaponOffset.Set(weapon.Hash, WeaponOffset.OffsetType.Rotation, rotation); AttachWeapon(weapon, weaponObject); Debug.WriteLine($"[{ResourceName}]{GameModeName}:{ResourceName}:CommandSucceed: {raw}"); TriggerEvent($"{GameModeName}:{ResourceName}:CommandSucceed", raw); break; // case "reg": // // Sync // var handle = weaponObject.Handle; // // if (API.NetworkGetEntityIsNetworked(weaponObject.Handle)) // { // Debug.WriteLine($"not networked {weaponObject.Handle}"); // } // weaponObject.IsPersistent = true; // var netId = API.NetworkGetNetworkIdFromEntity(handle); // API.NetworkRegisterEntityAsNetworked(API.ObjToNet(handle)); // API.SetNetworkIdCanMigrate(netId, true); // API.SetNetworkIdExistsOnAllMachines(netId, true); // API.NetworkRequestControlOfEntity(handle); // Debug.WriteLine($"try set prop as networked {weaponObject.Handle}"); // break; default: Debug.WriteLine($"[{ResourceName}]{GameModeName}:{ResourceName}:CommandFailed: {raw}"); TriggerEvent($"{GameModeName}:{ResourceName}:CommandFailed", raw); break; } } catch (Exception e) { Debug.WriteLine($"[{ResourceName}][ERROR]{e.Message}"); // Debug.WriteLine($"[{ResourceName}]Usage: /wob pos [posX] [posY] [posZ]"); // Debug.WriteLine($"[{ResourceName}]Usage: /wob rot [rotX] [rotY] [rotZ]"); Debug.WriteLine($"[{ResourceName}]{GameModeName}:{ResourceName}:CommandFailed: {raw}"); TriggerEvent($"{GameModeName}:{ResourceName}:CommandFailed", raw); } }), false); #if DEBUG API.RegisterCommand("wob-current", new Action(() => { var currentWeapon = Game.PlayerPed.Weapons.Current; var currentWeaponSlot = API.GetWeapontypeSlot((uint)currentWeapon.Hash); var currentWeapontypeInSlot = API.GetPedWeapontypeInSlot(Game.PlayerPed.Handle, (uint)currentWeaponSlot); Debug.WriteLine($"currentWeapon: {(uint)currentWeapon.Hash}"); Debug.WriteLine($"Game.PlayerPed.Weapons.Current.Group: {(uint)Game.PlayerPed.Weapons.Current.Group}"); Debug.WriteLine($"currentWeaponSlot: {(uint)currentWeaponSlot}"); Debug.WriteLine($"currentWeapontypeInSlot: {(uint)currentWeapontypeInSlot}"); }), false); API.RegisterCommand("wob-pos", new Action <int, List <object>, string>((source, args, raw) => { var weaponObject = Entity.FromHandle(int.Parse(args[0].ToString())); if (weaponObject is null || !weaponObject.Exists()) { return; } var pedBone = Game.PlayerPed.Bones[(Bone)int.Parse(args[1].ToString())]; var attachPos = new Vector3(float.Parse(args[2].ToString()), float.Parse(args[3].ToString()), float.Parse(args[4].ToString())); var attachRot = new Vector3(float.Parse(args[5].ToString()), float.Parse(args[6].ToString()), float.Parse(args[7].ToString())); weaponObject.AttachTo(pedBone, attachPos, attachRot); // CurrentWeaponsOnBack.Values.ForEach(weaponObject => { }); }), false); API.RegisterCommand("wob-view", new Action(() => { Debug.WriteLine("_weaponAttachedObject"); WeaponDisplay.GetAllDisplayedWeaponObjects().ForEach(kvp => { var weaponObject = kvp.Value; Debug.WriteLine($"weapon: {weaponObject?.Model}({weaponObject?.Model.Hash}), modelHandle: {weaponObject?.Handle}"); }); }), false); #endif }