ScriptEvents.java 27 KB

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