using System; using System.Collections.Generic; using System.Linq; using System.Text; using GTANetworkAPI; using Newtonsoft.Json; namespace ReallifeGamemode.Server.Util { public static class AnimationSync { public static Dictionary> animationPair = new Dictionary>(); public static void SyncAnimation(this Player player, dynamic animationName) { if (!player.HasData("Animation")) player.SetData("Animation", String.Empty); string currentAnimation = player.GetData("Animation"); string newAnimation = animationName; if (currentAnimation.Equals(newAnimation)) return; player.SetSharedData("AnimationData", newAnimation); player.SetData("Animation", newAnimation); } public static void SyncAnimation(this Player player, List animations) { string animationName = animations.ElementAt(0); List nextAnimations = animations.Skip(1).ToList(); player.SyncAnimation(animationName); if (nextAnimations.Count != 0) { player.TriggerEvent("SERVER:QueueAnimation", animationName); animationPair.Add(player, nextAnimations); } } /// Check if Player has any Animation playing. /// /// public static bool HasAnimation(this Player player) { return player.HasData("Animation"); } /// Check if Player has a specific Animation playing. /// /// Name of requested animation public static bool HasAnimation(this Player player, dynamic animationName) { return player.HasData("Animation") && (player.GetData("Animation") == animationName); } public static void ClearAnimation(this Player player) { if (!player.HasData("Animation")) return; player.ResetData("Animation"); player.ResetSharedData("AnimationData"); } } public class AnimationSyncEvents : Script { [RemoteEvent("CLIENT:AnimPairTransition")] public void AnimPairTransition(Player player) { if (!AnimationSync.animationPair.ContainsKey(player)) return; List animationPairs = AnimationSync.animationPair[player]; player.SyncAnimation(animationPairs); } [RemoteEvent("CLIENT:ClearAnimationData")] public void ClearAnimationData(Player player, Player target) { target.ClearAnimation(); } [ServerEvent(Event.PlayerWeaponSwitch)] public void OnPlayerWeaponSwitch(Player player, WeaponHash oldWeapon, WeaponHash newWeapon) { if (!player.HasAnimation()) return; NAPI.Player.SetPlayerCurrentWeapon(player, WeaponHash.Unarmed); } [ServerEvent(Event.PlayerConnected)] public void OnPlayerConnected(Player player) { player.TriggerEvent("SERVER:LoadAnimations"); } [ServerEvent(Event.PlayerDeath)] public void OnPlayerDeath(Player player, Player killer, uint reason) { player.ClearAnimation(); } } }