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 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:QueueAnimations", nextAnimations.ToArray(), animationName); } /// 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, string JSON_transitionTo) { string[] transitionTo = (string[])JsonConvert.DeserializeObject(JSON_transitionTo); player.SendChatMessage(transitionTo.ToString()); player.SyncAnimation(transitionTo.ToList()); } [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(); } } }