using KFCommonUtilityLib.Scripts.NetPackages; using System.Collections.Generic; using System.Xml.Linq; using UnityEngine; public class MinEventActionAttachPrefabToEntitySync : MinEventActionAttachPrefabToEntity { private static Dictionary dict_loaded = new Dictionary(); //public override bool CanExecute(MinEventTypes _eventType, MinEventParams _params) //{ // return base.CanExecute(_eventType, _params) && (_params.IsLocal || (_params.Self && !_params.Self.isEntityRemote)); //} public override void Execute(MinEventParams _params) { base.Execute(_params); if (ConnectionManager.Instance.IsServer) { ConnectionManager.Instance.SendPackage(NetPackageManager.GetPackage().Setup(_params.Self.entityId, prefab, parent_transform_path, local_offset, local_rotation, local_scale), false, -1, -1, _params.Self.entityId); } else if (_params.IsLocal || (_params.Self && !_params.Self.isEntityRemote)) { ConnectionManager.Instance.SendToServer(NetPackageManager.GetPackage().Setup(_params.Self.entityId, prefab, parent_transform_path, local_offset, local_rotation, local_scale)); } } public override bool ParseXmlAttribute(XAttribute _attribute) { bool flag = false; if (_attribute.Name.LocalName == "prefab") { prefab = _attribute.Value; if (dict_loaded.TryGetValue(_attribute.Value, out GameObject go) && go) { goToInstantiate = go; flag = true; } else { flag = base.ParseXmlAttribute(_attribute); dict_loaded[_attribute.Value] = goToInstantiate; } } else { flag = base.ParseXmlAttribute(_attribute); } return flag; } public static void RemoteAttachPrefab(EntityAlive entity, string prefab, string path, Vector3 local_offset, Vector3 local_rotation, Vector3 local_scale) { Transform transform = entity.RootTransform; if (!string.IsNullOrEmpty(path)) { transform = GameUtils.FindDeepChildActive(transform, path); } if (transform == null) { return; } GameObject goToInstantiate = dict_loaded[prefab]; string text = "tempPrefab_" + goToInstantiate.name; Transform transform2 = GameUtils.FindDeepChild(transform, text); if (transform2 == null) { GameObject gameObject = UnityEngine.Object.Instantiate(goToInstantiate); if (gameObject == null) { return; } transform2 = gameObject.transform; gameObject.name = text; Utils.SetLayerRecursively(gameObject, transform.gameObject.layer, null); transform2.parent = transform; transform2.localPosition = local_offset; transform2.localRotation = Quaternion.Euler(local_rotation.x, local_rotation.y, local_rotation.z); transform2.localScale = local_scale; } } }