protected override void Init() { RepresentedItem.SetupItemEntity(this, thisEntity); // Set up the triggers. AddItemTrigger = TriggerId.getIdByName("AddItem"); AddTriggerSlot("Interaction"); }
protected override void Init() { // Add Torso mesh. thisEntity.AddComponent(new RenderComponent( new MeshRenderJob(Renderer.Opaque.Mesh, Resources.UseMaterial("Miner/Torso", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneBody", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(new RenderComponent( new MeshRenderJob(Renderer.Shadow.Mesh, Resources.UseMaterial("::Shadow", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneBody", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(renderComponentWing1Opaque = new RenderComponent( new MeshRenderJob(Renderer.Opaque.Mesh, Resources.UseMaterial("Miner/Torso", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneWing1", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(renderComponentWing1Shadow = new RenderComponent( new MeshRenderJob(Renderer.Shadow.Mesh, Resources.UseMaterial("::Shadow", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneWing1", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(renderComponentWing2Opaque = new RenderComponent( new MeshRenderJob(Renderer.Opaque.Mesh, Resources.UseMaterial("Miner/Torso", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneWing2", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(renderComponentWing2Shadow = new RenderComponent( new MeshRenderJob(Renderer.Shadow.Mesh, Resources.UseMaterial("::Shadow", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneWing2", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(DroneScale), true)); thisEntity.AddComponent(new RenderComponent( new MeshRenderJob(Renderer.Transparent.Mesh, Resources.UseMaterial("Miner/DroneIndicator", UpvoidMiner.ModDomain), Resources.UseMesh("Miner/DroneIndicator", UpvoidMiner.ModDomain), mat4.Identity), mat4.Scale(new vec3(.03f, 7, .03f)), true)); // Set up the triggers. AddItemTrigger = TriggerId.getIdByName("AddItem"); AddTriggerSlot("Interaction"); }
public override void OnUse(Player player, vec3 _worldPos, vec3 _worldNormal, Entity _hitEntity) { switch (ToolType) { case ToolType.Pickaxe: // Pickaxe has small radius but can dig everywhere player.DigMaterial(_worldNormal, _worldPos, digRadiusPickaxe, null); return; case ToolType.Shovel: // Shovel has big radius but can only dig dirt player.DigMaterial(_worldNormal, _worldPos, digRadiusShovel, new[] { TerrainResource.FromName("Dirt").Index, TerrainResource.FromName("Desert").Index }); return; case ToolType.Axe: if (_hitEntity != null) { _hitEntity[TriggerId.getIdByName("Hit")] |= new HitMessage(player.thisEntity); } return; case ToolType.DroneChain: // Add a drone to the use-position. player.AddDrone(_worldPos); // Remove that drone from inventory. player.Inventory.RemoveItem(new ToolItem(ToolType)); return; case ToolType.Hammer: // TODO return; default: throw new InvalidOperationException("Unknown tool"); } }
void HandlePressInput(object sender, InputPressArgs e) { if (!Rendering.MainViewport.HasFocus) { return; } // Scale the area using + and - keys. // Translate it using up down left right (x, z) // and PageUp PageDown (y). if (e.PressType == InputPressArgs.KeyPressType.Down) { switch (e.Key) { case InputKey.Shift: keyModifierShift = true; break; case InputKey.Control: keyModifierControl = true; break; case InputKey.Alt: keyModifierAlt = true; break; case InputKey.F8: Renderer.Opaque.Mesh.DebugWireframe = !Renderer.Opaque.Mesh.DebugWireframe; break; case InputKey.Q: if (Inventory.Selection != null) { DropItem(Inventory.Selection); } break; // F1 resets the player position case InputKey.F1: character.Body.SetTransformation(mat4.Translate(new vec3(0, 10f, 0))); break; // Tab and shift-Tab cycle between digging shapes case InputKey.Tab: if (!keyModifierControl) { int vals = Enum.GetValues(typeof(DiggingShape)).Length; int offset = keyModifierShift ? vals - 1 : 1; CurrentDiggingShape = (DiggingShape)(((uint)CurrentDiggingShape + offset) % vals); } else { int vals = Enum.GetValues(typeof(DiggingAlignment)).Length; int offset = keyModifierShift ? vals - 1 : 1; CurrentDiggingAlignment = (DiggingAlignment)(((uint)CurrentDiggingAlignment + offset) % vals); } // Reselect to refresh shape if (Inventory.Selection != null) { Inventory.Selection.OnDeselect(this); Inventory.Selection.OnSelect(this); } break; default: break; } // Quickaccess items. if (InputKey.Key1 <= e.Key && e.Key <= InputKey.Key9) { Inventory.Select((int)e.Key - (int)InputKey.Key1); } if (e.Key == InputKey.Key0) { Inventory.Select(9); // Special '0'. } } else if (e.PressType == InputPressArgs.KeyPressType.Up) { switch (e.Key) { case InputKey.Shift: keyModifierShift = false; break; case InputKey.Control: keyModifierControl = false; break; case InputKey.Alt: keyModifierAlt = false; break; } } // Following interactions are only possible if UI is not open. if (!Gui.IsInventoryOpen) { float minRayQueryRange; float maxRayQueryRange; if (!LocalScript.NoclipEnabled) { minRayQueryRange = minRayQueryDistancePlayer; maxRayQueryRange = maxRayQueryDistancePlayer; } else { minRayQueryRange = minRayQueryDistanceNoClip; maxRayQueryRange = maxRayQueryDistanceNoClip; } // If left mouse click is detected, we want to execute a rayquery and report a "OnUse" to the selected item. if (Inventory.Selection != null && e.Key == InputKey.MouseLeft && e.PressType == InputPressArgs.KeyPressType.Down) { // Send a ray query to find the position on the terrain we are looking at. ContainingWorld.Physics.RayQuery(camera.Position + camera.ForwardDirection * minRayQueryRange, camera.Position + camera.ForwardDirection * maxRayQueryRange, delegate(bool _hit, vec3 _position, vec3 _normal, RigidBody _body, bool _hasTerrainCollision) { // Receiving the async ray query result here if (_hit) { Entity _hitEntity = null; if (_body != null && _body.RefComponent != null) { _hitEntity = _body.RefComponent.Entity; } /// Subtract a few cm toward camera to increase stability near constraints. _position -= camera.ForwardDirection * .04f; // Use currently selected item. if (e.Key == InputKey.MouseLeft) { Item selection = Inventory.Selection; if (selection != null) { selection.OnUse(this, _position, _normal, _hitEntity); } } } }); } if (e.Key == InputKey.E && e.PressType == InputPressArgs.KeyPressType.Down) { ContainingWorld.Physics.RayQuery(camera.Position + camera.ForwardDirection * minRayQueryRange, camera.Position + camera.ForwardDirection * maxRayQueryRange, delegate(bool _hit, vec3 _position, vec3 _normal, RigidBody _body, bool _hasTerrainCollision) { // Receiving the async ray query result here if (_body != null && _body.RefComponent != null) { Entity entity = _body.RefComponent.Entity; if (entity != null) { TriggerId trigger = TriggerId.getIdByName("Interaction"); entity[trigger] |= new InteractionMessage(thisEntity); } } }); } } }