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); } } }
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)); } } } } } }
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); }
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)); } } }