Chat implementation, currently buggy

This commit is contained in:
Anuken
2018-01-03 23:12:46 -05:00
parent a0ae64db11
commit dc1700f0ff
8 changed files with 60 additions and 20 deletions

View File

@@ -5,6 +5,11 @@ com.badlogic.gdx.graphics.g2d.BitmapFont: {
markupEnabled: true, markupEnabled: true,
scale: 0.5 scale: 0.5
}, },
default-font-chat: {
file: square.fnt,
markupEnabled: false,
scale: 0.5
},
title: { title: {
file: title.fnt, file: title.fnt,
markupEnabled: true, markupEnabled: true,
@@ -30,6 +35,7 @@ io.anuke.ucore.scene.Skin$TintedDrawable: {
dialogDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.9} }, dialogDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.9} },
invis: {name: white, color: {r: 0, g: 0, b: 0, a: 0} } invis: {name: white, color: {r: 0, g: 0, b: 0, a: 0} }
loadDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.8} }, loadDim: {name: white, color: {r: 0, g: 0, b: 0, a: 0.8} },
chatfield: {name: white, color: {r: 0, g: 0, b: 0, a: 0.2}},
clear: {name: white, color: {r: 0.1, g: 0.1, b: 0.1, a: 0.75}}, clear: {name: white, color: {r: 0.1, g: 0.1, b: 0.1, a: 0.75}},
clear-over: {name: white, color: {r: 1, g: 1, b: 1, a: 0.2} }, clear-over: {name: white, color: {r: 1, g: 1, b: 1, a: 0.2} },
clear-down: {name: white, color: {r: 1, g: 1, b: 1, a: 0.4} } clear-down: {name: white, color: {r: 1, g: 1, b: 1, a: 0.4} }

View File

@@ -148,6 +148,8 @@ public class Control extends Module{
"dash", Input.SHIFT_LEFT, "dash", Input.SHIFT_LEFT,
"rotate_alt", new Axis(Input.R, Input.E), "rotate_alt", new Axis(Input.R, Input.E),
"rotate", new Axis(Input.SCROLL), "rotate", new Axis(Input.SCROLL),
"player_list", Input.TAB,
"chat", Input.ENTER,
"weapon_1", Input.NUM_1, "weapon_1", Input.NUM_1,
"weapon_2", Input.NUM_2, "weapon_2", Input.NUM_2,
"weapon_3", Input.NUM_3, "weapon_3", Input.NUM_3,
@@ -172,6 +174,7 @@ public class Control extends Module{
"dash", Input.CONTROLLER_Y, "dash", Input.CONTROLLER_Y,
"rotate_alt", new Axis(Input.UNSET), "rotate_alt", new Axis(Input.UNSET),
"rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B), "rotate", new Axis(Input.CONTROLLER_A, Input.CONTROLLER_B),
"player_list", Input.CONTROLLER_START,
"weapon_1", Input.NUM_1, "weapon_1", Input.NUM_1,
"weapon_2", Input.NUM_2, "weapon_2", Input.NUM_2,
"weapon_3", Input.NUM_3, "weapon_3", Input.NUM_3,
@@ -257,6 +260,7 @@ public class Control extends Module{
//multiplying by 2 so you start with more time in the beginning //multiplying by 2 so you start with more time in the beginning
wavetime = waveSpacing()*2; wavetime = waveSpacing()*2;
//hacky, but I doubt anyone will use this many resources
if(mode.infiniteResources){ if(mode.infiniteResources){
Arrays.fill(items, 999999999); Arrays.fill(items, 999999999);
} }

View File

@@ -261,7 +261,7 @@ public class NetClient extends Module {
}); });
Net.handle(ChatPacket.class, packet -> { Net.handle(ChatPacket.class, packet -> {
//TODO Gdx.app.postRunnable(() -> Vars.ui.addChatMessage(packet.name, packet.text));
}); });
Net.handle(KickPacket.class, packet -> { Net.handle(KickPacket.class, packet -> {
@@ -285,6 +285,10 @@ public class NetClient extends Module {
ChatPacket packet = new ChatPacket(); ChatPacket packet = new ChatPacket();
packet.text = message; packet.text = message;
Net.send(packet, SendMode.tcp); Net.send(packet, SendMode.tcp);
if(Net.server()){
Vars.ui.addChatMessage(Vars.player.name, packet.text);
}
} }
public void handleShoot(Weapon weapon, float x, float y, float angle){ public void handleShoot(Weapon weapon, float x, float y, float angle){

View File

@@ -157,8 +157,6 @@ public class NetServer extends Module{
if(player == null) if(player == null)
return; //GHOSTS AAAA return; //GHOSTS AAAA
//TODO add to chat fragment
packet.name = player.name; packet.name = player.name;
Net.send(packet, SendMode.tcp); Net.send(packet, SendMode.tcp);
}); });

View File

@@ -59,7 +59,9 @@ public class UI extends SceneModule{
toolfrag = new ToolFragment(), toolfrag = new ToolFragment(),
hudfrag = new HudFragment(), hudfrag = new HudFragment(),
placefrag = new PlacementFragment(), placefrag = new PlacementFragment(),
weaponfrag = new WeaponFragment(); weaponfrag = new WeaponFragment(),
chatfrag = new ChatFragment(),
listfrag = new PlayerListFragment();
public UI() { public UI() {
Dialog.setShowAction(()-> sequence( Dialog.setShowAction(()-> sequence(
@@ -309,11 +311,19 @@ public class UI extends SceneModule{
toolfrag.build(); toolfrag.build();
chatfrag.build();
listfrag.build();
updateItems(); updateItems();
build.end(); build.end();
} }
public void addChatMessage(String sender, String message){
((ChatFragment)chatfrag).addMessage(message, sender);
}
public void showGameError(){ public void showGameError(){
gameerror.show(); gameerror.show();
} }

View File

@@ -8,7 +8,10 @@ import com.badlogic.gdx.graphics.g2d.GlyphLayout;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import io.anuke.mindustry.Vars; import io.anuke.mindustry.Vars;
import io.anuke.mindustry.net.Net;
import io.anuke.ucore.core.Core; import io.anuke.ucore.core.Core;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.core.Timers;
import io.anuke.ucore.scene.Scene; import io.anuke.ucore.scene.Scene;
import io.anuke.ucore.scene.ui.Label; import io.anuke.ucore.scene.ui.Label;
import io.anuke.ucore.scene.ui.Label.LabelStyle; import io.anuke.ucore.scene.ui.Label.LabelStyle;
@@ -18,8 +21,10 @@ import io.anuke.ucore.scene.ui.layout.Table;
import static io.anuke.ucore.core.Core.scene; import static io.anuke.ucore.core.Core.scene;
import static io.anuke.ucore.core.Core.skin; import static io.anuke.ucore.core.Core.skin;
//TODO show chat even when not toggled
public class ChatFragment extends Table implements Fragment{ public class ChatFragment extends Table implements Fragment{
private final static int messagesShown = 10; private final static int messagesShown = 10;
private final static int maxLength = 150;
private Array<ChatMessage> messages = new Array<>(); private Array<ChatMessage> messages = new Array<>();
private float fadetime; private float fadetime;
private float lastfadetime; private float lastfadetime;
@@ -30,14 +35,21 @@ public class ChatFragment extends Table implements Fragment{
private GlyphLayout layout = new GlyphLayout(); private GlyphLayout layout = new GlyphLayout();
private float offsetx = 4, offsety = 4, fontoffsetx = 2, chatspace = 50; private float offsetx = 4, offsety = 4, fontoffsetx = 2, chatspace = 50;
private float textWidth = 600; private float textWidth = 600;
private Color shadowColor = new Color(0,0,0,0.4f); private Color shadowColor = new Color(0, 0, 0, 0.4f);
private float textspacing = 10; private float textspacing = 10;
public ChatFragment(){ public ChatFragment(){
super(); super();
setFillParent(true); setFillParent(true);
font = Core.skin.getFont("pixel-font"); font = Core.skin.getFont("default-font");
//TODO put it input
update(() -> {
if(Net.active() && Inputs.keyTap("chat")){
toggle();
}
});
setup(); setup();
} }
@@ -51,12 +63,12 @@ public class ChatFragment extends Table implements Fragment{
fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle())); fieldlabel.setStyle(new LabelStyle(fieldlabel.getStyle()));
fieldlabel.getStyle().font = font; fieldlabel.getStyle().font = font;
fieldlabel.setStyle(fieldlabel.getStyle()); fieldlabel.setStyle(fieldlabel.getStyle());
fieldlabel.setFontScale(2);
chatfield = new TextField("", new TextField.TextFieldStyle(skin.get(TextField.TextFieldStyle.class)));
chatfield.getStyle().background = skin.getDrawable("blank"); chatfield = new TextField("", new TextField.TextFieldStyle(skin.get(TextField.TextFieldStyle.class)));
chatfield.setTextFieldFilter((field, c) -> field.getText().length() < maxLength);
chatfield.getStyle().background = skin.getDrawable("chatfield");
chatfield.getStyle().fontColor = Color.WHITE; chatfield.getStyle().fontColor = Color.WHITE;
chatfield.getStyle().font = skin.getFont("pixel-font-nomarkup"); chatfield.getStyle().font = skin.getFont("default-font-chat");
bottom().left().marginBottom(offsety).marginLeft(offsetx*2).add(fieldlabel).padBottom(4f); bottom().left().marginBottom(offsety).marginLeft(offsetx*2).add(fieldlabel).padBottom(4f);
@@ -67,16 +79,15 @@ public class ChatFragment extends Table implements Fragment{
public void draw(Batch batch, float alpha){ public void draw(Batch batch, float alpha){
batch.setColor(shadowColor); batch.setColor(shadowColor);
if(chatOpen) if(chatOpen)
batch.draw(skin.getRegion("white"), offsetx, chatfield.getY(), Gdx.graphics.getWidth()-offsetx*2, chatfield.getHeight()-1); batch.draw(skin.getRegion("white"), offsetx, chatfield.getY(), Gdx.graphics.getWidth()-offsetx*2, chatfield.getHeight()-1);
font.getData().setScale(2f);
font.getData().down = -21.5f; font.getData().down = -21.5f;
font.getData().lineHeight = 22f; font.getData().lineHeight = 22f;
super.draw(batch, alpha); super.draw(batch, alpha);
float spacing = chatspace; float spacing = chatspace;
chatfield.setVisible(chatOpen); chatfield.setVisible(chatOpen);
@@ -89,15 +100,14 @@ public class ChatFragment extends Table implements Fragment{
layout.setText(font, messages.get(i).formattedMessage, Color.WHITE, textWidth, Align.bottomLeft, true); layout.setText(font, messages.get(i).formattedMessage, Color.WHITE, textWidth, Align.bottomLeft, true);
theight += layout.height+textspacing; theight += layout.height+textspacing;
if(i == 0)theight -= textspacing+1; if(i == 0) theight -= textspacing+1;
font.getCache().clear(); font.getCache().clear();
font.getCache().addText(messages.get(i).formattedMessage, fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true); font.getCache().addText(messages.get(i).formattedMessage, fontoffsetx + offsetx, offsety + theight, textWidth, Align.bottomLeft, true);
if(fadetime-i < 1f && fadetime-i >= 0f){ if(fadetime-i < 1f && fadetime-i >= 0f){
font.getCache().setAlphas(fadetime-i); font.getCache().setAlphas(fadetime-i);
batch.setColor(0,0,0,shadowColor.a*(fadetime-i)); batch.setColor(0, 0, 0, shadowColor.a*(fadetime-i));
} }
batch.draw(skin.getRegion("white"), offsetx, theight-layout.height+1-4, textWidth, layout.height+textspacing); batch.draw(skin.getRegion("white"), offsetx, theight-layout.height+1-4, textWidth, layout.height+textspacing);
@@ -109,7 +119,7 @@ public class ChatFragment extends Table implements Fragment{
batch.setColor(Color.WHITE); batch.setColor(Color.WHITE);
if(fadetime > 0 && !chatOpen) if(fadetime > 0 && !chatOpen)
fadetime -= Gdx.graphics.getDeltaTime()*60f/120f; fadetime -= Timers.delta()/120f;
} }
private void sendMessage(){ private void sendMessage(){
@@ -118,6 +128,8 @@ public class ChatFragment extends Table implements Fragment{
if(message.replaceAll(" ", "").isEmpty()) return; if(message.replaceAll(" ", "").isEmpty()) return;
Vars.netClient.handleSendMessage(message); Vars.netClient.handleSendMessage(message);
} }
@@ -128,12 +140,12 @@ public class ChatFragment extends Table implements Fragment{
scene.setKeyboardFocus(chatfield); scene.setKeyboardFocus(chatfield);
chatOpen = !chatOpen; chatOpen = !chatOpen;
lastfadetime = fadetime; lastfadetime = fadetime;
fadetime = messagesShown+1; fadetime = messagesShown + 1;
}else if(chatOpen){ }else if(chatOpen){
scene.setKeyboardFocus(null); scene.setKeyboardFocus(null);
chatOpen = !chatOpen; chatOpen = !chatOpen;
sendMessage(); sendMessage();
fadetime = lastfadetime; fadetime = messagesShown + 1; //TODO?
} }
} }
@@ -145,7 +157,7 @@ public class ChatFragment extends Table implements Fragment{
messages.insert(0, new ChatMessage(message, sender)); messages.insert(0, new ChatMessage(message, sender));
fadetime += 1f; fadetime += 1f;
fadetime = Math.min(fadetime, messagesShown)+2f; fadetime = Math.min(fadetime, messagesShown) + 2f;
} }
private static class ChatMessage{ private static class ChatMessage{

View File

@@ -3,6 +3,7 @@ package io.anuke.mindustry.ui.fragments;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import io.anuke.mindustry.Vars;
import io.anuke.mindustry.core.GameState; import io.anuke.mindustry.core.GameState;
import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.core.GameState.State;
import io.anuke.mindustry.input.InputHandler; import io.anuke.mindustry.input.InputHandler;
@@ -24,6 +25,8 @@ public class PlacementFragment implements Fragment{
Table breaktable, next; Table breaktable, next;
public void build(){ public void build(){
if(!Vars.android) return;
InputHandler input = control.getInput(); InputHandler input = control.getInput();
float s = 50f; float s = 50f;

View File

@@ -5,6 +5,7 @@ import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Net; import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.ui.BorderImage; import io.anuke.mindustry.ui.BorderImage;
import io.anuke.ucore.core.Draw; import io.anuke.ucore.core.Draw;
import io.anuke.ucore.core.Inputs;
import io.anuke.ucore.scene.builders.label; import io.anuke.ucore.scene.builders.label;
import io.anuke.ucore.scene.builders.table; import io.anuke.ucore.scene.builders.table;
import io.anuke.ucore.scene.ui.layout.Table; import io.anuke.ucore.scene.ui.layout.Table;
@@ -21,6 +22,8 @@ public class PlayerListFragment implements Fragment{
row(); row();
add(content).grow(); add(content).grow();
}}.end(); }}.end();
visible(() -> Inputs.keyDown("player_list"));
}}.end(); }}.end();
rebuild(); rebuild();