ScriptEvents.java 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. package me.km.snuviscript;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.UUID;
  7. import java.util.function.Consumer;
  8. import java.util.stream.Collectors;
  9. import me.hammerle.snuviscript.code.Compiler;
  10. import me.hammerle.snuviscript.code.Script;
  11. import me.hammerle.snuviscript.code.SnuviParser;
  12. import me.hammerle.snuviscript.math.Fraction;
  13. import me.kcm.events.PlayerPreRespawnEvent;
  14. import me.km.KajetansMod;
  15. import me.km.api.ModuleListener;
  16. import me.km.api.Module;
  17. import me.km.api.Utils;
  18. import me.km.dimensions.ModDimensions;
  19. import me.km.effects.PlayerUsesEffectEvent;
  20. import me.km.entities.EntityHuman;
  21. import me.km.entities.EntityItemProjectile;
  22. import me.km.events.PlayerHurtEvent;
  23. import net.minecraft.entity.Entity;
  24. import net.minecraft.entity.EntityLivingBase;
  25. import net.minecraft.entity.passive.EntitySheep;
  26. import net.minecraft.entity.player.EntityPlayer;
  27. import net.minecraft.entity.player.EntityPlayerMP;
  28. import net.minecraft.init.Items;
  29. import net.minecraft.inventory.ClickType;
  30. import net.minecraft.item.ItemStack;
  31. import net.minecraft.server.management.PlayerList;
  32. import net.minecraft.util.EnumHand;
  33. import net.minecraft.util.math.BlockPos;
  34. import net.minecraft.util.math.RayTraceResult;
  35. import net.minecraftforge.event.CommandEvent;
  36. import net.minecraftforge.event.entity.EntityMountEvent;
  37. import net.minecraftforge.event.entity.ThrowableImpactEvent;
  38. import net.minecraftforge.event.entity.item.ItemTossEvent;
  39. import net.minecraftforge.event.entity.living.*;
  40. import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
  41. import net.minecraftforge.event.entity.player.FillBucketEvent;
  42. import net.minecraftforge.event.entity.player.ItemFishedEvent;
  43. import net.minecraftforge.event.entity.player.PlayerDropsEvent;
  44. import net.minecraftforge.event.entity.player.PlayerInteractEvent;
  45. import net.minecraftforge.event.world.BlockEvent;
  46. import net.minecraftforge.fml.common.eventhandler.Event;
  47. import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
  48. import net.minecraftforge.fml.common.gameevent.PlayerEvent;
  49. import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerRespawnEvent;
  50. public class ScriptEvents extends ModuleListener
  51. {
  52. private final HashMap<UUID, UUID> questJoin;
  53. private final SnuviParser parser;
  54. public ScriptEvents(Module m)
  55. {
  56. super(m);
  57. questJoin = new HashMap<>();
  58. parser = KajetansMod.scripts.getSnuviParser();
  59. }
  60. // -------------------------------------------------------------------------
  61. // basics
  62. // -------------------------------------------------------------------------
  63. private void handleEvent(EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
  64. {
  65. parser.callEvent(event, (sc) ->
  66. {
  67. if(p != null)
  68. {
  69. ScriptVars.setPlayerVars(sc, p);
  70. }
  71. before.accept(sc);
  72. }, after);
  73. if(p != null)
  74. {
  75. Script data = KajetansMod.scripts.getScript(p);
  76. if(data != null)
  77. {
  78. parser.callEvent(event, data, (sc) ->
  79. {
  80. ScriptVars.setPlayerVars(sc, p);
  81. before.accept(sc);
  82. }, after);
  83. }
  84. }
  85. }
  86. private void handleEvent(EntityPlayer p, String event, Consumer<Script> before)
  87. {
  88. handleEvent(p, event, before, null);
  89. }
  90. private void simpleCancel(Script sc, Event e, String name)
  91. {
  92. try
  93. {
  94. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  95. }
  96. catch(Exception ex)
  97. {
  98. KajetansMod.scripts.logger.print("invalid var in '" + name + "' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  99. }
  100. }
  101. // -------------------------------------------------------------------------
  102. // events
  103. // -------------------------------------------------------------------------
  104. /*@SubscribeEvent
  105. public void onPlayerMove(PlayerMoveEvent e)
  106. {
  107. EntityPlayer p = e.getEntityPlayer();
  108. Location l = new Location(p);
  109. l.round();
  110. parser.callEvent("player_move", (sc) -> ScriptVars.setPlayerVars(sc, p), null,
  111. sc -> ((MinecraftScript) sc).removeLocation(l));
  112. PlayerScript data = KajetansMod.scripts.getScript(p);
  113. if(data != null)
  114. {
  115. parser.callEvent("player_move", data, (sc) ->
  116. {
  117. ScriptVars.setPlayerVars(sc, p);
  118. }, null, data.removeLocation(l));
  119. }
  120. } */
  121. public boolean onInventoryClick(Script script, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
  122. {
  123. parser.callEvent("inv_click", script, sc ->
  124. {
  125. ScriptVars.setPlayerVars(sc, p);
  126. sc.setVar("inv_id", new Fraction(inv.getId()));
  127. sc.setVar("inv_name", inv.getName());
  128. sc.setVar("inv_slot", new Fraction(slot));
  129. ScriptVars.setItemVars(sc, inv.getStackInSlot(slot));
  130. sc.setVar("cancel", false);
  131. }, null);
  132. return script.getVar("cancel").getBoolean(script);
  133. }
  134. public void onInventoryClose(Script script, SnuviInventory inv, EntityPlayer p)
  135. {
  136. parser.callEvent("inv_close", script, sc ->
  137. {
  138. ScriptVars.setPlayerVars(sc, p);
  139. sc.setVar("inv_id", new Fraction(inv.getId()));
  140. sc.setVar("inv_name", inv.getName());
  141. }, null);
  142. }
  143. public void onHumanHurt(EntityPlayer p, EntityHuman h)
  144. {
  145. handleEvent(p, "human_hurt", sc -> ScriptVars.setEntityVars(sc, h));
  146. }
  147. @SubscribeEvent
  148. public void onPlayerPostRespawn(PlayerRespawnEvent e)
  149. {
  150. handleEvent(e.player, "player_post_respawn", null);
  151. }
  152. @SubscribeEvent
  153. public void onPlayerPreRespawn(PlayerPreRespawnEvent e)
  154. {
  155. handleEvent(e.getEntityPlayer(), "player_pre_respawn", null);
  156. }
  157. @SubscribeEvent
  158. public void onPlayerDamage(PlayerHurtEvent e)
  159. {
  160. EntityPlayer p = e.getEntityPlayer();
  161. handleEvent(p, "player_hurt", (sc) ->
  162. {
  163. if(p.getHealth() <= e.getAmount())
  164. {
  165. sc.setVar("player_killed", true);
  166. }
  167. else
  168. {
  169. sc.setVar("player_killed", false);
  170. }
  171. sc.setVar("player_damage", Fraction.fromDouble(e.getAmount()));
  172. sc.setVar("player_damage_cause", e.getSource().getDamageType());
  173. EntityPlayer ent = Utils.getDamager(e.getSource());
  174. if(ent != null)
  175. {
  176. sc.setVar("player_involved", true);
  177. ScriptVars.setSecPlayer(sc, ent);
  178. }
  179. else
  180. {
  181. sc.setVar("player_involved", false);
  182. }
  183. sc.setVar("cancel", e.isCanceled());
  184. }, (sc) ->
  185. {
  186. try
  187. {
  188. e.setAmount(sc.getVar("player_damage").getFraction(sc).floatValue());
  189. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  190. }
  191. catch(Exception ex)
  192. {
  193. KajetansMod.scripts.logger.print("invalid var in 'player_hurt' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  194. }
  195. });
  196. }
  197. @SubscribeEvent
  198. public void onPlayerDamage(LivingHealEvent e)
  199. {
  200. if(e.getEntityLiving() instanceof EntityPlayer)
  201. {
  202. handleEvent((EntityPlayer) e.getEntityLiving(), "player_heal", (sc) ->
  203. {
  204. sc.setVar("heal", Fraction.fromDouble(e.getAmount()));
  205. sc.setVar("cancel", e.isCanceled());
  206. }, (sc) ->
  207. {
  208. try
  209. {
  210. e.setAmount(sc.getVar("heal").getFraction(sc).floatValue());
  211. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  212. }
  213. catch(Exception ex)
  214. {
  215. KajetansMod.scripts.logger.print("invalid var in 'player_heal' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  216. }
  217. });
  218. }
  219. }
  220. @SubscribeEvent
  221. public void onLivingDeath(LivingDeathEvent e)
  222. {
  223. if(!(e.getEntityLiving() instanceof EntityPlayer))
  224. {
  225. handleEvent(null, "entity_death", (sc) ->
  226. {
  227. EntityLivingBase ent = e.getEntityLiving();
  228. ScriptVars.setEntityVars(sc, ent);
  229. EntityPlayer p = Utils.getDamager(e.getSource());
  230. if(p != null)
  231. {
  232. sc.setVar("player_involved", true);
  233. ScriptVars.setPlayerVars(sc, p);
  234. }
  235. else
  236. {
  237. sc.setVar("player_involved", false);
  238. }
  239. sc.setVar("cancel", e.isCanceled());
  240. }, (sc) ->
  241. {
  242. simpleCancel(sc, e, "entity_death");
  243. });
  244. return;
  245. }
  246. EntityPlayer p = (EntityPlayer) e.getEntity();
  247. handleEvent(p, "player_death", (sc) ->
  248. {
  249. sc.setVar("clear", false);
  250. EntityPlayer ent = Utils.getDamager(e.getSource());
  251. if(ent != null)
  252. {
  253. ScriptVars.setSecPlayer(sc, ent);
  254. }
  255. sc.setVar("cancel", e.isCanceled());
  256. }, (sc) ->
  257. {
  258. try
  259. {
  260. if(sc.getVar("clear").getBoolean(sc))
  261. {
  262. p.inventory.clear();
  263. }
  264. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  265. }
  266. catch(Exception ex)
  267. {
  268. KajetansMod.scripts.logger.print("invalid var in 'player_death' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  269. }
  270. });
  271. }
  272. @SubscribeEvent
  273. public void onEntityDamage(LivingHurtEvent e)
  274. {
  275. EntityPlayer p = Utils.getDamager(e.getSource());
  276. if(p == null)
  277. {
  278. return;
  279. }
  280. handleEvent(p, "entity_hurt", (sc) ->
  281. {
  282. sc.setVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());
  283. ScriptVars.setEntityVars(sc, e.getEntity());
  284. sc.setVar("entity_damage", Fraction.fromDouble(e.getAmount()));
  285. sc.setVar("entity_damage_cause", e.getSource().getDamageType());
  286. sc.setVar("cancel", e.isCanceled());
  287. }, (sc) ->
  288. {
  289. try
  290. {
  291. e.setAmount(sc.getVar("entity_damage").getFraction(sc).floatValue());
  292. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  293. }
  294. catch(Exception ex)
  295. {
  296. KajetansMod.scripts.logger.print("invalid var in 'entity_hurt' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  297. }
  298. });
  299. }
  300. @SubscribeEvent
  301. public void onEntityDrop(LivingDropsEvent e)
  302. {
  303. try
  304. {
  305. handleEvent(null, "entity_drop", (sc) ->
  306. {
  307. sc.setVar("drops", e.getDrops());
  308. ScriptVars.setEntityVars(sc, e.getEntityLiving());
  309. EntityPlayer p = Utils.getDamager(e.getSource());
  310. if(p != null)
  311. {
  312. sc.setVar("player_involved", true);
  313. ScriptVars.setPlayerVars(sc, p);
  314. }
  315. else
  316. {
  317. sc.setVar("player_involved", false);
  318. }
  319. sc.setVar("cancel", e.isCanceled());
  320. }, (sc) ->
  321. {
  322. simpleCancel(sc, e, "entity_drop");
  323. });
  324. }
  325. catch(NullPointerException ex)
  326. {
  327. KajetansMod.scripts.sendWarningToConsole(ex.toString() + " " + ex.getMessage());
  328. }
  329. }
  330. @SubscribeEvent
  331. public void onPlayerDrop(PlayerDropsEvent e)
  332. {
  333. handleEvent(e.getEntityPlayer(), "player_drop", (sc) ->
  334. {
  335. sc.setVar("cancel", e.isCanceled());
  336. }, (sc) ->
  337. {
  338. simpleCancel(sc, e, "player_drop");
  339. });
  340. }
  341. @SubscribeEvent
  342. public void onProjectileHit(ThrowableImpactEvent e)
  343. {
  344. EntityPlayer p = Utils.getPlayerFromProjectile(e.getEntityThrowable());
  345. if(p != null)
  346. {
  347. handleEvent(p, "throw_hit", (sc) ->
  348. {
  349. if(e.getRayTraceResult().entityHit != null)
  350. {
  351. sc.setVar("is_entity_hit", true);
  352. sc.setVar("entity_hit", e.getRayTraceResult().entityHit);
  353. }
  354. else
  355. {
  356. sc.setVar("is_entity_hit", false);
  357. }
  358. ScriptVars.setEntityVars(sc, e.getEntityThrowable());
  359. });
  360. }
  361. }
  362. public void onEntityItemProjectileHit(EntityItemProjectile ent, EntityPlayer p, ItemStack stack, List<Entity> ents)
  363. {
  364. handleEvent(p, "item_hit", (sc) ->
  365. {
  366. ScriptVars.setEntityVars(sc, ent);
  367. ScriptVars.setItemVars(sc, stack);
  368. sc.setVar("entities", ents);
  369. });
  370. }
  371. @SubscribeEvent
  372. public void onEntityShear(PlayerInteractEvent.EntityInteract e)
  373. {
  374. if(e.getHand() == EnumHand.OFF_HAND || !(e.getTarget() instanceof EntitySheep))
  375. {
  376. return;
  377. }
  378. EntityPlayer p = e.getEntityPlayer();
  379. if(p.getHeldItemMainhand().getItem() != Items.SHEARS)
  380. {
  381. return;
  382. }
  383. EntitySheep sheep = (EntitySheep) e.getTarget();
  384. handleEvent(p, "entity_shear", (sc) ->
  385. {
  386. ScriptVars.setEntityVars(sc, sheep);
  387. sc.setVar("entity_sheared", sheep.getSheared());
  388. sc.setVar("entity_color", sheep.getFleeceColor().toString());
  389. sc.setVar("cancel", e.isCanceled());
  390. }, (sc) ->
  391. {
  392. try
  393. {
  394. sheep.setSheared(sc.getVar("entity_sheared").getBoolean(sc));
  395. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  396. }
  397. catch(Exception ex)
  398. {
  399. KajetansMod.scripts.logger.print("invalid var in 'entity_shear' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  400. }
  401. });
  402. }
  403. @SubscribeEvent
  404. public void onBlockBreak(BlockEvent.BreakEvent e)
  405. {
  406. handleEvent(e.getPlayer(), "block_break", (sc) ->
  407. {
  408. ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
  409. sc.setVar("cancel", e.isCanceled());
  410. }, (sc) ->
  411. {
  412. simpleCancel(sc, e, "block_break");
  413. });
  414. }
  415. @SubscribeEvent
  416. public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e)
  417. {
  418. EntityPlayer p = e.player;
  419. if(p == null)
  420. {
  421. return;
  422. }
  423. handleEvent(p, "player_login", (sc) ->
  424. {
  425. sc.setVar("first_join", Utils.hasPlayedBefore(p));
  426. PlayerList list = KajetansMod.server.getPlayerList();
  427. sc.setVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
  428. sc.setVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
  429. });
  430. }
  431. @SubscribeEvent
  432. public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent e)
  433. {
  434. EntityPlayer p = e.player;
  435. if(p == null)
  436. {
  437. return;
  438. }
  439. handleEvent(p, "player_logout", null);
  440. }
  441. @SubscribeEvent
  442. public void onBucketFill(FillBucketEvent e)
  443. {
  444. handleEvent(e.getEntityPlayer(), "bucket_fill", (sc) ->
  445. {
  446. RayTraceResult ray = e.getTarget();
  447. if(ray != null)
  448. {
  449. BlockPos pos = ray.getBlockPos();
  450. if(pos != null)
  451. {
  452. sc.setVar("has_block", true);
  453. ScriptVars.setBlockVars(sc, e.getWorld(), pos);
  454. }
  455. else
  456. {
  457. sc.setVar("has_block", false);
  458. }
  459. }
  460. else
  461. {
  462. sc.setVar("has_block", false);
  463. }
  464. sc.setVar("cancel", e.isCanceled());
  465. }, (sc) ->
  466. {
  467. simpleCancel(sc, e, "bucket_fill");
  468. });
  469. }
  470. @SubscribeEvent
  471. public void onBlockPlace(BlockEvent.PlaceEvent e)
  472. {
  473. handleEvent(e.getPlayer(), "block_place", (sc) ->
  474. {
  475. sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
  476. ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
  477. sc.setVar("cancel", e.isCanceled());
  478. }, (sc) ->
  479. {
  480. simpleCancel(sc, e, "block_place");
  481. });
  482. }
  483. @SubscribeEvent
  484. public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e)
  485. {
  486. if(e.getHand() == EnumHand.OFF_HAND)
  487. {
  488. return;
  489. }
  490. handleEvent(e.getEntityPlayer(), "block_click", (sc) ->
  491. {
  492. sc.setVar("action", "right");
  493. ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
  494. sc.setVar("cancel", e.isCanceled());
  495. }, (sc) ->
  496. {
  497. simpleCancel(sc, e, "block_click");
  498. });
  499. }
  500. @SubscribeEvent
  501. public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock e)
  502. {
  503. if(e.getHand() == EnumHand.OFF_HAND)
  504. {
  505. return;
  506. }
  507. handleEvent(e.getEntityPlayer(), "block_click", (sc) ->
  508. {
  509. sc.setVar("action", "left");
  510. ScriptVars.setBlockVars(sc, e.getWorld(), e.getPos());
  511. sc.setVar("cancel", e.isCanceled());
  512. }, (sc) ->
  513. {
  514. simpleCancel(sc, e, "block_click");
  515. });
  516. }
  517. @SubscribeEvent(receiveCanceled = true)
  518. public void onEntityClick(PlayerInteractEvent.EntityInteract e)
  519. {
  520. if(e.getHand() != EnumHand.OFF_HAND)
  521. {
  522. handleEvent(e.getEntityPlayer(), "entity_click", (sc) ->
  523. {
  524. ScriptVars.setEntityVars(sc, e.getTarget());
  525. sc.setVar("cancel", e.isCanceled());
  526. }, (sc) ->
  527. {
  528. simpleCancel(sc, e, "entity_click");
  529. });
  530. }
  531. }
  532. @SubscribeEvent
  533. public void onFishing(ItemFishedEvent e)
  534. {
  535. handleEvent(e.getEntityPlayer(), "fishing", (sc) ->
  536. {
  537. sc.setVar("drops", e.getDrops());
  538. sc.setVar("cancel", e.isCanceled());
  539. }, (sc) ->
  540. {
  541. simpleCancel(sc, e, "fishing");
  542. });
  543. }
  544. @SubscribeEvent
  545. public void onItemClick(PlayerInteractEvent.RightClickItem e)
  546. {
  547. handleEvent(e.getEntityPlayer(), "item_air_click", (sc) ->
  548. {
  549. ScriptVars.setItemVars(sc, e.getItemStack());
  550. sc.setVar("hand", e.getHand().toString());
  551. sc.setVar("cancel", e.isCanceled());
  552. }, (sc) ->
  553. {
  554. simpleCancel(sc, e, "item_air_click");
  555. });
  556. }
  557. public void onArmSwing(EntityPlayer p, EnumHand hand)
  558. {
  559. handleEvent(p, "arm_swing", (sc) ->
  560. {
  561. sc.setVar("hand", hand);
  562. });
  563. }
  564. @SubscribeEvent
  565. public void onItemUseStart(LivingEntityUseItemEvent.Start e)
  566. {
  567. if(!(e.getEntityLiving() instanceof EntityPlayer))
  568. {
  569. return;
  570. }
  571. handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_start", (sc) ->
  572. {
  573. sc.setVar("duration", new Fraction(e.getDuration()));
  574. sc.setVar("cancel", e.isCanceled());
  575. }, (sc) ->
  576. {
  577. try
  578. {
  579. e.setDuration(sc.getVar("duration").getInt(sc));
  580. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  581. }
  582. catch(Exception ex)
  583. {
  584. KajetansMod.scripts.logger.print("invalid var in 'item_use_start' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  585. }
  586. });
  587. }
  588. @SubscribeEvent
  589. public void onConsuming(LivingEntityUseItemEvent.Finish e)
  590. {
  591. if(!(e.getEntityLiving() instanceof EntityPlayer))
  592. {
  593. return;
  594. }
  595. handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_finish", (sc) ->
  596. {
  597. sc.setVar("result_stack", e.getResultStack());
  598. });
  599. }
  600. @SubscribeEvent
  601. public void onCrafting(PlayerEvent.ItemCraftedEvent e)
  602. {
  603. handleEvent(e.player, "craft", (sc) ->
  604. {
  605. ScriptVars.setItemVars(sc, e.crafting);
  606. });
  607. }
  608. @SubscribeEvent
  609. public void onItemDrop(ItemTossEvent e)
  610. {
  611. handleEvent(e.getPlayer(), "player_toss", (sc) ->
  612. {
  613. ScriptVars.setItemVars(sc, e.getEntityItem().getItem());
  614. sc.setVar("cancel", e.isCanceled());
  615. }, (sc) ->
  616. {
  617. simpleCancel(sc, e, "player_toss");
  618. });
  619. }
  620. @SubscribeEvent
  621. public void onItemPickup(EntityItemPickupEvent e)
  622. {
  623. handleEvent(e.getEntityPlayer(), "player_pickup", (sc) ->
  624. {
  625. ScriptVars.setEntityVars(sc, e.getItem());
  626. ScriptVars.setItemVars(sc, e.getItem().getItem());
  627. sc.setVar("cancel", e.isCanceled());
  628. }, (sc) ->
  629. {
  630. simpleCancel(sc, e, "player_pickup");
  631. });
  632. }
  633. @SubscribeEvent
  634. public void onVehicleEnter(EntityMountEvent e)
  635. {
  636. if(!(e.getEntityMounting() instanceof EntityPlayer))
  637. {
  638. return;
  639. }
  640. EntityPlayer p = (EntityPlayer) e.getEntityMounting();
  641. handleEvent(p, "entity_mount", (sc) ->
  642. {
  643. sc.setVar("mounting", e.isMounting());
  644. ScriptVars.setEntityVars(sc, e.getEntityBeingMounted());
  645. sc.setVar("cancel", e.isCanceled());
  646. }, (sc) ->
  647. {
  648. simpleCancel(sc, e, "entity_mount");
  649. });
  650. }
  651. @SubscribeEvent
  652. public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e)
  653. {
  654. handleEvent(e.player, "portal", (sc) ->
  655. {
  656. sc.setVar("from", ModDimensions.getWorldName(e.fromDim));
  657. sc.setVar("to", ModDimensions.getWorldName(e.toDim));
  658. });
  659. }
  660. @SubscribeEvent
  661. public void onCommand(CommandEvent e)
  662. {
  663. if(e.getSender() instanceof EntityPlayer)
  664. {
  665. handleEvent((EntityPlayer) e.getSender(), "command", (sc) ->
  666. {
  667. sc.setVar("command", e.getCommand().getName());
  668. sc.setVar("args", Arrays.stream(e.getParameters()).map(s -> Compiler.convert(s)).collect(Collectors.toList()));
  669. sc.setVar("cancel", e.isCanceled());
  670. }, (sc) ->
  671. {
  672. simpleCancel(sc, e, "command");
  673. });
  674. }
  675. }
  676. public void onCustomCommand(EntityPlayer p, String command, String[] args)
  677. {
  678. handleEvent(p, "custom_command", (sc) ->
  679. {
  680. sc.setVar("command", command);
  681. if(args.length == 0)
  682. {
  683. sc.setVar("args", new ArrayList<>());
  684. }
  685. else
  686. {
  687. sc.setVar("args", Arrays.stream(args).map(s -> Compiler.convert(s)).collect(Collectors.toList()));
  688. }
  689. });
  690. }
  691. public void onEffectUse(PlayerUsesEffectEvent e)
  692. {
  693. handleEvent(e.getPlayer(), "player_use_effect", (sc) ->
  694. {
  695. sc.setVar("power", new Fraction(e.getPower()));
  696. sc.setVar("mana_cost", new Fraction(e.getMana()));
  697. sc.setVar("cause", e.getCause().toString());
  698. sc.setVar("effect", e.getEffect());
  699. sc.setVar("cancel", e.isCanceled());
  700. }, (sc) ->
  701. {
  702. try
  703. {
  704. e.setPower(Math.min(20, Math.max(1, sc.getVar("power").getInt(sc))));
  705. e.setMana(Math.max(0, sc.getVar("mana_cost").getInt(sc)));
  706. e.setCanceled(sc.getVar("cancel").getBoolean(sc));
  707. }
  708. catch(Exception ex)
  709. {
  710. KajetansMod.scripts.logger.print("invalid var in 'player_use_effect' event", ex, null, sc.getName(), sc, sc.getActiveRealLine());
  711. }
  712. });
  713. }
  714. public void onFunctionKey(EntityPlayerMP p, int key)
  715. {
  716. handleEvent(p, "function_key", (sc) ->
  717. {
  718. sc.setVar("key", new Fraction(key));
  719. });
  720. }
  721. }