private void FxHighlight_OnItemSelect(UIMenu sender, UIMenuItem selectedItem, int index, UIMenuItem itemToControl, FxName fxName, string asset, bool useEvolutionArg = false) { if (selectedItem == itemToControl) { PTFXHelper.RemovePTFX(fxHandle); if (itemToControl.Text == "REMOVED") { return; } Ped player = Game.Player.Character; PlayLoopOrNonLoopedFX(player.IsInVehicle() ? player.CurrentVehicle : (Entity)player, asset, fxName, useEvolutionArg); lastAsset = asset; lastFXName = fxName; if (Game.IsKeyPressed(Keys.ShiftKey)) { if (sender == FavouritesMenu || (sender.ParentMenu != null && sender.ParentMenu == FavouritesMenu)) //Remove from favourites { try { FavouritesList.Remove(FavouritesList.Find(d => d.FxName == fxName && d.AssetName == asset)); ForceDecimal(); XMLHelper.SaveObjectToXML(FavouritesList, @"scripts\ParticleFxFavourites.xml"); if (sender == FavouritesMenu) { itemToControl.Text = "REMOVED"; itemToControl.Value = null; itemToControl.Description = null; } else if (sender.ParentMenu != null && sender.ParentMenu == FavouritesMenu) { sender.Title = "REMOVED"; sender.ParentItem.Text = "REMOVED"; sender.ParentItem.Description = null; } UI.ShowSubtitle("Removed from Favourites!"); } catch { } } else //Add to favourites { DetailedFx newFav = new DetailedFx(asset, fxName); FavouritesList.Add(newFav); ForceDecimal(); XMLHelper.SaveObjectToXML(FavouritesList, @"scripts\ParticleFxFavourites.xml"); UI.ShowSubtitle("Saved to Favourites!"); favLastIndex = FavouritesMenu.SelectedIndex; rebuildFavourites = true; allowMenuDraw = false; } } } }
void PlayLoopOrNonLoopedFX(Entity e, string asset, FxName fxName, bool useEvolutionArgument) { if (!PTFXHelper.HasNamedPTFXAssetLoaded(asset)) { PTFXHelper.RequestNamedPTFXAsset(asset); UI.ShowSubtitle("~r~ PTFX asset is not loaded, please try again ~n~ PTFX asset may not exist.."); } if (PTFXHelper.HasNamedPTFXAssetLoaded(asset)) { string fxType; Vector3 pos = e.Position + e.ForwardVector * 2f + e.RightVector * 1.5f; fxHandle = PTFXHelper.SpawnPTFXOnEntity(asset, fxName.PTFXName, e, new Vector3(1.5f, 2f, 0f), new Vector3(0.0f, 0.0f, 180.0f), fxSize); fxType = "Looped on Entity"; /*if (!PTFXHelper.DoesPTFXLoopedExist(fxHandle)) * { * fxHandle = PTFXHelper.SpawnPTFXOnEntityBone(asset, fxname, e, default(Vector3), default(Vector3), (int)Bone.IK_R_Hand, fxSize); * fxType = "Looped on Entity Bone"; * } * * if (!PTFXHelper.DoesPTFXLoopedExist(fxHandle)) * { * fxHandle = PTFXHelper.SpawnPTFXOnPedBone(asset, fxname, (Ped)e, default(Vector3), default(Vector3), (int)Bone.IK_R_Hand, fxSize); * fxType = "Looped on Ped Bone"; * }*/ if (!PTFXHelper.DoesPTFXLoopedExist(fxHandle)) { fxHandle = PTFXHelper.SpawnPTFXAtCoordinate(asset, fxName.PTFXName, pos, new Vector3(0, 0, 180.0f), fxSize); fxType = "Looped on Coordinate"; } if (!PTFXHelper.DoesPTFXLoopedExist(fxHandle)) { PTFXHelper.StartPTFXOnEntity(asset, fxName.PTFXName, e, new Vector3(1.5f, 2f, 0f), new Vector3(0.0f, 0.0f, 180.0f), fxSize); PTFXHelper.StartPTFXAtCoordinate(asset, fxName.PTFXName, pos, new Vector3(0, 0, 180.0f), fxSize); fxType = "Non Looped on Entity or on Coordinate, or doesn't work :("; } UI.ShowSubtitle("PTFX Spawn Type: " + fxType); if (useEvolutionArgument && PTFXHelper.DoesPTFXLoopedExist(fxHandle)) { foreach (var evo in fxName.EvolutionList) { PTFXHelper.SetEvolution(fxHandle, evo.EvolutionName, evo.Amount); PTFXHelper.SetAlpha(fxHandle, 1); } } } }
private static void CamxxCore_Dump(ref List <FxAsset> fxAssets) { List <string> assetList = Directory.GetFiles(@"scripts\Particle Asset Dump").ToList(); foreach (string txtFilePath in assetList) { string assetName = Path.GetFileNameWithoutExtension(txtFilePath); FxAsset asset = new FxAsset(assetName, new List <FxName>()); List <string> lines = File.ReadAllLines(txtFilePath).ToList(); foreach (string line in lines) { if (line.Contains("\"")) { var ptfxName = line.Split('\"', '\"')[1]; FxName fx = new FxName(ptfxName, new List <FxEvolution>()); if (line.Contains("->")) { var evolutionArgs = line.Substring(line.LastIndexOf("-> ") + 3); if (evolutionArgs.Contains(",")) { IList <string> evoArgList = evolutionArgs.Split(new string[] { ",", " " }, StringSplitOptions.RemoveEmptyEntries); foreach (var arg in evoArgList) { fx.EvolutionList.Add(new FxEvolution(arg, 1.0f)); } } else { fx.EvolutionList.Add(new FxEvolution(evolutionArgs, 1.0f)); } } asset.FxNames.Add(fx); } } fxAssets.Add(asset); } }
private static void PtxEffectRuleToXML(PgDictionary *ptxRulesDict, FxAsset fxAsset) { for (var i = 0; i < ptxRulesDict->ItemsCount; i++) { var itAddress = Marshal.ReadIntPtr(ptxRulesDict->Items + i * 8); if (itAddress == IntPtr.Zero) { continue; } var ptfxName = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itAddress + 0x20)); if (string.IsNullOrEmpty(ptfxName)) { continue; } FxName fx = new FxName(ptfxName, new List <FxEvolution>()); var parameters = Marshal.ReadIntPtr(itAddress + 0x48); if (parameters != IntPtr.Zero) { var parametersList = Marshal.ReadIntPtr(parameters); var numParams = Marshal.ReadInt16(parameters + 0x8); for (int p = 0; p < numParams; p++) { var itParam = parametersList + p * 0x18; string evolutionParam = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(itParam)); fx.EvolutionList.Add(new FxEvolution(evolutionParam, 1.0f)); } } fxAsset.FxNames.Add(fx); } }