ScriptEvents.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797
  1. package me.km.snuviscript;
  2. import java.util.*;
  3. import java.util.function.Consumer;
  4. import java.util.stream.Collectors;
  5. import me.hammerle.snuviscript.code.*;
  6. import me.hammerle.snuviscript.inputprovider.Variable;
  7. import me.kcm.BlockHarvest;
  8. import me.kcm.Craft;
  9. import me.km.utils.Utils;
  10. import me.km.entities.*;
  11. import me.km.events.CommandEvent;
  12. import me.km.inventory.ModInventory;
  13. import me.km.utils.*;
  14. import net.minecraft.block.*;
  15. import net.minecraft.command.ICommandSource;
  16. import net.minecraft.entity.*;
  17. import net.minecraft.entity.item.FallingBlockEntity;
  18. import net.minecraft.entity.player.*;
  19. import net.minecraft.inventory.*;
  20. import net.minecraft.inventory.container.ClickType;
  21. import net.minecraft.item.ItemStack;
  22. import net.minecraft.item.crafting.ICraftingRecipe;
  23. import net.minecraft.item.crafting.IRecipeType;
  24. import net.minecraft.loot.LootContext;
  25. import net.minecraft.loot.LootParameters;
  26. import net.minecraft.network.play.server.SSetSlotPacket;
  27. import net.minecraft.server.MinecraftServer;
  28. import net.minecraft.server.management.PlayerList;
  29. import net.minecraft.tileentity.TileEntity;
  30. import net.minecraft.util.math.*;
  31. import net.minecraft.util.math.vector.Vector3d;
  32. import net.minecraft.util.text.*;
  33. import net.minecraft.world.*;
  34. import net.minecraft.world.server.ServerWorld;
  35. import net.minecraftforge.event.*;
  36. import net.minecraftforge.event.entity.*;
  37. import net.minecraftforge.event.entity.item.ItemTossEvent;
  38. import net.minecraftforge.event.entity.living.*;
  39. import net.minecraftforge.event.entity.living.LivingEvent.LivingJumpEvent;
  40. import net.minecraftforge.event.entity.player.*;
  41. import net.minecraftforge.event.world.*;
  42. import net.minecraftforge.eventbus.api.*;
  43. import net.minecraftforge.event.entity.player.PlayerEvent;
  44. import net.minecraftforge.eventbus.api.Event.Result;
  45. public class ScriptEvents implements BlockHarvest, Craft {
  46. private static void setLiving(Script sc, LivingEntity ent) {
  47. sc.setVar("living_entity", ent);
  48. }
  49. private static void setItem(Script sc, ItemStack stack) {
  50. sc.setVar("item", stack);
  51. }
  52. private static void setPlayer(Script sc, PlayerEntity p) {
  53. sc.setVar("player", p);
  54. // deprecated
  55. sc.setVar("player_name", p == null ? null : p.getName().getString());
  56. }
  57. @SuppressWarnings("")
  58. private static void setBlock(Script sc, World w, BlockPos pos, BlockState state) {
  59. sc.setVar("block_loc", new Location(w, pos));
  60. sc.setVar("block_type", state.getBlock().getRegistryName().toString());
  61. sc.setVar("block", state.getBlock());
  62. }
  63. @SuppressWarnings("")
  64. private static void setBlock(Script sc, World w, BlockPos pos) {
  65. BlockState state = w.getBlockState(pos);
  66. sc.setVar("block_loc", new Location(w, pos));
  67. sc.setVar("block_type", state.getBlock().getRegistryName().toString());
  68. sc.setVar("block", state.getBlock());
  69. }
  70. private static void setEntity(Script sc, Entity ent) {
  71. sc.setVar("entity", ent);
  72. }
  73. private final Scripts scripts;
  74. private final MinecraftServer server;
  75. public ScriptEvents(Scripts scripts, MinecraftServer server) {
  76. this.scripts = scripts;
  77. this.server = server;
  78. }
  79. private static void nothing(Script sc) {}
  80. private void handleEvent(Event e, String event, Consumer<Script> before,
  81. Consumer<Script> after) {
  82. if(e.isCancelable()) {
  83. scripts.getScriptManager().callEvent(event, sc -> {
  84. before.accept(sc);
  85. sc.setVar("cancel", e.isCanceled());
  86. }, sc -> {
  87. after.accept(sc);
  88. handleVar(sc, event, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  89. });
  90. } else {
  91. scripts.getScriptManager().callEvent(event, before, after);
  92. }
  93. }
  94. private void handleEvent(Event e, String event, Consumer<Script> before) {
  95. handleEvent(e, event, before, ScriptEvents::nothing);
  96. }
  97. private void handleEvent(String event, Consumer<Script> before, Consumer<Script> after) {
  98. scripts.getScriptManager().callEvent(event, before, after);
  99. }
  100. private void handleEvent(String event, Consumer<Script> before) {
  101. handleEvent(event, before, ScriptEvents::nothing);
  102. }
  103. private void handleVar(Script sc, String event, String name, Consumer<Variable> c) {
  104. try {
  105. ifVarNotNull(sc, name, c);
  106. } catch(Exception ex) {
  107. scripts.getLogger().print(String.format("invalid var in '%s' event", event), ex, null,
  108. sc.getName(), sc, sc.getStackTrace());
  109. }
  110. }
  111. private void ifVarNotNull(Script sc, String name, Consumer<Variable> c) {
  112. Variable v = sc.getVar(name);
  113. if(v != null) {
  114. c.accept(v);
  115. }
  116. }
  117. private void simpleCancel(Script sc, Event e, String name) {
  118. try {
  119. ifVarNotNull(sc, "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  120. } catch(Exception ex) {
  121. scripts.getLogger().print(String.format("invalid var in '%s' event", name), ex, null,
  122. sc.getName(), sc, sc.getStackTrace());
  123. }
  124. }
  125. public void onPlayerDataTick(PlayerEntity p, String var) {
  126. handleEvent("player_data_tick", sc -> {
  127. setPlayer(sc, p);
  128. sc.setVar("var", var);
  129. });
  130. }
  131. public void onPlayerStartElytra(PlayerEntity p) {
  132. handleEvent("player_elytra_start", sc -> {
  133. setPlayer(sc, p);
  134. });
  135. }
  136. public void onPlayerStopElytra(PlayerEntity p) {
  137. handleEvent("player_elytra_stop", sc -> {
  138. setPlayer(sc, p);
  139. });
  140. }
  141. public void onPlayerMove(PlayerEntity p, int id) {
  142. handleEvent("player_move", sc -> {
  143. setPlayer(sc, p);
  144. sc.setVar("id", (double) id);
  145. });
  146. }
  147. public boolean onInventoryClick(Script script, ITextComponent text, ModInventory inv, int slot,
  148. ClickType click, PlayerEntity p) {
  149. scripts.getScriptManager().callEvent("inv_click", script, sc -> {
  150. setPlayer(sc, p);
  151. sc.setVar("inv", inv);
  152. sc.setVar("inv_id", (double) inv.getModId());
  153. sc.setVar("inv_name", text.getString());
  154. sc.setVar("inv_slot", (double) slot);
  155. setItem(sc, inv.getStackInSlot(slot));
  156. sc.setVar("cancel", false);
  157. }, ScriptEvents::nothing);
  158. Variable v = script.getVar("cancel");
  159. return v != null && v.getBoolean(script);
  160. }
  161. public void onInventoryClose(Script script, ITextComponent text, ModInventory inv,
  162. PlayerEntity p) {
  163. scripts.getScriptManager().callEvent("inv_close", script, sc -> {
  164. setPlayer(sc, p);
  165. sc.setVar("inv", inv);
  166. sc.setVar("inv_id", (double) inv.getModId());
  167. sc.setVar("inv_name", text.getString());
  168. }, ScriptEvents::nothing);
  169. }
  170. public void onHumanHurt(Entity attacker, EntityHuman h) {
  171. handleEvent("human_hurt", sc -> {
  172. setEntity(sc, attacker);
  173. sc.setVar("human", h);
  174. });
  175. }
  176. @SubscribeEvent(receiveCanceled = true)
  177. public void onPlayerPostRespawn(PlayerEvent.PlayerRespawnEvent e) {
  178. handleEvent("player_post_respawn", sc -> setPlayer(sc, e.getPlayer()));
  179. }
  180. public void onPlayerPreRespawn(PlayerEntity p) {
  181. handleEvent("player_pre_respawn", sc -> setPlayer(sc, p));
  182. }
  183. @SubscribeEvent(receiveCanceled = true)
  184. public void onLivingDamage(LivingDamageEvent e) {
  185. handleEvent(e, "living_damage", (sc) -> {
  186. setLiving(sc, e.getEntityLiving());
  187. sc.setVar("damage_source", e.getSource());
  188. sc.setVar("damage_amount", (double) e.getAmount());
  189. }, (sc) -> {
  190. handleVar(sc, "living_damage", "damage_amount", v -> e.setAmount(v.getFloat(sc)));
  191. });
  192. }
  193. @SubscribeEvent(receiveCanceled = true)
  194. public void onLivingHurt(LivingHurtEvent e) {
  195. handleEvent(e, "living_hurt", (sc) -> {
  196. setLiving(sc, e.getEntityLiving());
  197. sc.setVar("damage_source", e.getSource());
  198. sc.setVar("damage_amount", (double) e.getAmount());
  199. }, (sc) -> {
  200. handleVar(sc, "living_hurt", "damage_amount", v -> e.setAmount(v.getFloat(sc)));
  201. });
  202. }
  203. @SubscribeEvent(receiveCanceled = true)
  204. public void onLivingAttacked(LivingAttackEvent e) {
  205. handleEvent(e, "living_pre_hurt", (sc) -> {
  206. setLiving(sc, e.getEntityLiving());
  207. sc.setVar("damage_source", e.getSource());
  208. sc.setVar("damage_amount", (double) e.getAmount());
  209. });
  210. }
  211. @SubscribeEvent(receiveCanceled = true)
  212. public void onLivingHeal(LivingHealEvent e) {
  213. handleEvent(e, "living_heal", (sc) -> {
  214. setLiving(sc, e.getEntityLiving());
  215. sc.setVar("heal_amount", (double) e.getAmount());
  216. }, (sc) -> {
  217. handleVar(sc, "living_heal", "heal_amount", v -> e.setAmount(v.getFloat(sc)));
  218. });
  219. }
  220. @SubscribeEvent(receiveCanceled = true)
  221. public void onLivingDeath(LivingDeathEvent e) {
  222. handleEvent(e, "living_death", (sc) -> {
  223. setLiving(sc, e.getEntityLiving());
  224. sc.setVar("damage_source", e.getSource());
  225. });
  226. }
  227. @SubscribeEvent(receiveCanceled = true)
  228. public void onLivingDrop(LivingDropsEvent e) {
  229. handleEvent(e, "living_drop", (sc) -> {
  230. setLiving(sc, e.getEntityLiving());
  231. sc.setVar("drops", e.getDrops());
  232. sc.setVar("damage_source", e.getSource());
  233. sc.setVar("looting", (double) e.getLootingLevel());
  234. });
  235. }
  236. @SubscribeEvent(receiveCanceled = true)
  237. public void onLivingExperienceDrop(LivingExperienceDropEvent e) {
  238. handleEvent(e, "living_experience_drop", (sc) -> {
  239. setLiving(sc, e.getEntityLiving());
  240. sc.setVar("experience", (double) e.getDroppedExperience());
  241. }, (sc) -> {
  242. handleVar(sc, "living_experience_drop", "experience",
  243. v -> e.setDroppedExperience(v.getInt(sc)));
  244. });
  245. }
  246. @SubscribeEvent(receiveCanceled = true)
  247. public void onProjectileHit(ProjectileImpactEvent e) {
  248. final Entity hitEntity;
  249. final Location loc;
  250. RayTraceResult ray = e.getRayTraceResult();
  251. switch(ray.getType()) {
  252. case ENTITY:
  253. hitEntity = ((EntityRayTraceResult) e.getRayTraceResult()).getEntity();
  254. loc = null;
  255. break;
  256. case BLOCK:
  257. loc = new Location(e.getEntity().world,
  258. ((BlockRayTraceResult) e.getRayTraceResult()).getPos());
  259. hitEntity = null;
  260. break;
  261. default:
  262. return;
  263. }
  264. handleEvent(e, "projectile_hit", (sc) -> {
  265. sc.setVar("projectile", e.getEntity());
  266. sc.setVar("entity_hit", hitEntity);
  267. sc.setVar("loc_hit", loc);
  268. sc.setVar("shooter", Utils.getEntityFromProjectile(e.getEntity()));
  269. });
  270. }
  271. public void onEntityItemProjectileHit(EntityItemProjectile ent, LivingEntity liv,
  272. ItemStack stack, Entity hitEntity, BlockPos pos) {
  273. Location loc = (pos == null) ? null : new Location(ent.world, pos);
  274. handleEvent("item_hit", (sc) -> {
  275. sc.setVar("projectile", ent);
  276. setItem(sc, stack);
  277. sc.setVar("entity_hit", hitEntity);
  278. sc.setVar("loc_hit", loc);
  279. sc.setVar("shooter", liv);
  280. });
  281. }
  282. @Override
  283. public List<ItemStack> onBlockHarvest(BlockState state, ServerWorld w, BlockPos pos,
  284. TileEntity tileEnt, Entity ent, ItemStack stack) {
  285. LootContext.Builder loot = new LootContext.Builder(w).withRandom(w.getRandom())
  286. .withParameter(LootParameters.field_237457_g_, Vector3d.copyCentered(pos))
  287. .withParameter(LootParameters.TOOL, stack == null ? ItemStack.EMPTY : stack)
  288. .withNullableParameter(LootParameters.THIS_ENTITY, ent)
  289. .withNullableParameter(LootParameters.BLOCK_ENTITY, tileEnt);
  290. List<ItemStack> list = state.getDrops(loot);
  291. try {
  292. final Block b = state.getBlock();
  293. final String name = b.getRegistryName().toString();
  294. scripts.getScriptManager().callEvent("block_drop", sc -> {
  295. sc.setVar("drops", list);
  296. sc.setVar("block_type", name);
  297. sc.setVar("block", b);
  298. sc.setVar("location", new Location(w, pos));
  299. setEntity(sc, ent);
  300. setItem(sc, stack);
  301. }, ScriptEvents::nothing);
  302. } catch(Exception ex) {
  303. ex.printStackTrace();
  304. }
  305. return list;
  306. }
  307. @SubscribeEvent(receiveCanceled = true)
  308. public void onBlockBreak(BlockEvent.BreakEvent e) {
  309. handleEvent("block_break", (sc) -> {
  310. setPlayer(sc, e.getPlayer());
  311. setBlock(sc, (World) e.getWorld(), e.getPos(), e.getState());
  312. sc.setVar("cancel", e.isCanceled());
  313. }, (sc) -> {
  314. simpleCancel(sc, e, "block_break");
  315. });
  316. }
  317. @SubscribeEvent(receiveCanceled = true)
  318. public void onBlockPlace(BlockEvent.EntityPlaceEvent e) {
  319. if(!(e.getEntity() instanceof PlayerEntity)) {
  320. return;
  321. }
  322. PlayerEntity p = (PlayerEntity) e.getEntity();
  323. handleEvent("block_place", (sc) -> {
  324. setPlayer(sc, p);
  325. sc.setVar("block_type_after", e.getPlacedBlock().getBlock().getRegistryName());
  326. setBlock(sc, (World) e.getWorld(), e.getPos(), e.getState());
  327. sc.setVar("cancel", e.isCanceled());
  328. }, (sc) -> {
  329. simpleCancel(sc, e, "block_place");
  330. });
  331. }
  332. @SubscribeEvent(receiveCanceled = true)
  333. public void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent e) {
  334. PlayerEntity p = e.getPlayer();
  335. if(p == null) {
  336. return;
  337. }
  338. PlayerList list = server.getPlayerList();
  339. boolean banned = list.getBannedPlayers().isBanned(p.getGameProfile());
  340. boolean whitelisted = list.getWhitelistedPlayers().isWhitelisted(p.getGameProfile());
  341. handleEvent("player_login", (sc) -> {
  342. setPlayer(sc, p);
  343. sc.setVar("is_banned", banned);
  344. sc.setVar("is_whitelisted", whitelisted);
  345. });
  346. }
  347. @SubscribeEvent(receiveCanceled = true)
  348. public void onPlayerLogout(PlayerEvent.PlayerLoggedOutEvent e) {
  349. PlayerEntity p = e.getPlayer();
  350. if(p == null || e.getPlayer().ticksExisted < 20) {
  351. return;
  352. }
  353. handleEvent("player_logout", sc -> setPlayer(sc, p));
  354. }
  355. @SubscribeEvent(receiveCanceled = true)
  356. public void onBucketFill(FillBucketEvent e) {
  357. handleEvent("bucket_use", (sc) -> {
  358. setPlayer(sc, e.getPlayer());
  359. RayTraceResult ray = e.getTarget();
  360. if(ray != null && ray.hitInfo != null && ray.hitInfo instanceof BlockPos) {
  361. BlockPos pos = (BlockPos) ray.hitInfo;
  362. sc.setVar("has_block", true);
  363. ScriptEvents.setBlock(sc, e.getWorld(), pos);
  364. } else {
  365. sc.setVar("has_block", false);
  366. }
  367. sc.setVar("cancel", e.isCanceled());
  368. }, (sc) -> {
  369. simpleCancel(sc, e, "bucket_use");
  370. });
  371. }
  372. @SubscribeEvent(receiveCanceled = true)
  373. public void onRightClickBlock(PlayerInteractEvent.RightClickBlock e) {
  374. handleEvent("block_click", (sc) -> {
  375. setPlayer(sc, e.getPlayer());
  376. sc.setVar("action", "right");
  377. sc.setVar("hand", e.getHand().name());
  378. ScriptEvents.setBlock(sc, e.getWorld(), e.getPos());
  379. sc.setVar("cancel", e.isCanceled());
  380. }, (sc) -> {
  381. handleVar(sc, "block_click", "cancel", v -> {
  382. boolean b = v.getBoolean(sc);
  383. e.setCanceled(b);
  384. if(!b) {
  385. e.setUseBlock(Result.DEFAULT);
  386. e.setUseItem(Result.DEFAULT);
  387. }
  388. });
  389. });
  390. }
  391. @SubscribeEvent(receiveCanceled = true)
  392. public void onLeftClickBlock(PlayerInteractEvent.LeftClickBlock e) {
  393. handleEvent("block_click", (sc) -> {
  394. setPlayer(sc, e.getPlayer());
  395. sc.setVar("action", "left");
  396. sc.setVar("hand", e.getHand().name());
  397. ScriptEvents.setBlock(sc, e.getWorld(), e.getPos());
  398. sc.setVar("cancel", e.isCanceled());
  399. }, (sc) -> {
  400. handleVar(sc, "block_click", "cancel", v -> {
  401. boolean b = v.getBoolean(sc);
  402. e.setCanceled(b);
  403. if(!b) {
  404. e.setUseBlock(Result.DEFAULT);
  405. e.setUseItem(Result.DEFAULT);
  406. }
  407. });
  408. });
  409. }
  410. @SubscribeEvent(receiveCanceled = true)
  411. public void onEntityClick(PlayerInteractEvent.EntityInteract e) {
  412. handleEvent("entity_click", (sc) -> {
  413. setPlayer(sc, e.getPlayer());
  414. sc.setVar("hand", e.getHand().name());
  415. setEntity(sc, e.getTarget());
  416. sc.setVar("cancel", e.isCanceled());
  417. }, (sc) -> {
  418. simpleCancel(sc, e, "entity_click");
  419. });
  420. }
  421. public void onEmptyLeftClick(PlayerEntity p) {
  422. handleEvent("left_click_air", sc -> setPlayer(sc, p));
  423. }
  424. @SubscribeEvent(receiveCanceled = true)
  425. public void onItemClick(PlayerInteractEvent.RightClickItem e) {
  426. handleEvent("item_air_click", (sc) -> {
  427. setPlayer(sc, e.getPlayer());
  428. setItem(sc, e.getItemStack());
  429. sc.setVar("hand", e.getHand().toString());
  430. sc.setVar("cancel", e.isCanceled());
  431. }, (sc) -> {
  432. simpleCancel(sc, e, "item_air_click");
  433. });
  434. }
  435. @SubscribeEvent(receiveCanceled = true)
  436. public void onItemUseStart(LivingEntityUseItemEvent.Start e) {
  437. handleEvent(e, "item_use_start", (sc) -> {
  438. setLiving(sc, e.getEntityLiving());
  439. sc.setVar("duration", (double) e.getDuration());
  440. setItem(sc, e.getItem());
  441. }, (sc) -> {
  442. handleVar(sc, "item_use_start", "duration", v -> e.setDuration(v.getInt(sc)));
  443. });
  444. }
  445. @SubscribeEvent(receiveCanceled = true)
  446. public void onConsuming(LivingEntityUseItemEvent.Finish e) {
  447. handleEvent(e, "item_use_finish", (sc) -> {
  448. setLiving(sc, e.getEntityLiving());
  449. setItem(sc, e.getItem());
  450. sc.setVar("result", e.getResultStack());
  451. }, (sc) -> {
  452. handleVar(sc, "item_use_finish", "result", v -> {
  453. ItemStack stack = (ItemStack) v.get(sc);
  454. if(stack == null) {
  455. e.setResultStack(ItemStack.EMPTY);
  456. } else {
  457. e.setResultStack(stack);
  458. }
  459. });
  460. });
  461. }
  462. @SubscribeEvent(receiveCanceled = true)
  463. public void onFishing(ItemFishedEvent e) {
  464. handleEvent("fishing", (sc) -> {
  465. setPlayer(sc, e.getPlayer());
  466. sc.setVar("drops", e.getDrops());
  467. sc.setVar("hook", e.getHookEntity());
  468. sc.setVar("rod_damage", (double) e.getRodDamage());
  469. sc.setVar("cancel", e.isCanceled());
  470. }, (sc) -> {
  471. simpleCancel(sc, e, "fishing");
  472. handleVar(sc, "fishing", "rod_damage", v -> e.damageRodBy(v.getInt(sc)));
  473. });
  474. }
  475. @SubscribeEvent(receiveCanceled = true)
  476. public void onCrafting(PlayerEvent.ItemCraftedEvent e) {
  477. handleEvent("craft", (sc) -> {
  478. setPlayer(sc, e.getPlayer());
  479. setItem(sc, e.getCrafting());
  480. });
  481. }
  482. @SubscribeEvent(receiveCanceled = true)
  483. public void onItemDrop(ItemTossEvent e) {
  484. handleEvent("player_toss", (sc) -> {
  485. setPlayer(sc, e.getPlayer());
  486. setItem(sc, e.getEntityItem().getItem());
  487. sc.setVar("cancel", e.isCanceled());
  488. }, (sc) -> {
  489. simpleCancel(sc, e, "player_toss");
  490. });
  491. }
  492. @SubscribeEvent(receiveCanceled = true)
  493. public void onItemPickup(EntityItemPickupEvent e) {
  494. handleEvent("player_pickup", (sc) -> {
  495. setPlayer(sc, e.getPlayer());
  496. setEntity(sc, e.getItem());
  497. setItem(sc, e.getItem().getItem());
  498. sc.setVar("cancel", e.isCanceled());
  499. }, (sc) -> {
  500. simpleCancel(sc, e, "player_pickup");
  501. });
  502. }
  503. @SubscribeEvent(receiveCanceled = true)
  504. public void onEntityMount(EntityMountEvent e) {
  505. handleEvent(e, "entity_mount", (sc) -> {
  506. sc.setVar("mounting", e.isMounting());
  507. setEntity(sc, e.getEntityBeingMounted());
  508. sc.setVar("rider", e.getEntityMounting());
  509. });
  510. }
  511. @SubscribeEvent(receiveCanceled = true)
  512. public void onPlayerUsePortal(PlayerEvent.PlayerChangedDimensionEvent e) {
  513. handleEvent("portal", (sc) -> {
  514. setPlayer(sc, e.getPlayer());
  515. sc.setVar("from", e.getFrom().getRegistryName().getPath());
  516. sc.setVar("to", e.getTo().getRegistryName().getPath());
  517. });
  518. }
  519. public void onCommand(CommandEvent e) {
  520. handleEvent("command", (sc) -> {
  521. setPlayer(sc, e.getPlayer());
  522. sc.setVar("command", e.getName());
  523. sc.setVar("cancel", e.isCanceled());
  524. }, (sc) -> {
  525. handleVar(sc, "command", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  526. });
  527. }
  528. public void onCustomCommand(PlayerEntity p, String command, String[] args) {
  529. handleEvent("custom_command", (sc) -> {
  530. setPlayer(sc, p);
  531. sc.setVar("command", command);
  532. if(args.length == 0) {
  533. sc.setVar("args", new ArrayList<>());
  534. } else {
  535. sc.setVar("args", Arrays.stream(args).map(s -> SnuviUtils.convert(s))
  536. .collect(Collectors.toList()));
  537. }
  538. });
  539. }
  540. public void onFunctionKey(ServerPlayerEntity p, int key) {
  541. handleEvent("function_key", (sc) -> {
  542. setPlayer(sc, p);
  543. sc.setVar("key", (double) key);
  544. });
  545. }
  546. @SubscribeEvent(receiveCanceled = true)
  547. public void onChatEvent(ServerChatEvent e) {
  548. handleEvent("chat", (sc) -> {
  549. setPlayer(sc, e.getPlayer());
  550. sc.setVar("message", e.getMessage());
  551. sc.setVar("cancel", e.isCanceled());
  552. }, (sc) -> {
  553. handleVar(sc, "chat", "message",
  554. v -> e.setComponent(new StringTextComponent(v.getString(sc))));
  555. handleVar(sc, "chat", "cancel", v -> e.setCanceled(v.getBoolean(sc)));
  556. });
  557. }
  558. @SubscribeEvent(receiveCanceled = true, priority = EventPriority.HIGHEST)
  559. public void onPreExplosion(ExplosionEvent.Start e) {
  560. e.setCanceled(true);
  561. handleEvent(e, "pre_explosion", sc -> {
  562. sc.setVar("damage_source", e.getExplosion().getDamageSource());
  563. sc.setVar("location", new Location(e.getWorld(), e.getExplosion().getPosition()));
  564. });
  565. }
  566. @SubscribeEvent
  567. public void onExplosion(ExplosionEvent.Detonate e) {
  568. ReflectionUtils.setNoBreakMode(e.getExplosion());
  569. handleEvent(e, "explosion", sc -> {
  570. sc.setVar("affected_blocks", e.getAffectedBlocks());
  571. sc.setVar("affected_entities", e.getAffectedEntities());
  572. sc.setVar("damage_source", e.getExplosion().getDamageSource());
  573. sc.setVar("location", new Location(e.getWorld(), e.getExplosion().getPosition()));
  574. });
  575. }
  576. private static String getName(ICommandSource cs) {
  577. if(cs instanceof PlayerEntity) {
  578. return ((PlayerEntity) cs).getName().getString();
  579. } else if(cs instanceof MinecraftServer) {
  580. return "Server";
  581. }
  582. return null;
  583. }
  584. public void onMissingCommand(ICommandSource cs, String command) {
  585. PlayerEntity p = (cs instanceof PlayerEntity) ? (PlayerEntity) cs : null;
  586. handleEvent("missing_command", (sc) -> {
  587. setPlayer(sc, p);
  588. sc.setVar("command_name", command);
  589. sc.setVar("sender_name", getName(cs));
  590. });
  591. }
  592. public void onMissingPermission(ICommandSource cs, String command) {
  593. PlayerEntity p = (cs instanceof PlayerEntity) ? (PlayerEntity) cs : null;
  594. handleEvent("missing_perm", (sc) -> {
  595. setPlayer(sc, p);
  596. sc.setVar("command_name", command);
  597. sc.setVar("sender_name", getName(cs));
  598. });
  599. }
  600. @SubscribeEvent(receiveCanceled = true)
  601. public void onEntityJoinWorld(EntityJoinWorldEvent e) {
  602. Entity ent = e.getEntity();
  603. if(!e.getEntity().isPassenger()
  604. && !scripts.getEntityLimits().isAllowedToSpawn(ent.getType())) {
  605. e.getEntity().getPassengers().forEach(rider -> {
  606. if(rider == null || rider instanceof PlayerEntity) {
  607. return;
  608. }
  609. rider.remove();
  610. });
  611. e.getEntity().removePassengers();
  612. e.setCanceled(true);
  613. return;
  614. }
  615. handleEvent(e, "entity_join", (sc) -> {
  616. setEntity(sc, ent);
  617. });
  618. }
  619. @SubscribeEvent(receiveCanceled = true)
  620. public void onEntityLeaveWorld(EntityLeaveWorldEvent e) {
  621. Entity ent = e.getEntity();
  622. handleEvent(e, "entity_leave", (sc) -> {
  623. setEntity(sc, ent);
  624. });
  625. }
  626. @SubscribeEvent
  627. public void onServerTick(TickEvent.ServerTickEvent e) {
  628. if(e.phase == TickEvent.Phase.END) {
  629. scripts.getEntityLimits().tick(server.getWorlds());
  630. }
  631. }
  632. @SubscribeEvent(receiveCanceled = true)
  633. public void onAnimalTame(AnimalTameEvent e) {
  634. handleEvent(e, "animal_tame", (sc) -> {
  635. sc.setVar("animal", e.getAnimal());
  636. sc.setVar("tamer", e.getTamer());
  637. });
  638. }
  639. @SubscribeEvent(receiveCanceled = true)
  640. public void onJump(LivingJumpEvent e) {
  641. handleEvent(e, "living_jump", (sc) -> {
  642. setLiving(sc, e.getEntityLiving());
  643. });
  644. }
  645. public void onSneak(PlayerEntity p, boolean sneak) {
  646. handleEvent("player_sneak", (sc) -> {
  647. setPlayer(sc, p);
  648. sc.setVar("sneak", sneak);
  649. });
  650. }
  651. @SubscribeEvent(receiveCanceled = true)
  652. public void onMobGriefing(EntityMobGriefingEvent e) {
  653. handleEvent(e, "mob_griefing", (sc) -> {
  654. Entity ent = e.getEntity();
  655. setEntity(sc, ent);
  656. boolean b = true;
  657. if(ent != null) {
  658. World w = ent.world;
  659. if(w != null) {
  660. GameRules rules = w.getGameRules();
  661. if(rules != null) {
  662. try {
  663. b = !rules.getBoolean(GameRules.MOB_GRIEFING);
  664. } catch(Exception ex) {
  665. System.out.println("onMobGriefing Exception");
  666. ex.printStackTrace();
  667. }
  668. } else {
  669. System.out.println("Rules are null");
  670. }
  671. } else {
  672. System.out.println("World is null");
  673. }
  674. } else {
  675. System.out.println("Entity is null");
  676. }
  677. sc.setVar("cancel", b);
  678. }, (sc) -> {
  679. handleVar(sc, "mob_griefing", "cancel", (v) -> {
  680. e.setResult(v.getBoolean(sc) ? Result.DENY : Result.ALLOW);
  681. });
  682. });
  683. }
  684. @SubscribeEvent(receiveCanceled = true)
  685. public void onWorldLoad(WorldEvent.Load e) {
  686. handleEvent(e, "world_load", (sc) -> {
  687. sc.setVar("world", e.getWorld());
  688. });
  689. }
  690. @Override
  691. public void onCraft(int id, World w, PlayerEntity p, CraftingInventory inv,
  692. CraftResultInventory result) {
  693. if(w.isRemote) {
  694. return;
  695. }
  696. ServerPlayerEntity serverplayerentity = (ServerPlayerEntity) p;
  697. Wrapper<ItemStack> wrapper = new Wrapper<>(ItemStack.EMPTY);
  698. Optional<ICraftingRecipe> optional =
  699. w.getServer().getRecipeManager().getRecipe(IRecipeType.CRAFTING, inv, w);
  700. if(optional.isPresent()) {
  701. ICraftingRecipe icraftingrecipe = optional.get();
  702. if(result.canUseRecipe(w, serverplayerentity, icraftingrecipe)) {
  703. wrapper.set(icraftingrecipe.getCraftingResult(inv));
  704. scripts.getScriptManager().callEvent("craft", (sc) -> {
  705. setPlayer(sc, p);
  706. sc.setVar("result", wrapper.get());
  707. }, (sc) -> {
  708. handleVar(sc, "craft", "result", (v) -> {
  709. ItemStack stack = (ItemStack) v.get(sc);
  710. if(stack == null) {
  711. wrapper.set(ItemStack.EMPTY);
  712. } else {
  713. wrapper.set(stack);
  714. }
  715. });
  716. });
  717. }
  718. }
  719. result.setInventorySlotContents(0, wrapper.get());
  720. serverplayerentity.connection.sendPacket(new SSetSlotPacket(id, 0, wrapper.get()));
  721. }
  722. }