ScriptEvents.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825
  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. e.setCanceled(qd.getBooleanVar("cancel"));
  224. });
  225. }
  226. @SubscribeEvent
  227. public void onLivingDeath(LivingDeathEvent e)
  228. {
  229. if(!(e.getEntityLiving() instanceof EntityPlayer))
  230. {
  231. handleEvent(null, "entity_death", (qd) ->
  232. {
  233. EntityLivingBase ent = e.getEntityLiving();
  234. ScriptVars.setEntityVars(qd, ent);
  235. EntityPlayer p = Utils.getDamager(e.getSource());
  236. if(p != null)
  237. {
  238. qd.setEventVar("player_involved", true);
  239. ScriptVars.setPlayerVars(qd, p);
  240. }
  241. else
  242. {
  243. qd.setEventVar("player_involved", false);
  244. }
  245. qd.setVar("cancel", e.isCanceled());
  246. }, (qd) ->
  247. {
  248. e.setCanceled(qd.getBooleanVar("cancel"));
  249. });
  250. return;
  251. }
  252. EntityPlayer p = (EntityPlayer) e.getEntity();
  253. handleEvent(p, "player_death", (qd) ->
  254. {
  255. qd.setEventVar("clear", false);
  256. EntityPlayer ent = Utils.getDamager(e.getSource());
  257. if(ent != null)
  258. {
  259. ScriptVars.setSecPlayer(qd, ent);
  260. }
  261. qd.setVar("cancel", e.isCanceled());
  262. }, (qd) ->
  263. {
  264. if(qd.getBooleanVar("clear"))
  265. {
  266. p.inventory.clear();
  267. }
  268. e.setCanceled(qd.getBooleanVar("cancel"));
  269. });
  270. }
  271. @SubscribeEvent
  272. public void onEntityDamage(LivingHurtEvent e)
  273. {
  274. EntityPlayer p = Utils.getDamager(e.getSource());
  275. if(p == null)
  276. {
  277. return;
  278. }
  279. handleEvent(p, "entity_hurt", (qd) ->
  280. {
  281. qd.setEventVar("entity_killed", e.getEntityLiving().getHealth() <= e.getAmount());
  282. ScriptVars.setEntityVars(qd, e.getEntity());
  283. qd.setEventVar("entity_damage", Fraction.fromDouble(e.getAmount()));
  284. qd.setEventVar("entity_damage_cause", e.getSource().getDamageType());
  285. qd.setVar("cancel", e.isCanceled());
  286. }, (qd) ->
  287. {
  288. e.setCanceled(qd.getBooleanVar("cancel"));
  289. });
  290. }
  291. @SubscribeEvent
  292. public void onEntityDrop(LivingDropsEvent e)
  293. {
  294. try
  295. {
  296. handleEvent(null, "entity_drop", (qd) ->
  297. {
  298. qd.setEventVar("drops", e.getDrops());
  299. ScriptVars.setEntityVars(qd, e.getEntityLiving());
  300. EntityPlayer p = Utils.getDamager(e.getSource());
  301. if(p != null)
  302. {
  303. qd.setEventVar("player_involved", true);
  304. ScriptVars.setPlayerVars(qd, p);
  305. }
  306. else
  307. {
  308. qd.setEventVar("player_involved", false);
  309. }
  310. qd.setVar("cancel", e.isCanceled());
  311. }, (qd) ->
  312. {
  313. e.setCanceled(qd.getBooleanVar("cancel"));
  314. });
  315. }
  316. catch(NullPointerException ex)
  317. {
  318. KajetansMod.scripts.sendWarningToConsole(ex.toString() + " " + ex.getMessage());
  319. }
  320. }
  321. @SubscribeEvent
  322. public void onPlayerDrop(PlayerDropsEvent e)
  323. {
  324. handleEvent(e.getEntityPlayer(), "player_drop", (qd) ->
  325. {
  326. qd.setVar("cancel", e.isCanceled());
  327. }, (qd) ->
  328. {
  329. e.setCanceled(qd.getBooleanVar("cancel"));
  330. });
  331. }
  332. @SubscribeEvent
  333. public void onProjectileHit(ThrowableImpactEvent e)
  334. {
  335. EntityPlayer p = Utils.getPlayerFromProjectile(e.getEntityThrowable());
  336. if(p != null)
  337. {
  338. handleEvent(p, "throw_hit", (qd) ->
  339. {
  340. if(e.getRayTraceResult().entityHit != null)
  341. {
  342. qd.setEventVar("is_entity_hit", true);
  343. qd.setEventVar("entity_hit", e.getRayTraceResult().entityHit);
  344. }
  345. else
  346. {
  347. qd.setEventVar("is_entity_hit", false);
  348. }
  349. ScriptVars.setEntityVars(qd, e.getEntityThrowable());
  350. });
  351. }
  352. }
  353. public void onEntityItemProjectileHit(EntityItemProjectile ent, EntityPlayer p, ItemStack stack, List<Entity> ents)
  354. {
  355. handleEvent(p, "item_hit", (qd) ->
  356. {
  357. ScriptVars.setEntityVars(qd, ent);
  358. ScriptVars.setItemVars(qd, stack);
  359. qd.setEventVar("entities", ents);
  360. });
  361. }
  362. @SubscribeEvent
  363. public void onEntityShear(PlayerInteractEvent.EntityInteract e)
  364. {
  365. if(e.getHand() == EnumHand.OFF_HAND || !(e.getTarget() instanceof EntitySheep))
  366. {
  367. return;
  368. }
  369. EntityPlayer p = e.getEntityPlayer();
  370. if(p.getHeldItemMainhand().getItem() != Items.SHEARS)
  371. {
  372. return;
  373. }
  374. EntitySheep sheep = (EntitySheep) e.getTarget();
  375. handleEvent(p, "entity_shear", (qd) ->
  376. {
  377. ScriptVars.setEntityVars(qd, sheep);
  378. qd.setEventVar("entity_sheared", sheep.getSheared());
  379. qd.setEventVar("entity_color", sheep.getFleeceColor().toString());
  380. qd.setVar("cancel", e.isCanceled());
  381. }, (qd) ->
  382. {
  383. e.setCanceled(qd.getBooleanVar("cancel"));
  384. sheep.setSheared(qd.getBooleanVar("entity_sheared"));
  385. });
  386. }
  387. @SubscribeEvent
  388. public void onBlockBreak(BlockEvent.BreakEvent e)
  389. {
  390. handleEvent(e.getPlayer(), "block_break", (qd) ->
  391. {
  392. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  393. qd.setVar("cancel", e.isCanceled());
  394. }, (qd) ->
  395. {
  396. e.setCanceled(qd.getBooleanVar("cancel"));
  397. });
  398. }
  399. @SubscribeEvent
  400. public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e)
  401. {
  402. EntityPlayer p = e.player;
  403. if(p == null)
  404. {
  405. return;
  406. }
  407. handleEvent(p, "player_login", (qd) ->
  408. {
  409. qd.setEventVar("first_join", Utils.hasPlayedBefore(p));
  410. PlayerList list = KajetansMod.server.getPlayerList();
  411. qd.setEventVar("is_banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
  412. qd.setEventVar("is_whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
  413. });
  414. }
  415. @SubscribeEvent
  416. public void onPlayerJoin(PlayerJoinMessageEvent e)
  417. {
  418. EntityPlayer p = e.getEntityPlayer();
  419. handleEvent(p, "player_join_server", (qd) ->
  420. {
  421. qd.setEventVar("message", e.getMessage());
  422. qd.setEventVar("changed_name", e.hasNameChanged());
  423. qd.setVar("cancel", e.isCanceled());
  424. }, (qd) ->
  425. {
  426. e.setMessage(String.valueOf(qd.getVar("message")));
  427. e.setCanceled(qd.getBooleanVar("cancel"));
  428. });
  429. }
  430. @SubscribeEvent
  431. public void onPlayerLeave(PlayerLeaveMessageEvent e)
  432. {
  433. EntityPlayer p = e.getEntityPlayer();
  434. handleEvent(p, "player_leave", (qd) ->
  435. {
  436. qd.setEventVar("message", e.getMessage());
  437. qd.setVar("cancel", e.isCanceled());
  438. }, (qd) ->
  439. {
  440. e.setMessage(String.valueOf(qd.getVar("message")));
  441. e.setCanceled(qd.getBooleanVar("cancel"));
  442. });
  443. }
  444. @SubscribeEvent
  445. public void onBucketFill(FillBucketEvent e)
  446. {
  447. handleEvent(e.getEntityPlayer(), "bucket_fill", (qd) ->
  448. {
  449. RayTraceResult ray = e.getTarget();
  450. if(ray != null)
  451. {
  452. BlockPos pos = ray.getBlockPos();
  453. if(pos != null)
  454. {
  455. qd.setEventVar("has_block", true);
  456. ScriptVars.setBlockVars(qd, e.getWorld(), pos);
  457. }
  458. else
  459. {
  460. qd.setEventVar("has_block", false);
  461. }
  462. }
  463. else
  464. {
  465. qd.setEventVar("has_block", false);
  466. }
  467. qd.setVar("cancel", e.isCanceled());
  468. }, (qd) ->
  469. {
  470. e.setCanceled(qd.getBooleanVar("cancel"));
  471. });
  472. }
  473. @SubscribeEvent
  474. public void onBlockPlace(BlockEvent.PlaceEvent e)
  475. {
  476. handleEvent(e.getPlayer(), "block_place", (qd) ->
  477. {
  478. qd.setEventVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
  479. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  480. qd.setVar("cancel", e.isCanceled());
  481. }, (qd) ->
  482. {
  483. e.setCanceled(qd.getBooleanVar("cancel"));
  484. });
  485. }
  486. @SubscribeEvent
  487. public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e)
  488. {
  489. if(e.getHand() == EnumHand.OFF_HAND)
  490. {
  491. return;
  492. }
  493. handleEvent(e.getEntityPlayer(), "block_click", (qd) ->
  494. {
  495. qd.setEventVar("action", "right");
  496. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  497. qd.setVar("cancel", e.isCanceled());
  498. }, (qd) ->
  499. {
  500. e.setCanceled(qd.getBooleanVar("cancel"));
  501. });
  502. }
  503. @SubscribeEvent
  504. public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock e)
  505. {
  506. if(e.getHand() == EnumHand.OFF_HAND)
  507. {
  508. return;
  509. }
  510. handleEvent(e.getEntityPlayer(), "block_click", (qd) ->
  511. {
  512. qd.setEventVar("action", "left");
  513. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  514. qd.setVar("cancel", e.isCanceled());
  515. }, (qd) ->
  516. {
  517. e.setCanceled(qd.getBooleanVar("cancel"));
  518. });
  519. }
  520. @SubscribeEvent
  521. public void onEntityClick(PlayerInteractEvent.EntityInteract e)
  522. {
  523. if(e.getHand() != EnumHand.OFF_HAND)
  524. {
  525. handleEvent(e.getEntityPlayer(), "entity_click", (qd) ->
  526. {
  527. ScriptVars.setEntityVars(qd, e.getTarget());
  528. qd.setVar("cancel", e.isCanceled());
  529. }, (qd) ->
  530. {
  531. e.setCanceled(qd.getBooleanVar("cancel"));
  532. });
  533. }
  534. }
  535. @SubscribeEvent
  536. public void onFishing(ItemFishedEvent e)
  537. {
  538. handleEvent(e.getEntityPlayer(), "fishing", (qd) ->
  539. {
  540. qd.setEventVar("drops", e.getDrops());
  541. qd.setVar("cancel", e.isCanceled());
  542. }, (qd) ->
  543. {
  544. e.setCanceled(qd.getBooleanVar("cancel"));
  545. });
  546. }
  547. @SubscribeEvent
  548. public void onItemClick(PlayerInteractEvent.RightClickItem e)
  549. {
  550. handleEvent(e.getEntityPlayer(), "item_air_click", (qd) ->
  551. {
  552. ScriptVars.setItemVars(qd, e.getItemStack());
  553. qd.setEventVar("hand", e.getHand().toString());
  554. qd.setVar("cancel", e.isCanceled());
  555. }, (qd) ->
  556. {
  557. e.setCanceled(qd.getBooleanVar("cancel"));
  558. });
  559. }
  560. public void onArmSwing(EntityPlayer p, EnumHand hand)
  561. {
  562. handleEvent(p, "arm_swing", (qd) ->
  563. {
  564. qd.setEventVar("hand", hand);
  565. });
  566. }
  567. @SubscribeEvent
  568. public void onItemUseStart(LivingEntityUseItemEvent.Start e)
  569. {
  570. if(!(e.getEntityLiving() instanceof EntityPlayer))
  571. {
  572. return;
  573. }
  574. handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_start", (qd) ->
  575. {
  576. qd.setEventVar("duration", new Fraction(e.getDuration()));
  577. qd.setVar("cancel", e.isCanceled());
  578. }, (qd) ->
  579. {
  580. e.setCanceled(qd.getBooleanVar("cancel"));
  581. try
  582. {
  583. e.setDuration(ScriptUtils.getInt(qd.getVar("duration")));
  584. }
  585. catch(Exception ex)
  586. {
  587. KajetansMod.scripts.logger.printException(ex, "item_use_start", qd, qd.getActiveRealCodeLine());
  588. }
  589. });
  590. }
  591. @SubscribeEvent
  592. public void onConsuming(LivingEntityUseItemEvent.Finish e)
  593. {
  594. if(!(e.getEntityLiving() instanceof EntityPlayer))
  595. {
  596. return;
  597. }
  598. handleEvent((EntityPlayer) e.getEntityLiving(), "item_use_finish", (qd) ->
  599. {
  600. qd.setEventVar("result_stack", e.getResultStack());
  601. });
  602. }
  603. @SubscribeEvent
  604. public void onCrafting(PlayerEvent.ItemCraftedEvent e)
  605. {
  606. handleEvent(e.player, "craft", (qd) ->
  607. {
  608. ScriptVars.setItemVars(qd, e.crafting);
  609. });
  610. }
  611. @SubscribeEvent
  612. public void onItemDrop(ItemTossEvent e)
  613. {
  614. handleEvent(e.getPlayer(), "player_toss", (qd) ->
  615. {
  616. ScriptVars.setItemVars(qd, e.getEntityItem().getItem());
  617. qd.setVar("cancel", e.isCanceled());
  618. }, (qd) ->
  619. {
  620. e.setCanceled(qd.getBooleanVar("cancel"));
  621. });
  622. }
  623. @SubscribeEvent
  624. public void onItemPickup(EntityItemPickupEvent e)
  625. {
  626. handleEvent(e.getEntityPlayer(), "player_pickup", (qd) ->
  627. {
  628. ScriptVars.setItemVars(qd, e.getItem().getItem());
  629. qd.setVar("cancel", e.isCanceled());
  630. }, (qd) ->
  631. {
  632. e.setCanceled(qd.getBooleanVar("cancel"));
  633. });
  634. }
  635. @SubscribeEvent
  636. public void onVehicleEnter(EntityMountEvent e)
  637. {
  638. if(!(e.getEntityMounting() instanceof EntityPlayer))
  639. {
  640. return;
  641. }
  642. EntityPlayer p = (EntityPlayer) e.getEntityMounting();
  643. handleEvent(p, "entity_mount", (qd) ->
  644. {
  645. qd.setEventVar("mounting", e.isMounting());
  646. ScriptVars.setEntityVars(qd, e.getEntityBeingMounted());
  647. qd.setVar("cancel", e.isCanceled());
  648. }, (qd) ->
  649. {
  650. e.setCanceled(qd.getBooleanVar("cancel"));
  651. });
  652. }
  653. @SubscribeEvent
  654. public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e)
  655. {
  656. handleEvent(e.player, "portal", (qd) ->
  657. {
  658. qd.setEventVar("from", ModDimensions.getWorldName(e.fromDim));
  659. qd.setEventVar("to", ModDimensions.getWorldName(e.toDim));
  660. });
  661. }
  662. @SubscribeEvent
  663. public void onCommand(CommandEvent e)
  664. {
  665. if(e.getSender() instanceof EntityPlayer)
  666. {
  667. handleEvent((EntityPlayer) e.getSender(), "command", (qd) ->
  668. {
  669. qd.setEventVar("command", e.getCommand().getName());
  670. qd.setEventVar("args", Arrays.stream(e.getParameters()).map(s -> Code.convertInput(null, s, false)).collect(Collectors.toList()));
  671. qd.setVar("cancel", e.isCanceled());
  672. }, (qd) ->
  673. {
  674. e.setCanceled(qd.getBooleanVar("cancel"));
  675. });
  676. }
  677. }
  678. public void onCustomCommand(EntityPlayer p, String command, String args)
  679. {
  680. handleEvent(p, "custom_command", (qd) ->
  681. {
  682. qd.setEventVar("command", command);
  683. if(args.length() == 0)
  684. {
  685. qd.setEventVar("args", new ArrayList<>());
  686. return;
  687. }
  688. qd.setEventVar("args", Arrays.stream(args.trim().split(" ")).map(s -> Code.convertInput(null, s, false)).collect(Collectors.toList()));
  689. });
  690. }
  691. public void onEffectUse(PlayerUsesEffectEvent e)
  692. {
  693. handleEvent(e.getPlayer(), "player_use_effect", (qd) ->
  694. {
  695. qd.setEventVar("power", new Fraction(e.getPower()));
  696. qd.setEventVar("mana_cost", new Fraction(e.getMana()));
  697. qd.setEventVar("cause", e.getCause().toString());
  698. qd.setEventVar("effect", e.getEffect());
  699. qd.setVar("cancel", e.isCanceled());
  700. }, (qd) ->
  701. {
  702. try
  703. {
  704. int power = ScriptUtils.getInt(qd.getVar("power"));
  705. if(power < 1 || power > 20)
  706. {
  707. throw new IllegalArgumentException();
  708. }
  709. e.setPower(power);
  710. }
  711. catch(Exception ex)
  712. {
  713. KajetansMod.scripts.logger.printException(ex, "player_use_effect", qd, qd.getActiveRealCodeLine());
  714. }
  715. try
  716. {
  717. int mana = ScriptUtils.getInt(qd.getVar("mana_cost"));
  718. if(mana < 0)
  719. {
  720. throw new IllegalArgumentException();
  721. }
  722. e.setMana(mana);
  723. }
  724. catch(Exception ex)
  725. {
  726. KajetansMod.scripts.logger.printException(ex, "player_use_effect", qd, qd.getActiveRealCodeLine());
  727. }
  728. e.setCanceled(qd.getBooleanVar("cancel"));
  729. });
  730. }
  731. public void onFunctionKey(EntityPlayerMP p, int key)
  732. {
  733. handleEvent(p, "function_key", (qd) ->
  734. {
  735. qd.setEventVar("key", new Fraction(key));
  736. });
  737. }
  738. /*@SubscribeEvent
  739. public void QuestVillagerPickUpItem(ItemTossEvent e)
  740. {
  741. EntityPlayer p = e.getPlayer();
  742. PlayerScript qd = KajetansMod.scripts.getScript(p);
  743. if(qd == null || !qd.isLoadedEvent("villager_give"))
  744. {
  745. return;
  746. }
  747. final EntityItem itemEnt = e.getEntityItem();
  748. KajetansMod.scheduler.scheduleTask(() ->
  749. {
  750. if(itemEnt.isDead)
  751. {
  752. return;
  753. }
  754. EntityVillager v = Utils.getNearestEntity(p.world, itemEnt.getPositionVector(), 2, EntityVillager.class);
  755. if(v == null)
  756. {
  757. return;
  758. }
  759. Script data = KajetansMod.scripts.getScript(p);
  760. if(data == null || !data.isLoadedEvent("villager_give"))
  761. {
  762. return;
  763. }
  764. data.setVar("event", "villager_give");
  765. ScriptVars.setPlayerVars(data, p);
  766. ScriptVars.setItemVars(data, itemEnt.getItem());
  767. data.setEventVar("villager_loc", new Location(v));
  768. data.setEventVar("villager_prof", v.getProfessionForge().getRegistryName());
  769. data.setVar("cancel", e.isCanceled());
  770. data.runCode();
  771. if(data.getBooleanVar("cancel"))
  772. {
  773. return;
  774. }
  775. itemEnt.setDead();
  776. }, 40);
  777. }*/
  778. }