ScriptEvents.java 27 KB

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