NmsUtilities.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package me.km.nms;
  2. import java.util.List;
  3. import me.hammerle.code.Script;
  4. import me.hammerle.exceptions.IllegalStringException;
  5. import me.km.api.Location;
  6. import net.minecraft.block.Block;
  7. import net.minecraft.block.state.IBlockState;
  8. import net.minecraft.entity.Entity;
  9. import net.minecraft.entity.EntityLiving;
  10. import net.minecraft.entity.player.EntityPlayer;
  11. import net.minecraft.entity.player.EntityPlayerMP;
  12. import net.minecraft.init.Blocks;
  13. import net.minecraft.inventory.IInventory;
  14. import net.minecraft.nbt.JsonToNBT;
  15. import net.minecraft.nbt.NBTException;
  16. import net.minecraft.nbt.NBTTagCompound;
  17. import net.minecraft.network.play.server.SPacketChat;
  18. import net.minecraft.tileentity.TileEntity;
  19. import net.minecraft.util.math.BlockPos;
  20. import net.minecraft.util.math.Vec3d;
  21. import net.minecraft.util.text.Style;
  22. import net.minecraft.util.text.TextComponentString;
  23. import net.minecraft.util.text.TextFormatting;
  24. import net.minecraft.util.text.event.ClickEvent;
  25. import net.minecraft.world.World;
  26. import net.minecraft.world.chunk.storage.AnvilChunkLoader;
  27. public class NmsUtilities
  28. {
  29. // -----------------------------------------------------------------------------------
  30. // Entity Tools
  31. // -----------------------------------------------------------------------------------
  32. public static List<Entity> getCollidingEntities(Entity e, double x, double y, double z)
  33. {
  34. return e.getEntityWorld().getEntitiesWithinAABBExcludingEntity(e, e.getCollisionBoundingBox().expand(x, y, z));
  35. }
  36. public static List<Entity> getCollidingEntities(Entity e)
  37. {
  38. return getCollidingEntities(e, 0, 0, 0);
  39. }
  40. public static void walkTo(EntityLiving liv, Vec3d v, double speed)
  41. {
  42. liv.getMoveHelper().setMoveTo(v.xCoord, v.yCoord, v.zCoord, speed);
  43. }
  44. public static void canDestroyBlocks(EntityLiving liv)
  45. {
  46. liv.tasks.addTask(1, new PathfinderGoalDestroyBlock(liv));
  47. }
  48. public static String getNbtString(Entity ent)
  49. {
  50. NBTTagCompound tag = new NBTTagCompound();
  51. ent.writeToNBTAtomically(tag);
  52. return tag.toString();
  53. }
  54. public static Entity getEntityFromNbtString(Script sc, String s, Location l)
  55. {
  56. try
  57. {
  58. NBTTagCompound nbt = JsonToNBT.getTagFromJson(s);
  59. Vec3d v = l.getPos();
  60. Entity ent = AnvilChunkLoader.readWorldEntityPos(nbt, l.getWorld(), v.xCoord, v.yCoord, v.zCoord, true);
  61. if(ent == null)
  62. {
  63. return null;
  64. }
  65. else
  66. {
  67. ent.setLocationAndAngles(v.xCoord, v.yCoord, v.zCoord, ent.rotationYaw, ent.rotationPitch);
  68. if(ent instanceof EntityLiving)
  69. {
  70. ((EntityLiving) ent).onInitialSpawn(ent.getEntityWorld().getDifficultyForLocation(new BlockPos(ent)), null);
  71. }
  72. }
  73. return ent;
  74. }
  75. catch(NBTException ex)
  76. {
  77. throw new IllegalStringException(sc, s);
  78. }
  79. }
  80. // -------------------------------------------------------------------------
  81. // Block Tools
  82. // -------------------------------------------------------------------------
  83. @SuppressWarnings(value = {"unchecked", "deprecation"})
  84. public static void setBlockWithData(World w, BlockPos pos, int dv, Block block, String data)
  85. {
  86. NBTTagCompound nbttagcompound = new NBTTagCompound();
  87. boolean flag = false;
  88. if (data != null && block.hasTileEntity())
  89. {
  90. try
  91. {
  92. nbttagcompound = JsonToNBT.getTagFromJson(data);
  93. flag = true;
  94. }
  95. catch(NBTException ex)
  96. {
  97. throw new IllegalStringException(data);
  98. }
  99. }
  100. TileEntity tileentity = w.getTileEntity(pos);
  101. if (tileentity != null)
  102. {
  103. if (tileentity instanceof IInventory)
  104. {
  105. ((IInventory) tileentity).clear();
  106. }
  107. w.setBlockState(pos, Blocks.AIR.getDefaultState(), block == Blocks.AIR ? 2 : 4);
  108. }
  109. IBlockState iblockdata = block.getStateFromMeta(dv);
  110. if(w.setBlockState(pos, iblockdata, 2))
  111. {
  112. if (flag)
  113. {
  114. TileEntity tileentity1 = w.getTileEntity(pos);
  115. if (tileentity1 != null)
  116. {
  117. nbttagcompound.setInteger("x", pos.getX());
  118. nbttagcompound.setInteger("y", pos.getY());
  119. nbttagcompound.setInteger("z", pos.getZ());
  120. tileentity1.readFromNBT(nbttagcompound);
  121. }
  122. }
  123. w.notifyNeighborsRespectDebug(pos, iblockdata.getBlock(), false);
  124. }
  125. }
  126. // -------------------------------------------------------------------------
  127. // NBT Tools
  128. // -------------------------------------------------------------------------
  129. public static String highlightNbtSyntax(String text)
  130. {
  131. StringBuilder sb = new StringBuilder(text);
  132. int counter = 0;
  133. for(char c : text.toCharArray())
  134. {
  135. switch(c)
  136. {
  137. case '}':
  138. sb.replace(counter, counter + 1, "§c} §r");
  139. counter += 6;
  140. continue;
  141. case '{':
  142. sb.replace(counter, counter + 1, "§c{§r");
  143. counter += 5;
  144. continue;
  145. case ']':
  146. sb.replace(counter, counter + 1, "§c] §r");
  147. counter += 6;
  148. continue;
  149. case '[':
  150. sb.replace(counter, counter + 1, "§c[§r");
  151. counter += 5;
  152. continue;
  153. case ',':
  154. sb.replace(counter, counter + 1, "§6, §r");
  155. counter += 6;
  156. continue;
  157. case '"':
  158. sb.replace(counter, counter + 1, "§a\"");
  159. counter += 3;
  160. continue;
  161. case ':':
  162. sb.replace(counter, counter + 1, "§8:");
  163. counter += 3;
  164. continue;
  165. case '0':
  166. sb.replace(counter, counter + 1, "§50");
  167. counter += 3;
  168. continue;
  169. case '1':
  170. sb.replace(counter, counter + 1, "§51");
  171. counter += 3;
  172. continue;
  173. case '2':
  174. sb.replace(counter, counter + 1, "§52");
  175. counter += 3;
  176. continue;
  177. case '3':
  178. sb.replace(counter, counter + 1, "§53");
  179. counter += 3;
  180. continue;
  181. case '4':
  182. sb.replace(counter, counter + 1, "§54");
  183. counter += 3;
  184. continue;
  185. case '5':
  186. sb.replace(counter, counter + 1, "§55");
  187. counter += 3;
  188. continue;
  189. case '6':
  190. sb.replace(counter, counter + 1, "§56");
  191. counter += 3;
  192. continue;
  193. case '7':
  194. sb.replace(counter, counter + 1, "§57");
  195. counter += 3;
  196. continue;
  197. case '8':
  198. sb.replace(counter, counter + 1, "§58");
  199. counter += 3;
  200. continue;
  201. case '9':
  202. sb.replace(counter, counter + 1, "§59");
  203. counter += 3;
  204. continue;
  205. default:
  206. counter++;
  207. }
  208. }
  209. return sb.toString();
  210. }
  211. // -------------------------------------------------------------------------
  212. // Copy Tools
  213. // -------------------------------------------------------------------------
  214. public static void sendCopyableText(EntityPlayer p, String s)
  215. {
  216. s = s.replace('{', 'Ɛ');
  217. s = s.replace('}', 'Ƒ');
  218. s = s.replace('[', 'ƒ');
  219. s = s.replace(']', 'Ɠ');
  220. s = s.replace('(', 'ƕ');
  221. s = s.replace(')', 'Ɩ');
  222. s = s.replace(" ", "%20");
  223. s = s.replace('\'', 'Ɩ');
  224. s = s.replace('"', 'Ɩ');
  225. s = s.replace("\\", "");
  226. sendLink(p, "Hier drücken zum Kopieren.", "http://minecraft.hammerle.me/showtext.php/?text=" + s);
  227. }
  228. private static void sendLink(EntityPlayer p, String s, String link)
  229. {
  230. TextComponentString text = new TextComponentString(s);
  231. Style style = text.getStyle();
  232. style.setColor(TextFormatting.RED);
  233. style.setBold(true);
  234. style.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, link));
  235. p.sendMessage(text);
  236. }
  237. // -------------------------------------------------------------------------
  238. // Action-Bar
  239. // -------------------------------------------------------------------------
  240. public static void sendActionBar(EntityPlayerMP p, String message)
  241. {
  242. p.connection.sendPacket(new SPacketChat(new TextComponentString(message), (byte) 2));
  243. }
  244. }