EntityCommands.java 12 KB

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