ScriptEvents.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. package me.km.snuviscript;
  2. import java.util.*;
  3. import java.util.function.Consumer;
  4. import java.util.stream.Collectors;
  5. import me.hammerle.snuviscript.code.*;
  6. import me.hammerle.snuviscript.inputprovider.Variable;
  7. import me.kcm.BlockHarvest;
  8. import me.kcm.Craft;
  9. import me.km.utils.Utils;
  10. import me.km.entities.*;
  11. import me.km.events.CommandEvent;
  12. import me.km.inventory.ModInventory;
  13. import me.km.utils.*;
  14. import net.minecraft.block.*;
  15. import net.minecraft.command.ICommandSource;
  16. import net.minecraft.entity.*;
  17. import net.minecraft.entity.player.*;
  18. import net.minecraft.inventory.*;
  19. import net.minecraft.inventory.container.ClickType;
  20. import net.minecraft.item.ItemStack;
  21. import net.minecraft.item.crafting.ICraftingRecipe;
  22. import net.minecraft.item.crafting.IRecipeType;
  23. import net.minecraft.loot.LootContext;
  24. import net.minecraft.loot.LootParameters;
  25. import net.minecraft.network.play.server.SSetSlotPacket;
  26. import net.minecraft.server.MinecraftServer;
  27. import net.minecraft.server.management.PlayerList;
  28. import net.minecraft.tileentity.TileEntity;
  29. import net.minecraft.util.math.*;
  30. import net.minecraft.util.math.vector.Vector3d;
  31. import net.minecraft.util.text.*;
  32. import net.minecraft.world.*;
  33. import net.minecraft.world.server.ServerWorld;
  34. import net.minecraftforge.event.*;
  35. import net.minecraftforge.event.entity.*;
  36. import net.minecraftforge.event.entity.item.ItemTossEvent;
  37. import net.minecraftforge.event.entity.living.*;
  38. import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;
  39. import net.minecraftforge.event.entity.player.*;
  40. import net.minecraftforge.event.world.*;
  41. import net.minecraftforge.eventbus.api.*;
  42. import net.minecraftforge.event.entity.player.PlayerEvent;
  43. import net.minecraftforge.eventbus.api.Event.Result;
  44. public class ScriptEvents implements BlockHarvest, Craft {
  45. private static void setLiving(Script sc, LivingEntity ent) {
  46. sc.setVar("living_entity", ent);
  47. }
  48. private static void setItem(Script sc, ItemStack stack) {
  49. sc.setVar("item", stack);
  50. }
  51. private static void setPlayer(Script sc, PlayerEntity p) {
  52. sc.setVar("player", p);
  53. // deprecated
  54. sc.setVar("player_name", p == null ? null : p.getName().getString());
  55. }
  56. @SuppressWarnings("")
  57. private static void setBlock(Script sc, World w, BlockPos pos, BlockState state) {
  58. sc.setVar("block_loc", new Location(w, pos));
  59. sc.setVar("block_type", state.getBlock().getRegistryName().toString());
  60. sc.setVar("block", state.getBlock());
  61. }
  62. @SuppressWarnings("")
  63. private static void setBlock(Script sc, World w, BlockPos pos) {
  64. BlockState state = w.getBlockState(pos);
  65. sc.setVar("block_loc", new Location(w, pos));
  66. sc.setVar("block_type", state.getBlock().getRegistryName().toString());
  67. sc.setVar("block", state.getBlock());
  68. }
  69. private static void setEntity(Script sc, Entity ent) {
  70. sc.setVar("entity", ent);
  71. }
  72. private final Scripts scripts;
  73. private final MinecraftServer server;
  74. public ScriptEvents(Scripts scripts, MinecraftServer server) {
  75. this.scripts = scripts;
  76. this.server = server;
  77. }
  78. private static void nothing(Script sc) {}
  79. private void handleEvent(Event e, String event, Consumer<Script> before,
  80. Consumer<Script> after) {
  81. if(e.isCancelable()) {
  82. scripts.getScriptManager().callEvent(event, sc -> {
  83. before.accept(sc);
  84. sc.setVar("cancel", e.isCanceled());
  85. }, sc -> {
  86. after.accept(sc);
  87. handleVar(sc, event, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  88. });
  89. } else {
  90. scripts.getScriptManager().callEvent(event, before, after);
  91. }
  92. }
  93. private void handleEvent(Event e, String event, Consumer<Script> before) {
  94. handleEvent(e, event, before, ScriptEvents::nothing);
  95. }
  96. private void handleEvent(String event, Consumer<Script> before, Consumer<Script> after) {
  97. scripts.getScriptManager().callEvent(event, before, after);
  98. }
  99. private void handleEvent(String event, Consumer<Script> before) {
  100. handleEvent(event, before, ScriptEvents::nothing);
  101. }
  102. private void handleVar(Script sc, String event, String name, Consumer<Variable> c) {
  103. try {
  104. ifVarNotNull(sc, name, c);
  105. } catch(Exception ex) {
  106. scripts.getLogger().print(String.format("invalid var in '%s' event", event), ex, null,
  107. sc.getName(), sc, sc.getStackTrace());
  108. }
  109. }
  110. private void ifVarNotNull(Script sc, String name, Consumer<Variable> c) {
  111. Variable v = sc.getVar(name);
  112. if(v != null) {
  113. c.accept(v);
  114. }
  115. }
  116. private void simpleCancel(Script sc, Event e, String name) {
  117. try {
  118. ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  119. } catch(Exception ex) {
  120. scripts.getLogger().print(String.format("invalid var in '%s' event", name), ex, null,
  121. sc.getName(), sc, sc.getStackTrace());
  122. }
  123. }
  124. public void onPlayerDataTick(PlayerEntity p, String var) {
  125. handleEvent("player_data_tick", sc -> {
  126. setPlayer(sc, p);
  127. sc.setVar("var", var);
  128. });
  129. }
  130. public void onPlayerStartElytra(PlayerEntity p) {
  131. handleEvent("player_elytra_start", sc -> {
  132. setPlayer(sc, p);
  133. });
  134. }
  135. public void onPlayerStopElytra(PlayerEntity p) {
  136. handleEvent("player_elytra_stop", sc -> {
  137. setPlayer(sc, p);
  138. });
  139. }
  140. public void onPlayerMove(PlayerEntity p, int id) {
  141. handleEvent("player_move", sc -> {
  142. setPlayer(sc, p);
  143. sc.setVar("id", (double) id);
  144. });
  145. }
  146. public boolean onInventoryClick(Script script, ITextComponent text, ModInventory inv, int slot,
  147. ClickType click, PlayerEntity p) {
  148. scripts.getScriptManager().callEvent("inv_click", script, sc -> {
  149. setPlayer(sc, p);
  150. sc.setVar("inv", inv);
  151. sc.setVar("inv_id", (double) inv.getModId());
  152. sc.setVar("inv_name", text.getString());
  153. sc.setVar("inv_slot", (double) slot);
  154. setItem(sc, inv.getStackInSlot(slot));
  155. sc.setVar("cancel", false);
  156. }, ScriptEvents::nothing);
  157. Variable v = script.getVar("cancel");
  158. return v != null && v.getBoolean(script);
  159. }
  160. public void onInventoryClose(Script script, ITextComponent text, ModInventory inv,
  161. PlayerEntity p) {
  162. scripts.getScriptManager().callEvent("inv_close", script, sc -> {
  163. setPlayer(sc, p);
  164. sc.setVar("inv", inv);
  165. sc.setVar("inv_id", (double) inv.getModId());
  166. sc.setVar("inv_name", text.getString());
  167. }, ScriptEvents::nothing);
  168. }
  169. public void onHumanHurt(Entity attacker, EntityHuman h) {
  170. handleEvent("human_hurt", sc -> {
  171. setEntity(sc, attacker);
  172. sc.setVar("human", h);
  173. });
  174. }
  175. @SubscribeEvent(receiveCanceled = true)
  176. public void onPlayerPostRespawn(PlayerEvent.PlayerRespawnEvent e) {
  177. handleEvent("player_post_respawn", sc -> setPlayer(sc, e.getPlayer()));
  178. }
  179. public void onPlayerPreRespawn(PlayerEntity p) {
  180. handleEvent("player_pre_respawn", sc -> setPlayer(sc, p));
  181. }
  182. @SubscribeEvent(receiveCanceled = true)
  183. public void onLivingDamage(LivingDamageEvent e) {
  184. handleEvent(e, "living_damage", (sc) -> {
  185. setLiving(sc, e.getEntityLiving());
  186. sc.setVar("damage_source", e.getSource());
  187. sc.setVar("damage_amount", (double) e.getAmount());
  188. }, (sc) -> {
  189. handleVar(sc, "living_damage", "damage_amount", v -> e.setAmount(v.getFloat(sc)));
  190. });
  191. }
  192. @SubscribeEvent(receiveCanceled = true)
  193. public void onLivingHurt(LivingHurtEvent e) {
  194. handleEvent(e, "living_hurt", (sc) -> {
  195. setLiving(sc, e.getEntityLiving());
  196. sc.setVar("damage_source", e.getSource());
  197. sc.setVar("damage_amount", (double) e.getAmount());
  198. }, (sc) -> {
  199. handleVar(sc, "living_hurt", "damage_amount", v -> e.setAmount(v.getFloat(sc)));
  200. });
  201. }
  202. @SubscribeEvent(receiveCanceled = true)
  203. public void onLivingAttacked(LivingAttackEvent e) {
  204. handleEvent(e, "living_pre_hurt", (sc) -> {
  205. setLiving(sc, e.getEntityLiving());
  206. sc.setVar("damage_source", e.getSource());
  207. sc.setVar("damage_amount", (double) e.getAmount());
  208. });
  209. }
  210. @SubscribeEvent(receiveCanceled = true)
  211. public void onLivingHeal(LivingHealEvent e) {
  212. handleEvent(e, "living_heal", (sc) -> {
  213. setLiving(sc, e.getEntityLiving());
  214. sc.setVar("heal_amount", (double) e.getAmount());
  215. }, (sc) -> {
  216. handleVar(sc, "living_heal", "heal_amount", v -> e.setAmount(v.getFloat(sc)));
  217. });
  218. }
  219. @SubscribeEvent(receiveCanceled = true)
  220. public void onLivingDeath(LivingDeathEvent e) {
  221. handleEvent(e, "living_death", (sc) -> {
  222. setLiving(sc, e.getEntityLiving());
  223. sc.setVar("damage_source", e.getSource());
  224. });
  225. }
  226. @SubscribeEvent(receiveCanceled = true)
  227. public void onLivingDrop(LivingDropsEvent e) {
  228. handleEvent(e, "living_drop", (sc) -> {
  229. setLiving(sc, e.getEntityLiving());
  230. sc.setVar("drops", e.getDrops());
  231. sc.setVar("damage_source", e.getSource());
  232. sc.setVar("looting", (double) e.getLootingLevel());
  233. });
  234. }
  235. @SubscribeEvent(receiveCanceled = true)
  236. public void onLivingExperienceDrop(LivingExperienceDropEvent e) {
  237. handleEvent(e, "living_experience_drop", (sc) -> {
  238. setLiving(sc, e.getEntityLiving());
  239. sc.setVar("experience", (double) e.getDroppedExperience());
  240. }, (sc) -> {
  241. handleVar(sc, "living_experience_drop", "experience",
  242. v -> e.setDroppedExperience(v.getInt(sc)));
  243. });
  244. }
  245. @SubscribeEvent(receiveCanceled = true)
  246. public void onProjectileHit(ProjectileImpactEvent e) {
  247. final Entity hitEntity;
  248. final Location loc;
  249. RayTraceResult ray = e.getRayTraceResult();
  250. switch(ray.getType()) {
  251. case ENTITY:
  252. hitEntity = ((EntityRayTraceResult) e.getRayTraceResult()).getEntity();
  253. loc = null;
  254. break;
  255. case BLOCK:
  256. loc = new Location(e.getEntity().world,
  257. ((BlockRayTraceResult) e.getRayTraceResult()).getPos());
  258. hitEntity = null;
  259. break;
  260. default:
  261. return;
  262. }
  263. handleEvent(e, "projectile_hit", (sc) -> {
  264. sc.setVar("projectile", e.getEntity());
  265. sc.setVar("entity_hit", hitEntity);
  266. sc.setVar("loc_hit", loc);
  267. sc.setVar("shooter", Utils.getEntityFromProjectile(e.getEntity()));
  268. });
  269. }
  270. public void onEntityItemProjectileHit(EntityItemProjectile ent, LivingEntity liv,
  271. ItemStack stack, Entity hitEntity, BlockPos pos) {
  272. Location loc = (pos == null) ? null : new Location(ent.world, pos);
  273. handleEvent("item_hit", (sc) -> {
  274. sc.setVar("projectile", ent);
  275. setItem(sc, stack);
  276. sc.setVar("entity_hit", hitEntity);
  277. sc.setVar("loc_hit", loc);
  278. sc.setVar("shooter", liv);
  279. });
  280. }
  281. @Override
  282. public List<ItemStack> onBlockHarvest(BlockState state, ServerWorld w, BlockPos pos,
  283. TileEntity tileEnt, Entity ent, ItemStack stack) {
  284. LootContext.Builder loot = new LootContext.Builder(w).withRandom(w.getRandom())
  285. .withParameter(LootParameters.field_237457_g_, Vector3d.copyCentered(pos))
  286. .withParameter(LootParameters.TOOL, stack == null ? ItemStack.EMPTY : stack)
  287. .withNullableParameter(LootParameters.THIS_ENTITY, ent)
  288. .withNullableParameter(LootParameters.BLOCK_ENTITY, tileEnt);
  289. List<ItemStack> list = state.getDrops(loot);
  290. try {
  291. final Block b = state.getBlock();
  292. final String name = b.getRegistryName().toString();
  293. scripts.getScriptManager().callEvent("block_drop", sc -> {
  294. sc.setVar("drops", list);
  295. sc.setVar("block_type", name);
  296. sc.setVar("block", b);
  297. sc.setVar("location", new Location(w, pos));
  298. setEntity(sc, ent);
  299. setItem(sc, stack);
  300. }, ScriptEvents::nothing);
  301. } catch(Exception ex) {
  302. ex.printStackTrace();
  303. }
  304. return list;
  305. }
  306. @SubscribeEvent(receiveCanceled = true)
  307. public void onBlockBreak(BlockEvent.BreakEvent e) {
  308. handleEvent("block_break", (sc) -> {
  309. setPlayer(sc, e.getPlayer());
  310. setBlock(sc, (World) e.getWorld(), e.getPos(), e.getState());
  311. sc.setVar("cancel", e.isCanceled());
  312. }, (sc) -> {
  313. simpleCancel(sc, e, "block_break");
  314. });
  315. }
  316. @SubscribeEvent(receiveCanceled = true)
  317. public void onBlockPlace(BlockEvent.EntityPlaceEvent e) {
  318. if(!(e.getEntity() instanceof PlayerEntity)) {
  319. return;
  320. }
  321. PlayerEntity p = (PlayerEntity) e.getEntity();
  322. handleEvent("block_place", (sc) -> {
  323. setPlayer(sc, p);
  324. sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
  325. setBlock(sc, (World) e.getWorld(), e.getPos(), e.getState());
  326. sc.setVar("cancel", e.isCanceled());
  327. }, (sc) -> {
  328. simpleCancel(sc, e, "block_place");
  329. });
  330. }
  331. @SubscribeEvent(receiveCanceled = true)
  332. public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e) {
  333. PlayerEntity p = e.getPlayer();
  334. if(p == null) {
  335. return;
  336. }
  337. PlayerList list = server.getPlayerList();
  338. boolean banned = list.getBannedPlayers().isBanned(p.getGameProfile());
  339. boolean whitelisted = list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile());
  340. handleEvent("player_login", (sc) -> {
  341. setPlayer(sc, p);
  342. sc.setVar("is_banned", banned);
  343. sc.setVar("is_whitelisted", whitelisted);
  344. });
  345. }
  346. @SubscribeEvent(receiveCanceled = true)
  347. public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent e) {
  348. PlayerEntity p = e.getPlayer();
  349. if(p == null || e.getPlayer().ticksExisted < 20) {
  350. return;
  351. }
  352. handleEvent("player_logout", sc -> setPlayer(sc, p));
  353. }
  354. @SubscribeEvent(receiveCanceled = true)
  355. public void onBucketFill(FillBucketEvent e) {
  356. handleEvent("bucket_use", (sc) -> {
  357. setPlayer(sc, e.getPlayer());
  358. RayTraceResult ray = e.getTarget();
  359. if(ray != null && ray.hitInfo != null && ray.hitInfo instanceof BlockPos) {
  360. BlockPos pos = (BlockPos) ray.hitInfo;
  361. sc.setVar("has_block", true);
  362. ScriptEvents.setBlock(sc, e.getWorld(), pos);
  363. } else {
  364. sc.setVar("has_block", false);
  365. }
  366. sc.setVar("cancel", e.isCanceled());
  367. }, (sc) -> {
  368. simpleCancel(sc, e, "bucket_use");
  369. });
  370. }
  371. @SubscribeEvent(receiveCanceled = true)
  372. public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e) {
  373. handleEvent("block_click", (sc) -> {
  374. setPlayer(sc, e.getPlayer());
  375. sc.setVar("action", "right");
  376. sc.setVar("hand", e.getHand().name());
  377. ScriptEvents.setBlock(sc, e.getWorld(), e.getPos());
  378. sc.setVar("cancel", e.isCanceled());
  379. }, (sc) -> {
  380. handleVar(sc, "block_click", "cancel", v -> {
  381. boolean b = v.getBoolean(sc);
  382. e.setCanceled(b);
  383. if(!b) {
  384. e.setUseBlock(Result.DEFAULT);
  385. e.setUseItem(Result.DEFAULT);
  386. }
  387. });
  388. });
  389. }
  390. @SubscribeEvent(receiveCanceled = true)
  391. public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock e) {
  392. handleEvent("block_click", (sc) -> {
  393. setPlayer(sc, e.getPlayer());
  394. sc.setVar("action", "left");
  395. sc.setVar("hand", e.getHand().name());
  396. ScriptEvents.setBlock(sc, e.getWorld(), e.getPos());
  397. sc.setVar("cancel", e.isCanceled());
  398. }, (sc) -> {
  399. handleVar(sc, "block_click", "cancel", v -> {
  400. boolean b = v.getBoolean(sc);
  401. e.setCanceled(b);
  402. if(!b) {
  403. e.setUseBlock(Result.DEFAULT);
  404. e.setUseItem(Result.DEFAULT);
  405. }
  406. });
  407. });
  408. }
  409. @SubscribeEvent(receiveCanceled = true)
  410. public void onEntityClick(PlayerInteractEvent.EntityInteract e) {
  411. handleEvent("entity_click", (sc) -> {
  412. setPlayer(sc, e.getPlayer());
  413. sc.setVar("hand", e.getHand().name());
  414. setEntity(sc, e.getTarget());
  415. sc.setVar("cancel", e.isCanceled());
  416. }, (sc) -> {
  417. simpleCancel(sc, e, "entity_click");
  418. });
  419. }
  420. public void onEmptyLeftClick(PlayerEntity p) {
  421. handleEvent("left_click_air", sc -> setPlayer(sc, p));
  422. }
  423. @SubscribeEvent(receiveCanceled = true)
  424. public void onItemClick(PlayerInteractEvent.RightClickItem e) {
  425. handleEvent("item_air_click", (sc) -> {
  426. setPlayer(sc, e.getPlayer());
  427. setItem(sc, e.getItemStack());
  428. sc.setVar("hand", e.getHand().toString());
  429. sc.setVar("cancel", e.isCanceled());
  430. }, (sc) -> {
  431. simpleCancel(sc, e, "item_air_click");
  432. });
  433. }
  434. @SubscribeEvent(receiveCanceled = true)
  435. public void onItemUseStart(LivingEntityUseItemEvent.Start e) {
  436. handleEvent(e, "item_use_start", (sc) -> {
  437. setLiving(sc, e.getEntityLiving());
  438. sc.setVar("duration", (double) e.getDuration());
  439. setItem(sc, e.getItem());
  440. }, (sc) -> {
  441. handleVar(sc, "item_use_start", "duration", v -> e.setDuration(v.getInt(sc)));
  442. });
  443. }
  444. @SubscribeEvent(receiveCanceled = true)
  445. public void onConsuming(LivingEntityUseItemEvent.Finish e) {
  446. handleEvent(e, "item_use_finish", (sc) -> {
  447. setLiving(sc, e.getEntityLiving());
  448. setItem(sc, e.getItem());
  449. sc.setVar("result", e.getResultStack());
  450. }, (sc) -> {
  451. handleVar(sc, "item_use_finish", "result", v -> {
  452. ItemStack stack = (ItemStack) v.get(sc);
  453. if(stack == null) {
  454. e.setResultStack(ItemStack.EMPTY);
  455. } else {
  456. e.setResultStack(stack);
  457. }
  458. });
  459. });
  460. }
  461. @SubscribeEvent(receiveCanceled = true)
  462. public void onFishing(ItemFishedEvent e) {
  463. handleEvent("fishing", (sc) -> {
  464. setPlayer(sc, e.getPlayer());
  465. sc.setVar("drops", e.getDrops());
  466. sc.setVar("hook", e.getHookEntity());
  467. sc.setVar("rod_damage", (double) e.getRodDamage());
  468. sc.setVar("cancel", e.isCanceled());
  469. }, (sc) -> {
  470. simpleCancel(sc, e, "fishing");
  471. handleVar(sc, "fishing", "rod_damage", v -> e.damageRodBy(v.getInt(sc)));
  472. });
  473. }
  474. @SubscribeEvent(receiveCanceled = true)
  475. public void onCrafting(PlayerEvent.ItemCraftedEvent e) {
  476. handleEvent("craft", (sc) -> {
  477. setPlayer(sc, e.getPlayer());
  478. setItem(sc, e.getCrafting());
  479. });
  480. }
  481. @SubscribeEvent(receiveCanceled = true)
  482. public void onItemDrop(ItemTossEvent e) {
  483. handleEvent("player_toss", (sc) -> {
  484. setPlayer(sc, e.getPlayer());
  485. setItem(sc, e.getEntityItem().getItem());
  486. sc.setVar("cancel", e.isCanceled());
  487. }, (sc) -> {
  488. simpleCancel(sc, e, "player_toss");
  489. });
  490. }
  491. @SubscribeEvent(receiveCanceled = true)
  492. public void onItemPickup(EntityItemPickupEvent e) {
  493. handleEvent("player_pickup", (sc) -> {
  494. setPlayer(sc, e.getPlayer());
  495. setEntity(sc, e.getItem());
  496. setItem(sc, e.getItem().getItem());
  497. sc.setVar("cancel", e.isCanceled());
  498. }, (sc) -> {
  499. simpleCancel(sc, e, "player_pickup");
  500. });
  501. }
  502. @SubscribeEvent(receiveCanceled = true)
  503. public void onEntityMount(EntityMountEvent e) {
  504. handleEvent(e, "entity_mount", (sc) -> {
  505. sc.setVar("mounting", e.isMounting());
  506. setEntity(sc, e.getEntityBeingMounted());
  507. sc.setVar("rider", e.getEntityMounting());
  508. });
  509. }
  510. @SubscribeEvent(receiveCanceled = true)
  511. public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e) {
  512. handleEvent("portal", (sc) -> {
  513. setPlayer(sc, e.getPlayer());
  514. sc.setVar("from", e.getFrom().getRegistryName().getPath());
  515. sc.setVar("to", e.getTo().getRegistryName().getPath());
  516. });
  517. }
  518. public void onCommand(CommandEvent e) {
  519. handleEvent("command", (sc) -> {
  520. setPlayer(sc, e.getPlayer());
  521. sc.setVar("command", e.getName());
  522. sc.setVar("cancel", e.isCanceled());
  523. }, (sc) -> {
  524. handleVar(sc, "command", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  525. });
  526. }
  527. public void onCustomCommand(PlayerEntity p, String command, String[] args) {
  528. handleEvent("custom_command", (sc) -> {
  529. setPlayer(sc, p);
  530. sc.setVar("command", command);
  531. if(args.length == 0) {
  532. sc.setVar("args", new ArrayList<>());
  533. } else {
  534. sc.setVar("args", Arrays.stream(args).map(s -> SnuviUtils.convert(s))
  535. .collect(Collectors.toList()));
  536. }
  537. });
  538. }
  539. public void onFunctionKey(ServerPlayerEntity p, int key) {
  540. handleEvent("function_key", (sc) -> {
  541. setPlayer(sc, p);
  542. sc.setVar("key", (double) key);
  543. });
  544. }
  545. @SubscribeEvent(receiveCanceled = true)
  546. public void onChatEvent(ServerChatEvent e) {
  547. handleEvent("chat", (sc) -> {
  548. setPlayer(sc, e.getPlayer());
  549. sc.setVar("message", e.getMessage());
  550. sc.setVar("cancel", e.isCanceled());
  551. }, (sc) -> {
  552. handleVar(sc, "chat", "message",
  553. v -> e.setComponent(new StringTextComponent(v.getString(sc))));
  554. handleVar(sc, "chat", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  555. });
  556. }
  557. @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST)
  558. public void onPreExplosion(ExplosionEvent.Start e) {
  559. e.setCanceled(true);
  560. handleEvent(e, "pre_explosion", sc -> {
  561. sc.setVar("damage_source", e.getExplosion().getDamageSource());
  562. sc.setVar("location", new Location(e.getWorld(), e.getExplosion().getPosition()));
  563. });
  564. }
  565. @SubscribeEvent
  566. public void onExplosion(ExplosionEvent.Detonate e) {
  567. ReflectionUtils.setNoBreakMode(e.getExplosion());
  568. handleEvent(e, "explosion", sc -> {
  569. sc.setVar("affected_blocks", e.getAffectedBlocks());
  570. sc.setVar("affected_entities", e.getAffectedEntities());
  571. sc.setVar("damage_source", e.getExplosion().getDamageSource());
  572. sc.setVar("location", new Location(e.getWorld(), e.getExplosion().getPosition()));
  573. });
  574. }
  575. private static String getName(ICommandSource cs) {
  576. if(cs instanceof PlayerEntity) {
  577. return ((PlayerEntity) cs).getName().getString();
  578. } else if(cs instanceof MinecraftServer) {
  579. return "Server";
  580. }
  581. return null;
  582. }
  583. public void onMissingCommand(ICommandSource cs, String command) {
  584. PlayerEntity p = (cs instanceof PlayerEntity) ? (PlayerEntity) cs : null;
  585. handleEvent("missing_command", (sc) -> {
  586. setPlayer(sc, p);
  587. sc.setVar("command_name", command);
  588. sc.setVar("sender_name", getName(cs));
  589. });
  590. }
  591. public void onMissingPermission(ICommandSource cs, String command) {
  592. PlayerEntity p = (cs instanceof PlayerEntity) ? (PlayerEntity) cs : null;
  593. handleEvent("missing_perm", (sc) -> {
  594. setPlayer(sc, p);
  595. sc.setVar("command_name", command);
  596. sc.setVar("sender_name", getName(cs));
  597. });
  598. }
  599. @SubscribeEvent(receiveCanceled = true)
  600. public void onEntityJoinWorld(EntityJoinWorldEvent e) {
  601. Entity ent = e.getEntity();
  602. if(!e.getEntity().isPassenger()
  603. && !scripts.getEntityLimits().isAllowedToSpawn(ent.getType())) {
  604. e.getEntity().getPassengers().forEach(rider -> {
  605. if(rider == null || rider instanceof PlayerEntity) {
  606. return;
  607. }
  608. rider.remove();
  609. });
  610. e.getEntity().removePassengers();
  611. e.setCanceled(true);
  612. return;
  613. }
  614. handleEvent(e, "entity_join", (sc) -> {
  615. setEntity(sc, ent);
  616. });
  617. }
  618. @SubscribeEvent(receiveCanceled = true)
  619. public void onEntityLeaveWorld(EntityLeaveWorldEvent e) {
  620. Entity ent = e.getEntity();
  621. handleEvent(e, "entity_leave", (sc) -> {
  622. setEntity(sc, ent);
  623. });
  624. }
  625. @SubscribeEvent
  626. public void onServerTick(TickEvent.ServerTickEvent e) {
  627. if(e.phase == TickEvent.Phase.END) {
  628. scripts.getEntityLimits().tick(server.getWorlds());
  629. }
  630. }
  631. @SubscribeEvent(receiveCanceled = true)
  632. public void onAnimalTame(AnimalTameEvent e) {
  633. handleEvent(e, "animal_tame", (sc) -> {
  634. sc.setVar("animal", e.getAnimal());
  635. sc.setVar("tamer", e.getTamer());
  636. });
  637. }
  638. @SubscribeEvent(receiveCanceled = true)
  639. public void onJump(LivingJumpEvent e) {
  640. handleEvent(e, "living_jump", (sc) -> {
  641. setLiving(sc, e.getEntityLiving());
  642. });
  643. }
  644. public void onSneak(PlayerEntity p, boolean sneak) {
  645. handleEvent("player_sneak", (sc) -> {
  646. setPlayer(sc, p);
  647. sc.setVar("sneak", sneak);
  648. });
  649. }
  650. @SubscribeEvent(receiveCanceled = true)
  651. public void onMobGriefing(EntityMobGriefingEvent e) {
  652. handleEvent(e, "mob_griefing", (sc) -> {
  653. Entity ent = e.getEntity();
  654. setEntity(sc, ent);
  655. boolean b = true;
  656. if(ent != null) {
  657. World w = ent.world;
  658. if(w != null) {
  659. GameRules rules = w.getGameRules();
  660. if(rules != null) {
  661. try {
  662. b = !rules.getBoolean(GameRules.MOB_GRIEFING);
  663. } catch(Exception ex) {
  664. System.out.println("onMobGriefing Exception");
  665. ex.printStackTrace();
  666. }
  667. } else {
  668. System.out.println("Rules are null");
  669. }
  670. } else {
  671. System.out.println("World is null");
  672. }
  673. } else {
  674. System.out.println("Entity is null");
  675. }
  676. sc.setVar("cancel", b);
  677. }, (sc) -> {
  678. handleVar(sc, "mob_griefing", "cancel", (v) -> {
  679. e.setResult(v.getBoolean(sc) ? Result.DENY : Result.ALLOW);
  680. });
  681. });
  682. }
  683. @SubscribeEvent(receiveCanceled = true)
  684. public void onWorldLoad(WorldEvent.Load e) {
  685. handleEvent(e, "world_load", (sc) -> {
  686. sc.setVar("world", e.getWorld());
  687. });
  688. }
  689. @Override
  690. public void onCraft(int id, World w, PlayerEntity p, CraftingInventory inv,
  691. CraftResultInventory result) {
  692. if(w.isRemote) {
  693. return;
  694. }
  695. ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) p;
  696. Wrapper<ItemStack> wrapper = new Wrapper<>(ItemStack.EMPTY);
  697. Optional<ICraftingRecipe> optional =
  698. w.getServer().getRecipeManager().getRecipe(IRecipeType.CRAFTING, inv, w);
  699. if(optional.isPresent()) {
  700. ICraftingRecipe icraftingrecipe = optional.get();
  701. if(result.canUseRecipe(w, serverplayerentity, icraftingrecipe)) {
  702. wrapper.set(icraftingrecipe.getCraftingResult(inv));
  703. scripts.getScriptManager().callEvent("craft", (sc) -> {
  704. setPlayer(sc, p);
  705. sc.setVar("result", wrapper.get());
  706. }, (sc) -> {
  707. handleVar(sc, "craft", "result", (v) -> {
  708. ItemStack stack = (ItemStack) v.get(sc);
  709. if(stack == null) {
  710. wrapper.set(ItemStack.EMPTY);
  711. } else {
  712. wrapper.set(stack);
  713. }
  714. });
  715. });
  716. }
  717. }
  718. result.setInventorySlotContents(0, wrapper.get());
  719. serverplayerentity.connection.sendPacket(new SSetSlotPacket(id, 0, wrapper.get()));
  720. }
  721. }