示例#1
0
        private static void OnWakeUp(object[] obj)
        {
            if (!enabled)
            {
                return;
            }

            if (Module <GlobleBlackBoard> .Self.HasInfo("pennyleave"))
            {
                if (!Module <GlobleBlackBoard> .Self.HasInfo("pennycomebackagain"))
                {
                    Module <GlobleBlackBoard> .Self.SetInfo("pennycomebackagain", "1");

                    Module <FavorManager> .Self.GainFavorValue(PennyID, -1, 600);
                }

                Vector3 position = new Vector3(225.5f, 48.0f, -94.5f);
                Vector3 rot      = new Vector3(0f, -90f, 0f);
                Actor   actor    = StoryHelper.GetActor(PennyID, string.Empty);

                //Module<SceneItemManager>.Self.CreateWithSceneFlag((SceneItemType)0, 168510, "Mission/Mission_pennyshow", "Main", "show_taizi", "0", false, AssetType.Mission);

                if (actor == null)
                {
                    actor = Module <NpcRepository> .Self.CreateNpc(4000141);
                }
                if (actor != null)
                {
                    actor.ClearActionQueue();
                    actor.DoCommand(ACType.Transfer, ACTransferPara.Construct("Main", position, rot));
                    actor.gamePos = position;
                    //actor.SetAiActive(true);
                    actor.DoCommand(ACType.Animation, ACTAnimationPara.Construct("AlwaysGuitar", null, null, false));
                    //actor.SetBehaviorState(BehaveState.Default);
                }
            }
        }
示例#2
0
        private static void TimerCallback(object state)
        {
            double currentTime = Module <TimeManager> .Self.TotalSecond / Module <TimeManager> .Self.TimeScale;

            foreach (KeyValuePair <int, double> k in kissingSpouses)
            {
                if (k.Value + 6 < currentTime)
                {
                    Actor a = ActorMgr.Self.Get(k.Key);
                    if (a != null)
                    {
                        ResetOneSpouseAnimation(a);
                    }
                }
            }

            if (!enabled || !settings.SpousesKiss || Module <ScenarioModule> .Self.CurrentScenarioName == "Main" || Module <ScenarioModule> .Self.CurrentScenarioName == "food")
            {
                return;
            }

            double nextKissTime = lastKiss + settings.MinKissingInterval;

            if (currentTime < nextKissTime)
            {
                return;
            }

            List <FavorObject> spouseList  = GetSpouses();
            List <Actor>       aSpouseList = new List <Actor>();

            aSpouseList.Add(Module <Player> .Self.actor);

            foreach (FavorObject f in spouseList)
            {
                Actor a = ActorMgr.Self.Get(f.ID);
                if (a == null)
                {
                    continue;
                }

                if (a.InActiveScene)
                {
                    aSpouseList.Add(a);
                }
            }

            int n = aSpouseList.Count;

            while (n > 1)
            {
                n--;
                int   k     = rand.Next(n + 1);
                Actor value = aSpouseList[k];
                aSpouseList[k] = aSpouseList[n];
                aSpouseList[n] = value;
            }

            foreach (Actor a in aSpouseList)
            {
                if (currentTime < nextKissTime)
                {
                    break;
                }

                if (!a.CanInteract || a.InBattle || !a.Visible || a.IsActionRunning(ACType.Sleep) || a.IsActionRunning(ACType.Sit) || a.IsActionRunning(ACType.Conversation) || a.IsActionRunning(ACType.Interact) || kissingSpouses.ContainsKey(a.InstanceId) || Module <EGMgr> .Self.IsEngagementEvent(a.InstanceId) || a.OnBus || a.IsInteractive())
                {
                    continue;
                }
                Vector3 pos1 = a.gamePos;
                foreach (Actor ao in aSpouseList)
                {
                    if (ao.InstanceId == a.InstanceId || !ao.CanInteract || ao.InBattle || !ao.Visible || ao.IsActionRunning(ACType.Sleep) || ao.IsActionRunning(ACType.Sit) || ao.IsActionRunning(ACType.Conversation) || ao.IsActionRunning(ACType.Interact) || kissingSpouses.ContainsKey(ao.InstanceId) || Module <EGMgr> .Self.IsEngagementEvent(ao.InstanceId) || ao.OnBus || ao.IsInteractive())
                    {
                        continue;
                    }
                    Vector3 pos2 = ao.gamePos;
                    float   dist = Vector3.Distance(pos1, pos2);

                    if (dist < settings.MaxKissingDistance)
                    {
                        int maxR   = Math.Max(50 - Math.Max(((int)Math.Round(currentTime - nextKissTime) - settings.MinKissingInterval), 0), 2);
                        int chance = new IntR(1, maxR).GetValue(rand);

                        if (chance != 1)
                        {
                            continue;
                        }

                        float _radiusSelf = a.GetActorRadius();
                        float _radiusTar  = ao.GetActorRadius();
                        float num         = (Module <NpcRepository> .Self.GetNpcGender(a.InstanceId) != Gender.Male) ? .17f : .19f;
                        if (a.InstanceId == Module <Player> .Self.actor.InstanceId || ao.InstanceId == Module <Player> .Self.actor.InstanceId)
                        {
                            num = (Module <Player> .Self.GetGender() != Gender.Male) ? -0.05f : -0.03f;
                        }
                        float _dis = _radiusSelf + _radiusTar + num;

                        Vector3 _tarDir = ao.gamePos - a.gamePos;
                        _tarDir.y = 0f;
                        Vector3 tarPos;
                        if (Module <ScenarioModule> .Self.CurrentScenarioName == "Main")
                        {
                            Util.TryGetGroundPosition(out tarPos, a.gamePos, _tarDir, _dis, 3f, 3f, true, 0.1f, _radiusTar, 36);
                        }
                        else
                        {
                            Util.TryGetGroundPosition(out tarPos, a.gamePos, _tarDir, _dis, 2f, 2f, true, 0.1f, _radiusTar, 36);
                        }

                        float y = Mathf.Max(a.gamePos.y, tarPos.y);

                        Vector3 apos = a.gamePos;
                        Vector3 arot = a.gameRot.eulerAngles;

                        Vector3 _sefPos = a.gamePos;
                        _sefPos.y = y;
                        Vector3 _tarPos = tarPos;
                        _tarPos.y = y;
                        Vector3 _sefRot = Quaternion.LookRotation(_tarPos - _sefPos, Vector3.up).eulerAngles;
                        Vector3 _tarRot = Quaternion.LookRotation(_sefPos - _tarPos, Vector3.up).eulerAngles;
                        Vector3 vector  = (_sefPos + _tarPos) * 0.5f;
                        if (a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, _sefPos, _sefRot)))
                        {
                            if (ao.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, _tarPos, _tarRot)))
                            {
                                a.StopAction(ACType.Animation, false);
                                if (a.TryDoAction(ACType.Animation, ACTAnimationPara.Construct(animName, null, null, true)))
                                {
                                    ao.StopAction(ACType.Animation, false);
                                    if (ao.TryDoAction(ACType.Animation, ACTAnimationPara.Construct(animName, null, null, true)))
                                    {
                                        kissLocations.Add(ao.gamePos - a.gamePos);     // add location for audio

                                        kissingSpouses.Add(a.InstanceId, currentTime); // for resetting animations
                                        kissingSpouses.Add(ao.InstanceId, currentTime);

                                        lastKiss = currentTime; // reset timer for kissing

                                        // start animating
                                        a.AddGravityEffector(turnOffGravity);
                                        a.StartInteraction(FullBodyBipedEffector.LeftHand, ao.GetInteractionObject(iKName), true);
                                        a.StartInteraction(FullBodyBipedEffector.RightHand, ao.GetInteractionObject(iKName), true);

                                        ao.AddGravityEffector(turnOffGravity);
                                        ao.StartInteraction(FullBodyBipedEffector.LeftHand, a.GetInteractionObject(iKName), true);
                                        ao.StartInteraction(FullBodyBipedEffector.RightHand, a.GetInteractionObject(iKName), true);

                                        break;
                                    }
                                    else
                                    {
                                        ResetOneSpouseAnimation(a);
                                        a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, apos, arot));
                                    }
                                }
                            }
                            else
                            {
                                a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, apos, arot));
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        private static void OnGUI(UnityModManager.ModEntry modEntry)
        {
            float infoBoxWidth = (typeof(UnityModManager).GetProperty("Params", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, new object[] { }) as UnityModManager.Param).WindowWidth * 0.9f;

            if (infoBoxWidth == 0)
            {
                infoBoxWidth = 960;
            }

            float buttonWidthShort = infoBoxWidth / 7f;

            float buttonWidthMedium = infoBoxWidth / 2f;


            if (Module <FavorManager> .Self?.GetAllShowFavorObjects() == null)
            {
                npcContent = null;
                return;
            }
            if (npcContent == null || npcContent.Length != Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1)
            {
                npcContent = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1];
            }

            string[] tempNPC = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length];

            for (int i = 0; i < Module <FavorManager> .Self.GetAllShowFavorObjects().Length; i++)
            {
                FavorObject favorObject = Module <FavorManager> .Self.GetAllShowFavorObjects()[i];

                NpcData npcData = Module <FavorManager> .Self.npcData[i];
                string  text    = (npcData == null) ? favorObject.ID.ToString() : npcData.Name;
                string  text2   = (!favorObject.IsDebut) ? string.Empty : "(?) ";
                tempNPC[i] = string.Concat(new object[]
                {
                    text,
                    " ",
                    text2,
                    favorObject.ID,
                    " ",
                    FavorRelationshipUtil.GetGenderRelation(npcData.gender, favorObject.Relationship),
                    " ",
                    favorObject.FavorValue
                });
            }
            tempNPC.CopyTo(npcContent, 0);
            string[] sortedNPC = new string[Module <FavorManager> .Self.GetAllShowFavorObjects().Length + 1];
            Array.Sort(tempNPC);
            tempNPC.CopyTo(sortedNPC, 0);
            npcContent[npcContent.Length - 1] = "All NPCs";
            sortedNPC[sortedNPC.Length - 1]   = "All NPCs";

            GUILayout.Box("NPC Count:" + Module <FavorManager> .Self.GetAllShowFavorObjects().Length, new GUILayoutOption[0]);
            realSelectIndex = GUILayout.SelectionGrid(realSelectIndex, sortedNPC, 2, new GUILayoutOption[]
            {
                GUILayout.Width((float)infoBoxWidth)
            });
            selectIndex = npcContent.IndexOf(sortedNPC[realSelectIndex]);
            GUILayout.Space(10);
            GUILayout.BeginHorizontal(new GUILayoutOption[0]);
            if (GUILayout.Button("Talk", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject2 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    IFavorBehavior favorBehavior = favorObject2.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_Dialog);
                    favorBehavior.Execute(favorObject2, null);
                    favorObject2.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject3 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        IFavorBehavior favorBehavior2 = favorObject3.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_Dialog);
                        favorBehavior2.Execute(favorObject3, null);
                        favorObject3.IsDebut = false;
                    }
                }
            }
            giftIdStr = GUILayout.TextField(giftIdStr, new GUILayoutOption[]
            {
                GUILayout.Width(58f)
            });
            if (GUILayout.Button("Gift", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                int num;
                int.TryParse(giftIdStr, out num);
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject4 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    IFavorBehavior favorBehavior3 = favorObject4.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_GiveGift);
                    favorBehavior3.Execute(favorObject4, new object[]
                    {
                        num
                    });
                    favorObject4.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject5 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        IFavorBehavior favorBehavior4 = favorObject5.FavorBehaviorList.Find((IFavorBehavior it) => it is FavorBehavior_GiveGift);
                        favorBehavior4.Execute(favorObject5, new object[]
                        {
                            num
                        });
                        favorObject5.IsDebut = false;
                    }
                }
            }
            addFavor = GUILayout.TextField(addFavor, new GUILayoutOption[]
            {
                GUILayout.Width(40f)
            });
            if (GUILayout.Button("Add", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                int gainFavorValue;
                int.TryParse(addFavor, out gainFavorValue);
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject6 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    favorObject6.GainFavorValue(-1, gainFavorValue, true, true, true);
                    favorObject6.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject7 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        Actor actor = Module <ActorMgr> .Self.Get(favorObject7.ID);

                        if (!(actor == null) && (!(actor != null) || !actor.InFarAwayScene()))
                        {
                            favorObject7.GainFavorValue(-1, gainFavorValue, true, true, true);
                            favorObject7.IsDebut = false;
                        }
                    }
                }
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(10);

            GUILayout.BeginHorizontal(new GUILayoutOption[0]);
            if (GUILayout.Button("Love", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject10 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    FavorUtility.SetNpcRelation(favorObject10.ID, FavorRelationshipId.NormalLover, 0);
                    favorObject10.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject11 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        FavorUtility.SetNpcRelation(favorObject11.ID, FavorRelationshipId.NormalLover, 0);
                        favorObject11.IsDebut = false;
                    }
                }
            }
            if (GUILayout.Button("BreakUp", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject12 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    FavorRelationLover.Breakup(favorObject12);
                    favorObject12.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject13 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        FavorRelationLover.Breakup(favorObject13);
                        favorObject13.IsDebut = false;
                    }
                }
            }
            if (GUILayout.Button("Marry", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject14 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    FavorUtility.SetNpcRelation(favorObject14.ID, FavorRelationshipId.NormalCouple, 0);
                    favorObject14.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject15 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        favorObject15.IsDebut = false;
                        FavorUtility.SetNpcRelation(favorObject15.ID, FavorRelationshipId.NormalCouple, 0);
                    }
                }
            }
            if (GUILayout.Button("Divorce", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject16 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    FavorRelationMarriage.DoDivorce(favorObject16);
                    favorObject16.IsDebut = false;
                }
                else
                {
                    foreach (FavorObject favorObject17 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        FavorRelationMarriage.DoDivorce(favorObject17);
                        favorObject17.IsDebut = false;
                    }
                }
            }
            if (GUILayout.Button("Move", new GUILayoutOption[]
            {
                GUILayout.Width((float)buttonWidthShort)
            }))
            {
                if (selectIndex < npcContent.Length - 1)
                {
                    FavorObject favorObject18 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                    if (favorObject18 != null)
                    {
                        Actor actor2 = StoryHelper.GetActor(favorObject18.ID, string.Empty);
                        if (actor2 == null)
                        {
                            actor2 = Module <NpcRepository> .Self.CreateNpc(favorObject18.ID);

                            Debug.Log(string.Concat(new object[]
                            {
                                "创建NPC->",
                                favorObject18.ID,
                                " Name:",
                                (!actor2) ? "Null" : actor2.ActorName,
                                " 于地点:",
                                Module <Player> .Self.actor.gamePos,
                                new Vector3(0f, 2f, 0f)
                            }));
                        }
                        if (actor2 != null)
                        {
                            actor2.ClearActionQueue();
                            actor2.DoCommand(ACType.Transfer, ACTransferPara.Construct(Module <ScenarioModule> .Self.CurrentScenarioName, Module <Player> .Self.actor.gamePos + new Vector3(0f, 2f, 0f), Vector3.zero));
                        }
                    }
                }
                else
                {
                    foreach (FavorObject favorObject19 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                    {
                        if (favorObject19 != null)
                        {
                            Actor actor3 = StoryHelper.GetActor(favorObject19.ID, string.Empty);
                            if (actor3 == null)
                            {
                                actor3 = Module <NpcRepository> .Self.CreateNpc(favorObject19.ID);

                                Debug.Log(string.Concat(new object[]
                                {
                                    "创建NPC->",
                                    favorObject19.ID,
                                    " Name:",
                                    (!actor3) ? "Null" : actor3.ActorName,
                                    " 于地点:",
                                    Module <Player> .Self.actor.gamePos,
                                    new Vector3(0f, 2f, 0f)
                                }));
                            }
                            if (actor3 != null)
                            {
                                actor3.ClearActionQueue();
                                actor3.DoCommand(ACType.Transfer, ACTransferPara.Construct(Module <ScenarioModule> .Self.CurrentScenarioName, Module <Player> .Self.actor.gamePos + new Vector3(0f, 2f, 0f), Vector3.zero));
                            }
                        }
                    }
                }
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(10);
            GUILayout.BeginHorizontal(new GUILayoutOption[0]);
            GUILayout.Label($"Relation: {Enum.GetName(typeof(FavorRelationshipId), relationEnum[relationId])}", new GUILayoutOption[] { GUILayout.Width(150) });
            relationId = (int)GUILayout.HorizontalSlider(relationId, 0, relationEnum.Length - 1, new GUILayoutOption[0]);
            if (GUILayout.Button("Set", new GUILayoutOption[]
            {
                GUILayout.Width(150)
            }))
            {
                try
                {
                    int relationIdEnum = relationEnum[relationId];
                    if (selectIndex < npcContent.Length - 1)
                    {
                        FavorObject favorObject8 = Module <FavorManager> .Self.GetAllShowFavorObjects()[selectIndex];

                        FavorUtility.SetNpcRelation(favorObject8.ID, (FavorRelationshipId)relationIdEnum, 0);
                        favorObject8.IsDebut = false;
                    }
                    else
                    {
                        foreach (FavorObject favorObject9 in Module <FavorManager> .Self.GetAllShowFavorObjects())
                        {
                            FavorUtility.SetNpcRelation(favorObject9.ID, (FavorRelationshipId)relationIdEnum, 0);
                            favorObject9.IsDebut = false;
                        }
                    }
                }
                catch { }
            }
            GUILayout.EndHorizontal();
            GUILayout.Space(20);
        }
示例#4
0
        public static void DoInteract(Actor a, Actor ao, int anim)
        {
            if ((!teeterGameRunning && !CanInteract(a, ao)) || (anim == 1 && Module <ActorMgr> .Self.GetActorInfo(ao.TmpltId).modelType == "Npc_Little"))
            {
                return;
            }

            string animName = Interacts[anim];

            Dbgl($"DoInteract: animName {animName} modelType {Module<ActorMgr>.Self.GetActorInfo(a.TmpltId).modelType} {Module<ActorMgr>.Self.GetActorInfo(ao.TmpltId).modelType}");
            if (Module <ActorMgr> .Self.GetActorInfo(ao.TmpltId).modelType == "0")
            {
                animName = CheckPet(ao, animName);
                Dbgl($"pet anim: {animName}");
            }

            bool   isTall    = animName == "Interact_Kiss" && (Module <ActorMgr> .Self.GetActorInfo(a.TmpltId).modelType == "Npc_Tall" || Module <ActorMgr> .Self.GetActorInfo(ao.TmpltId).modelType == "Npc_Tall");
            string mAnimName = animName;

            if (isTall)
            {
                mAnimName += "_Tall";
            }


            Vector3 pos1 = a.gamePos;
            Vector3 pos2 = ao.gamePos;

            float dist = Vector3.Distance(pos1, pos2);

            float _radiusSelf = a.GetActorRadius();
            float _radiusTar  = ao.GetActorRadius(); //0.25, 0.28 if tall

            float num = GetDistance(ao, animName);

            float _dis = _radiusSelf + _radiusTar + num;

            Vector3 _tarDir = ao.gamePos - a.gamePos;

            _tarDir.y = 0f;
            Vector3 tarPos;

            if (Module <ScenarioModule> .Self.CurrentScenarioName == "Main")
            {
                Util.TryGetGroundPosition(out tarPos, a.gamePos, _tarDir, _dis, 3f, 3f, true, 0.1f, _radiusTar, 36);
            }
            else
            {
                Util.TryGetGroundPosition(out tarPos, a.gamePos, _tarDir, _dis, 2f, 2f, true, 0.1f, _radiusTar, 36);
            }

            float y = Mathf.Max(a.gamePos.y, tarPos.y);

            Vector3 apos = a.gamePos;
            Vector3 arot = a.gameRot.eulerAngles;

            Vector3 aopos = ao.gamePos;
            Vector3 aorot = ao.gameRot.eulerAngles;

            Vector3 _sefPos = a.gamePos;

            _sefPos.y = y;
            Vector3 _tarPos = tarPos;

            _tarPos.y = y;
            Vector3 _sefRot = Quaternion.LookRotation(_tarPos - _sefPos, Vector3.up).eulerAngles;
            Vector3 _tarRot = Quaternion.LookRotation(_sefPos - _tarPos, Vector3.up).eulerAngles;
            Vector3 vector  = (_sefPos + _tarPos) * 0.5f;

            if (a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, _sefPos, _sefRot)))
            {
                if (ao.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, _tarPos, _tarRot)))
                {
                    a.StopAction(ACType.Animation, false);
                    if (a.TryDoAction(ACType.Animation, ACTAnimationPara.Construct(mAnimName, null, null, true)))
                    {
                        ao.StopAction(ACType.Animation, false);
                        if (ao.TryDoAction(ACType.Animation, ACTAnimationPara.Construct(mAnimName, null, EndAnimation, true)))
                        {
                            actorPairs.Add(new AnimationPair(animName, a, ao));
                            a.SetHoldingObjVisible(false);
                            ao.SetHoldingObjVisible(false);

                            isInteracting = true;

                            if (animName == "Hug")
                            {
                                Dbgl("started hugging");
                                isHugging = true;
                                hugTargets.Add(a);
                                hugTargets.Add(ao);
                                targetTime = settings.HugTime;
                            }

                            // start animating
                            a.AddGravityEffector(turnOffGravity);
                            a.StartInteraction(FullBodyBipedEffector.LeftHand, ao.GetInteractionObject(iKNames[animName]), true);
                            a.StartInteraction(FullBodyBipedEffector.RightHand, ao.GetInteractionObject(iKNames[animName]), true);

                            ao.AddGravityEffector(turnOffGravity);
                            ao.StartInteraction(FullBodyBipedEffector.LeftHand, a.GetInteractionObject(iKNames[animName]), true);
                            ao.StartInteraction(FullBodyBipedEffector.RightHand, a.GetInteractionObject(iKNames[animName]), true);

                            return;
                        }
                        else
                        {
                            if (actorPairs.Count > 0)
                            {
                                actorPairs.RemoveAt(actorPairs.Count - 1);
                            }
                            ResetOneAnimation(a);
                            a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, apos, arot));
                            ao.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, aopos, aorot));
                        }
                    }
                }
                else
                {
                    if (actorPairs.Count > 0)
                    {
                        actorPairs.RemoveAt(actorPairs.Count - 1);
                    }
                    a.TryDoAction(ACType.Transfer, ACTransferPara.Construct(string.Empty, apos, arot));
                }
            }
        }