public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) { m_subsystemGameInfo = base.Project.FindSubsystem <SubsystemGameInfo>(throwOnError: true); m_subsystemParticles = base.Project.FindSubsystem <SubsystemParticles>(throwOnError: true); m_subsystemAudio = base.Project.FindSubsystem <SubsystemAudio>(throwOnError: true); m_subsystemTime = base.Project.FindSubsystem <SubsystemTime>(throwOnError: true); m_subsystemTerrain = base.Project.FindSubsystem <SubsystemTerrain>(throwOnError: true); m_subsystemPickables = base.Project.FindSubsystem <SubsystemPickables>(throwOnError: true); m_componentGui = base.Entity.FindComponent <ComponentGui>(throwOnError: true); m_componentHumanModel = base.Entity.FindComponent <ComponentHumanModel>(throwOnError: true); m_componentBody = base.Entity.FindComponent <ComponentBody>(throwOnError: true); m_componentOuterClothingModel = base.Entity.FindComponent <ComponentOuterClothingModel>(throwOnError: true); m_componentVitalStats = base.Entity.FindComponent <ComponentVitalStats>(throwOnError: true); m_componentLocomotion = base.Entity.FindComponent <ComponentLocomotion>(throwOnError: true); m_componentPlayer = base.Entity.FindComponent <ComponentPlayer>(throwOnError: true); SteedMovementSpeedFactor = 1f; Insulation = 0f; LeastInsulatedSlot = ClothingSlot.Feet; m_clothes[ClothingSlot.Head] = new List <int>(); m_clothes[ClothingSlot.Torso] = new List <int>(); m_clothes[ClothingSlot.Legs] = new List <int>(); m_clothes[ClothingSlot.Feet] = new List <int>(); ValuesDictionary value = valuesDictionary.GetValue <ValuesDictionary>("Clothes"); SetClothes(ClothingSlot.Head, HumanReadableConverter.ValuesListFromString <int>(';', value.GetValue <string>("Head"))); SetClothes(ClothingSlot.Torso, HumanReadableConverter.ValuesListFromString <int>(';', value.GetValue <string>("Torso"))); SetClothes(ClothingSlot.Legs, HumanReadableConverter.ValuesListFromString <int>(';', value.GetValue <string>("Legs"))); SetClothes(ClothingSlot.Feet, HumanReadableConverter.ValuesListFromString <int>(';', value.GetValue <string>("Feet"))); Display.DeviceReset += Display_DeviceReset; }
public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) { m_subsystemTime = base.Project.FindSubsystem <SubsystemTime>(throwOnError: true); m_subsystemTerrain = base.Project.FindSubsystem <SubsystemTerrain>(throwOnError: true); m_subsystemSky = base.Project.FindSubsystem <SubsystemSky>(throwOnError: true); m_componentGui = base.Entity.FindComponent <ComponentGui>(throwOnError: true); m_componentPlayer = base.Entity.FindComponent <ComponentPlayer>(throwOnError: true); }
public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap) { ComponentGui = Entity.FindComponent <ComponentGui>(true); base.Load(valuesDictionary, idToEntityMap); }
public new void Update(float dt) { PlayerInput playerInput = ComponentInput.PlayerInput; if (ComponentInput.IsControlledByTouch && m_aimDirection.HasValue) { playerInput.Look = Vector2.Zero; } if (ComponentMiner.Inventory != null) { ComponentMiner.Inventory.ActiveSlotIndex = MathUtils.Clamp(ComponentMiner.Inventory.ActiveSlotIndex + playerInput.ScrollInventory, 0, 5); if (playerInput.SelectInventorySlot.HasValue) { ComponentMiner.Inventory.ActiveSlotIndex = MathUtils.Clamp(playerInput.SelectInventorySlot.Value, 0, 5); } } if (m_subsystemTime.PeriodicGameTimeEvent(0.5, 0)) { ReadOnlyList <int> readOnlyList = ComponentClothing.GetClothes(ClothingSlot.Head); if ((readOnlyList.Count > 0 && ClothingBlock.GetClothingData(readOnlyList[readOnlyList.Count - 1]).DisplayName == Utils.Get("DZˮͷ¿ø")) || (ComponentBody.ImmersionFluidBlock != null && ComponentBody.ImmersionFluidBlock.BlockIndex == RottenMeatBlock.Index)) { //if (ComponentBody.ImmersionDepth > 0.8f) //ComponentScreenOverlays.BlackoutFactor = 1f; ComponentHealth.Air = 1f; } } ComponentMount mount = ComponentRider.Mount; if (mount != null) { var componentSteedBehavior = mount.Entity.FindComponent <ComponentSteedBehavior>(); if (componentSteedBehavior != null) { if (playerInput.Move.Z > 0.5f && !m_speedOrderBlocked) { if (PlayerData.PlayerClass == PlayerClass.Male) { m_subsystemAudio.PlayRandomSound("Audio/Creatures/MaleYellFast", 0.75f, 0f, ComponentBody.Position, 2f, false); } else { m_subsystemAudio.PlayRandomSound("Audio/Creatures/FemaleYellFast", 0.75f, 0f, ComponentBody.Position, 2f, false); } componentSteedBehavior.SpeedOrder = 1; m_speedOrderBlocked = true; } else if (playerInput.Move.Z < -0.5f && !m_speedOrderBlocked) { if (PlayerData.PlayerClass == PlayerClass.Male) { m_subsystemAudio.PlayRandomSound("Audio/Creatures/MaleYellSlow", 0.75f, 0f, ComponentBody.Position, 2f, false); } else { m_subsystemAudio.PlayRandomSound("Audio/Creatures/FemaleYellSlow", 0.75f, 0f, ComponentBody.Position, 2f, false); } componentSteedBehavior.SpeedOrder = -1; m_speedOrderBlocked = true; } else if (MathUtils.Abs(playerInput.Move.Z) <= 0.25f) { m_speedOrderBlocked = false; } componentSteedBehavior.TurnOrder = playerInput.Move.X; componentSteedBehavior.JumpOrder = playerInput.Jump ? 1 : 0; ComponentLocomotion.LookOrder = new Vector2(playerInput.Look.X, 0f); } else { var componentBoat = mount.Entity.FindComponent <ComponentBoat>(); if (componentBoat != null || mount.Entity.FindComponent <ComponentBoatI>() != null) { if (componentBoat != null) { componentBoat.TurnOrder = playerInput.Move.X; componentBoat.MoveOrder = playerInput.Move.Z; ComponentLocomotion.LookOrder = new Vector2(playerInput.Look.X, 0f); } else { ComponentLocomotion.LookOrder = playerInput.Look; } ComponentCreatureModel.RowLeftOrder = playerInput.Move.X <-0.2f || playerInput.Move.Z> 0.2f; ComponentCreatureModel.RowRightOrder = playerInput.Move.X > 0.2f || playerInput.Move.Z > 0.2f; } var c = mount.Entity.FindComponent <ComponentLocomotion>(); if (c != null) { c.WalkOrder = playerInput.Move.XZ; c.FlyOrder = new Vector3(0f, playerInput.Move.Y, 0f); c.TurnOrder = playerInput.Look * new Vector2(1f, 0f); c.JumpOrder = playerInput.Jump ? 1 : 0; c.LookOrder = playerInput.Look; if (playerInput.ToggleCreativeFly) { c.IsCreativeFlyEnabled = !c.IsCreativeFlyEnabled; } } } } else { ComponentLocomotion.WalkOrder = (ComponentLocomotion.WalkOrder ?? Vector2.Zero) + (ComponentBody.IsSneaking ? (0.66f * new Vector2(playerInput.SneakMove.X, playerInput.SneakMove.Z)) : new Vector2(playerInput.Move.X, playerInput.Move.Z)); ComponentLocomotion.FlyOrder = new Vector3(0f, playerInput.Move.Y, 0f); ComponentLocomotion.TurnOrder = playerInput.Look * new Vector2(1f, 0f); ComponentLocomotion.JumpOrder = MathUtils.Max(playerInput.Jump ? 1 : 0, ComponentLocomotion.JumpOrder); } ComponentLocomotion.LookOrder += playerInput.Look * (SettingsManager.FlipVerticalAxis ? new Vector2(0f, -1f) : new Vector2(0f, 1f)); int num = Terrain.ExtractContents(ComponentMiner.ActiveBlockValue); Block block = BlocksManager.Blocks[num]; bool flag = false; if (playerInput.Interact.HasValue && !flag && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { Vector3 viewPosition = View.ActiveCamera.ViewPosition; var direction = Vector3.Normalize(View.ActiveCamera.ScreenToWorld(new Vector3(playerInput.Interact.Value, 1f), Matrix.Identity) - viewPosition); if (!ComponentMiner.Use(viewPosition, direction)) { var body = ComponentMiner.PickBody(viewPosition, direction); var result = ComponentMiner.PickTerrainForInteraction(viewPosition, direction); if (result.HasValue && (!body.HasValue || result.Value.Distance < body.Value.Distance)) { if (!ComponentMiner.Interact(result.Value)) { if (ComponentMiner.Place(result.Value)) { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } else { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } } else { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } float num2 = (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative || block.BlockIndex == Musket2Block.Index) ? 0.1f : 1.4f; Vector3 viewPosition2 = View.ActiveCamera.ViewPosition; if (playerInput.Aim.HasValue && block.IsAimable && m_subsystemTime.GameTime - m_lastActionTime > num2) { if (!m_isAimBlocked) { Vector2 value = playerInput.Aim.Value; Vector3 v = View.ActiveCamera.ScreenToWorld(new Vector3(value, 1f), Matrix.Identity); Point2 size = Window.Size; if (playerInput.Aim.Value.X >= size.X * 0.1f && playerInput.Aim.Value.X < size.X * 0.9f && playerInput.Aim.Value.Y >= size.Y * 0.1f && playerInput.Aim.Value.Y < size.Y * 0.9f) { m_aimDirection = Vector3.Normalize(v - viewPosition2); if (ComponentMiner.Aim(viewPosition2, m_aimDirection.Value, AimState.InProgress)) { ComponentMiner.Aim(viewPosition2, m_aimDirection.Value, AimState.Cancelled); m_aimDirection = null; m_isAimBlocked = true; } } else if (m_aimDirection.HasValue) { ComponentMiner.Aim(viewPosition2, m_aimDirection.Value, AimState.Cancelled); m_aimDirection = null; m_isAimBlocked = true; } } } else { m_isAimBlocked = false; if (m_aimDirection.HasValue) { ComponentMiner.Aim(viewPosition2, m_aimDirection.Value, AimState.Completed); m_aimDirection = null; m_lastActionTime = m_subsystemTime.GameTime; } } flag |= m_aimDirection.HasValue; if (playerInput.Hit.HasValue && !flag && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { Vector3 viewPosition3 = View.ActiveCamera.ViewPosition; var vector = Vector3.Normalize(View.ActiveCamera.ScreenToWorld(new Vector3(playerInput.Hit.Value, 1f), Matrix.Identity) - viewPosition3); TerrainRaycastResult?nullable3 = ComponentMiner.PickTerrainForInteraction(viewPosition3, vector); BodyRaycastResult? nullable4 = ComponentMiner.PickBody(viewPosition3, vector); if (nullable4.HasValue && (!nullable3.HasValue || nullable3.Value.Distance > nullable4.Value.Distance)) { if (ComponentMiner.ActiveBlockValue == 0) { Widget widget = ComponentNGui.OpenEntity(ComponentMiner.Inventory, nullable4.Value.ComponentBody.Entity); if (widget != null) { ComponentGui.ModalPanelWidget = widget; AudioManager.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f); return; } } flag = true; m_isDigBlocked = true; if (Vector3.Distance(viewPosition3 + vector * nullable4.Value.Distance, ComponentCreatureModel.EyePosition) <= 2f) { ComponentMiner.Hit(nullable4.Value.ComponentBody, vector); } } } if (playerInput.Dig.HasValue && !flag && !m_isDigBlocked && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { Vector3 viewPosition4 = View.ActiveCamera.ViewPosition; Vector3 v2 = View.ActiveCamera.ScreenToWorld(new Vector3(playerInput.Dig.Value, 1f), Matrix.Identity); TerrainRaycastResult?nullable5 = ComponentMiner.PickTerrainForDigging(viewPosition4, v2 - viewPosition4); if (nullable5.HasValue && ComponentMiner.Dig(nullable5.Value)) { m_lastActionTime = m_subsystemTime.GameTime; m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); } } if (!playerInput.Dig.HasValue) { m_isDigBlocked = false; } if (playerInput.Drop && ComponentMiner.Inventory != null) { IInventory inventory = ComponentMiner.Inventory; int slotValue = inventory.GetSlotValue(inventory.ActiveSlotIndex); int num3 = inventory.RemoveSlotItems(count: inventory.GetSlotCount(inventory.ActiveSlotIndex), slotIndex: inventory.ActiveSlotIndex); if (slotValue != 0 && num3 != 0) { Vector3 v3 = ComponentBody.Position + new Vector3(0f, ComponentBody.BoxSize.Y * 0.66f, 0f); Matrix matrix = ComponentBody.Matrix; Vector3 position = v3 + 0.25f * matrix.Forward; matrix = Matrix.CreateFromQuaternion(ComponentCreatureModel.EyeRotation); Vector3 value2 = 8f * matrix.Forward; m_subsystemPickables.AddPickable(slotValue, num3, position, value2, null); } } if (playerInput.PickBlockType.HasValue && !flag) { if (ComponentMiner.Inventory is ComponentCreativeInventory componentCreativeInventory) { Vector3 viewPosition5 = View.ActiveCamera.ViewPosition; Vector3 v4 = View.ActiveCamera.ScreenToWorld(new Vector3(playerInput.PickBlockType.Value, 1f), Matrix.Identity); TerrainRaycastResult?nullable6 = ComponentMiner.PickTerrainForDigging(viewPosition5, v4 - viewPosition5); if (nullable6.HasValue) { int value3 = nullable6.Value.Value; value3 = Terrain.ReplaceLight(value3, 0); int num4 = Terrain.ExtractContents(value3); Block block2 = BlocksManager.Blocks[num4]; int num5 = 0; var creativeValues = block2.GetCreativeValues(); if (block2.GetCreativeValues().Contains(value3)) { num5 = value3; } if (num5 == 0 && !block2.IsNonDuplicable) { var list = new List <BlockDropValue>(); bool _; block2.GetDropValues(m_subsystemTerrain, value3, 0, 2147483647, list, out _); if (list.Count > 0 && list[0].Count > 0) { num5 = list[0].Value; } } if (num5 == 0) { num5 = creativeValues.FirstOrDefault(); } if (num5 != 0) { int num6 = -1; for (int i = 0; i < 6; i++) { if (componentCreativeInventory.GetSlotCount(i) > 0 && componentCreativeInventory.GetSlotValue(i) == num5) { num6 = i; break; } } if (num6 < 0) { for (int j = 0; j < 6; j++) { if (componentCreativeInventory.GetSlotCount(j) == 0 || componentCreativeInventory.GetSlotValue(j) == 0) { num6 = j; break; } } } if (num6 < 0) { num6 = componentCreativeInventory.ActiveSlotIndex; } componentCreativeInventory.RemoveSlotItems(num6, 2147483647); componentCreativeInventory.AddSlotItems(num6, num5, 1); componentCreativeInventory.ActiveSlotIndex = num6; ComponentGui.DisplaySmallMessage(block2.GetDisplayName(m_subsystemTerrain, value3), false, false); m_subsystemAudio.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f, 0f); } } } } HighlightRaycastResult = ComponentMiner.PickTerrainForDigging(View.ActiveCamera.ViewPosition, View.ActiveCamera.ViewDirection); }
public void Update(float dt) { PlayerInput playerInput = ComponentInput.PlayerInput; if (ComponentInput.IsControlledByTouch && m_aim.HasValue) { playerInput.Look = Vector2.Zero; } if (ComponentMiner.Inventory != null) { ComponentMiner.Inventory.ActiveSlotIndex += playerInput.ScrollInventory; if (playerInput.SelectInventorySlot.HasValue) { ComponentMiner.Inventory.ActiveSlotIndex = MathUtils.Clamp(playerInput.SelectInventorySlot.Value, 0, 9); } } ComponentSteedBehavior componentSteedBehavior = null; ComponentBoat componentBoat = null; ComponentMount mount = ComponentRider.Mount; if (mount != null) { componentSteedBehavior = mount.Entity.FindComponent <ComponentSteedBehavior>(); componentBoat = mount.Entity.FindComponent <ComponentBoat>(); } if (componentSteedBehavior != null) { if (playerInput.Move.Z > 0.5f && !m_speedOrderBlocked) { if (PlayerData.PlayerClass == PlayerClass.Male) { m_subsystemAudio.PlayRandomSound("Audio/Creatures/MaleYellFast", 0.75f, 0f, base.ComponentBody.Position, 2f, autoDelay: false); } else { m_subsystemAudio.PlayRandomSound("Audio/Creatures/FemaleYellFast", 0.75f, 0f, base.ComponentBody.Position, 2f, autoDelay: false); } componentSteedBehavior.SpeedOrder = 1; m_speedOrderBlocked = true; } else if (playerInput.Move.Z < -0.5f && !m_speedOrderBlocked) { if (PlayerData.PlayerClass == PlayerClass.Male) { m_subsystemAudio.PlayRandomSound("Audio/Creatures/MaleYellSlow", 0.75f, 0f, base.ComponentBody.Position, 2f, autoDelay: false); } else { m_subsystemAudio.PlayRandomSound("Audio/Creatures/FemaleYellSlow", 0.75f, 0f, base.ComponentBody.Position, 2f, autoDelay: false); } componentSteedBehavior.SpeedOrder = -1; m_speedOrderBlocked = true; } else if (MathUtils.Abs(playerInput.Move.Z) <= 0.25f) { m_speedOrderBlocked = false; } componentSteedBehavior.TurnOrder = playerInput.Move.X; componentSteedBehavior.JumpOrder = (playerInput.Jump ? 1 : 0); base.ComponentLocomotion.LookOrder = new Vector2(playerInput.Look.X, 0f); } else if (componentBoat != null) { componentBoat.TurnOrder = playerInput.Move.X; componentBoat.MoveOrder = playerInput.Move.Z; base.ComponentLocomotion.LookOrder = new Vector2(playerInput.Look.X, 0f); base.ComponentCreatureModel.RowLeftOrder = (playerInput.Move.X <-0.2f || playerInput.Move.Z> 0.2f); base.ComponentCreatureModel.RowRightOrder = (playerInput.Move.X > 0.2f || playerInput.Move.Z > 0.2f); } else { base.ComponentLocomotion.WalkOrder = (base.ComponentBody.IsSneaking ? (0.66f * new Vector2(playerInput.SneakMove.X, playerInput.SneakMove.Z)) : new Vector2(playerInput.Move.X, playerInput.Move.Z)); base.ComponentLocomotion.FlyOrder = new Vector3(0f, playerInput.Move.Y, 0f); base.ComponentLocomotion.TurnOrder = playerInput.Look * new Vector2(1f, 0f); base.ComponentLocomotion.JumpOrder = MathUtils.Max(playerInput.Jump ? 1 : 0, base.ComponentLocomotion.JumpOrder); } base.ComponentLocomotion.LookOrder += playerInput.Look * (SettingsManager.FlipVerticalAxis ? new Vector2(0f, -1f) : new Vector2(0f, 1f)); base.ComponentLocomotion.VrLookOrder = playerInput.VrLook; base.ComponentLocomotion.VrMoveOrder = playerInput.VrMove; int num = Terrain.ExtractContents(ComponentMiner.ActiveBlockValue); Block block = BlocksManager.Blocks[num]; bool flag = false; if (playerInput.Interact.HasValue && !flag && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { if (!ComponentMiner.Use(playerInput.Interact.Value)) { TerrainRaycastResult?terrainRaycastResult = ComponentMiner.Raycast <TerrainRaycastResult>(playerInput.Interact.Value, RaycastMode.Interaction); if (terrainRaycastResult.HasValue) { if (!ComponentMiner.Interact(terrainRaycastResult.Value)) { if (ComponentMiner.Place(terrainRaycastResult.Value)) { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } else { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } } else { m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); flag = true; m_isAimBlocked = true; } } float num2 = (m_subsystemGameInfo.WorldSettings.GameMode == GameMode.Creative) ? 0.1f : 1.4f; if (playerInput.Aim.HasValue && block.IsAimable && m_subsystemTime.GameTime - m_lastActionTime > (double)num2) { if (!m_isAimBlocked) { Ray3 value = playerInput.Aim.Value; Vector3 vector = GameWidget.ActiveCamera.WorldToScreen(value.Position + value.Direction, Matrix.Identity); Point2 size = Window.Size; if (ComponentInput.IsControlledByVr || (vector.X >= (float)size.X * 0.02f && vector.X < (float)size.X * 0.98f && vector.Y >= (float)size.Y * 0.02f && vector.Y < (float)size.Y * 0.98f)) { m_aim = value; if (ComponentMiner.Aim(value, AimState.InProgress)) { ComponentMiner.Aim(m_aim.Value, AimState.Cancelled); m_aim = null; m_isAimBlocked = true; } else if (!m_aimHintIssued && Time.PeriodicEvent(1.0, 0.0)) { Time.QueueTimeDelayedExecution(Time.RealTime + 3.0, delegate { if (!m_aimHintIssued && m_aim.HasValue && !base.ComponentBody.IsSneaking) { m_aimHintIssued = true; ComponentGui.DisplaySmallMessage(LanguageControl.Get(fName, 1), Color.White, blinking: true, playNotificationSound: true); } }); } } else if (m_aim.HasValue) { ComponentMiner.Aim(m_aim.Value, AimState.Cancelled); m_aim = null; m_isAimBlocked = true; } } } else { m_isAimBlocked = false; if (m_aim.HasValue) { ComponentMiner.Aim(m_aim.Value, AimState.Completed); m_aim = null; m_lastActionTime = m_subsystemTime.GameTime; } } flag |= m_aim.HasValue; if (playerInput.Hit.HasValue && !flag && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { BodyRaycastResult?bodyRaycastResult = ComponentMiner.Raycast <BodyRaycastResult>(playerInput.Hit.Value, RaycastMode.Interaction); if (bodyRaycastResult.HasValue) { flag = true; m_isDigBlocked = true; if (Vector3.Distance(bodyRaycastResult.Value.HitPoint(), base.ComponentCreatureModel.EyePosition) <= 2f) { ComponentMiner.Hit(bodyRaycastResult.Value.ComponentBody, bodyRaycastResult.Value.HitPoint(), playerInput.Hit.Value.Direction); } } } if (playerInput.Dig.HasValue && !flag && !m_isDigBlocked && m_subsystemTime.GameTime - m_lastActionTime > 0.33000001311302185) { TerrainRaycastResult?terrainRaycastResult2 = ComponentMiner.Raycast <TerrainRaycastResult>(playerInput.Dig.Value, RaycastMode.Digging); if (terrainRaycastResult2.HasValue && ComponentMiner.Dig(terrainRaycastResult2.Value)) { m_lastActionTime = m_subsystemTime.GameTime; m_subsystemTerrain.TerrainUpdater.RequestSynchronousUpdate(); } } if (!playerInput.Dig.HasValue) { m_isDigBlocked = false; } if (playerInput.Drop && ComponentMiner.Inventory != null) { IInventory inventory = ComponentMiner.Inventory; int slotValue = inventory.GetSlotValue(inventory.ActiveSlotIndex); int num3 = inventory.RemoveSlotItems(count: inventory.GetSlotCount(inventory.ActiveSlotIndex), slotIndex: inventory.ActiveSlotIndex); if (slotValue != 0 && num3 != 0) { Vector3 position = base.ComponentBody.Position + new Vector3(0f, base.ComponentBody.BoxSize.Y * 0.66f, 0f) + 0.25f * base.ComponentBody.Matrix.Forward; Vector3 value2 = 8f * Matrix.CreateFromQuaternion(base.ComponentCreatureModel.EyeRotation).Forward; m_subsystemPickables.AddPickable(slotValue, num3, position, value2, null); } } if (!playerInput.PickBlockType.HasValue || flag) { return; } ComponentCreativeInventory componentCreativeInventory = ComponentMiner.Inventory as ComponentCreativeInventory; if (componentCreativeInventory == null) { return; } TerrainRaycastResult?terrainRaycastResult3 = ComponentMiner.Raycast <TerrainRaycastResult>(playerInput.PickBlockType.Value, RaycastMode.Digging, raycastTerrain: true, raycastBodies: false, raycastMovingBlocks: false); if (!terrainRaycastResult3.HasValue) { return; } int value3 = terrainRaycastResult3.Value.Value; value3 = Terrain.ReplaceLight(value3, 0); int num4 = Terrain.ExtractContents(value3); Block block2 = BlocksManager.Blocks[num4]; int num5 = 0; IEnumerable <int> creativeValues = block2.GetCreativeValues(); if (block2.GetCreativeValues().Contains(value3)) { num5 = value3; } if (num5 == 0 && !block2.IsNonDuplicable) { List <BlockDropValue> list = new List <BlockDropValue>(); block2.GetDropValues(m_subsystemTerrain, value3, 0, int.MaxValue, list, out bool _); if (list.Count > 0 && list[0].Count > 0) { num5 = list[0].Value; } } if (num5 == 0) { num5 = creativeValues.FirstOrDefault(); } if (num5 == 0) { return; } int num6 = -1; for (int i = 0; i < 10; i++) { if (componentCreativeInventory.GetSlotCapacity(i, num5) > 0 && componentCreativeInventory.GetSlotCount(i) > 0 && componentCreativeInventory.GetSlotValue(i) == num5) { num6 = i; break; } } if (num6 < 0) { for (int j = 0; j < 10; j++) { if (componentCreativeInventory.GetSlotCapacity(j, num5) > 0 && (componentCreativeInventory.GetSlotCount(j) == 0 || componentCreativeInventory.GetSlotValue(j) == 0)) { num6 = j; break; } } } if (num6 < 0) { num6 = componentCreativeInventory.ActiveSlotIndex; } componentCreativeInventory.RemoveSlotItems(num6, int.MaxValue); componentCreativeInventory.AddSlotItems(num6, num5, 1); componentCreativeInventory.ActiveSlotIndex = num6; ComponentGui.DisplaySmallMessage(block2.GetDisplayName(m_subsystemTerrain, value3), Color.White, blinking: false, playNotificationSound: false); m_subsystemAudio.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f, 0f); }
public static void moveInventoryByCraft(IInventory srcInventory, IInventory toInventory, Dictionary <int, int> items, ComponentGui gui) { //items格式 id 数量 Dictionary <int, int> fromList = new Dictionary <int, int>(); Dictionary <int, int> toList = new Dictionary <int, int>(); for (int i = 0; i < srcInventory.SlotsCount; i++) { if (srcInventory.GetSlotCount(i) != 0) { if (fromList.ContainsKey(srcInventory.GetSlotValue(i))) { fromList[srcInventory.GetSlotValue(i)] = srcInventory.GetSlotCount(i) + fromList[srcInventory.GetSlotValue(i)]; } else { fromList.Add(srcInventory.GetSlotValue(i), srcInventory.GetSlotCount(i)); } } } for (int i = 0; i < toInventory.SlotsCount; i++) { if (srcInventory.GetSlotCount(i) != 0) { if (toList.ContainsKey(toInventory.GetSlotValue(i))) { toList[srcInventory.GetSlotValue(i)] = toInventory.GetSlotCount(i) + toList[toInventory.GetSlotValue(i)]; } else { toList.Add(toInventory.GetSlotValue(i), toInventory.GetSlotCount(i)); } } } int useSlotCount = 0; int ja = 0; int allcnt; //判断能否全部转移 foreach (int id in fromList.Keys) {//id,cnt if (toList.ContainsKey(id)) { allcnt = toList[id] + fromList[id]; useSlotCount += (int)Math.Ceiling((double)allcnt / (double)toInventory.GetSlotCapacity(ja, id)); } else { allcnt = fromList[id]; useSlotCount += (int)Math.Ceiling((double)allcnt / (double)toInventory.GetSlotCapacity(ja, id)); } ++ja; } if (useSlotCount > toInventory.SlotsCount) { //不能全部转移 gui.DisplaySmallMessage("背包空间不足,不能转移物品", Color.Red, false, false); } else { //能全部转移 //先移除全部 for (int i = 0; i < srcInventory.SlotsCount; i++) { if (srcInventory.GetSlotCount(i) == 0) { continue; } srcInventory.RemoveSlotItems(i, srcInventory.GetSlotCount(i)); } for (int i = 0; i < toInventory.SlotsCount; i++) { if (toInventory.GetSlotCount(i) == 0) { continue; } toInventory.RemoveSlotItems(i, toInventory.GetSlotCount(i)); } int uu = 0; for (int i = 0; i < toInventory.SlotsCount; i++) { for (int j = 0; j < (int)Math.Ceiling((double)toList[toList.Keys.ToArray()[i]] / (double)toInventory.GetSlotCapacity(ja, toList.Keys.ToArray()[i])); j++)//计算转移次数 { int cap = toInventory.GetSlotCapacity(uu, toList.Keys.ToArray()[i]); if (toList.Values.ToArray()[i] - cap < 0) { cap = toList.Values.ToArray()[i]; } else { toList[toList.Keys.ToArray()[i]] = toList[toList.Keys.ToArray()[i]] - cap; } toInventory.AddSlotItems(uu, toList.Keys.ToArray()[i], cap); } ++uu; } gui.DisplaySmallMessage("转移成功!", Color.Red, false, false); } }