/* * Copyright 2013 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.logic.players; import org.lwjgl.input.Mouse; import org.terasology.config.Config; import org.terasology.entitySystem.entity.EntityRef; import org.terasology.entitySystem.event.EventPriority; import org.terasology.entitySystem.event.ReceiveEvent; import org.terasology.entitySystem.systems.BaseComponentSystem; import org.terasology.entitySystem.systems.RegisterMode; import org.terasology.entitySystem.systems.RegisterSystem; import org.terasology.input.Keyboard; import org.terasology.input.binds.general.HideHUDButton; import org.terasology.input.events.KeyDownEvent; import org.terasology.input.events.KeyEvent; import org.terasology.input.events.MouseXAxisEvent; import org.terasology.input.events.MouseYAxisEvent; import org.terasology.logic.characters.CharacterComponent; import org.terasology.logic.console.ConsoleMessageEvent; import org.terasology.logic.debug.DebugProperties; import org.terasology.network.ClientComponent; import org.terasology.registry.In; import org.terasology.rendering.nui.NUIManager; import org.terasology.rendering.nui.layers.ingame.metrics.DebugOverlay; import org.terasology.rendering.world.viewDistance.ViewDistance; import org.terasology.world.WorldProvider; /** */ @RegisterSystem(RegisterMode.CLIENT) public class DebugControlSystem extends BaseComponentSystem { @In private WorldProvider world; @In private Config config; @In private NUIManager nuiManager; private DebugOverlay overlay; private boolean mouseGrabbed = true; @Override public void initialise() { overlay = nuiManager.addOverlay("engine:debugOverlay", DebugOverlay.class); } @ReceiveEvent(components = ClientComponent.class) public void onHideHUD(HideHUDButton event, EntityRef entity) { if (event.isDown()) { // Make sure both are either visible or hidden final boolean hide = !(config.getRendering().getDebug().isHudHidden() && config.getRendering().getDebug().isFirstPersonElementsHidden()); config.getRendering().getDebug().setFirstPersonElementsHidden(hide); config.getRendering().getDebug().setHudHidden(hide); event.consume(); } } @ReceiveEvent(components = ClientComponent.class) public void onIncreaseViewDistance(IncreaseViewDistanceButton button, EntityRef entity) { int viewDistance = config.getRendering().getViewDistance().getIndex(); int maxViewDistance = ViewDistance.values().length - 1; if (viewDistance != maxViewDistance) { config.getRendering().setViewDistance(ViewDistance.forIndex((viewDistance + 1))); } button.consume(); } @ReceiveEvent(components = ClientComponent.class) public void onDecreaseViewDistance(DecreaseViewDistanceButton button, EntityRef entity) { int viewDistance = config.getRendering().getViewDistance().getIndex(); int minViewDistance = 0; if (viewDistance != minViewDistance) { config.getRendering().setViewDistance(ViewDistance.forIndex((viewDistance - 1))); } button.consume(); } @ReceiveEvent(components = ClientComponent.class) public void onKeyEvent(KeyEvent event, EntityRef entity) { boolean debugEnabled = config.getSystem().isDebugEnabled(); // Features for debug mode only if (debugEnabled && event.isDown()) { switch (event.getKey().getId()) { case Keyboard.KeyId.UP: world.getTime().setDays(world.getTime().getDays() + 0.005f); event.consume(); break; case Keyboard.KeyId.DOWN: world.getTime().setDays(world.getTime().getDays() - 0.005f); event.consume(); break; case Keyboard.KeyId.RIGHT: world.getTime().setDays(world.getTime().getDays() + 0.02f); event.consume(); break; case Keyboard.KeyId.LEFT: world.getTime().setDays(world.getTime().getDays() - 0.02f); event.consume(); break; default: break; } } } @ReceiveEvent(components = ClientComponent.class) public void onKeyDown(KeyDownEvent event, EntityRef entity) { boolean debugEnabled = config.getSystem().isDebugEnabled(); // Features for debug mode only if (debugEnabled) { switch (event.getKey().getId()) { case Keyboard.KeyId.F6: config.getRendering().getDebug().setEnabled(!config.getRendering().getDebug().isEnabled()); event.consume(); break; case Keyboard.KeyId.F7: config.getRendering().getDebug().cycleStage(); entity.send(new ConsoleMessageEvent("Set debug stage to: " + config.getRendering().getDebug().getStage())); event.consume(); break; case Keyboard.KeyId.F8: config.getRendering().getDebug().setRenderChunkBoundingBoxes(!config.getRendering().getDebug().isRenderChunkBoundingBoxes()); event.consume(); break; case Keyboard.KeyId.F9: config.getRendering().getDebug().setWireframe(!config.getRendering().getDebug().isWireframe()); event.consume(); break; default: break; } } switch (event.getKey().getId()) { case Keyboard.KeyId.F2: mouseGrabbed = !mouseGrabbed; DebugProperties debugProperties = (DebugProperties) nuiManager.getHUD().getHUDElement("engine:DebugProperties"); debugProperties.setVisible(!mouseGrabbed); Mouse.setGrabbed(mouseGrabbed); event.consume(); break; case Keyboard.KeyId.F3: config.getSystem().setDebugEnabled(!config.getSystem().isDebugEnabled()); event.consume(); break; case Keyboard.KeyId.F4: overlay.toggleMetricsMode(); event.consume(); break; default: break; } } @ReceiveEvent(components = CharacterComponent.class, priority = EventPriority.PRIORITY_HIGH) public void onMouseX(MouseXAxisEvent event, EntityRef entity) { if (!mouseGrabbed) { event.consume(); } } @ReceiveEvent(components = CharacterComponent.class, priority = EventPriority.PRIORITY_HIGH) public void onMouseY(MouseYAxisEvent event, EntityRef entity) { if (!mouseGrabbed) { event.consume(); } } }