ScriptEvents.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  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.function.Predicate;
  9. import java.util.stream.Collectors;
  10. import me.km.KajetansMod;
  11. import me.km.api.Location;
  12. import me.km.api.ModuleListener;
  13. import me.km.api.Module;
  14. import me.km.api.Utils;
  15. import me.km.effects.PlayerUsesEffectEvent;
  16. import me.km.events.PlayerHurtEvent;
  17. import me.km.events.PlayerJoinMessageEvent;
  18. import me.km.events.PlayerLeaveMessageEvent;
  19. import me.km.events.PlayerMoveEvent;
  20. import me.km.events.PlayerRespawnAtEvent;
  21. import net.minecraft.entity.Entity;
  22. import net.minecraft.entity.EntityLivingBase;
  23. import net.minecraft.entity.item.EntityItem;
  24. import net.minecraft.entity.passive.EntitySheep;
  25. import net.minecraft.entity.passive.EntityVillager;
  26. import net.minecraft.entity.player.EntityPlayer;
  27. import net.minecraft.init.Items;
  28. import net.minecraft.inventory.ClickType;
  29. import net.minecraft.item.ItemStack;
  30. import net.minecraft.server.management.PlayerList;
  31. import net.minecraft.util.EnumHand;
  32. import net.minecraft.util.math.BlockPos;
  33. import net.minecraft.util.math.RayTraceResult;
  34. import net.minecraft.world.WorldServer;
  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.SubscribeEvent;
  47. import net.minecraftforge.fml.common.gameevent.PlayerEvent;
  48. public class ScriptEvents extends ModuleListener
  49. {
  50. private final HashMap<UUID, UUID> questJoin;
  51. public ScriptEvents(Module m)
  52. {
  53. super(m);
  54. questJoin = new HashMap<>();
  55. }
  56. // -------------------------------------------------------------------------
  57. // Basics
  58. // -------------------------------------------------------------------------
  59. private void doInEvent(Script data, EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
  60. {
  61. data.setVar("event", event);
  62. if(p != null)
  63. {
  64. ScriptVars.setPlayerVars(data, p);
  65. }
  66. if(before != null)
  67. {
  68. before.accept(data);
  69. }
  70. data.runCode();
  71. if(after != null)
  72. {
  73. after.accept(data);
  74. }
  75. }
  76. private void handleEvent(EntityPlayer p, String event, Predicate<? super Script> pre, Consumer<Script> before, Consumer<Script> after)
  77. {
  78. KajetansMod.scripts.getScripts().stream().filter(pre).filter(qd -> qd.isEventLoaded(event)).forEach(data ->
  79. {
  80. doInEvent(data, p, event, before, after);
  81. });
  82. if(p != null && KajetansMod.scripts.hasQuest(p))
  83. {
  84. Script data = KajetansMod.scripts.getQuestData(p);
  85. if(data != null && data.isEventLoaded(event) && pre.test(data))
  86. {
  87. doInEvent(data, p, event, before, after);
  88. }
  89. }
  90. }
  91. private void handleEvent(EntityPlayer p, String event, Consumer<Script> before, Consumer<Script> after)
  92. {
  93. handleEvent(p, event, (qd) -> true, before, after);
  94. }
  95. private void handleEvent(EntityPlayer p, String event, Consumer<Script> before)
  96. {
  97. handleEvent(p, event, before, null);
  98. }
  99. // -------------------------------------------------------------------------
  100. // Questevents
  101. // -------------------------------------------------------------------------
  102. @SubscribeEvent
  103. public void joinOtherPlayersQuests(PlayerInteractEvent.EntityInteract e)
  104. {
  105. if(e.getHand() == EnumHand.OFF_HAND || !(e.getTarget() instanceof EntityPlayer))
  106. {
  107. return;
  108. }
  109. EntityPlayer p = e.getEntityPlayer();
  110. EntityPlayer affectedPlayer = (EntityPlayer) e.getTarget();
  111. if(KajetansMod.scripts.hasQuest(p) && !KajetansMod.scripts.hasQuest(affectedPlayer))
  112. {
  113. if(questJoin.get(affectedPlayer.getUniqueID()) != null)
  114. {
  115. if(questJoin.get(affectedPlayer.getUniqueID()).equals(p.getUniqueID()))
  116. {
  117. return;
  118. }
  119. }
  120. questJoin.put(affectedPlayer.getUniqueID(), p.getUniqueID());
  121. this.getModule().send(affectedPlayer, p.getName() + " fragt dich, ob du seiner Quest beitreten willst.");
  122. this.getModule().send(p, affectedPlayer.getName() + " wurde eine Anfrage gesendet.");
  123. return;
  124. }
  125. if(!KajetansMod.scripts.hasQuest(p) && questJoin.get(p.getUniqueID()) != null && KajetansMod.scripts.hasQuest(affectedPlayer))
  126. {
  127. if(questJoin.get(p.getUniqueID()).equals(affectedPlayer.getUniqueID()))
  128. {
  129. questJoin.remove(p.getUniqueID());
  130. KajetansMod.scripts.addPlayerToPlayer(p, affectedPlayer);
  131. }
  132. }
  133. }
  134. @SubscribeEvent
  135. public void onPlayerMove(PlayerMoveEvent e)
  136. {
  137. EntityPlayer p = e.getEntityPlayer();
  138. KajetansMod.scripts.getScripts().stream().filter(qd -> qd.isEventLoaded("player-move")).forEach(data ->
  139. {
  140. if(data.removeLocation(Location.rounded(p)))
  141. {
  142. doInEvent(data, p, "player-move", null, null);
  143. }
  144. });
  145. if(KajetansMod.scripts.hasQuest(p))
  146. {
  147. Script data = KajetansMod.scripts.getQuestData(p);
  148. if(data != null && data.isEventLoaded("player-move") && data.removeLocation(Location.rounded(p)))
  149. {
  150. doInEvent(data, p, "player-move", null, null);
  151. }
  152. }
  153. }
  154. public boolean QuestClickInventory(Script qd, SnuviInventory inv, int slot, ClickType click, EntityPlayer p)
  155. {
  156. qd.setVar("event", "inv-click");
  157. ScriptVars.setPlayerVars(qd, p);
  158. qd.setVar("inv-id", inv.getId());
  159. qd.setVar("inv-name", inv.getName());
  160. qd.setVar("inv-slot", slot);
  161. ScriptVars.setItemVars(qd, inv.getStackInSlot(slot));
  162. qd.setVar("cancel", false);
  163. qd.runCode();
  164. return qd.getBoolean("cancel");
  165. }
  166. public boolean QuestCloseInventory(Script qd, SnuviInventory inv, EntityPlayer p)
  167. {
  168. qd.setVar("event", "inv-close");
  169. ScriptVars.setPlayerVars(qd, p);
  170. qd.setVar("inv-id", inv.getId());
  171. qd.setVar("inv-name", inv.getName());
  172. qd.setVar("cancel", false);
  173. qd.runCode();
  174. return qd.getBoolean("cancel");
  175. }
  176. @SubscribeEvent
  177. public void QuestOnPlayerRespawn(PlayerRespawnAtEvent e)
  178. {
  179. handleEvent(e.getEntityPlayer(), "player-respawn", (qd) ->
  180. {
  181. qd.setVar("keep-inventory", e.isInventoryKeepingForced());
  182. qd.setVar("respawn-loc", new Location(e.getWorld(), e.getRespawnLoc()));
  183. }, (qd) ->
  184. {
  185. try
  186. {
  187. e.setForcedInventoryKeeping(qd.getBoolean("keep-inventory"));
  188. Location l = (Location) qd.getVar("respawn-loc");
  189. e.setRespawnLoc(l.getPos());
  190. e.setWorld((WorldServer) l.getWorld());
  191. }
  192. catch(ClassCastException | NullPointerException ex)
  193. {
  194. KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(respawn-loc)");
  195. }
  196. });
  197. }
  198. @SubscribeEvent
  199. public void QuestPlayerDamage(PlayerHurtEvent e)
  200. {
  201. EntityPlayer p = e.getEntityPlayer();
  202. handleEvent(p, "player-hurt", (qd) ->
  203. {
  204. if(p.getHealth() <= e.getAmount())
  205. {
  206. qd.setVar("player-killed", true);
  207. }
  208. else
  209. {
  210. qd.setVar("player-killed", false);
  211. }
  212. qd.setVar("player-damage", e.getAmount());
  213. qd.setVar("player-damage-cause", e.getSource().getDamageType());
  214. EntityPlayer ent = Utils.getDamager(e.getSource());
  215. if(ent != null)
  216. {
  217. qd.setVar("player-involved", true);
  218. ScriptVars.setSecPlayer(qd, ent);
  219. }
  220. else
  221. {
  222. qd.setVar("player-involved", false);
  223. }
  224. qd.setVar("cancel", e.isCanceled());
  225. }, (qd) ->
  226. {
  227. e.setCanceled(qd.getBoolean("cancel"));
  228. });
  229. }
  230. @SubscribeEvent
  231. public void QuestDeath(LivingDeathEvent e)
  232. {
  233. if(!(e.getEntityLiving() instanceof EntityPlayer))
  234. {
  235. handleEvent(null, "entity-death", (qd) ->
  236. {
  237. EntityLivingBase ent = e.getEntityLiving();
  238. ScriptVars.setEntityVars(qd, ent);
  239. EntityPlayer p = Utils.getDamager(e.getSource());
  240. if(p != null)
  241. {
  242. qd.setVar("player-involved", true);
  243. ScriptVars.setPlayerVars(qd, p);
  244. }
  245. else
  246. {
  247. qd.setVar("player-involved", false);
  248. }
  249. qd.setVar("cancel", e.isCanceled());
  250. }, (qd) ->
  251. {
  252. e.setCanceled(qd.getBoolean("cancel"));
  253. });
  254. return;
  255. }
  256. EntityPlayer p = (EntityPlayer) e.getEntity();
  257. handleEvent(p, "player-death", (qd) ->
  258. {
  259. //qd.setVar("message", e.getDeathMessage());
  260. qd.setVar("clear", false);
  261. EntityPlayer ent = Utils.getDamager(e.getSource());
  262. if(ent != null)
  263. {
  264. ScriptVars.setSecPlayer(qd, ent);
  265. }
  266. qd.setVar("cancel", e.isCanceled());
  267. }, (qd) ->
  268. {
  269. //e.setDeathMessage(String.valueOf(qd.getVar("message")));
  270. if(qd.getBoolean("clear"))
  271. {
  272. p.inventory.clear();
  273. }
  274. e.setCanceled(qd.getBoolean("cancel"));
  275. });
  276. }
  277. @SubscribeEvent
  278. public void QuestEntityDamage(LivingHurtEvent e)
  279. {
  280. EntityPlayer p = Utils.getDamager(e.getSource());
  281. if(p == null)
  282. {
  283. return;
  284. }
  285. handleEvent(p, "entity-hurt", (qd) ->
  286. {
  287. qd.setVar("entity-killed", e.getEntityLiving().getHealth() <= e.getAmount());
  288. ScriptVars.setEntityVars(qd, e.getEntity());
  289. qd.setVar("entity-damage", e.getAmount());
  290. qd.setVar("entity-damage-cause", e.getSource().getDamageType());
  291. qd.setVar("cancel", e.isCanceled());
  292. }, (qd) ->
  293. {
  294. e.setCanceled(qd.getBoolean("cancel"));
  295. });
  296. }
  297. @SubscribeEvent
  298. public void QuestEntityDrop(LivingDropsEvent e)
  299. {
  300. try
  301. {
  302. handleEvent(null, "entity-drop", (qd) ->
  303. {
  304. qd.setVar("drops", e.getDrops());
  305. ScriptVars.setEntityVars(qd, e.getEntityLiving());
  306. EntityPlayer p = Utils.getDamager(e.getSource());
  307. if(p != null)
  308. {
  309. qd.setVar("player-involved", true);
  310. ScriptVars.setPlayerVars(qd, p);
  311. }
  312. else
  313. {
  314. qd.setVar("player-involved", false);
  315. }
  316. qd.setVar("cancel", e.isCanceled());
  317. }, (qd) ->
  318. {
  319. e.setCanceled(qd.getBoolean("cancel"));
  320. });
  321. }
  322. catch(NullPointerException ex)
  323. {
  324. KajetansMod.scripts.sendWarningToConsole(ex.toString() + " " + ex.getMessage());
  325. }
  326. }
  327. @SubscribeEvent
  328. public void QuestPlayerDrop(PlayerDropsEvent e)
  329. {
  330. handleEvent(e.getEntityPlayer(), "player-drop", (qd) ->
  331. {
  332. qd.setVar("cancel", e.isCanceled());
  333. }, (qd) ->
  334. {
  335. e.setCanceled(qd.getBoolean("cancel"));
  336. });
  337. }
  338. @SubscribeEvent
  339. public void QuestProjectileHit(ThrowableImpactEvent e)
  340. {
  341. EntityPlayer p = Utils.getPlayerFromProjectile(e.getEntityThrowable());
  342. if(p != null)
  343. {
  344. handleEvent(p, "throw-hit", (qd) ->
  345. {
  346. if(e.getRayTraceResult().entityHit != null)
  347. {
  348. qd.setVar("is-entity-hit", true);
  349. qd.setVar("entity-hit", e.getRayTraceResult().entityHit);
  350. }
  351. else
  352. {
  353. qd.setVar("is-entity-hit", false);
  354. }
  355. ScriptVars.setEntityVars(qd, e.getEntityThrowable());
  356. });
  357. }
  358. }
  359. public void onEntityItemProjectileHit(EntityPlayer p, ItemStack stack, List<Entity> ents)
  360. {
  361. handleEvent(p, "item-hit", (qd) ->
  362. {
  363. ScriptVars.setItemVars(qd, stack);
  364. qd.setVar("entities", ents);
  365. });
  366. }
  367. @SubscribeEvent
  368. public void QuestEntityShear(PlayerInteractEvent.EntityInteract e)
  369. {
  370. if(e.getHand() == EnumHand.OFF_HAND || !(e.getTarget() instanceof EntitySheep))
  371. {
  372. return;
  373. }
  374. EntityPlayer p = e.getEntityPlayer();
  375. if(p.getHeldItemMainhand().getItem() != Items.SHEARS)
  376. {
  377. return;
  378. }
  379. EntitySheep sheep = (EntitySheep) e.getTarget();
  380. handleEvent(p, "entity-shear", (qd) ->
  381. {
  382. ScriptVars.setEntityVars(qd, sheep);
  383. qd.setVar("entity-sheared", sheep.getSheared());
  384. qd.setVar("entity-color", sheep.getFleeceColor().toString());
  385. qd.setVar("cancel", e.isCanceled());
  386. }, (qd) ->
  387. {
  388. e.setCanceled(qd.getBoolean("cancel"));
  389. sheep.setSheared(qd.getBoolean("entity-sheared"));
  390. });
  391. }
  392. @SubscribeEvent
  393. public void QuestBlockBreak(BlockEvent.BreakEvent e)
  394. {
  395. handleEvent(e.getPlayer(), "block-break", (qd) ->
  396. {
  397. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  398. qd.setVar("cancel", e.isCanceled());
  399. }, (qd) ->
  400. {
  401. e.setCanceled(qd.getBoolean("cancel"));
  402. });
  403. }
  404. @SubscribeEvent
  405. public void QuestPlayerLogin(PlayerEvent.PlayerLoggedInEvent e)
  406. {
  407. EntityPlayer p = e.player;
  408. if(p == null)
  409. {
  410. return;
  411. }
  412. handleEvent(p, "player-login", (qd) ->
  413. {
  414. qd.setVar("first-join", Utils.hasPlayedBefore(p));
  415. PlayerList list = KajetansMod.server.getPlayerList();
  416. qd.setVar("is-banned", list.getBannedPlayers().isBanned(p.getGameProfile()));
  417. qd.setVar("is-whitelisted", list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile()));
  418. });
  419. }
  420. @SubscribeEvent
  421. public void QuestPlayerJoin(PlayerJoinMessageEvent e)
  422. {
  423. EntityPlayer p = e.getEntityPlayer();
  424. handleEvent(p, "player-join-server", (qd) ->
  425. {
  426. qd.setVar("message", e.getMessage());
  427. qd.setVar("changed-name", e.hasNameChanged());
  428. qd.setVar("cancel", e.isCanceled());
  429. }, (qd) ->
  430. {
  431. e.setMessage(String.valueOf(qd.getVar("message")));
  432. e.setCanceled(qd.getBoolean("cancel"));
  433. });
  434. }
  435. @SubscribeEvent
  436. public void onPlayerLeave(PlayerLeaveMessageEvent e)
  437. {
  438. EntityPlayer p = e.getEntityPlayer();
  439. handleEvent(p, "player-leave", (qd) ->
  440. {
  441. qd.setVar("message", e.getMessage());
  442. qd.setVar("cancel", e.isCanceled());
  443. }, (qd) ->
  444. {
  445. e.setMessage(String.valueOf(qd.getVar("message")));
  446. e.setCanceled(qd.getBoolean("cancel"));
  447. });
  448. }
  449. @SubscribeEvent
  450. public void QuestBucketFill(FillBucketEvent e)
  451. {
  452. handleEvent(e.getEntityPlayer(), "bucket-fill", (qd) ->
  453. {
  454. RayTraceResult ray = e.getTarget();
  455. if(ray != null)
  456. {
  457. BlockPos pos = ray.getBlockPos();
  458. if(pos != null)
  459. {
  460. qd.setVar("has-block", true);
  461. ScriptVars.setBlockVars(qd, e.getWorld(), pos);
  462. }
  463. else
  464. {
  465. qd.setVar("has-block", false);
  466. }
  467. }
  468. else
  469. {
  470. qd.setVar("has-block", false);
  471. }
  472. qd.setVar("cancel", e.isCanceled());
  473. }, (qd) ->
  474. {
  475. e.setCanceled(qd.getBoolean("cancel"));
  476. });
  477. }
  478. @SubscribeEvent
  479. public void QuestBlockPlace(BlockEvent.PlaceEvent e)
  480. {
  481. handleEvent(e.getPlayer(), "block-place", (qd) ->
  482. {
  483. qd.setVar("block-type-after", e.getPlacedBlock().getBlock().getRegistryName());
  484. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  485. qd.setVar("cancel", e.isCanceled());
  486. }, (qd) ->
  487. {
  488. e.setCanceled(qd.getBoolean("cancel"));
  489. });
  490. }
  491. @SubscribeEvent
  492. public void QuestClickBlockRight(PlayerInteractEvent.RightClickBlock e)
  493. {
  494. if(e.getHand() == EnumHand.OFF_HAND)
  495. {
  496. return;
  497. }
  498. handleEvent(e.getEntityPlayer(), "block-click", (qd) ->
  499. {
  500. qd.setVar("action", "right");
  501. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  502. qd.setVar("cancel", e.isCanceled());
  503. }, (qd) ->
  504. {
  505. e.setCanceled(qd.getBoolean("cancel"));
  506. });
  507. }
  508. @SubscribeEvent
  509. public void QuestClickBlockLeft(PlayerInteractEvent.LeftClickBlock e)
  510. {
  511. if(e.getHand() == EnumHand.OFF_HAND)
  512. {
  513. return;
  514. }
  515. handleEvent(e.getEntityPlayer(), "block-click", (qd) ->
  516. {
  517. qd.setVar("action", "left");
  518. ScriptVars.setBlockVars(qd, e.getWorld(), e.getPos());
  519. qd.setVar("cancel", e.isCanceled());
  520. }, (qd) ->
  521. {
  522. e.setCanceled(qd.getBoolean("cancel"));
  523. });
  524. }
  525. @SubscribeEvent
  526. public void QuestClickEntity(PlayerInteractEvent.EntityInteract e)
  527. {
  528. if(e.getHand() != EnumHand.OFF_HAND)
  529. {
  530. handleEvent(e.getEntityPlayer(), "entity-click", (qd) ->
  531. {
  532. ScriptVars.setEntityVars(qd, e.getTarget());
  533. qd.setVar("cancel", e.isCanceled());
  534. }, (qd) ->
  535. {
  536. e.setCanceled(qd.getBoolean("cancel"));
  537. });
  538. }
  539. }
  540. @SubscribeEvent
  541. public void QuestFishing(ItemFishedEvent e)
  542. {
  543. handleEvent(e.getEntityPlayer(), "fishing", (qd) ->
  544. {
  545. qd.setVar("drops", e.getDrops());
  546. qd.setVar("cancel", e.isCanceled());
  547. }, (qd) ->
  548. {
  549. e.setCanceled(qd.getBoolean("cancel"));
  550. });
  551. }
  552. @SubscribeEvent
  553. public void QuestUseitem(LivingEntityUseItemEvent.Start e)
  554. {
  555. if(!(e.getEntityLiving() instanceof EntityPlayer))
  556. {
  557. return;
  558. }
  559. handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-start", (qd) ->
  560. {
  561. qd.setVar("duration", e.getDuration());
  562. qd.setVar("cancel", e.isCanceled());
  563. }, (qd) ->
  564. {
  565. e.setCanceled(qd.getBoolean("cancel"));
  566. try
  567. {
  568. e.setDuration((int) qd.getVar("duration"));
  569. }
  570. catch(Exception ex)
  571. {
  572. KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(duration)");
  573. }
  574. });
  575. }
  576. @SubscribeEvent
  577. public void QuestConsuming(LivingEntityUseItemEvent.Finish e)
  578. {
  579. if(!(e.getEntityLiving() instanceof EntityPlayer))
  580. {
  581. return;
  582. }
  583. handleEvent((EntityPlayer) e.getEntityLiving(), "item-use-finish", (qd) ->
  584. {
  585. qd.setVar("cancel", e.isCanceled());
  586. }, (qd) ->
  587. {
  588. e.setCanceled(qd.getBoolean("cancel"));
  589. });
  590. }
  591. @SubscribeEvent
  592. public void QuestCrafting(PlayerEvent.ItemCraftedEvent e)
  593. {
  594. handleEvent(e.player, "craft", (qd) ->
  595. {
  596. ScriptVars.setItemVars(qd, e.crafting);
  597. qd.setVar("cancel", e.isCanceled());
  598. }, (qd) ->
  599. {
  600. e.setCanceled(qd.getBoolean("cancel"));
  601. });
  602. }
  603. @SubscribeEvent
  604. public void QuestDropItem(ItemTossEvent e)
  605. {
  606. handleEvent(e.getPlayer(), "player-toss", (qd) ->
  607. {
  608. ScriptVars.setItemVars(qd, e.getEntityItem().getEntityItem());
  609. qd.setVar("cancel", e.isCanceled());
  610. }, (qd) ->
  611. {
  612. e.setCanceled(qd.getBoolean("cancel"));
  613. });
  614. }
  615. @SubscribeEvent
  616. public void QuestPickupItem(EntityItemPickupEvent e)
  617. {
  618. handleEvent(e.getEntityPlayer(), "player-pickup", (qd) ->
  619. {
  620. ScriptVars.setItemVars(qd, e.getItem().getEntityItem());
  621. qd.setVar("cancel", e.isCanceled());
  622. }, (qd) ->
  623. {
  624. e.setCanceled(qd.getBoolean("cancel"));
  625. });
  626. }
  627. @SubscribeEvent
  628. public void VehicleEnterEvent(EntityMountEvent e)
  629. {
  630. if(!(e.getEntityMounting() instanceof EntityPlayer))
  631. {
  632. return;
  633. }
  634. EntityPlayer p = (EntityPlayer) e.getEntityMounting();
  635. handleEvent(p, "entity-mount", (qd) ->
  636. {
  637. qd.setVar("mounting", e.isMounting());
  638. ScriptVars.setEntityVars(qd, e.getEntityBeingMounted());
  639. qd.setVar("cancel", e.isCanceled());
  640. }, (qd) ->
  641. {
  642. e.setCanceled(qd.getBoolean("cancel"));
  643. });
  644. }
  645. @SubscribeEvent
  646. public void PlayerPortalEvent(PlayerEvent.PlayerChangedDimensionEvent e)
  647. {
  648. handleEvent(e.player, "portal", (qd) ->
  649. {
  650. qd.setVar("from", e.fromDim);
  651. qd.setVar("to", e.toDim);
  652. });
  653. }
  654. @SubscribeEvent
  655. public void onCommand(CommandEvent e)
  656. {
  657. if(e.getSender() instanceof EntityPlayer)
  658. {
  659. handleEvent((EntityPlayer) e.getSender(), "command", (qd) ->
  660. {
  661. qd.setVar("command", e.getCommand().getName());
  662. qd.setVar("args", Arrays.stream(e.getParameters()).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
  663. qd.setVar("cancel", e.isCanceled());
  664. }, (qd) ->
  665. {
  666. e.setCanceled(qd.getBoolean("cancel"));
  667. });
  668. }
  669. }
  670. public void onCustomCommand(EntityPlayer p, String command, String args)
  671. {
  672. handleEvent(p, "custom-command", (qd) ->
  673. {
  674. qd.setVar("command", command);
  675. if(args.length() == 0)
  676. {
  677. qd.setVar("args", new ArrayList<>());
  678. }
  679. qd.setVar("args", Arrays.stream(args.trim().split(" ")).map(s -> ScriptUtils.convertInput(s)).collect(Collectors.toList()));
  680. });
  681. }
  682. public void useEffectEvent(PlayerUsesEffectEvent e)
  683. {
  684. handleEvent(e.getPlayer(), "player-use-effect", (qd) ->
  685. {
  686. qd.setVar("power", e.getPower());
  687. qd.setVar("mana-cost", e.getMana());
  688. qd.setVar("cause", e.getCause().toString());
  689. qd.setVar("effect", e.getEffect());
  690. qd.setVar("cancel", e.isCanceled());
  691. }, (qd) ->
  692. {
  693. try
  694. {
  695. int power = (int) qd.getVar("power");
  696. if(power < 1 || power > 20)
  697. {
  698. throw new IllegalArgumentException();
  699. }
  700. e.setPower(power);
  701. }
  702. catch(Exception ex)
  703. {
  704. KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(power)");
  705. }
  706. try
  707. {
  708. int mana = (int) qd.getVar("mana-cost");
  709. if(mana < 0)
  710. {
  711. throw new IllegalArgumentException();
  712. }
  713. e.setMana(mana);
  714. }
  715. catch(Exception ex)
  716. {
  717. KajetansMod.scripts.getQuestParser().printQuestException(qd, ex, "(mana-cost)");
  718. }
  719. e.setCanceled(qd.getBoolean("cancel"));
  720. });
  721. }
  722. @SubscribeEvent
  723. public void QuestVillagerPickUpItem(ItemTossEvent e)
  724. {
  725. EntityPlayer p = e.getPlayer();
  726. if(KajetansMod.scripts.hasQuest(p))
  727. {
  728. Script qd = KajetansMod.scripts.getQuestData(p);
  729. if(qd == null || !qd.isEventLoaded("villager-give"))
  730. {
  731. return;
  732. }
  733. final EntityItem itemEnt = e.getEntityItem();
  734. KajetansMod.scheduler.scheduleTask(() ->
  735. {
  736. if(itemEnt.isDead)
  737. {
  738. return;
  739. }
  740. EntityVillager v = Utils.getNearestEntity(p.world, itemEnt.getPositionVector(), 2, EntityVillager.class);
  741. if(v == null)
  742. {
  743. return;
  744. }
  745. Script data = KajetansMod.scripts.getQuestData(p);
  746. if(data == null || !data.isEventLoaded("villager-give"))
  747. {
  748. return;
  749. }
  750. data.setVar("event", "villager-give");
  751. ScriptVars.setPlayerVars(data, p);
  752. ScriptVars.setItemVars(data, itemEnt.getEntityItem());
  753. data.setVar("villager-loc", new Location(v));
  754. data.setVar("villager-prof", v.getProfessionForge().getRegistryName());
  755. data.setVar("cancel", e.isCanceled());
  756. data.runCode();
  757. if(data.getBoolean("cancel"))
  758. {
  759. return;
  760. }
  761. itemEnt.setDead();
  762. }, 40);
  763. }
  764. }
  765. }