ScriptEvents.java 24 KB

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