ScriptEvents.java 29 KB

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