ScriptEvents.java 28 KB

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