ScriptEvents.java 28 KB

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