public override void OnHitByProjectile(CellFace cellFace, WorldItem worldItem) { if (worldItem.ToRemove) { return; } ComponentBlockEntity blockEntity = m_subsystemBlockEntities.GetBlockEntity(cellFace.X, cellFace.Y, cellFace.Z); if (blockEntity != null) { ComponentChest inventory = blockEntity.Entity.FindComponent <ComponentChest>(throwOnError: true); Pickable pickable = worldItem as Pickable; int num = pickable?.Count ?? 1; int num2 = ComponentInventoryBase.AcquireItems(inventory, worldItem.Value, num); if (num2 < num) { m_subsystemAudio.PlaySound("Audio/PickableCollected", 1f, 0f, worldItem.Position, 3f, autoDelay: true); } if (num2 <= 0) { worldItem.ToRemove = true; } else if (pickable != null) { pickable.Count = num2; } } }
public static void OnHitByProjectile(CellFace cellFace, WorldItem worldItem) { if (worldItem.ToRemove) { return; } var blockEntity = GetBlockEntity(cellFace.Point); if (blockEntity == null) { return; } var inventory = blockEntity.Entity.FindComponent <ComponentInventoryBase>(true); var pickable = worldItem as Pickable; int count = (pickable == null) ? 1 : pickable.Count; int value = worldItem.Value; int max = ComponentInventoryBase.AcquireItems(inventory, value, count); if (max < count) { SubsystemAudio.PlaySound("Audio/PickableCollected", 1f, 0f, worldItem.Position, 3f, true); } if (max <= 0) { worldItem.ToRemove = true; } else if (pickable != null) { pickable.Count = max; } }
public NewChestWidget(IInventory inventory, ComponentInventoryBase component, string text = null) { Component = component; WidgetsManager.LoadWidgetContents(this, this, ContentManager.Get <XElement>("Widgets/NewChestWidget")); if (text != null) { Children.Find <LabelWidget>("ChestLabel").Text = text; } m_inventoryGrid = Children.Find <GridPanelWidget>("InventoryGrid"); m_chestNewGrid = Children.Find <GridPanelWidget>("ChestGrid"); int num = 0, y, x; InventorySlotWidget inventorySlotWidget; for (y = 0; y < m_chestNewGrid.RowsCount; y++) { for (x = 0; x < m_chestNewGrid.ColumnsCount; x++) { inventorySlotWidget = new InventorySlotWidget(); inventorySlotWidget.AssignInventorySlot(component, num++); m_chestNewGrid.Children.Add(inventorySlotWidget); m_chestNewGrid.SetWidgetCell(inventorySlotWidget, new Point2(x, y)); } } num = 6; for (y = 0; y < m_inventoryGrid.RowsCount; y++) { for (x = 0; x < m_inventoryGrid.ColumnsCount; x++) { inventorySlotWidget = new InventorySlotWidget(); inventorySlotWidget.AssignInventorySlot(inventory, num++); m_inventoryGrid.Children.Add(inventorySlotWidget); m_inventoryGrid.SetWidgetCell(inventorySlotWidget, new Point2(x, y)); } } }
public LiquidPumpWidget(IInventory inventory, ComponentInventoryBase componentDispenser) { m_componentDispenser = componentDispenser; m_componentBlockEntity = componentDispenser.Entity.FindComponent <ComponentBlockEntity>(true); m_subsystemTerrain = componentDispenser.Project.FindSubsystem <SubsystemTerrain>(true); WidgetsManager.LoadWidgetContents(this, this, ContentManager.Get <XElement>("Widgets/LiquidPumpWidget")); m_inventoryGrid = Children.Find <GridPanelWidget>("InventoryGrid"); m_dispenserGrid = Children.Find <GridPanelWidget>("DispenserGrid"); m_dispenserGrid2 = Children.Find <GridPanelWidget>("DispenserGrid2"); m_drillSlot = Children.Find <InventorySlotWidget>("DrillSlot"); int num = 0, y, x; for (y = 0; y < m_dispenserGrid.RowsCount; y++) { for (x = 0; x < m_dispenserGrid.ColumnsCount; x++) { var inventorySlotWidget = new InventorySlotWidget(); inventorySlotWidget.AssignInventorySlot(componentDispenser, num++); m_dispenserGrid.Children.Add(inventorySlotWidget); m_dispenserGrid.SetWidgetCell(inventorySlotWidget, new Point2(x, y)); } } for (y = 0; y < m_dispenserGrid2.RowsCount; y++) { for (x = 0; x < m_dispenserGrid2.ColumnsCount; x++) { var inventorySlotWidget2 = new InventorySlotWidget(); inventorySlotWidget2.AssignInventorySlot(componentDispenser, num++); m_dispenserGrid2.Children.Add(inventorySlotWidget2); m_dispenserGrid2.SetWidgetCell(inventorySlotWidget2, new Point2(x, y)); } } num = 6; for (y = 0; y < m_inventoryGrid.RowsCount; y++) { for (x = 0; x < m_inventoryGrid.ColumnsCount; x++) { var inventorySlotWidget3 = new InventorySlotWidget(); inventorySlotWidget3.AssignInventorySlot(inventory, num++); m_inventoryGrid.Children.Add(inventorySlotWidget3); m_inventoryGrid.SetWidgetCell(inventorySlotWidget3, new Point2(x, y)); } } m_drillSlot.AssignInventorySlot(componentDispenser, 8); }
public static void SaveItems(this ComponentInventoryBase inventory, ValuesDictionary valuesDictionary) { var sb = new StringBuilder(); for (int i = 0; i < inventory.m_slots.Count; i++) { var slot = inventory.m_slots[i]; if (slot.Count > 0) { sb.Append(slot.Value); if (slot.Count > 1) { sb.Append('*').Append(slot.Count); } } sb.Append(';'); } valuesDictionary.SetValue("Contents", sb.ToString(0, sb.Length - 1)); }
public static void LoadItems(this ComponentInventoryBase inventory, ValuesDictionary valuesDictionary) { string s = valuesDictionary.GetValue <string>("Contents", null); int i, count; ComponentInventoryBase.Slot slot; if (s != null) { var arr = s.Split(';'); count = arr.Length; for (i = 0; i < count; i++) { slot = new ComponentInventoryBase.Slot(); inventory.m_slots.Add(slot); s = arr[i]; if (s.Length > 0) { int x = s.IndexOf('*'); slot.Value = int.Parse(x > 0 ? s.Substring(0, x) : s); slot.Count = x > 0 ? int.Parse(s.Substring(x + 1)) : 1; } } return; } count = valuesDictionary.GetValue <int>("SlotsCount"); inventory.m_slots.Capacity = count; ValuesDictionary value2 = valuesDictionary.GetValue <ValuesDictionary>("Slots"); for (i = 0; i < count; i++) { slot = new ComponentInventoryBase.Slot(); inventory.m_slots.Add(slot); ValuesDictionary value3 = value2.GetValue <ValuesDictionary>("Slot" + i.ToString(CultureInfo.InvariantCulture), null); if (value3 != null) { slot.Value = value3.GetValue <int>("Contents"); slot.Count = value3.GetValue <int>("Count"); } } }
public DrillerWidget(IInventory inventory, ComponentInventoryBase componentDispenser) { m_componentDispenser = componentDispenser; m_componentBlockEntity = componentDispenser.Entity.FindComponent <ComponentBlockEntity>(true); m_subsystemTerrain = componentDispenser.Project.FindSubsystem <SubsystemTerrain>(true); WidgetsManager.LoadWidgetContents(this, this, ContentManager.Get <XElement>("Widgets/DrillerWidget")); m_inventoryGrid = Children.Find <GridPanelWidget>("InventoryGrid"); m_dispenserGrid = Children.Find <GridPanelWidget>("DispenserGrid"); m_dispenseButton = Children.Find <ButtonWidget>("DispenseButton"); m_shootButton = Children.Find <ButtonWidget>("ShootButton"); m_acceptsDropsBox = Children.Find <CheckboxWidget>("AcceptsDropsBox"); m_drillSlot = Children.Find <InventorySlotWidget>("DrillSlot"); int num = 6, y, x; InventorySlotWidget inventorySlotWidget; for (y = 0; y < m_inventoryGrid.RowsCount; y++) { for (x = 0; x < m_inventoryGrid.ColumnsCount; x++) { inventorySlotWidget = new InventorySlotWidget(); inventorySlotWidget.AssignInventorySlot(inventory, num++); m_inventoryGrid.Children.Add(inventorySlotWidget); m_inventoryGrid.SetWidgetCell(inventorySlotWidget, new Point2(x, y)); } } num = 0; for (y = 0; y < m_dispenserGrid.RowsCount; y++) { for (x = 0; x < m_dispenserGrid.ColumnsCount; x++) { inventorySlotWidget = new InventorySlotWidget(); inventorySlotWidget.AssignInventorySlot(componentDispenser, num++); m_dispenserGrid.Children.Add(inventorySlotWidget); m_dispenserGrid.SetWidgetCell(inventorySlotWidget, new Point2(x, y)); } } m_drillSlot.AssignInventorySlot(componentDispenser, 8); }
public void Update(float dt) { double totalElapsedGameTime = m_subsystemGameInfo.TotalElapsedGameTime; float num = MathUtils.Pow(0.5f, dt); float num2 = MathUtils.Pow(0.001f, dt); m_tmpPlayers.Clear(); foreach (ComponentPlayer componentPlayer in m_subsystemPlayers.ComponentPlayers) { if (componentPlayer.ComponentHealth.Health > 0f) { m_tmpPlayers.Add(componentPlayer); } } foreach (Pickable pickable in m_pickables) { if (pickable.ToRemove) { m_pickablesToRemove.Add(pickable); } else { Block block = BlocksManager.Blocks[Terrain.ExtractContents(pickable.Value)]; int num3 = m_pickables.Count - m_pickablesToRemove.Count; float num4 = MathUtils.Lerp(300f, 90f, MathUtils.Saturate((float)num3 / 60f)); double num5 = totalElapsedGameTime - pickable.CreationTime; if (num5 > (double)num4) { pickable.ToRemove = true; } else { TerrainChunk chunkAtCell = m_subsystemTerrain.Terrain.GetChunkAtCell(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Z)); if (chunkAtCell != null && chunkAtCell.State > TerrainChunkState.InvalidContents4) { Vector3 position = pickable.Position; Vector3 vector = position + pickable.Velocity * dt; if (!pickable.FlyToPosition.HasValue && num5 > 0.5) { foreach (ComponentPlayer tmpPlayer in m_tmpPlayers) { ComponentBody componentBody = tmpPlayer.ComponentBody; Vector3 v = componentBody.Position + new Vector3(0f, 0.75f, 0f); float num6 = (v - pickable.Position).LengthSquared(); if (num6 < 3.0625f) { bool flag = Terrain.ExtractContents(pickable.Value) == 248; IInventory inventory = tmpPlayer.ComponentMiner.Inventory; if (flag || ComponentInventoryBase.FindAcquireSlotForItem(inventory, pickable.Value) >= 0) { if (num6 < 1f) { if (flag) { tmpPlayer.ComponentLevel.AddExperience(pickable.Count, playSound: true); pickable.ToRemove = true; } else { pickable.Count = ComponentInventoryBase.AcquireItems(inventory, pickable.Value, pickable.Count); if (pickable.Count == 0) { pickable.ToRemove = true; m_subsystemAudio.PlaySound("Audio/PickableCollected", 0.7f, -0.4f, pickable.Position, 2f, autoDelay: false); } } } else if (!pickable.StuckMatrix.HasValue) { pickable.FlyToPosition = v + 0.1f * MathUtils.Sqrt(num6) * componentBody.Velocity; } } } } } if (pickable.FlyToPosition.HasValue) { Vector3 v2 = pickable.FlyToPosition.Value - pickable.Position; float num7 = v2.LengthSquared(); if (num7 >= 0.25f) { pickable.Velocity = 6f * v2 / MathUtils.Sqrt(num7); } else { pickable.FlyToPosition = null; } } else { FluidBlock surfaceBlock; float? surfaceHeight; Vector2? vector2 = m_subsystemFluidBlockBehavior.CalculateFlowSpeed(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y + 0.1f), Terrain.ToCell(pickable.Position.Z), out surfaceBlock, out surfaceHeight); if (!pickable.StuckMatrix.HasValue) { TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(position, vector, useInteractionBoxes: false, skipAirBlocks: true, (int value, float distance) => BlocksManager.Blocks[Terrain.ExtractContents(value)].IsCollidable); if (terrainRaycastResult.HasValue) { int contents = Terrain.ExtractContents(m_subsystemTerrain.Terrain.GetCellValue(terrainRaycastResult.Value.CellFace.X, terrainRaycastResult.Value.CellFace.Y, terrainRaycastResult.Value.CellFace.Z)); SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(contents); for (int i = 0; i < blockBehaviors.Length; i++) { blockBehaviors[i].OnHitByProjectile(terrainRaycastResult.Value.CellFace, pickable); } if (m_subsystemTerrain.Raycast(position, position, useInteractionBoxes: false, skipAirBlocks: true, (int value2, float distance) => BlocksManager.Blocks[Terrain.ExtractContents(value2)].IsCollidable).HasValue) { int num8 = Terrain.ToCell(position.X); int num9 = Terrain.ToCell(position.Y); int num10 = Terrain.ToCell(position.Z); int num11 = 0; int num12 = 0; int num13 = 0; int?num14 = null; for (int j = -3; j <= 3; j++) { for (int k = -3; k <= 3; k++) { for (int l = -3; l <= 3; l++) { if (!BlocksManager.Blocks[m_subsystemTerrain.Terrain.GetCellContents(j + num8, k + num9, l + num10)].IsCollidable) { int num15 = j * j + k * k + l * l; if (!num14.HasValue || num15 < num14.Value) { num11 = j + num8; num12 = k + num9; num13 = l + num10; num14 = num15; } } } } } if (num14.HasValue) { pickable.FlyToPosition = new Vector3(num11, num12, num13) + new Vector3(0.5f); } else { pickable.ToRemove = true; } } else { Plane plane = terrainRaycastResult.Value.CellFace.CalculatePlane(); bool flag2 = vector2.HasValue && vector2.Value != Vector2.Zero; if (plane.Normal.X != 0f) { float num16 = (flag2 || MathUtils.Sqrt(MathUtils.Sqr(pickable.Velocity.Y) + MathUtils.Sqr(pickable.Velocity.Z)) > 10f) ? 0.95f : 0.25f; pickable.Velocity *= new Vector3(0f - num16, num16, num16); } if (plane.Normal.Y != 0f) { float num17 = (flag2 || MathUtils.Sqrt(MathUtils.Sqr(pickable.Velocity.X) + MathUtils.Sqr(pickable.Velocity.Z)) > 10f) ? 0.95f : 0.25f; pickable.Velocity *= new Vector3(num17, 0f - num17, num17); if (flag2) { pickable.Velocity.Y += 0.1f * plane.Normal.Y; } } if (plane.Normal.Z != 0f) { float num18 = (flag2 || MathUtils.Sqrt(MathUtils.Sqr(pickable.Velocity.X) + MathUtils.Sqr(pickable.Velocity.Y)) > 10f) ? 0.95f : 0.25f; pickable.Velocity *= new Vector3(num18, num18, 0f - num18); } vector = position; } } } else { Vector3 vector3 = pickable.StuckMatrix.Value.Translation + pickable.StuckMatrix.Value.Up * block.ProjectileTipOffset; if (!m_subsystemTerrain.Raycast(vector3, vector3, useInteractionBoxes: false, skipAirBlocks: true, (int value, float distance) => BlocksManager.Blocks[Terrain.ExtractContents(value)].IsCollidable).HasValue) { pickable.Position = pickable.StuckMatrix.Value.Translation; pickable.Velocity = Vector3.Zero; pickable.StuckMatrix = null; } } if (surfaceBlock is WaterBlock && !pickable.SplashGenerated) { m_subsystemParticles.AddParticleSystem(new WaterSplashParticleSystem(m_subsystemTerrain, pickable.Position, large: false)); m_subsystemAudio.PlayRandomSound("Audio/Splashes", 1f, m_random.Float(-0.2f, 0.2f), pickable.Position, 6f, autoDelay: true); pickable.SplashGenerated = true; } else if (surfaceBlock is MagmaBlock && !pickable.SplashGenerated) { m_subsystemParticles.AddParticleSystem(new MagmaSplashParticleSystem(m_subsystemTerrain, pickable.Position, large: false)); m_subsystemAudio.PlayRandomSound("Audio/Sizzles", 1f, m_random.Float(-0.2f, 0.2f), pickable.Position, 3f, autoDelay: true); pickable.ToRemove = true; pickable.SplashGenerated = true; m_subsystemExplosions.TryExplodeBlock(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y), Terrain.ToCell(pickable.Position.Z), pickable.Value); } else if (surfaceBlock == null) { pickable.SplashGenerated = false; } if (m_subsystemTime.PeriodicGameTimeEvent(1.0, (double)(pickable.GetHashCode() % 100) / 100.0) && (m_subsystemTerrain.Terrain.GetCellContents(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y + 0.1f), Terrain.ToCell(pickable.Position.Z)) == 104 || m_subsystemFireBlockBehavior.IsCellOnFire(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y + 0.1f), Terrain.ToCell(pickable.Position.Z)))) { m_subsystemAudio.PlayRandomSound("Audio/Sizzles", 1f, m_random.Float(-0.2f, 0.2f), pickable.Position, 3f, autoDelay: true); pickable.ToRemove = true; m_subsystemExplosions.TryExplodeBlock(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y), Terrain.ToCell(pickable.Position.Z), pickable.Value); } if (!pickable.StuckMatrix.HasValue) { if (vector2.HasValue && surfaceHeight.HasValue) { float num19 = surfaceHeight.Value - pickable.Position.Y; float num20 = MathUtils.Saturate(3f * num19); pickable.Velocity.X += 4f * dt * (vector2.Value.X - pickable.Velocity.X); pickable.Velocity.Y -= 10f * dt; pickable.Velocity.Y += 10f * (1f / block.Density * num20) * dt; pickable.Velocity.Z += 4f * dt * (vector2.Value.Y - pickable.Velocity.Z); pickable.Velocity.Y *= num2; } else { pickable.Velocity.Y -= 10f * dt; pickable.Velocity *= num; } } } pickable.Position = vector; } } } } foreach (Pickable item in m_pickablesToRemove) { m_pickables.Remove(item); if (this.PickableRemoved != null) { this.PickableRemoved(item); } } m_pickablesToRemove.Clear(); }
public override void Update() { if (m_inventory == null || DragHostWidget == null) { return; } WidgetInput input = base.Input; ComponentPlayer viewPlayer = GetViewPlayer(); int slotValue = m_inventory.GetSlotValue(m_slotIndex); int num = Terrain.ExtractContents(slotValue); Block block = BlocksManager.Blocks[num]; if (m_componentPlayer != null) { m_blockIconWidget.DrawBlockEnvironmentData.InWorldMatrix = m_componentPlayer.ComponentBody.Matrix; } if (m_focus && !input.Press.HasValue) { m_focus = false; } else if (input.Tap.HasValue && HitTestGlobal(input.Tap.Value) == this) { m_focus = true; } if (input.SpecialClick.HasValue && HitTestGlobal(input.SpecialClick.Value.Start) == this && HitTestGlobal(input.SpecialClick.Value.End) == this) { IInventory inventory = null; foreach (InventorySlotWidget item in ((ContainerWidget)base.RootWidget).AllChildren.OfType <InventorySlotWidget>()) { if (item.m_inventory != null && item.m_inventory != m_inventory && item.Input == base.Input && item.IsEnabledGlobal && item.IsVisibleGlobal) { inventory = item.m_inventory; break; } } if (inventory != null) { int num2 = ComponentInventoryBase.FindAcquireSlotForItem(inventory, slotValue); if (num2 >= 0) { HandleMoveItem(m_inventory, m_slotIndex, inventory, num2, m_inventory.GetSlotCount(m_slotIndex)); } } } if (input.Click.HasValue && HitTestGlobal(input.Click.Value.Start) == this && HitTestGlobal(input.Click.Value.End) == this) { bool flag = false; if (viewPlayer != null) { if (viewPlayer.ComponentInput.SplitSourceInventory == m_inventory && viewPlayer.ComponentInput.SplitSourceSlotIndex == m_slotIndex) { viewPlayer.ComponentInput.SetSplitSourceInventoryAndSlot(null, -1); flag = true; } else if (viewPlayer.ComponentInput.SplitSourceInventory != null) { flag = HandleMoveItem(viewPlayer.ComponentInput.SplitSourceInventory, viewPlayer.ComponentInput.SplitSourceSlotIndex, m_inventory, m_slotIndex, 1); AudioManager.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f); } } if (!flag && m_inventory.ActiveSlotIndex != m_slotIndex && m_slotIndex < 10) { m_inventory.ActiveSlotIndex = m_slotIndex; if (m_inventory.ActiveSlotIndex == m_slotIndex) { AudioManager.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f); } } } if (!m_focus || ProcessingOnly || viewPlayer == null) { return; } Vector2?hold = input.Hold; if (hold.HasValue && HitTestGlobal(hold.Value) == this && !DragHostWidget.IsDragInProgress && m_inventory.GetSlotCount(m_slotIndex) > 0 && (viewPlayer.ComponentInput.SplitSourceInventory != m_inventory || viewPlayer.ComponentInput.SplitSourceSlotIndex != m_slotIndex)) { input.Clear(); viewPlayer.ComponentInput.SetSplitSourceInventoryAndSlot(m_inventory, m_slotIndex); AudioManager.PlaySound("Audio/UI/ButtonClick", 1f, 0f, 0f); } Vector2?drag = input.Drag; if (!drag.HasValue || HitTestGlobal(drag.Value) != this || DragHostWidget.IsDragInProgress) { return; } int slotCount = m_inventory.GetSlotCount(m_slotIndex); if (slotCount > 0) { DragMode dragMode = input.DragMode; if (viewPlayer.ComponentInput.SplitSourceInventory == m_inventory && viewPlayer.ComponentInput.SplitSourceSlotIndex == m_slotIndex) { dragMode = DragMode.SingleItem; } int num3 = (dragMode != 0) ? 1 : slotCount; SubsystemTerrain subsystemTerrain = m_inventory.Project.FindSubsystem <SubsystemTerrain>(); ContainerWidget containerWidget = (ContainerWidget)Widget.LoadWidget(null, ContentManager.Get <XElement>("Widgets/InventoryDragWidget"), null); containerWidget.Children.Find <BlockIconWidget>("InventoryDragWidget.Icon").Value = Terrain.ReplaceLight(slotValue, 15); containerWidget.Children.Find <BlockIconWidget>("InventoryDragWidget.Icon").DrawBlockEnvironmentData.SubsystemTerrain = subsystemTerrain; containerWidget.Children.Find <LabelWidget>("InventoryDragWidget.Name").Text = block.GetDisplayName(subsystemTerrain, slotValue); containerWidget.Children.Find <LabelWidget>("InventoryDragWidget.Count").Text = num3.ToString(); containerWidget.Children.Find <LabelWidget>("InventoryDragWidget.Count").IsVisible = (!(m_inventory is ComponentCreativeInventory) && !(m_inventory is ComponentFurnitureInventory)); DragHostWidget.BeginDrag(containerWidget, new InventoryDragData { Inventory = m_inventory, SlotIndex = m_slotIndex, DragMode = dragMode }, delegate { m_dragMode = null; }); m_dragMode = dragMode; } }
void InitCommands() { commands["msg"] = new CommandDefination { Usage = "msg @a/r/p/e <string> [bool=true] [bool=true]", AutoComplete = (obj) => obj.Enum(enumCreatureType).String().Bool().Bool(), Operation = (obj) => { string type = obj.NextString(); string msg = obj.NextString(); bool b1 = obj.NextBool(true); bool b2 = obj.NextBool(true); FindPlayer(type, obj, (a) => { a.ComponentGui.DisplaySmallMessage(msg, b1, b2); }); } }; commands["msgl"] = new CommandDefination { Usage = "msgl @a/r/p/e <string> <string> <string> [float=5] [float=0]", AutoComplete = (obj) => obj.Enum(enumCreatureType).String().String().Float().Float(), Operation = (obj) => { string type = obj.NextString(); string m1 = obj.NextString(); string m2 = obj.NextString(); float f1 = obj.NextFloat(5); float f2 = obj.NextFloat(0); FindPlayer(type, obj, (a) => { a.ComponentGui.DisplayLargeMessage(m1, m2, f1, f2); }); } }; commands["kill"] = new CommandDefination { Usage = "kill @a/r/p/e [string=magic]", AutoComplete = (obj) => obj.Enum(enumCreatureType).String(), Operation = (obj) => { string type = obj.NextString(); string reason = obj.NextString("magic"); EnumCreatures(type, obj, (c) => { c.ComponentHealth.Injure(1, null, true, reason); }); } }; commands["health"] = new CommandDefination { Usage = "health heal/injure [float=1] [string=magic]", AutoComplete = (obj) => obj.Enum(new string[] { "heal", "injure" }).Float().String(), Operation = (obj) => { string type = obj.NextString(); switch (type) { case "heal": float amount1 = obj.NextFloat(1); obj.Creature.ComponentHealth.Heal(amount1); break; case "injure": float amount = obj.NextFloat(1); string reason = obj.NextString("magic"); obj.Creature.ComponentHealth.Injure(amount, null, true, reason); break; default: throw new Exception("usage: health heal/injure [float=1] [string=magic]"); } } }; commands["strike"] = new CommandDefination { Usage = "strike <vector3>", AutoComplete = (obj) => obj.Vector3(), Operation = (obj) => { subsystemSky.MakeLightningStrike(obj.NextVector3()); } }; commands["setblock"] = new CommandDefination { Usage = "setblock <point3> <int>", AutoComplete = (obj) => obj.Point3().Int(), Operation = (s) => { var p = s.NextPoint3(); subsystemTerrain.ChangeCell(p.X, p.Y, p.Z, s.NextInt()); } }; commands["place"] = new CommandDefination { Usage = "place <point3> <int> [bool=false] [bool=false]", AutoComplete = (obj) => obj.Point3().Int().Bool().Bool(), Operation = (obj) => { var p = obj.NextPoint3(); subsystemTerrain.DestroyCell(2, p.X, p.Y, p.Z, obj.NextInt(), obj.NextBool(false), obj.NextBool(false)); } }; commands["fill"] = new CommandDefination { Usage = "fill <point3> <point3>", AutoComplete = (obj) => obj.Point3().Point3().Int(), Operation = (obj) => { var p1 = obj.NextPoint3(); var p2 = obj.NextPoint3(); var startx = Math.Min(p1.X, p2.X); var endx = Math.Max(p1.X, p2.X); var starty = Math.Min(p1.Y, p2.Y); var endy = Math.Max(p1.Y, p2.Y); var startz = Math.Min(p1.Z, p2.Z); var endz = Math.Max(p1.Z, p2.Z); var val = obj.NextInt(); for (int x = startx; x <= endx; x++) { for (int y = starty; y <= endy; y++) { for (int z = startz; z <= endz; z++) { subsystemTerrain.Terrain.SetCellValueFast(x, y, z, val); } } } var startChunk = Terrain.ToChunk(startx, startz); var endChunk = Terrain.ToChunk(endx, endz); for (int x = startChunk.X; x <= endChunk.X; x++) { for (int y = startChunk.Y; y <= endChunk.Y; y++) { var c = subsystemTerrain.Terrain.GetChunkAtCoords(x, y); if (c != null) { subsystemTerrain.TerrainUpdater.DowngradeChunkNeighborhoodState(c.Coords, 1, TerrainChunkState.InvalidLight, false); } } } } }; commands["time"] = new CommandDefination { Usage = "time add/set <float>", AutoComplete = (obj) => obj.Enum(new string[] { "add", "set" }).Float(), Operation = (obj) => { switch (obj.NextString()) { case "add": subsystemTime.TimeOfDayOffset += obj.NextFloat(); break; case "set": subsystemTime.TimeOfDayOffset = obj.NextFloat(); break; default: throw new Exception("usage: time add/set <float>"); } } }; commands["execute"] = new CommandDefination { Usage = "execute @a/r/p/e <another command>", AutoComplete = (obj) => { obj.Enum(enumCreatureType); AutoCompleteCommand(obj.CommandStream.GetAllLeft(), obj.Reciver); }, Operation = (obj) => { var type = obj.NextString(); var command = obj.GetAllLeft(); EnumCreatures(type, obj, (a) => { RunCommand(a, command); }); } }; commands["setdata"] = new CommandDefination { Usage = "setdata <creature data> <data type>", AutoComplete = (obj) => { obj.Enum(creatureDatas.Keys); string component = obj.CommandStream.Last; int i = creatureDatas[component]; switch (i) { case 0: obj.Any(typeof(ComponentLocomotion).GetProperty(component).PropertyType); break; case 1: obj.Any(typeof(ComponentHealth).GetProperty(component).PropertyType); break; case 2: obj.Any(typeof(ComponentBody).GetProperty(component).PropertyType); break; } }, Operation = (s) => { while (s.HasNext) { var component = s.NextString(); PropertyInfo p; if (creatureDatas.TryGetValue(component, out int i)) { switch (i) { case 0: p = typeof(ComponentLocomotion).GetProperty(component); p.SetValue(s.Creature.ComponentLocomotion, s.Next(p.PropertyType), null); break; case 1: p = typeof(ComponentHealth).GetProperty(component); p.SetValue(s.Creature.ComponentHealth, s.Next(p.PropertyType), null); break; case 2: p = typeof(ComponentBody).GetProperty(component); p.SetValue(s.Creature.ComponentBody, s.Next(p.PropertyType), null); break; } } else { throw new Exception(component + " is not a creature data"); } } } }; commands["gameinfo"] = new CommandDefination { Usage = "gameinfo <info name> <info value>", AutoComplete = (obj) => { Type settings = typeof(WorldSettings); obj.Enum(settings.GetFields().Select(f => f.Name)); obj.Any(settings.GetField(obj.CommandStream.Last).FieldType); }, Operation = (s) => { var setting = s.NextString(); var val = s.NextString(); var f = typeof(WorldSettings).GetField(setting); if (f != null) { f.SetValue(GameManager.WorldInfo.WorldSettings, ChangeType(val, f.FieldType)); } } }; commands["summon"] = new CommandDefination { Usage = "summon <animal name> <vector3> [float=0]", AutoComplete = (obj) => obj.String().Vector3().Float(), Operation = (s) => { var name = s.NextString(); var position = s.NextVector3(); var rotation = s.NextFloat(0); Entity entity = DatabaseManager.CreateEntity(Project, creatureTemplateNames[name], true); entity.FindComponent <ComponentBody>(true).Position = position; entity.FindComponent <ComponentBody>(true).Rotation = Quaternion.CreateFromAxisAngle(Vector3.UnitY, rotation); entity.FindComponent <ComponentSpawn>(true).SpawnDuration = 0.25f; Project.AddEntity(entity); } }; commands["tp"] = new CommandDefination { Usage = "tp <vector3>", AutoComplete = (obj) => obj.Vector3(), Operation = s => s.Creature.ComponentBody.Position = s.NextVector3() }; commands["additem"] = new CommandDefination { Usage = "additem <vector3> <int> [int=1] [vector=0,0,0]", AutoComplete = (obj) => obj.Vector3().Int().Int().Vector3(), Operation = s => { var position = s.NextVector3(); var val = s.NextInt(); var count = s.NextInt(1); Vector3?speed = null; if (s.HasNext) { speed = s.NextVector3(); } Project.FindSubsystem <SubsystemPickables>(true).AddPickable(s.NextInt(), s.NextInt(1), position, speed, null); } }; commands["give"] = new CommandDefination { Usage = "give @a/r/p/e <int> [int=1]", AutoComplete = (obj) => obj.Enum(enumCreatureType).Int().Int(), Operation = s => { var enumType = s.NextString(); var val = s.NextInt(); var count = s.NextInt(1); FindPlayer(enumType, s, (p) => ComponentInventoryBase.AcquireItems(p.ComponentMiner.Inventory, val, count)); } }; foreach (string name in commands.Keys) { commandUsage[commands[name].Usage] = name; } } void LoadBlockIds() { foreach (Block b in BlocksManager.Blocks) { foreach (int id in b.GetCreativeValues()) { var name = b.GetDisplayName(subsystemTerrain, id).Replace(' ', '_').ToLower(); blockIds[name] = id; } blockIds[b.DefaultDisplayName.Replace(' ', '_').ToLower()] = b.BlockIndex; } } void FindPlayer(string type, CommandStream s, Action <ComponentPlayer> a) { if (type[0] == '@') { EnumCreatures(type, s, c => { if (c is ComponentPlayer) { a(c as ComponentPlayer); } }); } else { FindPlayerByName(type, a); } } void FindPlayerByName(string name, Action <ComponentPlayer> a) { foreach (ComponentPlayer p in subsystemPlayers.ComponentPlayers) { if (p.PlayerData.Name == name) { a(p); } else { throw new WrongArgTypeException(name, "player"); } } } void LoadCreatureTemplateNames() { var paramterType = DatabaseManager.GameDatabase.ParameterType; var entities = DatabaseManager.GameDatabase.Database.Root.GetExplicitNestingChildren(paramterType, false); var displayName = new Guid("715ff548-ef2b-430e-8e6b-51b934e5da1d"); foreach (TemplatesDatabase.DatabaseObject o in entities) { if (o.EffectiveInheritanceRoot.Guid == displayName && o.Value.ToString() != string.Empty) { creatureTemplateNames[o.NestingParent.NestingParent.Name.ToLower()] = o.Value.ToString(); //Log.Information("{0}, {1}", o.NestingParent.NestingParent.Name, o.Value); } } } void LoadCreatureDatas() { foreach (PropertyInfo p in typeof(ComponentLocomotion).GetRuntimeProperties()) { if (CommandStream.IsTypeSupported(p.PropertyType)) { creatureDatas[p.Name] = 0; } } foreach (PropertyInfo p in typeof(ComponentHealth).GetRuntimeProperties()) { if (CommandStream.IsTypeSupported(p.PropertyType)) { creatureDatas[p.Name] = 1; } } foreach (PropertyInfo p in typeof(ComponentBody).GetRuntimeProperties()) { if (CommandStream.IsTypeSupported(p.PropertyType)) { creatureDatas[p.Name] = 2; } } } void EnumCreatures(string type, CommandStream s, Action <ComponentCreature> a) { var data = new EnumData(type, subsystemCreature.Creatures.Count, s.ExePosition); if (data.name == "player") { data.name = string.Empty; SearchCreature(data, SortCreatures(data, subsystemPlayers.ComponentPlayers), a); } else { SearchCreature(data, SortCreatures(data, subsystemCreature.Creatures), a); } } List <ComponentCreature> SortCreatures <T>(EnumData data, IEnumerable <T> collection) where T : ComponentCreature { var l = new List <ComponentCreature>(); if (data.mode1 == SearchingMode1.Regular) { foreach (ComponentCreature c in collection) { if (CheckCreatureWithData(data, c)) { l.Add(c); } } } else if (data.mode1 == SearchingMode1.Nearest) { var v = new Vector3(data.x, data.y, data.z); var dict = new Dictionary <float, ComponentCreature>(); foreach (ComponentCreature c in collection) { if (CheckCreatureWithData(data, c)) { dict.Add(Vector3.DistanceSquared(v, c.ComponentBody.Position), c); } } var l2 = new List <float>(); foreach (float i in dict.Keys) { l2.Add(i); } l2.Sort(delegate(float i1, float i2) { if (i1 > i2) { return(1); } return(-1); }); foreach (float i in l2) { l.Add(dict[i]); } } else { foreach (ComponentCreature c in collection) { if (CheckCreatureWithData(data, c)) { l.Add(c); } } var r = new Random(); var count = l.Count; int n = l.Count; while (n > 1) { n--; int k = r.UniformInt(0, n); var value = l[k]; l[k] = l[n]; l[n] = value; } } return(l); } void SearchCreature(EnumData data, List <ComponentCreature> sorted, Action <ComponentCreature> a) { for (int i = 0; i < data.count; i++) { if (i >= sorted.Count) { return; } a.Invoke(sorted[i]); } } bool CheckCreatureWithData(EnumData data, ComponentCreature c) { if (data.name != string.Empty) { string dataname; if (data.name[0] == '!') { Log.Information(c.DisplayName); if (creatureTemplateNames.TryGetValue(data.name.Substring(1), out dataname)) { if (dataname == c.DisplayName) { return(false); } } else { return(false); } } else { if (creatureTemplateNames.TryGetValue(data.name, out dataname)) { if (dataname != c.DisplayName) { return(false); } } else { return(false); } } } switch (data.SearchingMode) { case SearchingMode.Radius: if (data.r > 0) { if (Vector3.DistanceSquared(new Vector3(data.x, data.y, data.z), c.ComponentBody.Position) >= data.r2) { return(false); } } else { if (Vector3.DistanceSquared(new Vector3(data.x, data.y, data.z), c.ComponentBody.Position) <= data.r2) { return(false); } } break; case SearchingMode.Volume: var p = c.ComponentBody.Position; var x = p.X - data.x; var y = p.Y - data.y; var z = p.Z - data.z; if (x < 0 && x > data.dx && y < 0 && y > data.dy && z < 0 && z > data.dz) { return(false); } break; } return(true); }