using System; using Assets.Gamelogic.Communication; using Assets.Gamelogic.Core; using Assets.Gamelogic.UI; using Scripts.Core; using Improbable.Character; using Improbable; using Improbable.Gdk.Core; using Improbable.Gdk.GameObjectRepresentation; using Improbable.Gdk.TransformSynchronization; using Improbable.Skill; using Improbable.Transform; using Twokinds.Assets._Game.Scripts.CameraSystems; using Twokinds.Assets._Game.Scripts.Character.InControl; using UnityEngine; //using Vector3 = Improbable.Math.Vector3d; namespace Assets.Gamelogic.Visualizers { public class PlayerControlsVisualizer : MonoBehaviour { //[Require] protected LocalPlayerCheckStateWriter LocalPlayerCheck; [Require] protected MovementState.Requirable.Writer movementStateWriter; [Require] protected Health.Requirable.Reader HealthReader; [Require] protected AttackState.Requirable.Writer attackStateWriter; [Require] protected CharacterLook.Requirable.Writer CharacterLookWriter; [Require] protected SkillList.Requirable.Reader SkillListReader; private CameraSystem cameraOrbit; [SerializeField] private SendChatBehaviour sendChatBehaviour; //private Transform cameraMount; //private KGFOrbitCam orbitCam; private bool run = true; private bool crouch = false; public CharacterVisualizer CharacterVisualizer; private CharacterActionsTk _characterActions; protected void OnEnable() { AttachCamera(); _characterActions = new CharacterActionsTk(); _characterActions.SetupDefaultsAll(); } protected void OnDisable() { RemoveCamera(); if (_characterActions != null) { _characterActions.Destroy(); } } public void Update() { var movementDirection = GetMovementDirection(); var movementUpdater = new MovementState.Update() {MovementDirection = movementDirection}; if (CharacterVisualizer != null && CharacterVisualizer.Movement != null) { //if (cameraMount == null) //{ // SetupCameraMount(); //} var camera = Camera.main; var rot = new Vector3(0, camera.transform.eulerAngles.y, 0); Vector3 rotationInput = rot - transform.rotation.eulerAngles; var desiredRot = new Vector3(0, camera.transform.eulerAngles.y, 0); if (_characterActions.CameraOnlyRotation.IsPressed) { rotationInput = Vector3.zero; desiredRot = CharacterVisualizer.Movement.Motor.Transform.eulerAngles; } CharacterVisualizer.Movement.SetInput(movementDirection.ToUnityVector3(), rotationInput, desiredRot); //if (HealthReader.Data.dead == DeadState.Alive && MenuManager.AnythingOpen == false && !Input.GetMouseButton(2)) //{ // //CharacterVisualizer.Movement.MovementTransform.eulerAngles = new Vector3(0, camera.transform.eulerAngles.y, 0); // //.Rotate(new Vector3(0, Input.GetAxis("Mouse X") * 180 * Time.deltaTime, 0)); //} movementUpdater.Heading = (transform.eulerAngles.y); movementUpdater.TargetPosition = (CharacterVisualizer.Movement.MovementTransform.position.ToImprobableLocation().ToSpatialCoords()); } if (MenuManager.AnythingOpen == false && !ChatPanelController.ChatModeActive) { if (_characterActions.Jump.WasPressed) { movementStateWriter.SendJump(new Jump()); } if (_characterActions.Crouch.WasPressed) { crouch = !crouch; movementUpdater.Crouch = new Option(crouch); } if (_characterActions.Walk.WasPressed) { run = !run; movementUpdater.Run = new Option(run); } //if (_characterActions.HotkeysAlt[1].WasPressed) //{ // movementUpdater = movementUpdater.AddEmote(new Emote((int)ActionCode.Wave)); //} //if (_characterActions.HotkeysAlt[2].WasPressed) //{ // movementUpdater = movementUpdater.AddEmote(new Emote((int)ActionCode.Cheer)); //} //if (_characterActions.HotkeysAlt[3].WasPressed) //{ // movementUpdater = movementUpdater.AddEmote(new Emote((int)ActionCode.Dance)); //} if (_characterActions.Action1.WasPressed) { attackStateWriter.SendUseSkill(new UseSkill(3, UseSkillSetting.On)); //strike } if (_characterActions.Action2.WasPressed) { attackStateWriter.SendUseSkill(new UseSkill(2, UseSkillSetting.On)); //block } if (_characterActions.Action2.WasReleased) { attackStateWriter.SendUseSkill(new UseSkill(2, UseSkillSetting.Off)); //block } } if (!ChatPanelController.ChatModeActive && SkillBar.Instance != null) { for (int cnt = 0; cnt < SkillBar.Instance.icons.Count && cnt < _characterActions.Hotkeys.Length; cnt++) { if (SkillBar.Instance.icons[cnt].skill.HasValue && _characterActions.Hotkeys[cnt].WasPressed) { attackStateWriter.SendUseSkill(new UseSkill(SkillBar.Instance.icons[cnt].skill.Value, UseSkillSetting.Toggle)); //skills TM } } } movementStateWriter.Send(movementUpdater); if (Input.GetKeyDown(SimulationSettings.SubmitChatKey)) { if (ChatPanelController.ChatModeActive) { var message = ChatPanelController.SubmitChat(); if (message.Length > 0) { sendChatBehaviour.SayChat(message); ChatPanelController.ActivateChatMode(); } else { ChatPanelController.DeactivateChatMode(); } } else { ChatPanelController.ActivateChatMode(); } } if (Input.GetKeyDown(SimulationSettings.AbortKey) && ChatPanelController.ChatModeActive) { ChatPanelController.DeactivateChatMode(); } SetupCameraMount(); //drag camera round if (CharacterVisualizer != null && CharacterVisualizer.Movement != null && cameraOrbit.Target != null) { //var camera = Camera.main; cameraOrbit.Target.position = CharacterVisualizer.Movement.CameraTarget.position; cameraOrbit.Target.rotation = CharacterVisualizer.Movement.CameraTarget.rotation; //orbitCam = camera.GetComponent(); //orbitCam.itsTarget.itsTarget.transform.parent = Movement.cameraTarget.transform; //orbitCam.itsTarget.itsTarget.transform.localPosition = Vector3.zero; //orbitCam.itsTarget.itsTarget.transform.localRotation = Quaternion.identity; //cameraMount = camera.transform.parent; } } void FixedUpdate() { var lookRot = cameraOrbit.transform.rotation.eulerAngles - transform.rotation.eulerAngles;//(cameraOrbit.transform.rotation * Quaternion.Inverse(transform.rotation)).eulerAngles; var lookUpdate = new CharacterLook.Update() {X = lookRot.x, Y = lookRot.y, Z = lookRot.z}; if (lookRot.x != CharacterLookWriter.Data.X || lookRot.y != CharacterLookWriter.Data.Y || lookRot.z != CharacterLookWriter.Data.Z) { CharacterLookWriter.Send(lookUpdate); } } //void LateUpdate() //{ //} private Velocity GetMovementDirection() { if (ChatPanelController.ChatModeActive) { return new Velocity(); } return new Velocity(_characterActions.Move.X, 0, _characterActions.Move.Y); } void SetupCameraMount() { if (CharacterVisualizer != null) { if (CharacterVisualizer.Movement != null && cameraOrbit.Target == null) { //shouldnt be null. cameraOrbit.Target = CharacterVisualizer.Movement.CameraTarget.transform; } } else { cameraOrbit.Target = transform; } //cameraMount = new GameObject("Camera Mount").transform; //cameraMount.localPosition = new Vector3(0, 1.6f, 0); //cameraMount.localRotation = Quaternion.identity; } private void AttachCamera() { cameraOrbit = Camera.main.GetComponent(); InteractionManager.instance.character = CharacterVisualizer; } private void RemoveCamera() { InteractionManager.instance.character = null; } } }