EntityCommands.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package me.km.snuviscript.commands;
  2. import me.hammerle.snuviscript.code.ScriptManager;
  3. import static me.km.snuviscript.commands.CommandUtils.getNamedClass;
  4. import me.km.utils.Location;
  5. import me.km.utils.Mapper;
  6. import me.km.utils.Utils;
  7. import net.minecraft.enchantment.EnchantmentHelper;
  8. import net.minecraft.entity.*;
  9. import net.minecraft.entity.ai.attributes.Attributes;
  10. import net.minecraft.entity.item.*;
  11. import net.minecraft.entity.monster.CreeperEntity;
  12. import net.minecraft.entity.passive.horse.AbstractHorseEntity;
  13. import net.minecraft.entity.passive.SheepEntity;
  14. import net.minecraft.entity.passive.TameableEntity;
  15. import net.minecraft.entity.player.PlayerEntity;
  16. import net.minecraft.entity.player.ServerPlayerEntity;
  17. import net.minecraft.entity.projectile.*;
  18. import net.minecraft.item.ItemStack;
  19. import net.minecraft.nbt.CompoundNBT;
  20. import net.minecraft.nbt.JsonToNBT;
  21. import net.minecraft.potion.Effect;
  22. import net.minecraft.potion.EffectInstance;
  23. import net.minecraft.potion.PotionUtils;
  24. import net.minecraft.util.DamageSource;
  25. import net.minecraft.util.Direction;
  26. import net.minecraft.util.ResourceLocation;
  27. import net.minecraft.util.math.vector.Vector3d;
  28. import net.minecraft.util.text.StringTextComponent;
  29. import net.minecraft.world.World;
  30. import net.minecraft.world.server.ServerWorld;
  31. public class EntityCommands {
  32. @SuppressWarnings("unchecked")
  33. public static void registerFunctions(ScriptManager sm) {
  34. sm.registerConsumer("entity.setnopickup", (sc, in) -> {
  35. ((AbstractArrowEntity) in[0].get(sc)).pickupStatus =
  36. AbstractArrowEntity.PickupStatus.DISALLOWED;
  37. });
  38. sm.registerFunction("entity.getenchantmentmodifier",
  39. (sc, in) -> EnchantmentHelper.getEnchantmentModifierDamage(
  40. ((LivingEntity) in[0].get(sc)).getArmorInventoryList(),
  41. (DamageSource) in[1].get(sc)));
  42. sm.registerConsumer("entity.setburning",
  43. (sc, in) -> ((Entity) in[0].get(sc)).forceFireTicks(in[1].getInt(sc)));
  44. sm.registerFunction("entity.isburning", (sc, in) -> ((Entity) in[0].get(sc)).isBurning());
  45. sm.registerFunction("entity.getlook", (sc, in) -> {
  46. Object[] o = new Object[3];
  47. Vector3d v = ((Entity) in[0].get(sc)).getLookVec();
  48. o[0] = v.x;
  49. o[1] = v.y;
  50. o[2] = v.z;
  51. return o;
  52. });
  53. sm.registerFunction("entity.getmotion", (sc, in) -> {
  54. Object[] o = new Object[3];
  55. Vector3d v = ((Entity) in[0].get(sc)).getMotion();
  56. o[0] = v.x;
  57. o[1] = v.y;
  58. o[2] = v.z;
  59. return o;
  60. });
  61. sm.registerFunction("entity.getlocation", (sc, in) -> new Location((Entity) in[0].get(sc)));
  62. sm.registerConsumer("entity.setname", (sc, in) -> {
  63. Entity ent = (Entity) in[0].get(sc);
  64. ent.setCustomName(new StringTextComponent(in[1].getString(sc)));
  65. if(in.length >= 3) {
  66. ent.setCustomNameVisible(in[2].getBoolean(sc));
  67. return;
  68. }
  69. ent.setCustomNameVisible(false);
  70. });
  71. sm.registerFunction("entity.getname",
  72. (sc, in) -> ((Entity) in[0].get(sc)).getDisplayName().getString());
  73. sm.registerConsumer("entity.throw", (sc, in) -> {
  74. Entity ent = (Entity) in[0].get(sc);
  75. ent.setMotion(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc));
  76. ent.velocityChanged = true;
  77. });
  78. sm.registerConsumer("entity.teleport", (sc, in) -> {
  79. Entity ent = (Entity) in[0].get(sc);
  80. Location l = (Location) in[1].get(sc);
  81. if(l.getWorld() == null) {
  82. throw new IllegalArgumentException("world must not be null");
  83. }
  84. if(ent instanceof ServerPlayerEntity) {
  85. ServerPlayerEntity p = (ServerPlayerEntity) ent;
  86. p.stopRiding();
  87. if(p.isSleeping()) {
  88. p.stopSleepInBed(true, true);
  89. }
  90. float yaw = l.getYaw() != 0.0f ? l.getYaw() : ent.rotationYaw;
  91. float pitch = l.getPitch() != 0.0f ? l.getPitch() : ent.rotationPitch;
  92. p.teleport((ServerWorld) l.getWorld(), l.getX(), l.getY(), l.getZ(), yaw, pitch);
  93. } else {
  94. if(ent.world != l.getWorld()) {
  95. ServerWorld ws = (ServerWorld) l.getWorld();
  96. ent.changeDimension(ws);
  97. }
  98. float yaw = l.getYaw() != 0.0f ? l.getYaw() : ent.rotationYaw;
  99. float pitch = l.getPitch() != 0.0f ? l.getPitch() : ent.rotationPitch;
  100. ent.setLocationAndAngles(l.getX(), l.getY(), l.getZ(), yaw, pitch);
  101. }
  102. });
  103. sm.registerConsumer("entity.removeall", (sc, in) -> {
  104. Class<? extends Entity> c =
  105. (Class<? extends Entity>) getNamedClass(in[0].getString(sc));
  106. if(c == Entity.class) {
  107. return;
  108. }
  109. Location l = (Location) in[1].get(sc);
  110. Utils.getEntities(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[2].getDouble(sc), c)
  111. .stream().forEach(ent -> {
  112. ent.remove();
  113. });
  114. });
  115. sm.registerConsumer("entity.remove", (sc, in) -> ((Entity) in[0].get(sc)).remove());
  116. sm.registerConsumer("entity.setinvulnerable", (sc, in) -> {
  117. ((Entity) in[0].get(sc)).setInvulnerable(in[1].getBoolean(sc));
  118. });
  119. sm.registerConsumer("entity.setsilent", (sc, in) -> {
  120. ((Entity) in[0].get(sc)).setSilent(in[1].getBoolean(sc));
  121. });
  122. sm.registerConsumer("entity.setinvisible", (sc, in) -> {
  123. ((Entity) in[0].get(sc)).setInvisible(in[1].getBoolean(sc));
  124. });
  125. sm.registerConsumer("entity.mount", (sc, in) -> {
  126. ((Entity) in[0].get(sc)).startRiding(((Entity) in[1].get(sc)));
  127. });
  128. sm.registerConsumer("entity.unmount", (sc, in) -> {
  129. ((Entity) in[0].get(sc)).stopRiding();
  130. });
  131. sm.registerConsumer("entity.addeffect", (sc, in) -> {
  132. LivingEntity base = (LivingEntity) in[0].get(sc);
  133. Effect potion = Mapper.getPotion(in[1].getString(sc));
  134. if(potion == null) { // doing this only to prevent EffectInstance doing shit
  135. throw new IllegalArgumentException("potion does not exist");
  136. }
  137. if(base.isPotionActive(potion)) {
  138. base.removePotionEffect(potion);
  139. }
  140. boolean showParticles = in.length >= 5 ? in[4].getBoolean(sc) : true;
  141. base.addPotionEffect(new EffectInstance(potion, in[2].getInt(sc), in[3].getInt(sc),
  142. false, showParticles));
  143. });
  144. sm.registerConsumer("entity.cleareffects", (sc, in) -> {
  145. ((LivingEntity) in[0].get(sc)).clearActivePotions();
  146. });
  147. sm.registerFunction("entity.geteffectamplifier", (sc, in) -> {
  148. EffectInstance effect = ((LivingEntity) in[0].get(sc))
  149. .getActivePotionEffect(Mapper.getPotion(in[1].getString(sc)));
  150. return effect == null ? 0 : effect.getAmplifier() + 1;
  151. });
  152. sm.registerConsumer("entity.spawnitemframe", (sc, in) -> {
  153. Location l = ((Location) in[0].get(sc));
  154. ItemFrameEntity frame = new ItemFrameEntity(l.getWorld(), l.getBlockPos(),
  155. Direction.byName(in[1].getString(sc)));
  156. frame.setDisplayedItem(((ItemStack) in[2].get(sc))); // copy happens in internals
  157. l.getWorld().addEntity(frame);
  158. });
  159. sm.registerFunction("entity.getitemfromframe",
  160. (sc, in) -> ((ItemFrameEntity) in[0].get(sc)).getDisplayedItem());
  161. sm.registerFunction("entity.get", (sc, in) -> {
  162. Location l = (Location) in[0].get(sc);
  163. return Utils.getEntity(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[1].getDouble(sc),
  164. (Class<? extends Entity>) getNamedClass(in[2].getString(sc)));
  165. });
  166. sm.registerFunction("entity.getpotiontype",
  167. (sc, in) -> PotionUtils.getPotionFromItem(((PotionEntity) in[0].get(sc)).getItem())
  168. .getRegistryName().toString());
  169. sm.registerConsumer("entity.setgravity", (sc, in) -> {
  170. ((Entity) in[0].get(sc)).setNoGravity(!in[1].getBoolean(sc));
  171. });
  172. sm.registerFunction("entity.iswet", (sc, in) -> ((Entity) in[0].get(sc)).isWet());
  173. sm.registerConsumer("entity.setpickupdelay", (sc, in) -> {
  174. ((ItemEntity) in[0].get(sc)).setPickupDelay(in[1].getInt(sc));
  175. });
  176. sm.registerFunction("entity.spawn", (sc, in) -> {
  177. ResourceLocation type = new ResourceLocation(in[0].getString(sc));
  178. Location l = (Location) in[1].get(sc);
  179. if(!World.isInvalidPosition(l.getBlockPos())) {
  180. return null;
  181. }
  182. CompoundNBT nbt = in.length >= 3 ? JsonToNBT.getTagFromJson(in[2].getString(sc))
  183. : new CompoundNBT();
  184. nbt.putString("id", type.toString());
  185. ServerWorld sw = (ServerWorld) l.getWorld();
  186. Entity ent = EntityType.loadEntityAndExecute(nbt, sw, (e) -> {
  187. e.setLocationAndAngles(l.getX(), l.getY(), l.getZ(), e.rotationYaw,
  188. e.rotationPitch);
  189. return e;
  190. });
  191. if(ent == null) {
  192. return ent;
  193. }
  194. if(ent instanceof MobEntity) {
  195. ((MobEntity) ent).onInitialSpawn(sw, sw.getDifficultyForLocation(ent.getPosition()),
  196. SpawnReason.COMMAND, null, null);
  197. }
  198. if(!sw.func_242106_g(ent)) {
  199. return null;
  200. }
  201. return ent;
  202. });
  203. sm.registerFunction("entity.near", (sc, in) -> {
  204. Object o = in[0].get(sc);
  205. if(o instanceof Location) {
  206. return Utils.getEntities((Location) o, in[1].getDouble(sc));
  207. }
  208. return Utils.getEntities((Entity) o, in[1].getDouble(sc));
  209. });
  210. sm.registerConsumer("entity.setspeed", (sc, in) -> {
  211. ((LivingEntity) in[0].get(sc)).getAttribute(Attributes.MOVEMENT_SPEED)
  212. .setBaseValue(in[1].getDouble(sc));
  213. });
  214. sm.registerConsumer("entity.setgrowingage", (sc, in) -> {
  215. ((AgeableEntity) in[0].get(sc)).setGrowingAge(in[1].getInt(sc));
  216. });
  217. sm.registerFunction("entity.gettype",
  218. (sc, in) -> ((Entity) in[0].get(sc)).getType().getRegistryName().getPath());
  219. sm.registerFunction("entity.issneaking",
  220. (sc, in) -> ((Entity) in[0].get(sc)).isCrouching());
  221. sm.registerFunction("entity.issneaking",
  222. (sc, in) -> ((Entity) in[0].get(sc)).isCrouching());
  223. sm.registerFunction("sheep.issheared",
  224. (sc, in) -> ((SheepEntity) in[0].get(sc)).getSheared());
  225. sm.registerFunction("sheep.getcolor",
  226. (sc, in) -> ((SheepEntity) in[0].get(sc)).getFleeceColor().toString());
  227. sm.registerConsumer("creeper.explode",
  228. (sc, in) -> ((CreeperEntity) in[0].get(sc)).ignite());
  229. sm.registerFunction("pet.istamed", (sc, in) -> {
  230. Object o = in[0].get(sc);
  231. if(o instanceof AbstractHorseEntity) {
  232. return ((AbstractHorseEntity) o).isTame();
  233. }
  234. return ((TameableEntity) o).isTamed();
  235. });
  236. sm.registerConsumer("pet.settamed", (sc, in) -> {
  237. Object o = in[0].get(sc);
  238. boolean b = in[1].getBoolean(sc);
  239. if(o instanceof AbstractHorseEntity) {
  240. AbstractHorseEntity h = (AbstractHorseEntity) o;
  241. if(in.length >= 3) {
  242. h.setTamedBy((PlayerEntity) in[2].get(sc));
  243. }
  244. h.setHorseTamed(b);
  245. return;
  246. }
  247. TameableEntity t = (TameableEntity) o;
  248. if(in.length >= 3) {
  249. t.setTamedBy((PlayerEntity) in[2].get(sc));
  250. }
  251. t.setTamed(b);
  252. });
  253. sm.registerFunction("pet.getowner", (sc, in) -> {
  254. Object o = in[0].get(sc);
  255. if(o instanceof AbstractHorseEntity) {
  256. return ((AbstractHorseEntity) o).getOwnerUniqueId();
  257. }
  258. return ((TameableEntity) in[0].get(sc)).getOwnerId();
  259. });
  260. }
  261. }