Client.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. package me.km;
  2. import com.mojang.blaze3d.matrix.MatrixStack;
  3. import java.awt.Color;
  4. import java.util.List;
  5. import me.km.blocks.ModBlocks;
  6. import me.km.blocks.cookingpot.TileEntityCookingPot;
  7. import me.km.items.ItemColoredSoup;
  8. import me.km.items.ItemGemStone;
  9. import me.km.items.ModItems;
  10. import me.km.items.ModelCylinder;
  11. import me.km.items.ModelHat;
  12. import me.km.networking.ItemStackDisplayGui;
  13. import me.km.networking.KeyManager;
  14. import me.km.networking.ModPacketHandler;
  15. import me.km.networking.PlayerDisplayGui;
  16. import me.km.networking.PlayerHeadGui;
  17. import me.km.networking.StatusDisplayGui;
  18. import me.km.utils.ClientReflectionUtils;
  19. import net.minecraft.client.Minecraft;
  20. import net.minecraft.client.gui.FontRenderer;
  21. import net.minecraft.client.gui.screen.MainMenuScreen;
  22. import net.minecraft.client.gui.screen.MultiplayerScreen;
  23. import net.minecraft.client.gui.screen.Screen;
  24. import net.minecraft.client.renderer.IRenderTypeBuffer;
  25. import net.minecraft.client.renderer.Matrix4f;
  26. import net.minecraft.client.renderer.RenderType;
  27. import net.minecraft.client.renderer.RenderTypeLookup;
  28. import net.minecraft.client.renderer.Vector3f;
  29. import net.minecraft.client.renderer.color.BlockColors;
  30. import net.minecraft.client.renderer.color.IBlockColor;
  31. import net.minecraft.client.renderer.color.ItemColors;
  32. import net.minecraft.client.renderer.entity.EntityRenderer;
  33. import net.minecraft.client.renderer.entity.EntityRendererManager;
  34. import net.minecraft.entity.Entity;
  35. import net.minecraft.item.Item;
  36. import net.minecraft.item.ArmorItem;
  37. import net.minecraft.item.BlockItem;
  38. import net.minecraft.item.ItemStack;
  39. import net.minecraft.nbt.CompoundNBT;
  40. import net.minecraft.util.text.ITextComponent;
  41. import net.minecraft.util.text.StringTextComponent;
  42. import net.minecraft.util.text.TextFormatting;
  43. import net.minecraft.util.text.LanguageMap;
  44. import net.minecraft.world.GrassColors;
  45. import net.minecraft.world.biome.BiomeColors;
  46. import net.minecraftforge.api.distmarker.Dist;
  47. import net.minecraftforge.api.distmarker.OnlyIn;
  48. import net.minecraftforge.client.event.GuiScreenEvent;
  49. import net.minecraftforge.client.event.RenderGameOverlayEvent;
  50. import net.minecraftforge.client.event.RenderNameplateEvent;
  51. import net.minecraftforge.common.MinecraftForge;
  52. import net.minecraftforge.event.entity.player.ItemTooltipEvent;
  53. import net.minecraftforge.eventbus.api.SubscribeEvent;
  54. import net.minecraftforge.event.TickEvent;
  55. import net.minecraftforge.event.entity.player.PlayerInteractEvent;
  56. import net.minecraftforge.eventbus.api.Event;
  57. @OnlyIn(Dist.CLIENT)
  58. public class Client
  59. {
  60. public final static ModelCylinder CYLINDER = new ModelCylinder(1.0f);
  61. public final static ModelHat STRAW_HAT = new ModelHat(1.0f);
  62. public static KeyManager keyManager = null;
  63. public static void init()
  64. {
  65. MinecraftForge.EVENT_BUS.register(new Client());
  66. keyManager = new KeyManager();
  67. MinecraftForge.EVENT_BUS.register(keyManager);
  68. registerColors();
  69. ClientReflectionUtils.updatePlayerRenderer();
  70. }
  71. private static void registerColors()
  72. {
  73. RenderTypeLookup.setRenderLayer(ModBlocks.lantern, RenderType.getTranslucent());
  74. RenderTypeLookup.setRenderLayer(ModBlocks.tallGrass, RenderType.getCutout());
  75. RenderTypeLookup.setRenderLayer(ModBlocks.cherrySapling, RenderType.getCutout());
  76. RenderTypeLookup.setRenderLayer(ModBlocks.apricotSapling, RenderType.getCutout());
  77. RenderTypeLookup.setRenderLayer(ModBlocks.pearSapling, RenderType.getCutout());
  78. RenderTypeLookup.setRenderLayer(ModBlocks.plumSapling, RenderType.getCutout());
  79. RenderTypeLookup.setRenderLayer(ModBlocks.cherryLeaves, RenderType.getCutoutMipped());
  80. RenderTypeLookup.setRenderLayer(ModBlocks.apricotLeaves, RenderType.getCutoutMipped());
  81. RenderTypeLookup.setRenderLayer(ModBlocks.pearLeaves, RenderType.getCutoutMipped());
  82. RenderTypeLookup.setRenderLayer(ModBlocks.plumLeaves, RenderType.getCutoutMipped());
  83. BlockColors bColors = Minecraft.getInstance().getBlockColors();
  84. bColors.register((state, w, pos, tintIndex) ->
  85. {
  86. if(w == null || pos == null)
  87. {
  88. return -16777216;
  89. }
  90. TileEntityCookingPot tile = (TileEntityCookingPot) w.getTileEntity(pos);
  91. if(tile == null)
  92. {
  93. return -16777216;
  94. }
  95. Color c = tile.getColor();
  96. return -16777216 | c.getRed() << 16 | c.getGreen() << 8 | c.getBlue();
  97. }, ModBlocks.cookingPotCopper);
  98. IBlockColor tallGrass = (state, w, pos, tintIndex) ->
  99. {
  100. if(w != null && pos != null)
  101. {
  102. return BiomeColors.getGrassColor(w, pos);
  103. }
  104. return GrassColors.get(0.5D, 1.0D);
  105. };
  106. bColors.register(tallGrass, ModBlocks.tallGrass);
  107. ItemColors iColors = Minecraft.getInstance().getItemColors();
  108. iColors.register((stack, tintIndex) -> tintIndex > 0 ? -1 : ItemColoredSoup.getColor(stack), ModItems.coloredSoup);
  109. iColors.register((stack, tintIndex) -> tintIndex > 0 ? -1 : ((ItemGemStone) stack.getItem()).getColor(stack),
  110. ModItems.gemStone, ModItems.rawGemStone, ModItems.flawlessGemStone);
  111. iColors.register((stack, tintIndex) -> tallGrass.getColor(
  112. ((BlockItem) stack.getItem()).getBlock().getDefaultState(),
  113. null, null, tintIndex), ModBlocks.tallGrass);
  114. }
  115. @SubscribeEvent
  116. public void onClientTick(TickEvent.ClientTickEvent e)
  117. {
  118. if(e.phase == TickEvent.Phase.END)
  119. {
  120. StatusDisplayGui.INSTANCE.tick();
  121. }
  122. }
  123. @SubscribeEvent
  124. public void onRenderNamePlate(RenderNameplateEvent e)
  125. {
  126. e.setResult(Event.Result.DENY);
  127. Entity ent = e.getEntity();
  128. EntityRendererManager erm = Minecraft.getInstance().getRenderManager();
  129. EntityRenderer renderer = erm.getRenderer(ent);
  130. if(ClientReflectionUtils.canRenderName(renderer, ent))
  131. {
  132. double d0 = erm.squareDistanceTo(ent);
  133. if(!(d0 > 4096.0D))
  134. {
  135. boolean flag = !ent.isDiscrete();
  136. MatrixStack mStack = e.getMatrixStack();
  137. mStack.push();
  138. mStack.translate(0.0, ent.getHeight() + 0.5F, 0.0);
  139. mStack.rotate(erm.getCameraOrientation());
  140. mStack.scale(-0.025f, -0.025f, 0.025f);
  141. Matrix4f matrix4f = mStack.getLast().getMatrix();
  142. float f1 = Minecraft.getInstance().gameSettings.getTextBackgroundOpacity(0.25F);
  143. int j = (int) (f1 * 255.0F) << 24;
  144. FontRenderer fontrenderer = erm.getFontRenderer();
  145. ITextComponent text = ent.getCustomName();
  146. if(text == null)
  147. {
  148. text = ent.getDisplayName();
  149. }
  150. String s = text.getFormattedText();
  151. String[] parts = s.split("\n");
  152. IRenderTypeBuffer buffer = e.getRenderTypeBuffer();
  153. Vector3f up = new Vector3f(0.0f, 9.0f * 1.15f * 0.025f, 0.0f);
  154. for(String line : parts)
  155. {
  156. float f2 = -0.5f * fontrenderer.getStringWidth(line);
  157. fontrenderer.renderString(line, f2, 0.0f, 553648127, false, matrix4f, buffer, flag, j, 0xF00000);
  158. if(flag)
  159. {
  160. fontrenderer.renderString(line, f2, 0.0f, -1, false, matrix4f, buffer, false, 0, 0xF00000);
  161. }
  162. matrix4f.translate(up);
  163. }
  164. mStack.pop();
  165. }
  166. }
  167. }
  168. @SubscribeEvent
  169. public void onEmptyLeftClick(PlayerInteractEvent.LeftClickEmpty e)
  170. {
  171. ModPacketHandler.sendLeftClickEmpty();
  172. }
  173. @SubscribeEvent
  174. public void onRenderGui(RenderGameOverlayEvent.Pre e)
  175. {
  176. if(e.getType() == RenderGameOverlayEvent.ElementType.POTION_ICONS)
  177. {
  178. e.setCanceled(true);
  179. }
  180. }
  181. @SubscribeEvent
  182. public void onRenderGui(RenderGameOverlayEvent.Post e)
  183. {
  184. if(e.getType() == RenderGameOverlayEvent.ElementType.EXPERIENCE)
  185. {
  186. PlayerDisplayGui.INSTANCE.paint();
  187. StatusDisplayGui.INSTANCE.paint();
  188. PlayerHeadGui.INSTANCE.paint();
  189. ItemStackDisplayGui.INSTANCE.paint(keyManager);
  190. }
  191. }
  192. @SubscribeEvent
  193. public void onRenderGui(GuiScreenEvent.InitGuiEvent e)
  194. {
  195. // workaround until a client side server leave event is back
  196. Screen gui = e.getGui();
  197. if(gui instanceof MainMenuScreen || gui instanceof MultiplayerScreen)
  198. {
  199. PlayerDisplayGui.INSTANCE.clear();
  200. StatusDisplayGui.INSTANCE.clear();
  201. PlayerHeadGui.INSTANCE.clear();
  202. ItemStackDisplayGui.INSTANCE.clear();
  203. ItemStackDisplayGui.INSTANCE.setActive(false);
  204. }
  205. }
  206. @SubscribeEvent
  207. public void showingTooltip(ItemTooltipEvent e)
  208. {
  209. ItemStack stack = e.getItemStack();
  210. Item item = stack.getItem();
  211. if(item instanceof ArmorItem)
  212. {
  213. CompoundNBT com = stack.getTag();
  214. if(com != null && com.contains("magic"))
  215. {
  216. int magic = com.getInt("magic");
  217. if(magic != 0)
  218. {
  219. List<ITextComponent> list = e.getToolTip();
  220. for(int i = 0; i < list.size(); i++)
  221. {
  222. if(list.get(i).getString().contains("+"))
  223. {
  224. list.add(i, new StringTextComponent(
  225. String.format("%s+%d %s", TextFormatting.BLUE, magic,
  226. LanguageMap.getInstance().translateKey("magicarmor"))));
  227. break;
  228. }
  229. }
  230. }
  231. }
  232. }
  233. }
  234. /*@SubscribeEvent
  235. public void test(net.minecraftforge.client.event.ClientChatEvent e)
  236. {
  237. net.minecraft.world.chunk.Chunk c = Minecraft.getInstance().player.world.getChunkAt(Minecraft.getInstance().player.getPosition());
  238. if(!e.getMessage().equals("run"))
  239. {
  240. return;
  241. }
  242. int cluster = 0;
  243. int blocks = 0;
  244. net.minecraft.util.math.BlockPos.MutableBlockPos pos = new net.minecraft.util.math.BlockPos.MutableBlockPos();
  245. for(int x = 0; x < 16; x += 4)
  246. {
  247. for(int z = 0; z < 16; z += 4)
  248. {
  249. for(int y = 0; y < 256; y += 16)
  250. {
  251. cluster++;
  252. pos.setPos(x, y, z);
  253. blocks++;
  254. net.minecraft.block.Block current = c.getBlockState(pos).getBlock();
  255. for(int mx = 0; mx < 4; mx++)
  256. {
  257. for(int mz = 0; mz < 4; mz++)
  258. {
  259. for(int my = 0; my < 16; my++)
  260. {
  261. pos.setPos(x + mx, y + my, z + mz);
  262. net.minecraft.block.Block next = c.getBlockState(pos).getBlock();
  263. if(current != next)
  264. {
  265. current = next;
  266. blocks++;
  267. }
  268. }
  269. }
  270. }
  271. }
  272. }
  273. }
  274. org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger();
  275. logger.info("------------------------------------");
  276. logger.info(String.format("cluster: %d", cluster));
  277. logger.info(String.format("blocks: %d", blocks));
  278. logger.info(String.format("compression rate: %f", (16 * 16 * 256 * 16) / (cluster * 64.0 + blocks * 24.0)));
  279. cluster = 0;
  280. blocks = 0;
  281. for(int x = 0; x < 16; x++)
  282. {
  283. for(int z = 0; z < 16; z++)
  284. {
  285. cluster++;
  286. pos.setPos(x, 0, z);
  287. blocks++;
  288. net.minecraft.block.Block current = c.getBlockState(pos).getBlock();
  289. for(int y = 0; y < 256; y++)
  290. {
  291. pos.setPos(x, y, z);
  292. net.minecraft.block.Block next = c.getBlockState(pos).getBlock();
  293. if(current != next)
  294. {
  295. current = next;
  296. blocks++;
  297. }
  298. }
  299. }
  300. }
  301. logger.info("------");
  302. logger.info(String.format("cluster %d blocks", cluster, blocks));
  303. logger.info(String.format("cluster: %d", cluster));
  304. logger.info(String.format("blocks: %d", blocks));
  305. logger.info(String.format("compression rate: %f", (16 * 16 * 256 * 16) / (cluster * 64.0 + blocks * 24.0)));
  306. cluster = 1;
  307. blocks = 1;
  308. pos.setPos(0, 0, 0);
  309. net.minecraft.block.Block current = c.getBlockState(pos).getBlock();
  310. for(int y = 0; y < 256; y++)
  311. {
  312. for(int x = 0; x < 16; x++)
  313. {
  314. for(int z = 0; z < 16; z++)
  315. {
  316. pos.setPos(x, y, z);
  317. net.minecraft.block.Block next = c.getBlockState(pos).getBlock();
  318. if(current != next)
  319. {
  320. current = next;
  321. blocks++;
  322. }
  323. }
  324. }
  325. }
  326. logger.info("------");
  327. logger.info(String.format("cluster %d blocks", cluster, blocks));
  328. logger.info(String.format("cluster: %d", cluster));
  329. logger.info(String.format("blocks: %d", blocks));
  330. logger.info(String.format("compression rate: %f", (16 * 16 * 256 * 16) / (cluster * 64.0 + blocks * 24.0)));
  331. }*/
  332. }