public void OnEntityAdded(Entity entity) { ComponentPlayer componentPlayer = entity.FindComponent <ComponentPlayer>(); if (componentPlayer != null && componentPlayer.PlayerData == this) { if (ComponentPlayer != null) { throw new InvalidOperationException(string.Format(LanguageControl.Get(fName, 10), PlayerIndex)); } ComponentPlayer = componentPlayer; GameWidget.ActiveCamera = GameWidget.FindCamera <FppCamera>(); GameWidget.Target = componentPlayer; if (FirstSpawnTime < 0.0) { FirstSpawnTime = m_subsystemGameInfo.TotalElapsedGameTime; } } }
public PlayerData(Project project) { m_project = project; SubsystemPlayers = project.FindSubsystem <SubsystemPlayers>(throwOnError: true); SubsystemGameWidgets = project.FindSubsystem <SubsystemGameWidgets>(throwOnError: true); m_subsystemTerrain = project.FindSubsystem <SubsystemTerrain>(throwOnError: true); m_subsystemGameInfo = project.FindSubsystem <SubsystemGameInfo>(throwOnError: true); m_subsystemSky = project.FindSubsystem <SubsystemSky>(throwOnError: true); m_playerClass = PlayerClass.Male; Level = 1f; FirstSpawnTime = -1.0; LastSpawnTime = -1.0; RandomizeCharacterSkin(); ResetName(); InputDevice = WidgetInputDevice.None; m_stateMachine.AddState("FirstUpdate", null, delegate { if (ComponentPlayer != null) { UpdateSpawnDialog(string.Format(LanguageControl.Get(fName, 4), Name, MathUtils.Floor(Level)), null, 0f, resetProgress: true); m_stateMachine.TransitionTo("WaitForTerrain"); } else { m_stateMachine.TransitionTo("PrepareSpawn"); } }, null); m_stateMachine.AddState("PrepareSpawn", delegate { if (SpawnPosition == Vector3.Zero) { if (SubsystemPlayers.GlobalSpawnPosition == Vector3.Zero) { PlayerData playerData = SubsystemPlayers.PlayersData.FirstOrDefault((PlayerData pd) => pd.SpawnPosition != Vector3.Zero); if (playerData != null) { if (playerData.ComponentPlayer != null) { SpawnPosition = playerData.ComponentPlayer.ComponentBody.Position; m_spawnMode = SpawnMode.InitialNoIntro; } else { SpawnPosition = playerData.SpawnPosition; m_spawnMode = SpawnMode.InitialNoIntro; } } else { SpawnPosition = m_subsystemTerrain.TerrainContentsGenerator.FindCoarseSpawnPosition(); m_spawnMode = SpawnMode.InitialIntro; } SubsystemPlayers.GlobalSpawnPosition = SpawnPosition; } else { SpawnPosition = SubsystemPlayers.GlobalSpawnPosition; m_spawnMode = SpawnMode.InitialNoIntro; } } else { m_spawnMode = SpawnMode.Respawn; } if (m_spawnMode == SpawnMode.Respawn) { UpdateSpawnDialog(string.Format(LanguageControl.Get(fName, 2), Name, MathUtils.Floor(Level)), LanguageControl.Get(fName, 3), 0f, resetProgress: true); } else { UpdateSpawnDialog(string.Format(LanguageControl.Get(fName, 4), Name, MathUtils.Floor(Level)), null, 0f, resetProgress: true); } m_subsystemTerrain.TerrainUpdater.SetUpdateLocation(PlayerIndex, SpawnPosition.XZ, 0f, 64f); m_terrainWaitStartTime = Time.FrameStartTime; }, delegate { if (Time.PeriodicEvent(0.1, 0.0)) { float updateProgress2 = m_subsystemTerrain.TerrainUpdater.GetUpdateProgress(PlayerIndex, 0f, 64f); UpdateSpawnDialog(null, null, 0.5f * updateProgress2, resetProgress: false); if (!(updateProgress2 < 1f) || !(Time.FrameStartTime - m_terrainWaitStartTime < 15.0)) { switch (m_spawnMode) { case SpawnMode.InitialIntro: SpawnPosition = FindIntroSpawnPosition(SpawnPosition.XZ); break; case SpawnMode.InitialNoIntro: SpawnPosition = FindNoIntroSpawnPosition(SpawnPosition, respawn: false); break; case SpawnMode.Respawn: SpawnPosition = FindNoIntroSpawnPosition(SpawnPosition, respawn: true); break; default: throw new InvalidOperationException(LanguageControl.Get(fName, 5)); } m_stateMachine.TransitionTo("WaitForTerrain"); } } }, null); m_stateMachine.AddState("WaitForTerrain", delegate { m_terrainWaitStartTime = Time.FrameStartTime; Vector2 center = (ComponentPlayer != null) ? ComponentPlayer.ComponentBody.Position.XZ : SpawnPosition.XZ; m_subsystemTerrain.TerrainUpdater.SetUpdateLocation(PlayerIndex, center, MathUtils.Min(m_subsystemSky.VisibilityRange, 64f), 0f); }, delegate { if (Time.PeriodicEvent(0.1, 0.0)) { float updateProgress = m_subsystemTerrain.TerrainUpdater.GetUpdateProgress(PlayerIndex, MathUtils.Min(m_subsystemSky.VisibilityRange, 64f), 0f); UpdateSpawnDialog(null, null, 0.5f + 0.5f * updateProgress, resetProgress: false); if ((updateProgress >= 1f && Time.FrameStartTime - m_terrainWaitStartTime > 2.0) || Time.FrameStartTime - m_terrainWaitStartTime >= 15.0) { if (ComponentPlayer == null) { SpawnPlayer(SpawnPosition, m_spawnMode); } m_stateMachine.TransitionTo("Playing"); } } }, null); m_stateMachine.AddState("Playing", delegate { HideSpawnDialog(); }, delegate { if (ComponentPlayer == null) { m_stateMachine.TransitionTo("PrepareSpawn"); } else if (m_playerDeathTime.HasValue) { m_stateMachine.TransitionTo("PlayerDead"); } else if (ComponentPlayer.ComponentHealth.Health <= 0f) { m_playerDeathTime = Time.RealTime; } }, null); m_stateMachine.AddState("PlayerDead", delegate { GameWidget.ActiveCamera = GameWidget.FindCamera <DeathCamera>(); if (ComponentPlayer != null) { string text = ComponentPlayer.ComponentHealth.CauseOfDeath; if (string.IsNullOrEmpty(text)) { text = LanguageControl.Get(fName, 12); } string arg = string.Format(LanguageControl.Get(fName, 13), text); if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Cruel) { ComponentPlayer.ComponentGui.DisplayLargeMessage(LanguageControl.Get(fName, 6), string.Format(LanguageControl.Get(fName, 7), arg, LanguageControl.Get("GameMode", m_subsystemGameInfo.WorldSettings.GameMode.ToString())), 30f, 1.5f); } else if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Adventure && !m_subsystemGameInfo.WorldSettings.IsAdventureRespawnAllowed) { ComponentPlayer.ComponentGui.DisplayLargeMessage(LanguageControl.Get(fName, 6), string.Format(LanguageControl.Get(fName, 8), arg), 30f, 1.5f); } else { ComponentPlayer.ComponentGui.DisplayLargeMessage(LanguageControl.Get(fName, 6), string.Format(LanguageControl.Get(fName, 9), arg), 30f, 1.5f); } } Level = MathUtils.Max(MathUtils.Floor(Level / 2f), 1f); }, delegate { if (ComponentPlayer == null) { m_stateMachine.TransitionTo("PrepareSpawn"); } else if (Time.RealTime - m_playerDeathTime.Value > 1.5 && !DialogsManager.HasDialogs(ComponentPlayer.GuiWidget) && ComponentPlayer.GameWidget.Input.Any) { if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Cruel) { DialogsManager.ShowDialog(ComponentPlayer.GuiWidget, new GameMenuDialog(ComponentPlayer)); } else if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Adventure && !m_subsystemGameInfo.WorldSettings.IsAdventureRespawnAllowed) { ScreensManager.SwitchScreen("GameLoading", GameManager.WorldInfo, "AdventureRestart"); } else { m_project.RemoveEntity(ComponentPlayer.Entity, disposeEntity: true); } } }, null); m_stateMachine.TransitionTo("FirstUpdate"); }
public void HandleInput() { WidgetInput input = m_componentPlayer.GameWidget.Input; PlayerInput playerInput = m_componentPlayer.ComponentInput.PlayerInput; ComponentRider componentRider = m_componentPlayer.ComponentRider; if (m_componentPlayer.GameWidget.ActiveCamera.IsEntityControlEnabled) { if (!m_keyboardHelpMessageShown && (m_componentPlayer.PlayerData.InputDevice & WidgetInputDevice.Keyboard) != 0 && Time.PeriodicEvent(7.0, 0.0)) { m_keyboardHelpMessageShown = true; DisplaySmallMessage(LanguageControl.Get(fName, 1), Color.White, blinking: true, playNotificationSound: true); } else if (!m_gamepadHelpMessageShown && (m_componentPlayer.PlayerData.InputDevice & WidgetInputDevice.Gamepads) != 0 && Time.PeriodicEvent(7.0, 0.0)) { m_gamepadHelpMessageShown = true; DisplaySmallMessage(LanguageControl.Get(fName, 2), Color.White, blinking: true, playNotificationSound: true); } } if (playerInput.KeyboardHelp) { if (m_keyboardHelpDialog == null) { m_keyboardHelpDialog = new KeyboardHelpDialog(); } if (m_keyboardHelpDialog.ParentWidget != null) { DialogsManager.HideDialog(m_keyboardHelpDialog); } else { DialogsManager.ShowDialog(m_componentPlayer.GuiWidget, m_keyboardHelpDialog); } } if (playerInput.GamepadHelp) { if (m_gamepadHelpDialog == null) { m_gamepadHelpDialog = new GamepadHelpDialog(); } if (m_gamepadHelpDialog.ParentWidget != null) { DialogsManager.HideDialog(m_gamepadHelpDialog); } else { DialogsManager.ShowDialog(m_componentPlayer.GuiWidget, m_gamepadHelpDialog); } } if (m_helpButtonWidget.IsClicked) { ScreensManager.SwitchScreen("Help"); } if (playerInput.ToggleInventory || m_inventoryButtonWidget.IsClicked) { if (IsInventoryVisible()) { ModalPanelWidget = null; } else if (m_componentPlayer.ComponentMiner.Inventory is ComponentCreativeInventory) { ModalPanelWidget = new CreativeInventoryWidget(m_componentPlayer.Entity); } else { ModalPanelWidget = new FullInventoryWidget(m_componentPlayer.ComponentMiner.Inventory, m_componentPlayer.Entity.FindComponent <ComponentCraftingTable>(throwOnError: true)); } } if (playerInput.ToggleClothing || m_clothingButtonWidget.IsClicked) { if (IsClothingVisible()) { ModalPanelWidget = null; } else { ModalPanelWidget = new ClothingWidget(m_componentPlayer); } } if (m_sneakButtonWidget.IsClicked || playerInput.ToggleSneak) { bool isSneaking = m_componentPlayer.ComponentBody.IsSneaking; m_componentPlayer.ComponentBody.IsSneaking = !isSneaking; if (m_componentPlayer.ComponentBody.IsSneaking != isSneaking) { if (m_componentPlayer.ComponentBody.IsSneaking) { DisplaySmallMessage(LanguageControl.Get(fName, 3), Color.White, blinking: false, playNotificationSound: false); } else { DisplaySmallMessage(LanguageControl.Get(fName, 4), Color.White, blinking: false, playNotificationSound: false); } } } if (componentRider != null && (m_mountButtonWidget.IsClicked || playerInput.ToggleMount)) { bool flag = componentRider.Mount != null; if (flag) { componentRider.StartDismounting(); } else { ComponentMount componentMount = componentRider.FindNearestMount(); if (componentMount != null) { componentRider.StartMounting(componentMount); } } if (componentRider.Mount != null != flag) { if (componentRider.Mount != null) { DisplaySmallMessage(LanguageControl.Get(fName, 5), Color.White, blinking: false, playNotificationSound: false); } else { DisplaySmallMessage(LanguageControl.Get(fName, 6), Color.White, blinking: false, playNotificationSound: false); } } } if ((m_editItemButton.IsClicked || playerInput.EditItem) && m_componentPlayer.ComponentBlockHighlight.NearbyEditableCell.HasValue) { Point3 value = m_componentPlayer.ComponentBlockHighlight.NearbyEditableCell.Value; int cellValue = m_subsystemTerrain.Terrain.GetCellValue(value.X, value.Y, value.Z); int contents = Terrain.ExtractContents(cellValue); SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(contents); for (int i = 0; i < blockBehaviors.Length && !blockBehaviors[i].OnEditBlock(value.X, value.Y, value.Z, cellValue, m_componentPlayer); i++) { } } else if ((m_editItemButton.IsClicked || playerInput.EditItem) && IsActiveSlotEditable()) { IInventory inventory = m_componentPlayer.ComponentMiner.Inventory; if (inventory != null) { int activeSlotIndex = inventory.ActiveSlotIndex; int num = Terrain.ExtractContents(inventory.GetSlotValue(activeSlotIndex)); if (BlocksManager.Blocks[num].IsEditable) { SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(num); for (int i = 0; i < blockBehaviors.Length && !blockBehaviors[i].OnEditInventoryItem(inventory, activeSlotIndex, m_componentPlayer); i++) { } } } } if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative && (m_creativeFlyButtonWidget.IsClicked || playerInput.ToggleCreativeFly) && componentRider.Mount == null) { bool isCreativeFlyEnabled = m_componentPlayer.ComponentLocomotion.IsCreativeFlyEnabled; m_componentPlayer.ComponentLocomotion.IsCreativeFlyEnabled = !isCreativeFlyEnabled; if (m_componentPlayer.ComponentLocomotion.IsCreativeFlyEnabled != isCreativeFlyEnabled) { if (m_componentPlayer.ComponentLocomotion.IsCreativeFlyEnabled) { m_componentPlayer.ComponentLocomotion.JumpOrder = 1f; DisplaySmallMessage(LanguageControl.Get(fName, 7), Color.White, blinking: false, playNotificationSound: false); } else { DisplaySmallMessage(LanguageControl.Get(fName, 8), Color.White, blinking: false, playNotificationSound: false); } } } if (!m_componentPlayer.ComponentInput.IsControlledByVr && (m_cameraButtonWidget.IsClicked || playerInput.SwitchCameraMode)) { GameWidget gameWidget = m_componentPlayer.GameWidget; if (gameWidget.ActiveCamera.GetType() == typeof(FppCamera)) { gameWidget.ActiveCamera = gameWidget.FindCamera <TppCamera>(); DisplaySmallMessage(LanguageControl.Get(fName, 9), Color.White, blinking: false, playNotificationSound: false); } else if (gameWidget.ActiveCamera.GetType() == typeof(TppCamera)) { gameWidget.ActiveCamera = gameWidget.FindCamera <OrbitCamera>(); DisplaySmallMessage(LanguageControl.Get(fName, 10), Color.White, blinking: false, playNotificationSound: false); } else if (gameWidget.ActiveCamera.GetType() == typeof(OrbitCamera)) { gameWidget.ActiveCamera = gameWidget.FindCamera <FixedCamera>(); DisplaySmallMessage(LanguageControl.Get(fName, 11), Color.White, blinking: false, playNotificationSound: false); } else { gameWidget.ActiveCamera = gameWidget.FindCamera <FppCamera>(); DisplaySmallMessage(LanguageControl.Get(fName, 12), Color.White, blinking: false, playNotificationSound: false); } } if (m_photoButtonWidget.IsClicked || playerInput.TakeScreenshot) { ScreenCaptureManager.CapturePhoto(delegate { DisplaySmallMessage(LanguageControl.Get(fName, 13), Color.White, blinking: false, playNotificationSound: false); }, delegate { DisplaySmallMessage(LanguageControl.Get(fName, 14), Color.White, blinking: false, playNotificationSound: false); }); } if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative && (m_lightningButtonWidget.IsClicked || playerInput.Lighting)) { Matrix matrix = Matrix.CreateFromQuaternion(m_componentPlayer.ComponentCreatureModel.EyeRotation); base.Project.FindSubsystem <SubsystemWeather>(throwOnError: true).ManualLightingStrike(m_componentPlayer.ComponentCreatureModel.EyePosition, matrix.Forward); } if (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative && (m_timeOfDayButtonWidget.IsClicked || playerInput.TimeOfDay)) { float num2 = MathUtils.Remainder(0.25f, 1f); float num3 = MathUtils.Remainder(0.5f, 1f); float num4 = MathUtils.Remainder(0.75f, 1f); float num5 = MathUtils.Remainder(1f, 1f); float num6 = MathUtils.Remainder(num2 - m_subsystemTimeOfDay.TimeOfDay, 1f); float num7 = MathUtils.Remainder(num3 - m_subsystemTimeOfDay.TimeOfDay, 1f); float num8 = MathUtils.Remainder(num4 - m_subsystemTimeOfDay.TimeOfDay, 1f); float num9 = MathUtils.Remainder(num5 - m_subsystemTimeOfDay.TimeOfDay, 1f); float num10 = MathUtils.Min(num6, num7, num8, num9); if (num6 == num10) { m_subsystemTimeOfDay.TimeOfDayOffset += num6; DisplaySmallMessage(LanguageControl.Get(fName, 15), Color.White, blinking: false, playNotificationSound: false); } else if (num7 == num10) { m_subsystemTimeOfDay.TimeOfDayOffset += num7; DisplaySmallMessage(LanguageControl.Get(fName, 16), Color.White, blinking: false, playNotificationSound: false); } else if (num8 == num10) { m_subsystemTimeOfDay.TimeOfDayOffset += num8; DisplaySmallMessage(LanguageControl.Get(fName, 17), Color.White, blinking: false, playNotificationSound: false); } else if (num9 == num10) { m_subsystemTimeOfDay.TimeOfDayOffset += num9; DisplaySmallMessage(LanguageControl.Get(fName, 18), Color.White, blinking: false, playNotificationSound: false); } } if (ModalPanelWidget != null) { if (input.Cancel || input.Back || m_backButtonWidget.IsClicked) { ModalPanelWidget = null; } } else if (input.Back || m_backButtonWidget.IsClicked) { DialogsManager.ShowDialog(m_componentPlayer.GuiWidget, new GameMenuDialog(m_componentPlayer)); } }