MinecraftFunctions.java 86 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903
  1. package me.km.snuviscript;
  2. import me.km.KajetansMod;
  3. import me.km.afk.AfkListener;
  4. import me.km.environment.EnvironmentAPI;
  5. import me.km.utils.NBTUtils;
  6. import me.km.plots.ProtectionBank;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.UUID;
  11. import java.util.function.Consumer;
  12. import java.util.stream.Collectors;
  13. import me.hammerle.snuviscript.code.Script;
  14. import me.hammerle.snuviscript.code.SnuviUtils;
  15. import me.hammerle.snuviscript.code.SnuviParser;
  16. import me.km.api.Location;
  17. import me.km.api.TitleAPI;
  18. import me.km.api.Utils;
  19. import me.km.chatchannel.ChatChannel;
  20. import me.km.commands.CommandSilent;
  21. import me.km.dimensions.ModDimensions;
  22. import me.km.effects.EffectUtils;
  23. import me.km.inventory.InventoryUtils;
  24. import me.km.table.Table;
  25. import me.km.utils.ItemStackUtils;
  26. import me.km.utils.ReflectionUtils;
  27. import me.km.utils.SpecialBlockUtils;
  28. import net.minecraft.block.Block;
  29. import net.minecraft.block.BlockDoor;
  30. import net.minecraft.block.state.IBlockState;
  31. import net.minecraft.command.ICommandSender;
  32. import net.minecraft.enchantment.Enchantment;
  33. import net.minecraft.enchantment.EnchantmentHelper;
  34. import net.minecraft.entity.Entity;
  35. import net.minecraft.entity.EntityLiving;
  36. import net.minecraft.entity.EntityLivingBase;
  37. import net.minecraft.entity.item.EntityItemFrame;
  38. import net.minecraft.entity.monster.EntityCreeper;
  39. import net.minecraft.entity.passive.EntityVillager;
  40. import net.minecraft.entity.player.EntityPlayer;
  41. import net.minecraft.entity.player.EntityPlayerMP;
  42. import net.minecraft.entity.projectile.EntityPotion;
  43. import net.minecraft.inventory.EntityEquipmentSlot;
  44. import net.minecraft.inventory.IInventory;
  45. import net.minecraft.item.ItemStack;
  46. import net.minecraft.network.ThreadQuickExitException;
  47. import net.minecraft.network.play.client.CPacketChatMessage;
  48. import net.minecraft.network.play.client.CPacketClientStatus;
  49. import net.minecraft.network.play.server.SPacketSpawnPosition;
  50. import net.minecraft.potion.Potion;
  51. import net.minecraft.potion.PotionUtils;
  52. import net.minecraft.tileentity.TileEntity;
  53. import net.minecraft.tileentity.TileEntityChest;
  54. import net.minecraft.tileentity.TileEntitySign;
  55. import net.minecraft.util.DamageSource;
  56. import net.minecraft.util.EnumFacing;
  57. import net.minecraft.util.EnumParticleTypes;
  58. import net.minecraft.util.ResourceLocation;
  59. import net.minecraft.util.SoundCategory;
  60. import net.minecraft.util.SoundEvent;
  61. import net.minecraft.util.math.BlockPos;
  62. import net.minecraft.util.math.Vec3d;
  63. import net.minecraft.world.World;
  64. import net.minecraft.world.WorldServer;
  65. import me.km.effects.Effect;
  66. import me.km.events.CustomEventCaller;
  67. import me.km.events.PlayerMoveData;
  68. import me.km.exception.IllegalStringException;
  69. import me.km.exception.PlayerNotFoundException;
  70. import me.km.inventory.CustomContainer;
  71. import me.km.networking.ModPacketHandler;
  72. import me.km.pathfinder.PathfinderUtils;
  73. import me.km.permissions.Permissions;
  74. import me.km.skills.LeveledSkill;
  75. import me.km.skills.Skill;
  76. import me.km.table.TableAPI;
  77. import net.minecraft.block.BlockCrops;
  78. import net.minecraft.entity.item.EntityItem;
  79. import net.minecraft.item.Item;
  80. import net.minecraft.util.NonNullList;
  81. import net.minecraft.util.math.MathHelper;
  82. import net.minecraft.util.text.ITextComponent;
  83. import net.minecraft.util.text.TextComponentString;
  84. import net.minecraft.world.GameType;
  85. public class MinecraftFunctions
  86. {
  87. public static int inventoryIds = 0;
  88. @SuppressWarnings("")
  89. public static void registerFunctions(SnuviParser parser)
  90. {
  91. // ---------------------------------------------------------------------
  92. // Command-Bibliothek
  93. // ---------------------------------------------------------------------
  94. parser.registerFunction("command.add", (sc, in) ->
  95. {
  96. KajetansMod.scripts.registerScriptCommand(in[0].getString(sc));
  97. return Void.TYPE;
  98. });
  99. parser.registerFunction("command.remove", (sc, in) ->
  100. {
  101. KajetansMod.scripts.unregisterScriptCommand(in[0].getString(sc));
  102. return Void.TYPE;
  103. });
  104. parser.registerFunction("command.exists", (sc, in) -> KajetansMod.scripts.isRegisteredScriptCommand(in[0].getString(sc)));
  105. parser.registerFunction("command.clear", (sc, in) ->
  106. {
  107. KajetansMod.scripts.clearScriptCommands();
  108. return Void.TYPE;
  109. });
  110. // ---------------------------------------------------------------------
  111. // Permission-Bibliothek
  112. // ---------------------------------------------------------------------
  113. parser.registerFunction("perm.clear", (sc, in) ->
  114. {
  115. KajetansMod.perms.clear();
  116. return Void.TYPE;
  117. });
  118. parser.registerFunction("perm.registergroup", (sc, in) ->
  119. {
  120. KajetansMod.perms.registerGroupPermission(in[0].getInt(sc), in[1].getString(sc));
  121. return Void.TYPE;
  122. });
  123. parser.registerFunction("perm.registerplayer", (sc, in) ->
  124. {
  125. KajetansMod.perms.registerPlayerGroup(UUID.fromString(in[0].getString(sc)), in[1].getInt(sc));
  126. return Void.TYPE;
  127. });
  128. parser.registerFunction("perm.unregisterplayer", (sc, in) -> KajetansMod.perms.unregisterPlayer(UUID.fromString(in[0].getString(sc)), in[1].getInt(sc)));
  129. parser.registerFunction("perm.has", (sc, in) -> KajetansMod.perms.hasPermission((ICommandSender) in[0].get(sc), in[1].getString(sc)));
  130. // ---------------------------------------------------------------------
  131. // Title-Bibliothek
  132. // ---------------------------------------------------------------------
  133. parser.registerFunction("title.settime", (sc, in) ->
  134. {
  135. TitleAPI.setTitleTime((EntityPlayerMP) in[0].get(sc), in[1].getInt(sc), in[2].getInt(sc), in[3].getInt(sc));
  136. return Void.TYPE;
  137. });
  138. parser.registerFunction("title.clear", (sc, in) ->
  139. {
  140. TitleAPI.clearTitle((EntityPlayerMP) in[0].get(sc));
  141. return Void.TYPE;
  142. });
  143. parser.registerFunction("title.reset", (sc, in) ->
  144. {
  145. TitleAPI.resetTitle((EntityPlayerMP) in[0].get(sc));
  146. return Void.TYPE;
  147. });
  148. parser.registerFunction("title.send", (sc, in) ->
  149. {
  150. TitleAPI.setTitle((EntityPlayerMP) in[0].get(sc), SnuviUtils.connect(sc, in, 1));
  151. return Void.TYPE;
  152. });
  153. parser.registerFunction("title.setsub", (sc, in) ->
  154. {
  155. TitleAPI.setSubTitle((EntityPlayerMP) in[0].get(sc), SnuviUtils.connect(sc, in, 1));
  156. return Void.TYPE;
  157. });
  158. // ---------------------------------------------------------------------
  159. // Villager-Bibliothek
  160. // ---------------------------------------------------------------------
  161. parser.registerFunction("villager.showtrades", (sc, in) ->
  162. {
  163. ((EntityPlayer) in[0].get(sc)).displayVillagerTradeGui(((EntityVillager) in[1].get(sc)));
  164. return Void.TYPE;
  165. });
  166. // ---------------------------------------------------------------------
  167. // Player-Bibliothek
  168. // ---------------------------------------------------------------------
  169. parser.registerFunction("player.getitemamount", (sc, in) -> (double) InventoryUtils.searchInventoryFor(((EntityPlayer) in[0].get(sc)).inventory, (ItemStack) in[2].get(sc), in[1].getBoolean(sc)));
  170. parser.registerFunction("player.removeitem", (sc, in) ->
  171. {
  172. ItemStack stack = ((ItemStack) in[1].get(sc)).copy();
  173. stack.setCount(InventoryUtils.removeFromInventory(((EntityPlayer) in[0].get(sc)).inventory, stack));
  174. return stack;
  175. });
  176. parser.registerFunction("player.giveitem", (sc, in) ->
  177. {
  178. ItemStack stack = ((ItemStack) in[1].get(sc)).copy();
  179. stack.setCount(InventoryUtils.addToInventory(((EntityPlayer) in[0].get(sc)).inventory, stack));
  180. return stack;
  181. });
  182. parser.registerFunction("player.shootprojectile", (sc, in) -> EffectUtils.launchProjectile((EntityPlayer) in[0].get(sc), getClass(in[1].getString(sc)), in[2].getDouble(sc), in[3].get(sc)));
  183. parser.registerFunction("player.respawn", (sc, in) ->
  184. {
  185. KajetansMod.scheduler.scheduleTask(() ->
  186. {
  187. try
  188. {
  189. ((EntityPlayerMP) in[0].get(sc)).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN));
  190. }
  191. catch(ThreadQuickExitException ex)
  192. {
  193. // Minecraft needs this for canceling and queueing into main thread
  194. }
  195. });
  196. return Void.TYPE;
  197. });
  198. parser.registerFunction("player.clearinventory", (sc, in) ->
  199. {
  200. ((EntityPlayer) in[0].get(sc)).inventory.clear();
  201. return Void.TYPE;
  202. });
  203. parser.registerFunction("player.inventorytolist", (sc, in) ->
  204. {
  205. in[0].set(sc, ((EntityPlayer) in[1].get(sc)).inventory.mainInventory);
  206. return Void.TYPE;
  207. });
  208. parser.registerFunction("player.getnearest", (sc, in) -> Utils.getNearestPlayer(((Location) in[0].get(sc)).getWorld(), ((Location) in[0].get(sc)).getPos()));
  209. parser.registerFunction("player.say", (sc, in) ->
  210. {
  211. try
  212. {
  213. ((EntityPlayerMP) in[0].get(sc)).connection.processChatMessage(new CPacketChatMessage(SnuviUtils.connect(sc, in, 1)));
  214. }
  215. catch(ThreadQuickExitException ex)
  216. {
  217. // Minecraft needs this for canceling and queueing into main thread
  218. }
  219. return Void.TYPE;
  220. });
  221. parser.registerFunction("player.isafk", (sc, in) -> KajetansMod.afkManager.getEvent(AfkListener.class).isAfk((EntityPlayer) in[0].get(sc)));
  222. parser.registerFunction("player.speak", (sc, in) ->
  223. {
  224. sendMessageToGroup(in[0].get(sc), sc, NBTUtils.concat(sc, 2, "§7[§r" + in[1].getString(sc) + "§7]§r ", in));
  225. return Void.TYPE;
  226. });
  227. parser.registerFunction("player.setcompass", (sc, in) ->
  228. {
  229. ((EntityPlayerMP) in[0].get(sc)).connection.sendPacket(new SPacketSpawnPosition(((Location) in[1].get(sc)).getBlockPos()));
  230. return Void.TYPE;
  231. });
  232. parser.registerFunction("player.gethunger", (sc, in) -> (double) ((EntityPlayer) in[0].get(sc)).getFoodStats().getFoodLevel());
  233. parser.registerFunction("player.sethunger", (sc, in) ->
  234. {
  235. ((EntityPlayer) in[0].get(sc)).getFoodStats().setFoodLevel(in[1].getInt(sc));
  236. return Void.TYPE;
  237. });
  238. parser.registerFunction("player.getsaturation", (sc, in) -> (double) ReflectionUtils.getSaturation(((EntityPlayer) in[0].get(sc)).getFoodStats()));
  239. parser.registerFunction("player.setsaturation", (sc, in) ->
  240. {
  241. ReflectionUtils.setSaturation(((EntityPlayer) in[0].get(sc)).getFoodStats(), in[1].getFloat(sc));
  242. return Void.TYPE;
  243. });
  244. parser.registerFunction("player.getname", (sc, in) ->
  245. {
  246. Object o = in[0].get(sc);
  247. if(o instanceof EntityPlayer)
  248. {
  249. return ((EntityPlayer) o).getName();
  250. }
  251. return KajetansMod.playerbank.getDataBank().getName(o.toString());
  252. });
  253. parser.registerFunction("player.getfullname", (sc, in) -> KajetansMod.chatManager.getFullName((EntityPlayer) in[0].get(sc)));
  254. parser.registerFunction("player.getuuid", (sc, in) ->
  255. {
  256. Object o = in[0].get(sc);
  257. if(o instanceof EntityPlayer)
  258. {
  259. return ((EntityPlayer) o).getUniqueID().toString();
  260. }
  261. return KajetansMod.playerbank.getDataBank().getUUID(o.toString());
  262. });
  263. parser.registerFunction("player.getip", (sc, in) -> ((EntityPlayerMP) in[0].get(sc)).connection.netManager.getRemoteAddress().toString());
  264. parser.registerFunction("player.iscreative", (sc, in) -> ((EntityPlayer) in[0].get(sc)).isCreative());
  265. parser.registerFunction("player.isspectator", (sc, in) -> ((EntityPlayer) in[0].get(sc)).isSpectator());
  266. parser.registerFunction("player.issurvival", (sc, in) ->
  267. {
  268. EntityPlayer p = (EntityPlayer) in[0].get(sc);
  269. return !p.isCreative() && !p.isSpectator();
  270. });
  271. parser.registerFunction("player.isadventure", (sc, in) -> !((EntityPlayer) in[0].get(sc)).capabilities.allowEdit);
  272. parser.registerFunction("player.hasfly", (sc, in) -> ((EntityPlayer) in[0].get(sc)).capabilities.allowFlying);
  273. parser.registerFunction("player.setgamemode", (sc, in) ->
  274. {
  275. EntityPlayer p = (EntityPlayer) in[0].get(sc);
  276. switch(in[1].get(sc).toString())
  277. {
  278. case "survival":
  279. case "s":
  280. case "0":
  281. p.setGameType(GameType.SURVIVAL);
  282. break;
  283. case "creative":
  284. case "c":
  285. case "1":
  286. p.setGameType(GameType.CREATIVE);
  287. break;
  288. case "adventure":
  289. case "a":
  290. case "2":
  291. p.setGameType(GameType.ADVENTURE);
  292. break;
  293. case "specator":
  294. case "w":
  295. case "3":
  296. p.setGameType(GameType.SPECTATOR);
  297. break;
  298. default:
  299. p.setGameType(GameType.CREATIVE);
  300. break;
  301. }
  302. return Void.TYPE;
  303. });
  304. parser.registerFunction("player.getlastdamager", (sc, in) ->
  305. {
  306. DamageSource ds = ((EntityPlayer) in[0].get(sc)).getLastDamageSource();
  307. if(ds == null)
  308. {
  309. return null;
  310. }
  311. return ds.getImmediateSource();
  312. });
  313. parser.registerFunction("player.settag", (sc, in) ->
  314. {
  315. Object o = in[0].get(sc);
  316. if(o instanceof EntityPlayer)
  317. {
  318. KajetansMod.playerbank.getDataBank().setTag((EntityPlayer) o, in[1].getString(sc), in[2].getInt(sc));
  319. return Void.TYPE;
  320. }
  321. KajetansMod.playerbank.getDataBank().setTag(o.toString(), in[1].getString(sc), in[2].getInt(sc));
  322. return Void.TYPE;
  323. });
  324. parser.registerFunction("player.gettag", (sc, in) ->
  325. {
  326. Object o = in[0].get(sc);
  327. if(o instanceof EntityPlayer)
  328. {
  329. return (double) KajetansMod.playerbank.getDataBank().getTag((EntityPlayer) o, in[1].getString(sc));
  330. }
  331. return (double) KajetansMod.playerbank.getDataBank().getTag(o.toString(), in[1].getString(sc));
  332. });
  333. parser.registerFunction("player.setguild", (sc, in) ->
  334. {
  335. Object o = in[0].get(sc);
  336. if(o instanceof EntityPlayer)
  337. {
  338. KajetansMod.playerbank.setGuildId((EntityPlayer) o, in[1].getInt(sc));
  339. return Void.TYPE;
  340. }
  341. KajetansMod.playerbank.setGuildId(o.toString(), in[1].getInt(sc));
  342. return Void.TYPE;
  343. });
  344. parser.registerFunction("player.getguild", (sc, in) ->
  345. {
  346. Object o = in[0].get(sc);
  347. if(o instanceof EntityPlayer)
  348. {
  349. return (double) KajetansMod.playerbank.getGuildId((EntityPlayer) o);
  350. }
  351. return (double) KajetansMod.playerbank.getGuildId(o.toString());
  352. });
  353. parser.registerFunction("player.dropinventory", (sc, in) ->
  354. {
  355. ((EntityPlayer) in[0].get(sc)).inventory.dropAllItems();
  356. return Void.TYPE;
  357. });
  358. parser.registerFunction("player.gettarget", (sc, in) ->
  359. {
  360. if(in.length > 2)
  361. {
  362. return new Location(((EntityPlayer) in[0].get(sc)).world,
  363. Utils.getPlayerTarget((EntityPlayer) in[0].get(sc), in[1].getInt(sc), in[2].getBoolean(sc)));
  364. }
  365. return new Location(((EntityPlayer) in[0].get(sc)).world, Utils.getPlayerTarget((EntityPlayer) in[0].get(sc), in[1].getInt(sc)));
  366. });
  367. parser.registerFunction("player.gettargetentity", (sc, in) -> Utils.getTargetedEntity((EntityPlayer) in[0].get(sc), in[1].getDouble(sc), getClass(in[2].getString(sc))));
  368. parser.registerFunction("player.hasscript", (sc, in) -> KajetansMod.scripts.isRegistered((EntityPlayer) in[0].get(sc)));
  369. parser.registerAlias("player.hasscript", "player.hasquest");
  370. parser.registerFunction("player.action", (sc, in) ->
  371. {
  372. TextComponentString text = new TextComponentString(SnuviUtils.connect(sc, in, 1));
  373. doForGroup(in[0].get(sc), sc, p -> ((EntityPlayerMP) p).sendStatusMessage(text, true));
  374. return Void.TYPE;
  375. });
  376. parser.registerFunction("player.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer((EntityPlayer) in[0].get(sc)));
  377. parser.registerFunction("player.playsound", (sc, in) ->
  378. {
  379. EffectUtils.playSound((EntityPlayerMP) in[0].get(sc), SoundEvent.REGISTRY.getObject(new ResourceLocation(in[1].getString(sc))), SoundCategory.MASTER);
  380. return Void.TYPE;
  381. });
  382. parser.registerFunction("player.getspawn", (sc, in) ->
  383. {
  384. WorldServer ws = ModDimensions.getWorldFromName(in[1].getString(sc));
  385. return new Location(ws, ((EntityPlayer) in[0].get(sc)).getBedLocation(ws.provider.getDimension()));
  386. });
  387. parser.registerAlias("player.getspawn", "player.getbedspawn");
  388. parser.registerFunction("player.setspawn", (sc, in) ->
  389. {
  390. Location l = (Location) in[1].get(sc);
  391. ((EntityPlayerMP) in[0].get(sc)).setSpawnChunk(l.getBlockPos(), true, l.getWorld().provider.getDimension());
  392. return Void.TYPE;
  393. });
  394. parser.registerAlias("player.setspawn", "player.setbedspawn");
  395. parser.registerFunction("player.damageitem", (sc, in) ->
  396. {
  397. ((EntityPlayer) in[0].get(sc)).getHeldItemMainhand().damageItem(in[1].getInt(sc), (EntityPlayer) in[0].get(sc));
  398. return Void.TYPE;
  399. });
  400. parser.registerFunction("player.silentjoin", (sc, in) -> KajetansMod.perms.hasPermission((EntityPlayer) in[0].get(sc), Permissions.SILENT) && KajetansMod.generalCommands.getCommand(CommandSilent.class).silentjoin);
  401. // ---------------------------------------------------------------------
  402. // Players-Bibliothek
  403. // ---------------------------------------------------------------------
  404. parser.registerFunction("players.getamount", (sc, in) -> (double) KajetansMod.server.getCurrentPlayerCount());
  405. parser.registerFunction("players.tolist", (sc, in) ->
  406. {
  407. in[0].set(sc, new ArrayList(KajetansMod.server.getPlayerList().getPlayers()));
  408. return Void.TYPE;
  409. });
  410. parser.registerFunction("players.toworldlist", (sc, in) ->
  411. {
  412. in[0].set(sc, new ArrayList(ModDimensions.getWorldFromName(in[1].getString(sc)).playerEntities));
  413. return Void.TYPE;
  414. });
  415. parser.registerFunction("players.near", (sc, in) ->
  416. {
  417. Location l = (Location) in[1].get(sc);
  418. in[0].set(sc, Utils.getPlayers(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[2].getDouble(sc)));
  419. return Void.TYPE;
  420. });
  421. // ---------------------------------------------------------------------
  422. // Rank-Bibliothek
  423. // ---------------------------------------------------------------------
  424. parser.registerFunction("rank.get", (sc, in) ->
  425. {
  426. in[0].set(sc, KajetansMod.chatManager.getRanks((EntityPlayer) in[1].get(sc)));
  427. return Void.TYPE;
  428. });
  429. parser.registerFunction("rank.register", (sc, in) ->
  430. {
  431. KajetansMod.chatManager.registerRank(in[0].getString(sc), in[1].getInt(sc), in[2].getString(sc));
  432. return Void.TYPE;
  433. });
  434. parser.registerFunction("rank.player", (sc, in) ->
  435. {
  436. KajetansMod.chatManager.registerPlayerRank(UUID.fromString(in[0].getString(sc)), in[1].getString(sc));
  437. return Void.TYPE;
  438. });
  439. parser.registerFunction("rank.clear", (sc, in) ->
  440. {
  441. KajetansMod.chatManager.clearRanks();
  442. return Void.TYPE;
  443. });
  444. // ---------------------------------------------------------------------
  445. // Custom-Bibliothek
  446. // ---------------------------------------------------------------------
  447. /*parser.registerFunction("custom.registershapelessrecipe", (sc, in) ->
  448. {
  449. ItemStack[] stacks = new ItemStack[in.length - 1];
  450. for(int i = 0; i < stacks.length; i++)
  451. {
  452. stacks[i] = (ItemStack) in[i + 1].get(sc);
  453. }
  454. RecipeUtils.registerShapelessRecipe((ItemStack) in[0].get(sc), stacks);
  455. return Void.TYPE;
  456. });
  457. parser.registerFunction("custom.registershapedrecipe", (sc, in) ->
  458. {
  459. int counter = 0;
  460. while(in[counter + 1].get(sc).getClass() == String.class)
  461. {
  462. counter++;
  463. }
  464. String[] s = new String[counter];
  465. for(int i = 0; i < s.length; i++)
  466. {
  467. s[i] = in[i + 1].toString();
  468. }
  469. ItemStack[] stacks = new ItemStack[in.length - 1 - s.length];
  470. for(int i = 0; i < stacks.length; i++)
  471. {
  472. stacks[i] = (ItemStack) in[i + 1 + counter].get(sc);
  473. }
  474. RecipeUtils.registerShapedRecipe((ItemStack) in[0].get(sc), s, stacks);
  475. return Void.TYPE;
  476. });
  477. parser.registerFunction("custom.registerfurnacerecipe", (sc, in) ->
  478. {
  479. RecipeUtils.registerFurnaceRecipe((ItemStack) in[0].get(sc), (ItemStack) in[1].get(sc));
  480. return Void.TYPE;
  481. });
  482. parser.registerFunction("custom.clearrecipes", (sc, in) ->
  483. {
  484. RecipeUtils.clearRecipes();
  485. return Void.TYPE;
  486. });*/
  487. // ---------------------------------------------------------------------
  488. // World-Bibliothek
  489. // ---------------------------------------------------------------------
  490. parser.registerAlias("players.toworldlist", "world.getplayers");
  491. parser.registerFunction("world.setskills", (sc, in) ->
  492. {
  493. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).skills = in[1].getBoolean(sc);
  494. return Void.TYPE;
  495. });
  496. parser.registerFunction("world.setblockprotections", (sc, in) ->
  497. {
  498. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).blockProtection = in[1].getBoolean(sc);
  499. return Void.TYPE;
  500. });
  501. parser.registerFunction("world.setdefaultenchanting", (sc, in) ->
  502. {
  503. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).defaultEnchanting = in[1].getBoolean(sc);
  504. return Void.TYPE;
  505. });
  506. parser.registerFunction("world.setpvpprotection", (sc, in) ->
  507. {
  508. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).pvpProtection = in[1].getBoolean(sc);
  509. return Void.TYPE;
  510. });
  511. parser.registerFunction("world.setstatuseffects", (sc, in) ->
  512. {
  513. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).statusEffects = in[1].getBoolean(sc);
  514. return Void.TYPE;
  515. });
  516. parser.registerFunction("world.setscrolls", (sc, in) ->
  517. {
  518. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).scrolls = in[1].getBoolean(sc);
  519. return Void.TYPE;
  520. });
  521. parser.registerFunction("world.setdefaultproducing", (sc, in) ->
  522. {
  523. KajetansMod.worldManager.getWorldPreferences((World) in[0].get(sc)).defaultProducing = in[1].getBoolean(sc);
  524. return Void.TYPE;
  525. });
  526. parser.registerFunction("world.get", (sc, in) ->
  527. {
  528. return ModDimensions.getWorldFromName(in[0].getString(sc));
  529. });
  530. // ---------------------------------------------------------------------
  531. // Item-Bibliothek
  532. // ---------------------------------------------------------------------
  533. parser.registerFunction("item.drop", (sc, in) ->
  534. {
  535. Location l = (Location) in[0].get(sc);
  536. World w = l.getWorld();
  537. BlockPos pos = l.getBlockPos();
  538. ItemStack stack = ((ItemStack) in[1].get(sc)).copy();
  539. int amount = stack.getCount();
  540. while(amount > stack.getMaxStackSize())
  541. {
  542. stack.setCount(stack.getMaxStackSize());
  543. amount -= stack.getMaxStackSize();
  544. ItemStackUtils.drop(w, pos, stack.copy());
  545. }
  546. if(amount > 0)
  547. {
  548. stack.setCount(amount);
  549. ItemStackUtils.drop(w, pos, stack);
  550. }
  551. return Void.TYPE;
  552. });
  553. parser.registerFunction("item.gettooltype", (sc, in) -> Utils.getToolType((ItemStack) in[0].get(sc)).toString());
  554. parser.registerFunction("item.get", (sc, in) -> ((ItemStack) in[0].get(sc)).getItem());
  555. parser.registerFunction("item.gettype", (sc, in) -> ((ItemStack) in[0].get(sc)).getItem().getRegistryName().toString());
  556. parser.registerFunction("item.getdata", (sc, in) -> (double) ((ItemStack) in[0].get(sc)).getMetadata());
  557. parser.registerFunction("item.setdata", (sc, in) ->
  558. {
  559. ((ItemStack) in[0].get(sc)).setItemDamage(in[1].getInt(sc));
  560. return Void.TYPE;
  561. });
  562. parser.registerFunction("item.getamount", (sc, in) -> (double) ((ItemStack) in[0].get(sc)).getCount());
  563. parser.registerFunction("item.setamount", (sc, in) ->
  564. {
  565. ((ItemStack) in[0].get(sc)).setCount(in[1].getInt(sc));
  566. return Void.TYPE;
  567. });
  568. parser.registerFunction("item.getname", (sc, in) -> ((ItemStack) in[0].get(sc)).getDisplayName());
  569. parser.registerFunction("item.setname", (sc, in) ->
  570. {
  571. ((ItemStack) in[0].get(sc)).setStackDisplayName(SnuviUtils.connect(sc, in, 1));
  572. return Void.TYPE;
  573. });
  574. parser.registerFunction("item.getlore", (sc, in) ->
  575. {
  576. in[0].set(sc, ItemStackUtils.getLore((ItemStack) in[1].get(sc)));
  577. return Void.TYPE;
  578. });
  579. parser.registerFunction("item.setlore", (sc, in) ->
  580. {
  581. ItemStackUtils.setLore((ItemStack) in[0].get(sc), (List<String>) in[1].get(sc));
  582. return Void.TYPE;
  583. });
  584. parser.registerFunction("item.addlore", (sc, in) ->
  585. {
  586. ItemStackUtils.addLore((ItemStack) in[0].get(sc), SnuviUtils.connect(sc, in, 2), in[1].getInt(sc));
  587. return Void.TYPE;
  588. });
  589. parser.registerFunction("item.getenchantlevel", (sc, in) -> (double) EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByLocation(in[1].getString(sc)), (ItemStack) in[0].get(sc)));
  590. parser.registerFunction("item.setcooldown", (sc, in) ->
  591. {
  592. ((EntityPlayer) in[0].get(sc)).getCooldownTracker().setCooldown(((ItemStack) in[1].get(sc)).getItem(), in[2].getInt(sc));
  593. return Void.TYPE;
  594. });
  595. parser.registerFunction("item.gettooltype", (sc, in) -> Utils.getToolType((ItemStack) in[0].get(sc)));
  596. // ---------------------------------------------------------------------
  597. // Location-Bibliothek
  598. // ---------------------------------------------------------------------
  599. parser.registerFunction("loc.new", (sc, in) ->
  600. {
  601. if(in.length >= 6)
  602. {
  603. return new Location(ModDimensions.getWorldFromName(in[0].getString(sc)),
  604. in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc),
  605. in[4].getFloat(sc), in[5].getFloat(sc));
  606. }
  607. return new Location(ModDimensions.getWorldFromName(in[0].getString(sc)), in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc), 0, 0);
  608. });
  609. parser.registerFunction("loc.getx", (sc, in) -> ((Location) in[0].get(sc)).getX());
  610. parser.registerFunction("loc.gety", (sc, in) -> ((Location) in[0].get(sc)).getY());
  611. parser.registerFunction("loc.getz", (sc, in) -> ((Location) in[0].get(sc)).getZ());
  612. parser.registerFunction("loc.setx", (sc, in) ->
  613. {
  614. ((Location) in[0].get(sc)).setX(in[1].getDouble(sc));
  615. return Void.TYPE;
  616. });
  617. parser.registerFunction("loc.sety", (sc, in) ->
  618. {
  619. ((Location) in[0].get(sc)).setY(in[1].getDouble(sc));
  620. return Void.TYPE;
  621. });
  622. parser.registerFunction("loc.setz", (sc, in) ->
  623. {
  624. ((Location) in[0].get(sc)).setZ(in[1].getDouble(sc));
  625. return Void.TYPE;
  626. });
  627. parser.registerFunction("loc.addx", (sc, in) ->
  628. {
  629. ((Location) in[0].get(sc)).addX(in[1].getDouble(sc));
  630. return Void.TYPE;
  631. });
  632. parser.registerFunction("loc.addy", (sc, in) ->
  633. {
  634. ((Location) in[0].get(sc)).addY(in[1].getDouble(sc));
  635. return Void.TYPE;
  636. });
  637. parser.registerFunction("loc.addz", (sc, in) ->
  638. {
  639. ((Location) in[0].get(sc)).addZ(in[1].getDouble(sc));
  640. return Void.TYPE;
  641. });
  642. parser.registerFunction("loc.setyaw", (sc, in) ->
  643. {
  644. ((Location) in[0].get(sc)).setYaw(in[1].getFloat(sc));
  645. return Void.TYPE;
  646. });
  647. parser.registerFunction("loc.setpitch", (sc, in) ->
  648. {
  649. ((Location) in[0].get(sc)).setPitch(in[1].getFloat(sc));
  650. return Void.TYPE;
  651. });
  652. parser.registerFunction("loc.distance", (sc, in) -> ((Location) in[0].get(sc)).getPos().distanceTo(((Location) in[1].get(sc)).getPos()));
  653. parser.registerFunction("loc.mod", (sc, in) -> ((Location) in[0].get(sc)).copyAdd(in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc)));
  654. parser.registerFunction("loc.getcoord", (sc, in) ->
  655. {
  656. Location l = (Location) in[0].get(sc);
  657. switch(in[1].getString(sc))
  658. {
  659. case "x":
  660. return l.getX();
  661. case "y":
  662. return l.getY();
  663. case "z":
  664. return l.getZ();
  665. case "bx":
  666. return (double) MathHelper.floor(l.getX());
  667. case "by":
  668. return (double) MathHelper.floor(l.getY());
  669. case "bz":
  670. return (double) MathHelper.floor(l.getZ());
  671. case "w":
  672. return ModDimensions.getWorldName(l.getWorld());
  673. default:
  674. return null;
  675. }
  676. });
  677. parser.registerFunction("loc.gettime", (sc, in) -> (double) ((Location) in[0].get(sc)).getWorld().getWorldTime());
  678. parser.registerFunction("loc.hasstorm", (sc, in) -> ((Location) in[0].get(sc)).getWorld().isRaining());
  679. parser.registerFunction("loc.isbetween", (sc, in) ->
  680. {
  681. Location l1 = (Location) in[0].get(sc);
  682. Location l2 = (Location) in[1].get(sc);
  683. Location l3 = (Location) in[2].get(sc);
  684. return l1.getX() >= Math.min(l2.getX(), l3.getX()) && l1.getX() <= Math.max(l2.getX(), l3.getX()) &&
  685. l1.getY() >= Math.min(l2.getY(), l3.getY()) && l1.getY() <= Math.max(l2.getY(), l3.getY()) &&
  686. l1.getZ() >= Math.min(l2.getZ(), l3.getZ()) && l1.getZ() <= Math.max(l2.getZ(), l3.getZ());
  687. });
  688. // ---------------------------------------------------------------------
  689. // Block-Bibliothek
  690. // ---------------------------------------------------------------------
  691. parser.registerFunction("block.gettype", (sc, in) ->
  692. {
  693. Location l = (Location) in[0].get(sc);
  694. return l.getWorld().getBlockState(l.getBlockPos()).getBlock().getRegistryName().toString();
  695. });
  696. parser.registerFunction("block.get", (sc, in) ->
  697. {
  698. Location l = (Location) in[0].get(sc);
  699. return l.getWorld().getBlockState(l.getBlockPos()).getBlock();
  700. });
  701. parser.registerFunction("block.getdata", (sc, in) ->
  702. {
  703. Location l = (Location) in[0].get(sc);
  704. IBlockState state = l.getWorld().getBlockState(l.getBlockPos());
  705. return (double) state.getBlock().getMetaFromState(state);
  706. });
  707. parser.registerFunction("block.clone", (sc, in) ->
  708. {
  709. Location l = (Location) in[1].get(sc);
  710. NBTUtils.cloneBlock(l.getWorld(), ((Location) in[0].get(sc)).getBlockPos(), l.getBlockPos());
  711. return Void.TYPE;
  712. });
  713. parser.registerFunction("block.set", (sc, in) ->
  714. {
  715. Location l = (Location) in[0].get(sc);
  716. ItemStack stack = (ItemStack) in[1].get(sc);
  717. l.getWorld().setBlockState(l.getBlockPos(), Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata()));
  718. return Void.TYPE;
  719. });
  720. parser.registerFunction("block.set2", (sc, in) ->
  721. {
  722. Location l = (Location) in[0].get(sc);
  723. if(in.length >= 4)
  724. {
  725. NBTUtils.setBlockWithData(l.getWorld(), l.getBlockPos(), in[2].getInt(sc), Block.getBlockFromName(in[1].getString(sc)), SnuviUtils.connect(sc, in, 3));
  726. }
  727. else
  728. {
  729. NBTUtils.setBlockWithData(l.getWorld(), l.getBlockPos(), in[2].getInt(sc), Block.getBlockFromName(in[1].getString(sc)), null);
  730. }
  731. return Void.TYPE;
  732. });
  733. parser.registerFunction("block.setsign", (sc, in) ->
  734. {
  735. Location l = (Location) in[0].get(sc);
  736. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  737. SpecialBlockUtils.setSignLine(sign, in[1].getInt(sc), SnuviUtils.connect(sc, in, 2));
  738. return Void.TYPE;
  739. });
  740. parser.registerFunction("block.getsign", (sc, in) ->
  741. {
  742. Location l = (Location) in[0].get(sc);
  743. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  744. return sign.signText[in[1].getInt(sc)].getUnformattedText();
  745. });
  746. parser.registerFunction("block.setdoorstatus", (sc, in) ->
  747. {
  748. Location l = (Location) in[0].get(sc);
  749. BlockPos pos = l.getBlockPos();
  750. ((BlockDoor) l.getWorld().getBlockState(pos).getBlock()).toggleDoor(l.getWorld(), pos, in[1].getBoolean(sc));
  751. return Void.TYPE;
  752. });
  753. parser.registerFunction("block.getdoorstatus", (sc, in) ->
  754. {
  755. Location l = (Location) in[0].get(sc);
  756. return BlockDoor.isOpen(l.getWorld(), l.getBlockPos());
  757. });
  758. parser.registerFunction("block.isdoor", (sc, in) ->
  759. {
  760. Location l = (Location) in[0].get(sc);
  761. return l.getWorld().getBlockState(l.getBlockPos()).getBlock() instanceof BlockDoor;
  762. });
  763. parser.registerFunction("block.issolid", (sc, in) ->
  764. {
  765. IBlockState state = getBlockState((Location) in[0].get(sc));
  766. return state.isFullBlock() && state.isOpaqueCube();
  767. });
  768. parser.registerFunction("block.tostack", (sc, in) ->
  769. {
  770. Location l = (Location) in[0].get(sc);
  771. World w = l.getWorld();
  772. BlockPos pos = l.getBlockPos();
  773. IBlockState state = w.getBlockState(pos);
  774. return state.getBlock().getItem(w, pos, state);
  775. });
  776. parser.registerFunction("block.getitemamount", (sc, in) ->
  777. {
  778. Location l = (Location) in[0].get(sc);
  779. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  780. if(te == null || !(te instanceof TileEntityChest))
  781. {
  782. return 0.0d;
  783. }
  784. return (double) InventoryUtils.searchInventoryFor((TileEntityChest) te, (ItemStack) in[2].get(sc), in[1].getBoolean(sc));
  785. });
  786. parser.registerFunction("block.additem", (sc, in) ->
  787. {
  788. Location l = (Location) in[0].get(sc);
  789. ItemStack stack = ((ItemStack) in[1].get(sc));
  790. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  791. if(te == null || !(te instanceof TileEntityChest))
  792. {
  793. return stack;
  794. }
  795. stack.setCount(InventoryUtils.addToInventory((TileEntityChest) te, stack));
  796. return stack;
  797. });
  798. parser.registerFunction("block.subitem", (sc, in) ->
  799. {
  800. Location l = (Location) in[0].get(sc);
  801. ItemStack stack = ((ItemStack) in[1].get(sc));
  802. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  803. if(te == null || !(te instanceof TileEntityChest))
  804. {
  805. return stack;
  806. }
  807. stack.setCount(InventoryUtils.removeFromInventory((TileEntityChest) te, stack));
  808. return stack;
  809. });
  810. parser.registerFunction("block.grow", (sc, in) ->
  811. {
  812. Location l1 = (Location) in[0].get(sc);
  813. World w = l1.getWorld();
  814. BlockPos pos1 = l1.getBlockPos();
  815. BlockPos pos2 = ((Location) in[1].get(sc)).getBlockPos();
  816. int x = Math.min(pos1.getX(), pos2.getX());
  817. int endX = Math.max(pos1.getX(), pos2.getX());
  818. int y = Math.min(pos1.getY(), pos2.getY());
  819. int endY = Math.max(pos1.getY(), pos2.getY());
  820. int z = Math.min(pos1.getZ(), pos2.getZ());
  821. int endZ = Math.max(pos1.getZ(), pos2.getZ());
  822. if(endX - x > 50 || endY - y > 50 || endZ - z > 50)
  823. {
  824. throw new IllegalArgumentException("uhh, that area seems way to big for growing plants");
  825. }
  826. BlockPos relative;
  827. IBlockState state;
  828. for(; x <= endX; x++)
  829. {
  830. for(; y <= endY; y++)
  831. {
  832. for(; z <= endZ; z++)
  833. {
  834. relative = new BlockPos(x, y, z);
  835. state = w.getBlockState(relative);
  836. if(state.getBlock() instanceof BlockCrops)
  837. {
  838. w.setBlockState(relative, state.withProperty(BlockCrops.AGE, 7));
  839. }
  840. }
  841. }
  842. }
  843. return Void.TYPE;
  844. });
  845. // ---------------------------------------------------------------------
  846. // Event-Bibliothek
  847. // ---------------------------------------------------------------------
  848. parser.registerFunction("event.addmovedata", (sc, in) -> CustomEventCaller.registerMoveData(new PlayerMoveData(
  849. sc, (Location) in[0].get(sc), (Location) in[1].get(sc), in[2].getInt(sc), in[3].getInt(sc))));
  850. parser.registerFunction("event.removemovedata", (sc, in) ->
  851. {
  852. CustomEventCaller.removeMoveData(in[0].getInt(sc));
  853. return Void.TYPE;
  854. });
  855. // ---------------------------------------------------------------------
  856. // Skill-Bibliothek
  857. // ---------------------------------------------------------------------
  858. parser.registerFunction("skill.register", (sc, in) ->
  859. {
  860. KajetansMod.skills.registerSkill(in[0].getInt(sc), (ItemStack) in[1].get(sc), Effect.valueOf(in[2].getString(sc)),
  861. in[3].getString(sc), in[4].getString(sc), in[5].getInt(sc), in[6].getInt(sc), in[7].getInt(sc), in[8].getInt(sc));
  862. return Void.TYPE;
  863. });
  864. parser.registerFunction("skill.clear", (sc, in) -> {
  865. KajetansMod.skills.clearSkills(); return Void.TYPE; });
  866. parser.registerFunction("skill.getactive", (sc, in) ->
  867. {
  868. in[0].set(sc, KajetansMod.jobs.getActiveSkills((EntityPlayer) in[1].get(sc)));
  869. return Void.TYPE;
  870. });
  871. parser.registerFunction("skill.getid", (sc, in) -> ((LeveledSkill) in[0].get(sc)).getId());
  872. parser.registerFunction("skill.fromid", (sc, in) ->
  873. {
  874. Skill skill = KajetansMod.skills.getSkill(in[0].getInt(sc));
  875. if(skill == null)
  876. {
  877. return null;
  878. }
  879. byte level = (byte) EffectUtils.getEffectLevel((EntityPlayer) in[1].get(sc), skill.getEffect());
  880. if(level <= 0)
  881. {
  882. return null;
  883. }
  884. return new LeveledSkill(skill, level);
  885. });
  886. parser.registerFunction("skill.getstack", (sc, in) -> ((LeveledSkill) in[0].get(sc)).getItemStack());
  887. parser.registerFunction("skill.use", (sc, in) ->
  888. {
  889. ((LeveledSkill) in[0].get(sc)).useEffect((EntityPlayerMP) in[1].get(sc));
  890. return Void.TYPE;
  891. });
  892. // ---------------------------------------------------------------------
  893. // Job-Bibliothek
  894. // ---------------------------------------------------------------------
  895. parser.registerFunction("job.getlevel", (sc, in) -> (double) KajetansMod.jobs.getLevel((EntityPlayer) in[0].get(sc), in[1].getByte(sc)));
  896. parser.registerFunction("job.addlevel", (sc, in) ->
  897. {
  898. KajetansMod.jobs.addLevel((EntityPlayer) in[0].get(sc), in[1].getByte(sc), in[2].getByte(sc));
  899. return Void.TYPE;
  900. });
  901. parser.registerFunction("job.setlevel", (sc, in) ->
  902. {
  903. KajetansMod.jobs.setLevel((EntityPlayer) in[0].get(sc), in[1].getByte(sc), in[2].getByte(sc));
  904. return Void.TYPE;
  905. });
  906. parser.registerFunction("job.getxp", (sc, in) -> (double) KajetansMod.jobs.getXP((EntityPlayer) in[0].get(sc), in[1].getByte(sc)));
  907. parser.registerFunction("job.addxp", (sc, in) ->
  908. {
  909. KajetansMod.jobs.addXP((EntityPlayer) in[0].get(sc), in[1].getByte(sc), in[2].getInt(sc));
  910. return Void.TYPE;
  911. });
  912. parser.registerFunction("job.setxp", (sc, in) ->
  913. {
  914. KajetansMod.jobs.setXP((EntityPlayer) in[0].get(sc), in[1].getByte(sc), in[2].getInt(sc));
  915. return Void.TYPE;
  916. });
  917. parser.registerFunction("job.registerjob", (sc, in) ->
  918. {
  919. KajetansMod.jobs.registerJob(in[0].getByte(sc), SnuviUtils.connect(sc, in, 1));
  920. return Void.TYPE;
  921. });
  922. parser.registerFunction("job.registerrecipe", (sc, in) ->
  923. {
  924. KajetansMod.jobs.registerRecipe(in[0].getByte(sc), ItemStackUtils.getItem(in[1].getString(sc)), in[2].getByte(sc));
  925. return Void.TYPE;
  926. });
  927. parser.registerFunction("job.registermaterial", (sc, in) ->
  928. {
  929. KajetansMod.jobs.registerPreferedBlock(in[0].getByte(sc), Block.getBlockFromName(in[1].getString(sc)));
  930. return Void.TYPE;
  931. });
  932. parser.registerFunction("job.registerskill", (sc, in) ->
  933. {
  934. KajetansMod.jobs.registerSkill(in[0].getByte(sc), KajetansMod.skills.getSkill(in[1].getInt(sc)), in[2].getByte(sc), in[3].getByte(sc));
  935. return Void.TYPE;
  936. });
  937. parser.registerFunction("job.getamount", (sc, in) -> (double) KajetansMod.jobs.getNumberOfJobs());
  938. parser.registerFunction("job.getname", (sc, in) -> KajetansMod.jobs.getJobName(in[0].getByte(sc)));
  939. parser.registerFunction("job.geteffectlevel", (sc, in) -> (double) EffectUtils.getEffectLevel((EntityPlayer) in[0].get(sc), me.km.effects.Effect.valueOf(in[1].getString(sc))));
  940. parser.registerFunction("job.hasjob", (sc, in) -> KajetansMod.jobs.hasJob((EntityPlayer) in[0].get(sc), in[1].getByte(sc)));
  941. parser.registerFunction("job.hasrecipe", (sc, in) -> KajetansMod.jobs.hasRecipe((EntityPlayer) in[0].get(sc), ItemStackUtils.getItem(in[1].getString(sc))));
  942. parser.registerFunction("job.getjobs", (sc, in) ->
  943. {
  944. in[0].set(sc, KajetansMod.jobs.getJobs((EntityPlayer) in[1].get(sc)).stream().map(b -> (double) b).collect(Collectors.toList()));
  945. return Void.TYPE;
  946. });
  947. parser.registerFunction("job.isregmaterial", (sc, in) -> KajetansMod.jobs.isPreferedMaterial((EntityPlayer) in[0].get(sc),Block.getBlockFromName(in[1].getString(sc))));
  948. parser.registerFunction("job.setjob", (sc, in) ->
  949. {
  950. KajetansMod.jobs.setJob((EntityPlayer) in[0].get(sc), in[1].getByte(sc), in[2].getBoolean(sc));
  951. return Void.TYPE;
  952. });
  953. parser.registerFunction("job.reset", (sc, in) ->
  954. {
  955. KajetansMod.jobs.resetAll();
  956. return Void.TYPE;
  957. });
  958. // ---------------------------------------------------------------------
  959. // Entity - Befehle
  960. // ---------------------------------------------------------------------
  961. parser.registerFunction("entity.getlocation", (sc, in) -> new Location((Entity) in[0].get(sc)));
  962. parser.registerFunction("entity.damage", (sc, in) ->
  963. {
  964. // entity.damage(entity, damagefloat, DamageSource);
  965. if(in.length >= 3)
  966. {
  967. ((EntityLivingBase) in[0].get(sc)).attackEntityFrom((DamageSource) in[2].get(sc), in[1].getFloat(sc));
  968. return Void.TYPE;
  969. }
  970. ((EntityLivingBase) in[0].get(sc)).attackEntityFrom(DamageSource.GENERIC, in[1].getFloat(sc));
  971. return Void.TYPE;
  972. });
  973. parser.registerFunction("entity.getdamagesource", (sc, in) ->
  974. {
  975. Object o = in[0].get(sc);
  976. if(o instanceof EntityLivingBase)
  977. {
  978. EntityLivingBase ent = (EntityLivingBase) o;
  979. DamageSource ds;
  980. if(ent instanceof EntityPlayer)
  981. {
  982. ds = DamageSource.causePlayerDamage((EntityPlayer) ent);
  983. }
  984. else
  985. {
  986. ds = DamageSource.causeMobDamage(ent);
  987. }
  988. if(in[1].getBoolean(sc))
  989. {
  990. ds.setDamageAllowedInCreativeMode();
  991. }
  992. if(in[2].getBoolean(sc))
  993. {
  994. ds.setDamageBypassesArmor();
  995. }
  996. if(in[3].getBoolean(sc))
  997. {
  998. ds.setDamageIsAbsolute();
  999. }
  1000. if(in[4].getBoolean(sc))
  1001. {
  1002. ds.setExplosion();
  1003. }
  1004. if(in[5].getBoolean(sc))
  1005. {
  1006. ds.setFireDamage();
  1007. }
  1008. if(in[6].getBoolean(sc))
  1009. {
  1010. ds.setMagicDamage();
  1011. }
  1012. if(in[7].getBoolean(sc))
  1013. {
  1014. ds.setProjectile();
  1015. }
  1016. return ds;
  1017. }
  1018. switch(o.toString())
  1019. {
  1020. case "IN_FIRE": return DamageSource.IN_FIRE;
  1021. case "LIGHTNING_BOLT": return DamageSource.LIGHTNING_BOLT;
  1022. case "ON_FIRE": return DamageSource.ON_FIRE;
  1023. case "LAVA": return DamageSource.LAVA;
  1024. case "HOT_FLOOR": return DamageSource.HOT_FLOOR;
  1025. case "IN_WALL": return DamageSource.IN_WALL;
  1026. case "CRAMMING": return DamageSource.CRAMMING;
  1027. case "DROWN": return DamageSource.DROWN;
  1028. case "STARVE": return DamageSource.STARVE;
  1029. case "CACTUS": return DamageSource.CACTUS;
  1030. case "FALL": return DamageSource.FALL;
  1031. case "FLY_INTO_WALL": return DamageSource.FLY_INTO_WALL;
  1032. case "OUT_OF_WORLD": return DamageSource.OUT_OF_WORLD;
  1033. case "GENERIC": return DamageSource.GENERIC;
  1034. case "MAGIC": return DamageSource.MAGIC;
  1035. case "WITHER": return DamageSource.WITHER;
  1036. case "ANVIL": return DamageSource.ANVIL;
  1037. case "FALLING_BLOCK": return DamageSource.FALLING_BLOCK;
  1038. case "DRAGON_BREATH": return DamageSource.DRAGON_BREATH;
  1039. case "FIREWORKS": return DamageSource.FIREWORKS;
  1040. case "THORNS": return DamageSource.causeThornsDamage((Entity) in[1].get(sc));
  1041. }
  1042. return DamageSource.GENERIC;
  1043. });
  1044. parser.registerFunction("entity.gethealth", (sc, in) -> (double) ((EntityLivingBase) in[0].get(sc)).getHealth());
  1045. parser.registerFunction("entity.sethealth", (sc, in) ->
  1046. {
  1047. ((EntityLivingBase) in[0].get(sc)).setHealth(in[1].getFloat(sc));
  1048. return Void.TYPE;
  1049. });
  1050. parser.registerFunction("entity.setname", (sc, in) ->
  1051. {
  1052. Entity ent = (Entity) in[0].get(sc);
  1053. ent.setCustomNameTag(in[1].getString(sc));
  1054. if(in.length >= 3)
  1055. {
  1056. ent.setAlwaysRenderNameTag(in[2].getBoolean(sc));
  1057. return Void.TYPE;
  1058. }
  1059. ent.setAlwaysRenderNameTag(true);
  1060. return Void.TYPE;
  1061. });
  1062. parser.registerFunction("entity.getname", (sc, in) -> ((Entity) in[0].get(sc)).getDisplayName().getUnformattedText());
  1063. parser.registerFunction("entity.throw", (sc, in) ->
  1064. {
  1065. Utils.setVelocity((Entity) in[0].get(sc), in[1].getDouble(sc), in[2].getDouble(sc), in[3].getDouble(sc));
  1066. return Void.TYPE;
  1067. });
  1068. parser.registerFunction("entity.teleport", (sc, in) ->
  1069. {
  1070. Utils.teleportEntity((Entity) in[0].get(sc), (Location) in[1].get(sc));
  1071. return Void.TYPE;
  1072. });
  1073. parser.registerFunction("entity.setequip", (sc, in) ->
  1074. {
  1075. EntityLivingBase liv = (EntityLivingBase) in[0].get(sc);
  1076. ItemStack stack = ((ItemStack) in[2].get(sc)).copy();
  1077. switch(in[1].getString(sc))
  1078. {
  1079. case "hand":
  1080. liv.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, stack);
  1081. return Void.TYPE;
  1082. case "head":
  1083. liv.setItemStackToSlot(EntityEquipmentSlot.HEAD, stack);
  1084. return Void.TYPE;
  1085. case "chest":
  1086. liv.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack);
  1087. return Void.TYPE;
  1088. case "legs":
  1089. liv.setItemStackToSlot(EntityEquipmentSlot.LEGS, stack);
  1090. return Void.TYPE;
  1091. case "feet":
  1092. liv.setItemStackToSlot(EntityEquipmentSlot.FEET, stack);
  1093. return Void.TYPE;
  1094. case "offhand":
  1095. liv.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, stack);
  1096. }
  1097. return Void.TYPE;
  1098. });
  1099. parser.registerFunction("entity.getequip", (sc, in) ->
  1100. {
  1101. EntityLivingBase liv = (EntityLivingBase) in[0].get(sc);
  1102. switch(in[1].getString(sc))
  1103. {
  1104. case "hand":
  1105. return liv.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
  1106. case "head":
  1107. return liv.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
  1108. case "chest":
  1109. return liv.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
  1110. case "legs":
  1111. return liv.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
  1112. case "feet":
  1113. return liv.getItemStackFromSlot(EntityEquipmentSlot.FEET);
  1114. case "offhand":
  1115. return liv.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
  1116. }
  1117. return ItemStack.EMPTY;
  1118. });
  1119. parser.registerFunction("entity.removeall", (sc, in) ->
  1120. {
  1121. Class<? extends Entity> c = (Class<? extends Entity>) getClass(in[0].getString(sc));
  1122. if(c == Entity.class)
  1123. {
  1124. return Void.TYPE;
  1125. }
  1126. Location l = (Location) in[1].get(sc);
  1127. Utils.getEntities(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[2].getDouble(sc), c).stream().forEach(ent ->
  1128. {
  1129. ent.setDead();
  1130. });
  1131. return Void.TYPE;
  1132. });
  1133. parser.registerFunction("entity.remove", (sc, in) ->
  1134. {
  1135. ((Entity) in[0].get(sc)).setDead();
  1136. return Void.TYPE;
  1137. });
  1138. parser.registerFunction("entity.setinvulnerable", (sc, in) ->
  1139. {
  1140. ((Entity) in[0].get(sc)).setEntityInvulnerable(in[1].getBoolean(sc));
  1141. return Void.TYPE;
  1142. });
  1143. parser.registerFunction("entity.setsilent", (sc, in) ->
  1144. {
  1145. ((Entity) in[0].get(sc)).setSilent(in[1].getBoolean(sc));
  1146. return Void.TYPE;
  1147. });
  1148. parser.registerFunction("entity.hide", (sc, in) ->
  1149. {
  1150. ((Entity) in[0].get(sc)).setInvisible(true);
  1151. return Void.TYPE;
  1152. });
  1153. parser.registerFunction("entity.show", (sc, in) ->
  1154. {
  1155. ((Entity) in[0].get(sc)).setInvisible(false);
  1156. return Void.TYPE;
  1157. });
  1158. parser.registerFunction("entity.ride", (sc, in) ->
  1159. {
  1160. ((Entity) in[0].get(sc)).startRiding(((Entity) in[1].get(sc)));
  1161. return Void.TYPE;
  1162. });
  1163. parser.registerFunction("entity.addeffect", (sc, in) ->
  1164. {
  1165. EntityLivingBase base = (EntityLivingBase) in[0].get(sc);
  1166. Potion potion = Potion.getPotionFromResourceLocation(in[1].getString(sc));
  1167. if(base == null) // doing this only to prevent EffectUtils.addPotionTo doing shit
  1168. {
  1169. throw new NullPointerException("null not allowed for entity");
  1170. }
  1171. else if(potion == null)
  1172. {
  1173. throw new NullPointerException("potion does not exist");
  1174. }
  1175. EffectUtils.addPotionTo(base, potion, in[2].getInt(sc), in[3].getInt(sc));
  1176. return Void.TYPE;
  1177. });
  1178. parser.registerFunction("entity.haseffect", (sc, in) -> ((EntityLivingBase) in[0].get(sc)).isPotionActive(Potion.getPotionFromResourceLocation(in[1].getString(sc))));
  1179. parser.registerFunction("entity.goto", (sc, in) ->
  1180. {
  1181. Location l = (Location) in[1].get(sc);
  1182. PathfinderUtils.walkTo((EntityLiving) in[0].get(sc), l.getX(), l.getY(), l.getZ(), in[2].getDouble(sc));
  1183. return Void.TYPE;
  1184. });
  1185. parser.registerFunction("entity.explode", (sc, in) ->
  1186. {
  1187. ((EntityCreeper) in[0].get(sc)).ignite();
  1188. return Void.TYPE;
  1189. });
  1190. parser.registerFunction("entity.spawnitemframe", (sc, in) ->
  1191. {
  1192. Location l = ((Location) in[0].get(sc));
  1193. EntityItemFrame frame = new EntityItemFrame(l.getWorld(), l.getBlockPos(), EnumFacing.byName(in[1].getString(sc)));
  1194. frame.setDisplayedItem(((ItemStack) in[2].get(sc))); // cppy happens in internals
  1195. return Void.TYPE;
  1196. });
  1197. parser.registerFunction("entity.getitemframe", (sc, in) -> ((EntityItemFrame) in[0].get(sc)).getDisplayedItem());
  1198. parser.registerFunction("entity.get", (sc, in) ->
  1199. {
  1200. Location l = (Location) in[0].get(sc);
  1201. return Utils.getEntity(l.getWorld(), l.getX(), l.getY(), l.getZ(), in[1].getDouble(sc), getClass(in[2].getString(sc)));
  1202. });
  1203. parser.registerFunction("entity.getpotiontype", (sc, in) -> PotionUtils.getPotionFromItem(((EntityPotion) in[0].get(sc)).getPotion()).getRegistryName().toString());
  1204. parser.registerFunction("entity.setgravity", (sc, in) ->
  1205. {
  1206. ((Entity) in[0].get(sc)).setNoGravity(!in[1].getBoolean(sc));
  1207. return Void.TYPE;
  1208. });
  1209. parser.registerFunction("entity.iswet", (sc, in) -> ((Entity) in[0].get(sc)).isWet());
  1210. parser.registerFunction("entity.setpickupdelay", (sc, in) ->
  1211. {
  1212. ((EntityItem) in[0].get(sc)).setPickupDelay(in[1].getInt(sc));
  1213. return Void.TYPE;
  1214. });
  1215. parser.registerFunction("entity.setage", (sc, in) ->
  1216. {
  1217. ReflectionUtils.setAge((EntityItem) in[0].get(sc), in[1].getInt(sc));
  1218. return Void.TYPE;
  1219. });
  1220. // ---------------------------------------------------------------------
  1221. // Status-Bibliothek
  1222. // ---------------------------------------------------------------------
  1223. parser.registerFunction("status.getmana", (sc, in) -> (double) EnvironmentAPI.getMana(((EntityPlayer) in[0].get(sc))));
  1224. parser.registerFunction("status.getcold", (sc, in) -> (double) EnvironmentAPI.getCold(((EntityPlayer) in[0].get(sc))));
  1225. parser.registerFunction("status.getenergy", (sc, in) -> (double) EnvironmentAPI.getEnergy(((EntityPlayer) in[0].get(sc))));
  1226. parser.registerFunction("status.getthirst", (sc, in) -> (double) EnvironmentAPI.getThirst(((EntityPlayer) in[0].get(sc))));
  1227. parser.registerFunction("status.changemange", (sc, in) ->
  1228. {
  1229. EnvironmentAPI.changeMana(((EntityPlayer) in[0].get(sc)), in[1].getInt(sc));
  1230. return Void.TYPE;
  1231. });
  1232. parser.registerFunction("status.changecold", (sc, in) ->
  1233. {
  1234. EnvironmentAPI.changeCold(((EntityPlayer) in[0].get(sc)), in[1].getInt(sc));
  1235. return Void.TYPE;
  1236. });
  1237. parser.registerFunction("status.changeenergie", (sc, in) ->
  1238. {
  1239. EnvironmentAPI.changeEnergy(((EntityPlayer) in[0].get(sc)), in[1].getInt(sc));
  1240. return Void.TYPE;
  1241. });
  1242. parser.registerFunction("status.changethirst", (sc, in) ->
  1243. {
  1244. EnvironmentAPI.changeThirst(((EntityPlayer) in[0].get(sc)), in[1].getInt(sc));
  1245. return Void.TYPE;
  1246. });
  1247. parser.registerFunction("status.resetmana", (sc, in) ->
  1248. {
  1249. EnvironmentAPI.resetMana(((EntityPlayer) in[0].get(sc)));
  1250. return Void.TYPE;
  1251. });
  1252. parser.registerFunction("status.resetcold", (sc, in) ->
  1253. {
  1254. EnvironmentAPI.resetCold(((EntityPlayer) in[0].get(sc)));
  1255. return Void.TYPE;
  1256. });
  1257. parser.registerFunction("status.resetenergy", (sc, in) ->
  1258. {
  1259. EnvironmentAPI.resetEnergy(((EntityPlayer) in[0].get(sc)));
  1260. return Void.TYPE;
  1261. });
  1262. parser.registerFunction("status.resetthirst", (sc, in) ->
  1263. {
  1264. EnvironmentAPI.resetThirst(((EntityPlayer) in[0].get(sc)));
  1265. return Void.TYPE;
  1266. });
  1267. parser.registerFunction("status.gettemperature", (sc, in) ->
  1268. {
  1269. Location l = (Location) in[0].get(sc);
  1270. return (double) EnvironmentAPI.getTemperature(l.getWorld(), l.getBlockPos());
  1271. });
  1272. // ---------------------------------------------------------------------
  1273. // GMap-Bibliothek
  1274. // ---------------------------------------------------------------------
  1275. parser.registerFunction("gmap.removeall", (sc, in) ->
  1276. {
  1277. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMap(in[0].getString(sc));
  1278. return Void.TYPE;
  1279. });
  1280. parser.registerFunction("gmap.add", (sc, in) ->
  1281. {
  1282. KajetansMod.scripts.getDataBank(ScriptBank.class).addMapElement(in[0].getString(sc), in[1].getString(sc), in[2].getString(sc));
  1283. return Void.TYPE;
  1284. });
  1285. parser.registerFunction("gmap.remove", (sc, in) ->
  1286. {
  1287. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMapElement(in[0].getString(sc), in[1].getString(sc));
  1288. return Void.TYPE;
  1289. });
  1290. parser.registerFunction("gmap.totable", (sc, in) ->
  1291. {
  1292. in[0].set(sc, KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalMapAsTable(in[1].getString(sc)));
  1293. return Void.TYPE;
  1294. });
  1295. parser.registerFunction("gmap.get", (sc, in) -> KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(in[0].getString(sc), in[1].getString(sc)));
  1296. parser.registerFunction("gmap.getordefault", (sc, in) ->
  1297. {
  1298. Object o = KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(in[0].getString(sc), in[1].getString(sc));
  1299. if(o == null)
  1300. {
  1301. return in[2].get(sc);
  1302. }
  1303. return o;
  1304. });
  1305. // ---------------------------------------------------------------------
  1306. // GDMap-Bibliothek
  1307. // ---------------------------------------------------------------------
  1308. parser.registerFunction("gdmap.removeall", (sc, in) ->
  1309. {
  1310. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(in[0].getString(sc));
  1311. return Void.TYPE;
  1312. });
  1313. parser.registerFunction("gdmap.add", (sc, in) ->
  1314. {
  1315. KajetansMod.scripts.getDataBank(ScriptBank.class).addDualMapElement(in[0].getString(sc), in[1].getString(sc), in[2].getString(sc), in[3].getString(sc));
  1316. return Void.TYPE;
  1317. });
  1318. parser.registerFunction("gdmap.remove", (sc, in) ->
  1319. {
  1320. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(in[0].getString(sc), in[1].getString(sc), in[2].getString(sc));
  1321. return Void.TYPE;
  1322. });
  1323. parser.registerFunction("gdmap.totable", (sc, in) ->
  1324. {
  1325. in[0].set(sc, KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalDualMapAsTable(in[1].getString(sc), in[2].getString(sc)));
  1326. return Void.TYPE;
  1327. });
  1328. parser.registerFunction("gdmap.get", (sc, in) ->
  1329. {
  1330. return KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(in[0].getString(sc), in[1].getString(sc), in[2].getString(sc));
  1331. });
  1332. parser.registerFunction("gdmap.getordefault", (sc, in) ->
  1333. {
  1334. Object o = KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(in[0].getString(sc), in[1].getString(sc), in[2].getString(sc));
  1335. if(o == null)
  1336. {
  1337. return in[3].get(sc);
  1338. }
  1339. return o;
  1340. });
  1341. // ---------------------------------------------------------------------
  1342. // Table-Bibliothek
  1343. // ---------------------------------------------------------------------
  1344. parser.registerFunction("table.print", (sc, in) ->
  1345. {
  1346. Table t = (Table) in[1].get(sc);
  1347. if(t.getSize() >= 60)
  1348. {
  1349. throw new IllegalArgumentException("table is too big");
  1350. }
  1351. Object group = in[0].get(sc);
  1352. TableAPI.getTable(t, in[2].getInt(sc), in[3].getString(sc), in.length >= 5 ? in[4].getBoolean(sc) : false)
  1353. .forEach(s -> sendMessageToGroup(group, sc, new TextComponentString(s)));
  1354. return Void.TYPE;
  1355. });
  1356. parser.registerFunction("table.new", (sc, in) ->
  1357. {
  1358. in[0].set(sc, new Table(in[1].getInt(sc)));
  1359. return Void.TYPE;
  1360. });
  1361. parser.registerFunction("table.frommap", (sc, in) ->
  1362. {
  1363. in[0].set(sc, new Table((Map<Object, Object>) in[1].get(sc)));
  1364. return Void.TYPE;
  1365. });
  1366. parser.registerAlias("table.frommap", "map.totable");
  1367. parser.registerFunction("table.sort", (sc, in) ->
  1368. {
  1369. ((Table) in[0].get(sc)).sort();
  1370. return Void.TYPE;
  1371. });
  1372. parser.registerFunction("table.reverse", (sc, in) ->
  1373. {
  1374. ((Table) in[0].get(sc)).reverse();
  1375. return Void.TYPE;
  1376. });
  1377. parser.registerFunction("table.shuffle", (sc, in) ->
  1378. {
  1379. ((Table) in[0].get(sc)).shuffle();
  1380. return Void.TYPE;
  1381. });
  1382. parser.registerFunction("table.clear", (sc, in) ->
  1383. {
  1384. ((Table) in[0].get(sc)).clear();
  1385. return Void.TYPE;
  1386. });
  1387. parser.registerFunction("table.addrow", (sc, in) ->
  1388. {
  1389. Object[] o = new Object[in.length - 1];
  1390. for(int i = 1; i < in.length; i++)
  1391. {
  1392. o[i - 1] = in[i].get(sc);
  1393. }
  1394. ((Table) in[0].get(sc)).addRow(o);
  1395. return Void.TYPE;
  1396. });
  1397. parser.registerFunction("table.removerow", (sc, in) ->
  1398. {
  1399. ((Table) in[0].get(sc)).removeRow(in[1].getInt(sc));
  1400. return Void.TYPE;
  1401. });
  1402. parser.registerFunction("table.get", (sc, in) -> ((Table) in[0].get(sc)).getElement(in[1].getInt(sc), in[2].getInt(sc)));
  1403. parser.registerFunction("table.set", (sc, in) ->
  1404. {
  1405. ((Table) in[0].get(sc)).setElement(in[1].getInt(sc), in[2].getInt(sc), in[3].get(sc));
  1406. return Void.TYPE;
  1407. });
  1408. parser.registerFunction("table.getindexof", (sc, in) -> (double) ((Table) in[0].get(sc)).getIndexOf(in[1].get(sc)));
  1409. parser.registerFunction("table.setsortcolumn", (sc, in) ->
  1410. {
  1411. ((Table) in[0].get(sc)).setSortColumn(in[1].getInt(sc));
  1412. return Void.TYPE;
  1413. });
  1414. parser.registerFunction("table.getsize", (sc, in) -> (double) ((Table) in[0].get(sc)).getSize());
  1415. // ---------------------------------------------------------------------
  1416. // Plot-Bibliothek
  1417. // ---------------------------------------------------------------------
  1418. parser.registerFunction("plot.hastag", (sc, in) -> KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(((Location) in[0].get(sc)).getWorld(), ((Location) in[0].get(sc)).getBlockPos(), in[1].getString(sc)));
  1419. parser.registerFunction("plot.add", (sc, in) ->
  1420. {
  1421. Location l1 = (Location) in[0].get(sc);
  1422. Location l2 = (Location) in[1].get(sc);
  1423. BlockPos pos1 = l1.getBlockPos();
  1424. BlockPos pos2 = l2.getBlockPos();
  1425. KajetansMod.plots.getDataBank(ProtectionBank.class).addPlot(Math.min(pos1.getX(), pos2.getX()),
  1426. Math.min(pos1.getY(), pos2.getY()),
  1427. Math.min(pos1.getZ(), pos2.getZ()),
  1428. Math.max(pos1.getX(), pos2.getX()),
  1429. Math.max(pos1.getY(), pos2.getY()),
  1430. Math.max(pos1.getZ(), pos2.getZ()),
  1431. ModDimensions.getWorldName(l1.getWorld()), null, in[2].getString(sc));
  1432. return Void.TYPE;
  1433. });
  1434. parser.registerFunction("plot.getids", (sc, in) ->
  1435. {
  1436. Location l = (Location) in[1].get(sc);
  1437. in[0].set(sc, KajetansMod.plots.getDataBank(ProtectionBank.class).getRegionIds(l.getWorld(),
  1438. l.getBlockPos()).stream().map(o -> ((Number) o).doubleValue()).collect(Collectors.toSet()));
  1439. return Void.TYPE;
  1440. });
  1441. parser.registerFunction("plot.canbuild", (sc, in) ->
  1442. {
  1443. Location l = (Location) in[0].get(sc);
  1444. return KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(l.getWorld(), l.getBlockPos(), (EntityPlayer) in[1].get(sc));
  1445. });
  1446. parser.registerFunction("plot.getname", (sc, in) ->
  1447. {
  1448. Location l = (Location) in[0].get(sc);
  1449. KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(l.getWorld(), l.getBlockPos());
  1450. return Void.TYPE;
  1451. });
  1452. parser.registerFunction("plot.doesintersect", (sc, in) ->
  1453. {
  1454. Location l1 = (Location) in[0].get(sc);
  1455. Location l2 = (Location) in[1].get(sc);
  1456. int x1 = (int) Math.min(l1.getX(), l2.getX());
  1457. int x2 = (int) Math.max(l1.getX(), l2.getX());
  1458. int y1 = (int) Math.min(l1.getY(), l2.getY());
  1459. int y2 = (int) Math.max(l1.getY(), l2.getY());
  1460. int z1 = (int) Math.min(l1.getZ(), l2.getZ());
  1461. int z2 = (int) Math.max(l1.getZ(), l2.getZ());
  1462. return KajetansMod.plots.getDataBank(ProtectionBank.class).isPlotOverlapping(x1, y1, z1, x2, y2, z2, l1.getWorld());
  1463. });
  1464. // ---------------------------------------------------------------------
  1465. // Script-Bibliothek
  1466. // ---------------------------------------------------------------------
  1467. parser.registerFunction("script.playerstolist", (sc, in) ->
  1468. {
  1469. in[0].set(sc, new ArrayList<>(KajetansMod.scripts.getPlayerList(sc.getId())));
  1470. return Void.TYPE;
  1471. });
  1472. parser.registerFunction("script.getplayeramount", (sc, in) -> (double) KajetansMod.scripts.getPlayerList(sc.getId()).size());
  1473. parser.registerFunction("script.start", (sc, in) ->
  1474. {
  1475. Object o = in[0].get(sc);
  1476. if(o instanceof EntityPlayer)
  1477. {
  1478. String[] names = new String[in.length - 1];
  1479. for(int i = 1; i < in.length; i++)
  1480. {
  1481. names[i - 1] = in[i].getString(sc);
  1482. }
  1483. return KajetansMod.scripts.startPlayerScript((EntityPlayer) in[0].get(sc), names);
  1484. }
  1485. String[] names = new String[in.length];
  1486. names[0] = o.toString();
  1487. for(int i = 1; i < in.length; i++)
  1488. {
  1489. names[i - 1] = in[i].getString(sc);
  1490. }
  1491. KajetansMod.scripts.startScript(names);
  1492. return true;
  1493. });
  1494. parser.registerFunction("script.get", (sc, in) -> KajetansMod.scripts.getScript(in[0].getString(sc)));
  1495. parser.registerFunction("script.join", (sc, in) -> KajetansMod.scripts.registerPlayer((Script) in[0].get(sc), (EntityPlayer) in[1].get(sc)));
  1496. parser.registerFunction("script.kick", (sc, in) -> KajetansMod.scripts.unregisterPlayer((EntityPlayer) in[0].get(sc)));
  1497. parser.registerFunction("script.getleader", (sc, in) ->
  1498. {
  1499. List<EntityPlayer> players = KajetansMod.scripts.getPlayerList(sc.getId());
  1500. if(players.isEmpty())
  1501. {
  1502. return null;
  1503. }
  1504. return players.get(0);
  1505. });
  1506. // ---------------------------------------------------------------------
  1507. // Scoreboard-Bibliothek
  1508. // ---------------------------------------------------------------------
  1509. parser.registerFunction("sb.add", (sc, in) ->
  1510. {
  1511. int id = in[1].getInt(sc);
  1512. String message = SnuviUtils.connect(sc, in, 2);
  1513. doForGroup(in[0].get(sc), sc, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).addText(id, message));
  1514. return Void.TYPE;
  1515. });
  1516. parser.registerFunction("sb.remove", (sc, in) ->
  1517. {
  1518. int id = in[1].getInt(sc);
  1519. doForGroup(in[0].get(sc), sc, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).removeText(id));
  1520. return Void.TYPE;
  1521. });
  1522. parser.registerFunction("sb.reset", (sc, in) ->
  1523. {
  1524. doForGroup(in[0].get(sc), sc, p -> KajetansMod.scoreboard.resetScoreboard((EntityPlayerMP) p));
  1525. return Void.TYPE;
  1526. });
  1527. // ---------------------------------------------------------------------
  1528. // Display-Bibliothek
  1529. // ---------------------------------------------------------------------
  1530. parser.registerFunction("display.add", (sc, in) ->
  1531. {
  1532. byte id = in[1].getByte(sc);
  1533. String message = SnuviUtils.connect(sc, in, 2);
  1534. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToDisplay((EntityPlayerMP) p, (byte) 1, id, message));
  1535. return Void.TYPE;
  1536. });
  1537. parser.registerFunction("display.remove", (sc, in) ->
  1538. {
  1539. byte id = in[1].getByte(sc);
  1540. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToDisplay((EntityPlayerMP) p, (byte) 2, id, ""));
  1541. return Void.TYPE;
  1542. });
  1543. parser.registerFunction("display.reset", (sc, in) ->
  1544. {
  1545. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToDisplay((EntityPlayerMP) p, (byte) 3, (byte) -1, ""));
  1546. return Void.TYPE;
  1547. });
  1548. // ---------------------------------------------------------------------
  1549. // Head-Bibliothek
  1550. // ---------------------------------------------------------------------
  1551. parser.registerFunction("head.add", (sc, in) ->
  1552. {
  1553. byte id = in[1].getByte(sc);
  1554. String name = in[2].getString(sc);
  1555. int x = in[3].getInt(sc);
  1556. int y = in[4].getInt(sc);
  1557. byte scale = in[5].getByte(sc);
  1558. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 1, id, name, x, y, scale));
  1559. return Void.TYPE;
  1560. });
  1561. parser.registerFunction("head.remove", (sc, in) ->
  1562. {
  1563. byte id = in[1].getByte(sc);
  1564. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 2, id, "", -1, -1, (byte) -1));
  1565. return Void.TYPE;
  1566. });
  1567. parser.registerFunction("head.reset", (sc, in) ->
  1568. {
  1569. doForGroup(in[0].get(sc), sc, p -> ModPacketHandler.sendToHead((EntityPlayerMP) p, (byte) 3, (byte) -1, "", -1, -1, (byte) -1));
  1570. return Void.TYPE;
  1571. });
  1572. // ---------------------------------------------------------------------
  1573. // Effect-Bibliothek
  1574. // ---------------------------------------------------------------------
  1575. parser.registerFunction("effect.playsound", (sc, in) ->
  1576. {
  1577. Location l = (Location) in[0].get(sc);
  1578. Vec3d v = l.getPos();
  1579. EffectUtils.playSound((WorldServer) l.getWorld(), SoundEvent.REGISTRY.getObject(new ResourceLocation(in[1].getString(sc))), SoundCategory.MASTER, v.x, v.y, v.z);
  1580. return Void.TYPE;
  1581. });
  1582. parser.registerFunction("effect.play", (sc, in) ->
  1583. {
  1584. Location l = ((Location) in[0].get(sc));
  1585. EffectUtils.spawnParticle((WorldServer) l.getWorld(), EnumParticleTypes.getByName(in[1].getString(sc)), l.getX() + 0.5, l.getY() + 0.5, l.getZ() + 0.5, in[2].getInt(sc));
  1586. return Void.TYPE;
  1587. });
  1588. // ---------------------------------------------------------------------
  1589. // Inventory-Bibliothek
  1590. // ---------------------------------------------------------------------
  1591. parser.registerFunction("inv.new", (sc, in) ->
  1592. {
  1593. in[0].set(sc, new SnuviInventory(in[2].getString(sc), in[1].getInt(sc), inventoryIds++));
  1594. return Void.TYPE;
  1595. });
  1596. parser.registerFunction("inv.newdynamic", (sc, in) ->
  1597. {
  1598. in[0].set(sc, new SnuviInventory(in[2].getString(sc), in[1].getString(sc), inventoryIds++));
  1599. return Void.TYPE;
  1600. });
  1601. parser.registerFunction("inv.getid", (sc, in) ->
  1602. {
  1603. return (double) ((SnuviInventory) in[0].get(sc)).getId();
  1604. });
  1605. parser.registerFunction("inv.loadblock", (sc, in) ->
  1606. {
  1607. Location l = (Location) in[1].get(sc);
  1608. TileEntityChest chest = (TileEntityChest) l.getWorld().getTileEntity(l.getBlockPos());
  1609. int size = chest.getSizeInventory();
  1610. if(size % 9 != 0)
  1611. {
  1612. size /= 9;
  1613. size++;
  1614. size *= 9;
  1615. }
  1616. SnuviInventory inv = new SnuviInventory(in[2].getString(sc), size, inventoryIds++);
  1617. for(int i = 0; i < chest.getSizeInventory(); i++)
  1618. {
  1619. inv.setInventorySlotContents(i, chest.getStackInSlot(i).copy());
  1620. }
  1621. in[0].set(sc, inv);
  1622. return Void.TYPE;
  1623. });
  1624. parser.registerFunction("inv.setitem", (sc, in) ->
  1625. {
  1626. ((IInventory) in[0].get(sc)).setInventorySlotContents(in[1].getInt(sc), (ItemStack) in[2].get(sc));
  1627. return Void.TYPE;
  1628. });
  1629. parser.registerFunction("inv.getitem", (sc, in) -> ((IInventory) in[0].get(sc)).getStackInSlot(in[1].getInt(sc)));
  1630. parser.registerFunction("inv.open", (sc, in) ->
  1631. {
  1632. new ScriptInventoryHolder((SnuviInventory) in[0].get(sc), (EntityPlayerMP) in[1].get(sc), sc).openForPlayer();
  1633. return Void.TYPE;
  1634. });
  1635. parser.registerFunction("inv.close", (sc, in) ->
  1636. {
  1637. EntityPlayer p = (EntityPlayer) in[0].get(sc);
  1638. if(p.openContainer instanceof CustomContainer)
  1639. {
  1640. ((CustomContainer) p.openContainer).closeSafe();
  1641. }
  1642. else
  1643. {
  1644. p.closeScreen();
  1645. }
  1646. return Void.TYPE;
  1647. });
  1648. parser.registerFunction("inv.update", (sc, in) ->
  1649. {
  1650. EntityPlayerMP p = (EntityPlayerMP) in[0].get(sc);
  1651. NonNullList<ItemStack> list = NonNullList.<ItemStack>create();
  1652. int size = p.openContainer.inventorySlots.size();
  1653. for(int j = 0; j < size; j++)
  1654. {
  1655. ItemStack itemstack = p.openContainer.inventorySlots.get(j).getStack();
  1656. list.add(itemstack.isEmpty() ? ItemStack.EMPTY : itemstack);
  1657. }
  1658. p.sendAllContents(p.openContainer, list);
  1659. return Void.TYPE;
  1660. });
  1661. // ---------------------------------------------------------------------
  1662. // Read-Bibliothek
  1663. // ---------------------------------------------------------------------
  1664. parser.registerFunction("read.player", (sc, in) ->
  1665. {
  1666. try
  1667. {
  1668. return Utils.getPlayerByName(in[0].getString(sc));
  1669. }
  1670. catch(PlayerNotFoundException ex)
  1671. {
  1672. return null;
  1673. }
  1674. });
  1675. parser.registerFunction("read.location", (sc, in) -> new Location(in[0].getString(sc)));
  1676. parser.registerFunction("read.item", (sc, in) ->
  1677. {
  1678. String s = in[0].getString(sc);
  1679. if(s.startsWith("{"))
  1680. {
  1681. String left = SnuviUtils.connect(sc, in, 1);
  1682. return ItemStackUtils.getStackFromNbtString((s + left).replace('\'', '"'));
  1683. }
  1684. if(s.indexOf(':') == -1)
  1685. {
  1686. s = "minecraft:" + s;
  1687. }
  1688. Item item = ItemStackUtils.getItem(s);
  1689. int amount = in.length >= 2 ? in[1].getInt(sc) : 1;
  1690. int meta = in.length >= 3 ? in[2].getInt(sc) : 0;
  1691. ItemStack stack = new ItemStack(item, amount, meta);
  1692. if(in.length >= 4)
  1693. {
  1694. stack.setStackDisplayName(in[3].getString(sc));
  1695. }
  1696. if(in.length >= 5)
  1697. {
  1698. for(int i = 4; i < in.length; i++)
  1699. {
  1700. ItemStackUtils.addLore(stack, in[i].getString(sc));
  1701. }
  1702. }
  1703. return stack;
  1704. });
  1705. parser.registerFunction("read.spawnmob", (sc, in) -> NBTUtils.fromString(SnuviUtils.connect(sc, in, 1).replace('\'', '"'), (Location) in[0].get(sc)));
  1706. // ---------------------------------------------------------------------
  1707. // Text-Bibliothek
  1708. // ---------------------------------------------------------------------
  1709. parser.registerFunction("text.location", (sc, in) -> ((Location) in[0].get(sc)).toString());
  1710. parser.registerFunction("text.locationblock", (sc, in) -> ((Location) in[0].get(sc)).toBlockString());
  1711. parser.registerFunction("text.item", (sc, in) -> ItemStackUtils.getNbtString((ItemStack) in[0].get(sc)));
  1712. parser.registerFunction("text.click", (sc, in) -> NBTUtils.getClickable(in[0].get(sc), in[1].getString(sc)));
  1713. parser.registerFunction("text.hover", (sc, in) -> NBTUtils.getHoverable(in[0].get(sc), in[1].getString(sc)));
  1714. // ---------------------------------------------------------------------
  1715. // Ohne Bibliothek
  1716. // ---------------------------------------------------------------------
  1717. parser.registerFunction("getglobalvar", (sc, in) ->
  1718. {
  1719. Object o = in[0].get(sc);
  1720. if(in.length == 2)
  1721. {
  1722. if(o instanceof EntityPlayer)
  1723. {
  1724. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), ((EntityPlayer) o).getUniqueID().toString());
  1725. }
  1726. else if(o.equals("SERVER"))
  1727. {
  1728. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), "-1");
  1729. }
  1730. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), o.toString());
  1731. }
  1732. if(o instanceof EntityPlayer)
  1733. {
  1734. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), ((EntityPlayer) o).getUniqueID().toString(), in[2].get(sc));
  1735. }
  1736. else if(o.equals("SERVER"))
  1737. {
  1738. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), "-1", in[2].get(sc));
  1739. }
  1740. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(in[1].getString(sc), o.toString(), in[2].get(sc));
  1741. });
  1742. parser.registerAlias("getglobalvar", "ggv");
  1743. parser.registerFunction("setglobalvar", (sc, in) ->
  1744. {
  1745. Object o = in[0].get(sc);
  1746. if(o instanceof EntityPlayer)
  1747. {
  1748. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(in[2].getString(sc), in[1].getString(sc), ((EntityPlayer) o).getUniqueID().toString());
  1749. }
  1750. else if(o.equals("SERVER"))
  1751. {
  1752. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(in[2].getString(sc), in[1].getString(sc), "-1");
  1753. }
  1754. else
  1755. {
  1756. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(in[2].getString(sc), in[1].getString(sc), o.toString());
  1757. }
  1758. return Void.TYPE;
  1759. });
  1760. parser.registerAlias("setglobalvar", "sgv");
  1761. parser.registerFunction("delglobalvar", (sc, in) ->
  1762. {
  1763. Object o = in[0].get(sc);
  1764. if(o instanceof EntityPlayer)
  1765. {
  1766. KajetansMod.scripts.getDataBank(ScriptBank.class).deleteVar(in[1].getString(sc), ((EntityPlayer) o).getUniqueID().toString());
  1767. }
  1768. else if(o.equals("SERVER"))
  1769. {
  1770. KajetansMod.scripts.getDataBank(ScriptBank.class).deleteVar(in[1].getString(sc), "-1");
  1771. }
  1772. else
  1773. {
  1774. KajetansMod.scripts.getDataBank(ScriptBank.class).deleteVar(in[1].getString(sc), o.toString());
  1775. }
  1776. return Void.TYPE;
  1777. });
  1778. parser.registerAlias("delglobalvar", "dgv");
  1779. parser.registerFunction("msg", (sc, in) ->
  1780. {
  1781. sendMessageToGroup(in[0].get(sc), sc, NBTUtils.concat(sc, 1, in));
  1782. return Void.TYPE;
  1783. });
  1784. parser.registerFunction("removeformat", (sc, in) -> SnuviUtils.connect(sc, in, 0).replaceAll("§.", ""));
  1785. parser.registerFunction("concatspace", (sc, in) -> SnuviUtils.connect(sc, in, " ", 0));
  1786. parser.registerFunction("onlyletters", (sc, in) ->
  1787. {
  1788. for(char c : SnuviUtils.connect(sc, in, 0).toCharArray())
  1789. {
  1790. if(!Character.isLetter(c))
  1791. {
  1792. return false;
  1793. }
  1794. }
  1795. return true;
  1796. });
  1797. parser.registerFunction("command", (sc, in) ->
  1798. {
  1799. KajetansMod.scheduler.scheduleTask(() -> KajetansMod.server.commandManager.executeCommand(KajetansMod.server, SnuviUtils.connect(sc, in, 0)));
  1800. return Void.TYPE;
  1801. });
  1802. }
  1803. private static Class getClass(String s)
  1804. {
  1805. try
  1806. {
  1807. return Class.forName(s);
  1808. }
  1809. catch(ClassNotFoundException ex)
  1810. {
  1811. throw new IllegalStringException(s);
  1812. }
  1813. }
  1814. // ---------------------------------------------------------------------------------
  1815. // Block
  1816. // ---------------------------------------------------------------------------------
  1817. private static IBlockState getBlockState(Location l)
  1818. {
  1819. return l.getWorld().getBlockState(l.getBlockPos());
  1820. }
  1821. // ---------------------------------------------------------------------------------
  1822. // Gruppen-Handler
  1823. // ---------------------------------------------------------------------------------
  1824. public static void doForGroup(Object group, Script sc, Consumer<ICommandSender> c)
  1825. {
  1826. if(group instanceof String)
  1827. {
  1828. switch(group.toString())
  1829. {
  1830. case "all":
  1831. KajetansMod.scripts.getPlayerList(sc.getId()).forEach(p -> c.accept(p));
  1832. break;
  1833. case "online":
  1834. KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));
  1835. break;
  1836. case "dev":
  1837. ChatChannel.getDevChannel().forEach((p) -> c.accept(p));
  1838. break;
  1839. case "server":
  1840. c.accept(KajetansMod.server);
  1841. break;
  1842. default:
  1843. c.accept(Utils.getPlayerByName(group.toString()));
  1844. break;
  1845. }
  1846. return;
  1847. }
  1848. c.accept((EntityPlayer) group);
  1849. }
  1850. private static void sendMessageToGroup(Object group, Script sc, ITextComponent text)
  1851. {
  1852. doForGroup(group, sc, p -> p.sendMessage(text));
  1853. }
  1854. }