using Godot; using System; using System.Collections.Generic; public partial class Humanoid : CharacterBody3D { Options _Options; Reference _Reference; [Export] public AnimationTree Animator; [Export] public AnimQuickState CurrentAnimation; [Export] public Vector2 InputDirection; UIMode CurrentUIMode = UIMode.Game; (UIMode, Control)[] UIFrames; public ProgressBar HealthBar; ProgressBar StaminaBar; public ITool EquippedTool; Node Backpack; public string PlayerName = ""; public float Health = 100; public float MaxHealth = 100; public float Stamina = 100; public float MaxStamina = 100; public float StaminaDrain = 5; public float StaminaCharge = 5; public float JumpStamina = 10; public bool Running = false; public float JumpVelocity = 5.5f; public float RotationSpeed = 1f; public float FallDistanceForDamage = 15; public float FallDamageScale = 5f; public Ability Ability; public float Gravity = ProjectSettings.GetSetting( "physics/3d/default_gravity" ).AsSingle(); public bool mouseLock = true; public float Speed { get { if( Running ) { return 9f; } return 5f; } } public override void _EnterTree() { _Options = GetNode( "/root/Options" ); _Reference = GetNode("/root/Reference"); string[] Data = Name.ToString().Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); string PID = Data[0]; string AID = Data[1]; PlayerName = Data[2]; this.SetMultiplayerAuthority( Convert.ToInt32(PID), true ); if( IsMultiplayerAuthority() ) { _Reference.Humanoid = this; _Options.isAlive = true; _Reference.Humanoid = this; _Reference.Camera = GetChild( 0 ); _Reference.Camera.GetChild(0).MakeCurrent(); _Reference.Camera.Current = true; UIFrames = new (UIMode, Control) [] { ( UIMode.Game, GetNode( "/root/GameRoot/UI/GameUI/Game" ) ), ( UIMode.Inventory, GetNode( "/root/GameRoot/UI/GameUI/Inventory" ) ), ( UIMode.Pause, GetNode( "/root/GameRoot/UI/SettingsFrame" ) ) }; HealthBar = GetNode( "/root/GameRoot/UI/GameUI/Game/HealthBar" ); StaminaBar = GetNode( "/root/GameRoot/UI/GameUI/Game/StaminaBar" ); Input.MouseMode = Input.MouseModeEnum.ConfinedHidden; SetUIMode( CurrentUIMode ); HealthBar.MaxValue = MaxHealth; HealthBar.Value = Health; StaminaBar.MaxValue = MaxStamina; StaminaBar.Value = Stamina; EquipTool( 0 ); List spawnPoints = new List(); foreach (Node3D cur in _Reference.PlayerSpawnPoints.GetChildren()){ spawnPoints.Add(cur.GlobalPosition); } int chosenSpawn = new Random(DateTime.Now.Millisecond).Next(0, spawnPoints.Count); this.SetDeferred("global_position", spawnPoints[chosenSpawn]); Ability _Ability = (Ability)Convert.ToInt32(AID); if (_Ability == Ability.Vitality){ MaxHealth *= 1.25f; Health = MaxHealth; } else if ( _Ability == Ability.Stamina ){ MaxStamina *= 1.25f; StaminaCharge *= 1.25f; Stamina = MaxStamina; } else if ( _Ability == Ability.Strength ){ _Reference.Inventory.UpdateMaxWeight(500); } GetNode("PlayerModel").Visible = false; } } public enum AnimQuickState{ Idle, Walk, Run, Jump } Vector3 GetMovement( float deltaTime ) { // Copy current velocity off the CharacterBody3d Vector3 velocity = Velocity; if( CurrentUIMode == UIMode.Game ) { // Add the gravity. if ( IsOnFloor() ) { if ( Input.GetActionStrength( "Jump" ) == 1 && Stamina >= JumpStamina ) { CurrentAnimation = AnimQuickState.Jump; Stamina -= JumpStamina; velocity.Y = JumpVelocity; } } else { CurrentAnimation = AnimQuickState.Idle; velocity.Y -= Gravity * deltaTime; } if (Running && Stamina <= 0){ Running = false; } // Get the input direction and handle the movement/deceleration. Vector2 inputDir = Input.GetVector("Left", "Right", "Forward", "Backward"); Vector3 direction = (Transform.Basis * new Vector3(inputDir.X, 0, inputDir.Y)).Normalized(); if( direction != Vector3.Zero ) { // If there was input velocity.X = direction.X * Speed; velocity.Z = direction.Z * Speed; if (Running){ Stamina -= deltaTime * StaminaDrain; StaminaBar.Value = Stamina; StaminaBar.MaxValue = MaxStamina; CurrentAnimation = AnimQuickState.Run; InputDirection = inputDir; }else{ if (Stamina < MaxStamina){ Stamina += deltaTime * StaminaCharge / 2; StaminaBar.Value = Stamina; StaminaBar.MaxValue = MaxStamina; } CurrentAnimation = AnimQuickState.Walk; InputDirection = inputDir; } } else { // If there was no input velocity.X = Mathf.MoveToward( Velocity.X, 0, Speed ); velocity.Z = Mathf.MoveToward( Velocity.Z, 0, Speed ); if (Stamina < MaxStamina){ Stamina += deltaTime * StaminaCharge; StaminaBar.Value = Stamina; StaminaBar.MaxValue = MaxStamina; } CurrentAnimation = AnimQuickState.Idle; } } else { velocity = new Vector3 ( Mathf.MoveToward( Velocity.X, 0, Speed /6 ), velocity.Y - (Gravity * deltaTime), Mathf.MoveToward( Velocity.Z, 0, Speed /6 ) ); if (Stamina < MaxStamina){ Stamina += deltaTime * StaminaCharge; StaminaBar.Value = Stamina; StaminaBar.MaxValue = MaxStamina; } CurrentAnimation = AnimQuickState.Idle; } return velocity; } public void EquipTool(int BackpackIndex ) { if( Backpack == null ) { Backpack = GetNode( "/root/GameRoot/UI/GameUI/Game/ToolBar" ); } var Children = Backpack.GetChildren(); if( Children.Count > BackpackIndex ) { foreach( Label cur in Children ) { cur.Modulate = new Color( 1, 1, 1 ); } if (EquippedTool != null ) { EquippedTool.UnEquipped(); } // If same button is pressed put tool away Label UILabel = Backpack.GetChild