Chat.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package me.hammerle.snuviengine.game;
  2. import me.hammerle.snuviengine.api.FontRenderer;
  3. import me.hammerle.snuviengine.api.Shader;
  4. public class Chat
  5. {
  6. private final char[] input = new char[256];
  7. private final StringBuilder[] chat = new StringBuilder[25];
  8. private int startIndex = 0;
  9. private int writeIndex = 0;
  10. private int viewIndex = 0;
  11. private int viewLenght = 5;
  12. private final int lineLenght = 20;
  13. public Chat()
  14. {
  15. for(int i = 0; i < chat.length; i++)
  16. {
  17. chat[i] = new StringBuilder();
  18. }
  19. for(int i = 0; i < 30; i++)
  20. {
  21. addString(String.valueOf(i).toCharArray());
  22. }
  23. }
  24. private void nextWriteIndex()
  25. {
  26. writeIndex = (writeIndex + 1) % chat.length;
  27. chat[writeIndex].delete(0, chat[writeIndex].length());
  28. if(writeIndex == startIndex)
  29. {
  30. startIndex = (startIndex + 1) % chat.length;
  31. }
  32. int distance;
  33. if(viewIndex < writeIndex)
  34. {
  35. distance = writeIndex - viewIndex;
  36. }
  37. else
  38. {
  39. distance = chat.length - viewIndex + writeIndex;
  40. }
  41. if(distance - 1 == viewLenght)
  42. {
  43. viewIndex = (viewIndex + 1) % chat.length;
  44. }
  45. }
  46. private void addString(char[] text)
  47. {
  48. int pos = 0;
  49. for(int i = 0; i < text.length; i++)
  50. {
  51. int j = i;
  52. int w = 0;
  53. OUTER: while(j < text.length)
  54. {
  55. switch(text[j])
  56. {
  57. case ' ':
  58. break OUTER;
  59. case FontRenderer.COLOR_CHAR:
  60. j++;
  61. if(j < text.length)
  62. {
  63. j++;
  64. }
  65. break;
  66. default:
  67. w++;
  68. j++;
  69. break;
  70. }
  71. }
  72. pos += w;
  73. if(pos > lineLenght)
  74. {
  75. pos = w;
  76. nextWriteIndex();
  77. }
  78. while(i < j)
  79. {
  80. chat[writeIndex].append(text[i]);
  81. i++;
  82. }
  83. pos++;
  84. chat[writeIndex].append(' ');
  85. }
  86. nextWriteIndex();
  87. }
  88. public void tick()
  89. {
  90. if(((Game.DOWN.getTime() + 15) & 0x7) == 0)
  91. {
  92. if((viewIndex + viewLenght) % chat.length != writeIndex)
  93. {
  94. viewIndex = (viewIndex + 1) % chat.length;
  95. }
  96. }
  97. if(((Game.UP.getTime() + 15) & 0x7) == 0)
  98. {
  99. if(viewIndex != startIndex)
  100. {
  101. viewIndex--;
  102. if(viewIndex < 0)
  103. {
  104. viewIndex += chat.length;
  105. }
  106. }
  107. }
  108. }
  109. public void renderTick()
  110. {
  111. Shader.setTextureEnabled(true);
  112. Shader.setColorEnabled(true);
  113. float x = 0.0f;
  114. float y = 0.0f;
  115. FontRenderer fr = Shader.getFontRenderer();
  116. int i = viewIndex;
  117. int end = (viewIndex + viewLenght) % chat.length;
  118. while(i != end)
  119. {
  120. y = fr.drawString(x, y, true, chat[i].toString());
  121. i = (i + 1) % chat.length;
  122. }
  123. }
  124. }