MinecraftFunctions.java 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450
  1. package me.km.snuviscript;
  2. import me.km.KajetansMod;
  3. import me.km.afk.AfkListener;
  4. import me.km.api.Module;
  5. import me.km.api.Utils;
  6. import me.km.environment.EnvironmentAPI;
  7. import me.km.exception.EntityNotFoundException;
  8. import me.km.exception.IllegalItemStackStringException;
  9. import me.km.exception.IllegalStringLocationException;
  10. import me.km.exception.PlayerNotFoundException;
  11. import me.km.nms.NmsUtilities;
  12. import me.km.plots.ProtectionBank;
  13. import me.km.table.TableAPI;
  14. import java.util.ArrayList;
  15. import java.util.Arrays;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.Set;
  19. import java.util.UUID;
  20. import java.util.function.Consumer;
  21. import java.util.stream.Collectors;
  22. import me.hammerle.code.ISnuviLogger;
  23. import me.hammerle.code.Script;
  24. import me.hammerle.code.ScriptUtils;
  25. import me.km.api.Location;
  26. import me.km.api.TitleAPI;
  27. import me.km.dimensions.ModDimensions;
  28. import me.km.effects.EffectUtils;
  29. import me.km.inventory.InventoryUtils;
  30. import me.km.permissions.Permissions;
  31. import me.km.table.Table;
  32. import me.km.utils.ItemStackUtils;
  33. import me.km.utils.ReflectionUtils;
  34. import me.km.utils.SpecialBlockUtils;
  35. import net.minecraft.block.Block;
  36. import net.minecraft.block.BlockDoor;
  37. import net.minecraft.block.state.IBlockState;
  38. import net.minecraft.command.ICommandSender;
  39. import net.minecraft.enchantment.Enchantment;
  40. import net.minecraft.enchantment.EnchantmentHelper;
  41. import net.minecraft.entity.Entity;
  42. import net.minecraft.entity.EntityHanging;
  43. import net.minecraft.entity.EntityLiving;
  44. import net.minecraft.entity.EntityLivingBase;
  45. import net.minecraft.entity.item.EntityArmorStand;
  46. import net.minecraft.entity.item.EntityItemFrame;
  47. import net.minecraft.entity.monster.EntityCreeper;
  48. import net.minecraft.entity.passive.EntityVillager;
  49. import net.minecraft.entity.player.EntityPlayer;
  50. import net.minecraft.entity.player.EntityPlayerMP;
  51. import net.minecraft.entity.projectile.EntityPotion;
  52. import net.minecraft.inventory.EntityEquipmentSlot;
  53. import net.minecraft.inventory.IInventory;
  54. import net.minecraft.item.ItemStack;
  55. import net.minecraft.network.ThreadQuickExitException;
  56. import net.minecraft.network.play.client.CPacketChatMessage;
  57. import net.minecraft.network.play.client.CPacketClientStatus;
  58. import net.minecraft.network.play.server.SPacketSpawnPosition;
  59. import net.minecraft.potion.Potion;
  60. import net.minecraft.potion.PotionUtils;
  61. import net.minecraft.tileentity.TileEntity;
  62. import net.minecraft.tileentity.TileEntityChest;
  63. import net.minecraft.tileentity.TileEntitySign;
  64. import net.minecraft.util.DamageSource;
  65. import net.minecraft.util.EnumFacing;
  66. import net.minecraft.util.EnumParticleTypes;
  67. import net.minecraft.util.ResourceLocation;
  68. import net.minecraft.util.SoundCategory;
  69. import net.minecraft.util.SoundEvent;
  70. import net.minecraft.util.math.BlockPos;
  71. import net.minecraft.util.math.Vec3d;
  72. import net.minecraft.util.text.TextComponentString;
  73. import net.minecraft.world.World;
  74. import net.minecraft.world.WorldServer;
  75. import me.hammerle.exceptions.PreScriptException;
  76. import me.hammerle.exceptions.IllegalStringException;
  77. import me.hammerle.code.SnuviParser;
  78. import me.hammerle.exceptions.HoldCodeException;
  79. import me.hammerle.math.Fraction;
  80. import me.km.inventory.CustomContainer;
  81. import net.minecraft.entity.item.EntityItem;
  82. import net.minecraft.util.math.MathHelper;
  83. public class MinecraftFunctions implements ISnuviLogger
  84. {
  85. @SuppressWarnings("")
  86. public static void registerFunctions(SnuviParser parser)
  87. {
  88. // -------------------------------------------------------------
  89. // Command-Bibliothek
  90. // -------------------------------------------------------------
  91. parser.registerConsumer("command.add", (args, qd) ->
  92. KajetansMod.scripts.registerScriptCommand(args[0].toString()));
  93. parser.registerConsumer("command.remove", (args, qd) ->
  94. KajetansMod.scripts.unregisterScriptCommand(args[0].toString()));
  95. parser.registerFunction("command.exists", (args, qd) ->
  96. KajetansMod.scripts.isRegisteredScriptCommand(args[0].toString()));
  97. parser.registerConsumer("command.clear", (args, qd) ->
  98. KajetansMod.scripts.clearScriptCommands());
  99. // -------------------------------------------------------------
  100. // Permission-Bibliothek
  101. // -------------------------------------------------------------
  102. parser.registerConsumer("perm.clear", (args, qd) ->
  103. KajetansMod.perms.clear());
  104. parser.registerConsumer("perm.registergroup", (args, qd) ->
  105. KajetansMod.perms.registerGroupPermission(ScriptUtils.getInt(args[0]), args[1].toString()));
  106. parser.registerConsumer("perm.registerplayer", (args, qd) ->
  107. KajetansMod.perms.registerPlayerGroup(UUID.fromString(args[0].toString()), ScriptUtils.getInt(args[1])));
  108. // -------------------------------------------------------------
  109. // Title-Bibliothek
  110. // -------------------------------------------------------------
  111. parser.registerConsumer("title.settime", (args, qd) ->
  112. TitleAPI.setTitleTime((EntityPlayerMP) args[0], ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
  113. parser.registerConsumer("title.clear", (args, qd) ->
  114. TitleAPI.clearTitle((EntityPlayerMP) args[0]));
  115. parser.registerConsumer("title.reset", (args, qd) ->
  116. TitleAPI.resetTitle((EntityPlayerMP) args[0]));
  117. parser.registerConsumer("title.send", (args, qd) ->
  118. TitleAPI.setTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
  119. parser.registerConsumer("title.setsub", (args, qd) ->
  120. TitleAPI.setSubTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
  121. // -------------------------------------------------------------
  122. // Villager-Bibliothek
  123. // -------------------------------------------------------------
  124. parser.registerConsumer("villager.showtrades", (args, qd) ->
  125. ((EntityPlayer) args[0]).displayVillagerTradeGui(((EntityVillager) args[1])));
  126. // -------------------------------------------------------------
  127. // Player-Bibliothek
  128. // -------------------------------------------------------------
  129. parser.registerFunction("player.getitemamount", (args, qd) ->
  130. new Fraction(InventoryUtils.searchInventoryFor(((EntityPlayer) args[0]).inventory, (ItemStack) args[2], (boolean) args[1])));
  131. parser.registerFunction("player.removeitem", (args, qd) ->
  132. removeItem(args));
  133. parser.registerFunction("player.giveitem", (args, qd) ->
  134. giveItem(args));
  135. parser.registerFunction("player.shootprojectile", (args, qd) ->
  136. EffectUtils.launchProjectile((EntityPlayer) args[0], getClass(args[1].toString()), ScriptUtils.getDouble(args[2]), args[3]));
  137. parser.registerConsumer("player.respawn", (args, qd) ->
  138. respawnPlayer(qd, args));
  139. parser.registerConsumer("player.inventorytolist", (args, qd) ->
  140. qd.setVar(args[0].toString(), ((EntityPlayer) args[1]).inventory.mainInventory));
  141. parser.registerFunction("player.getnearest", (args, qd) ->
  142. Utils.getNearestPlayer(((Location) args[0]).getWorld(), ((Location) args[0]).getPos()));
  143. parser.registerConsumer("player.say", (args, qd) ->
  144. playerSay(args));
  145. parser.registerFunction("player.isafk", (args, qd) ->
  146. KajetansMod.afkManager.getEvent(AfkListener.class).isAfk(((EntityPlayer) args[0])));
  147. parser.registerConsumer("player.speak", (args, qd) ->
  148. sendMessageToGroup(args[0], qd, "§7[§r" + args[1] + "§7] " + ScriptUtils.connect(args, 2)));
  149. parser.registerConsumer("player.setcompass", (args, qd) ->
  150. ((EntityPlayerMP) args[0]).connection.sendPacket(new SPacketSpawnPosition(((Location) args[1]).getBlockPos())));
  151. parser.registerFunction("player.gethunger", (args, qd) ->
  152. new Fraction(((EntityPlayer) args[0]).getFoodStats().getFoodLevel()));
  153. parser.registerConsumer("player.sethunger", (args, qd) ->
  154. ((EntityPlayer) args[0]).getFoodStats().setFoodLevel(ScriptUtils.getInt(args[1])));
  155. parser.registerFunction("player.getsaturation", (args, qd) ->
  156. Fraction.fromDouble(ReflectionUtils.getSaturation(((EntityPlayer) args[0]).getFoodStats())));
  157. parser.registerConsumer("player.setsaturation", (args, qd) ->
  158. ReflectionUtils.setSaturation(((EntityPlayer) args[0]).getFoodStats(), ScriptUtils.getFloat(args[1])));
  159. parser.registerFunction("player.getname", (args, qd) ->
  160. getName(args));
  161. parser.registerFunction("player.getfullname", (args, qd) ->
  162. KajetansMod.chatManager.getFullName((EntityPlayer) args[0]));
  163. parser.registerFunction("player.getuuid", (args, qd) ->
  164. getUuid(args));
  165. parser.registerFunction("player.getip", (args, qd) ->
  166. ((EntityPlayerMP) args[0]).connection.netManager.getRemoteAddress().toString());
  167. parser.registerFunction("player.iscreative", (args, qd) ->
  168. ((EntityPlayer) args[0]).isCreative());
  169. parser.registerFunction("player.isspectator", (args, qd) ->
  170. ((EntityPlayer) args[0]).isSpectator());
  171. parser.registerFunction("player.issurvival", (args, qd) ->
  172. !((EntityPlayer) args[0]).isCreative() && !((EntityPlayer) args[0]).isSpectator());
  173. parser.registerFunction("player.isadventure", (args, qd) ->
  174. !((EntityPlayer) args[0]).capabilities.allowEdit);
  175. parser.registerFunction("player.hasfly", (args, qd) ->
  176. ((EntityPlayer) args[0]).capabilities.allowFlying);
  177. parser.registerFunction("player.getlastdamager", (args, qd) ->
  178. getLastDamager(args));
  179. parser.registerConsumer("player.settag", (args, qd) ->
  180. setTag(args));
  181. parser.registerFunction("player.gettag", (args, qd) ->
  182. getTag(args));
  183. parser.registerConsumer("player.dropinventory", (args, qd) ->
  184. dropInventory(args));
  185. parser.registerFunction("player.gettarget", (args, qd) ->
  186. new Location(((EntityPlayer) args[0]).world, Utils.getPlayerTarget((EntityPlayer) args[0], ScriptUtils.getInt(args[1]))));
  187. parser.registerFunction("player.gettargetentity", (args, qd) ->
  188. Utils.getTargetedEntity((EntityPlayer) args[0], ScriptUtils.getDouble(args[1]), getClass(args[2].toString())));
  189. parser.registerFunction("player.hasquest", (args, qd) ->
  190. KajetansMod.scripts.hasScript((EntityPlayer) args[0]));
  191. parser.registerConsumer("player.action", (args, qd) ->
  192. sendToActionBar(args, qd));
  193. parser.registerConsumer("player.kick", (args, qd) ->
  194. kickPlayerFromQuest(args, qd));
  195. parser.registerConsumer("player.playsound", (args, qd) ->
  196. playSoundPlayer(args));
  197. parser.registerFunction("player.getbedspawn", (args, qd) ->
  198. getBedLocation(args));
  199. parser.registerConsumer("player.setbedspawn", (args, qd) ->
  200. ((EntityPlayer) args[0]).bedLocation = ((Location) args[1]).getBlockPos());
  201. parser.registerConsumer("player.damageitem", (args, qd) ->
  202. ((EntityPlayer) args[0]).getHeldItemMainhand().damageItem(ScriptUtils.getInt(args[1]), (EntityPlayer) args[0]));
  203. // -------------------------------------------------------------
  204. // Players-Bibliothek
  205. // -------------------------------------------------------------
  206. parser.registerFunction("players.getamount", (args, qd) ->
  207. new Fraction(KajetansMod.server.getCurrentPlayerCount()));
  208. parser.registerConsumer("players.tolist", (args, qd) ->
  209. qd.setVar(args[0].toString(), new ArrayList(KajetansMod.server.getPlayerList().getPlayers())));
  210. parser.registerConsumer("players.toworldlist", (args, qd) ->
  211. qd.setVar(args[0].toString(), new ArrayList(ModDimensions.getWorldFromName(args[1].toString()).playerEntities)));
  212. parser.registerConsumer("players.near", (args, qd) ->
  213. qd.setVar(args[0].toString(), new ArrayList(Utils.getNearbyEntities(((Location) args[1]).getWorld(), ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2]), EntityPlayer.class))));
  214. // -------------------------------------------------------------
  215. // Rank-Bibliothek
  216. // -------------------------------------------------------------
  217. parser.registerConsumer("rank.get", (args, qd) ->
  218. qd.setVar(args[0].toString(), KajetansMod.chatManager.getRanks((EntityPlayer) args[1])));
  219. parser.registerConsumer("rank.register", (args, qd) ->
  220. KajetansMod.chatManager.registerRank(args[0].toString(), ScriptUtils.getInt(args[1]), args[2].toString()));
  221. parser.registerConsumer("rank.player", (args, qd) ->
  222. KajetansMod.chatManager.registerPlayerRank(UUID.fromString(args[0].toString()), args[1].toString()));
  223. parser.registerConsumer("rank.clear", (args, qd) ->
  224. KajetansMod.chatManager.clearRanks());
  225. // -------------------------------------------------------------
  226. // Custom-Bibliothek
  227. // -------------------------------------------------------------
  228. /*parser.registerConsumer("custom.registershapelessrecipe", (args, qd) ->
  229. registerShapelessRecipe(args));
  230. parser.registerConsumer("custom.registershapedrecipe", (args, qd) ->
  231. registerShapedRecipe(args));
  232. parser.registerConsumer("custom.registerfurnacerecipe", (args, qd) ->
  233. RecipeUtils.registerFurnaceRecipe((ItemStack) args[0], (ItemStack) args[1]));
  234. parser.registerConsumer("custom.clearrecipes", (args, qd) ->
  235. RecipeUtils.clearRecipes());*/
  236. // -------------------------------------------------------------
  237. // World-Bibliothek
  238. // -------------------------------------------------------------
  239. parser.registerAlias("world.getplayers", "players.toworldlist");
  240. parser.registerConsumer("world.setskills", (args, qd) ->
  241. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).skills = (boolean) args[1]);
  242. parser.registerConsumer("world.setblockprotections", (args, qd) ->
  243. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).blockProtection = (boolean) args[1]);
  244. parser.registerConsumer("world.setdefaultenchanting", (args, qd) ->
  245. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultEnchanting = (boolean) args[1]);
  246. parser.registerConsumer("world.setpvpprotection", (args, qd) ->
  247. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).pvpProtection = (boolean) args[1]);
  248. parser.registerConsumer("world.setstatuseffects", (args, qd) ->
  249. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).statusEffects = (boolean) args[1]);
  250. parser.registerConsumer("world.setmanabar", (args, qd) ->
  251. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).manabar = (boolean) args[1]);
  252. parser.registerConsumer("world.setscrolls", (args, qd) ->
  253. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).scrolls = (boolean) args[1]);
  254. parser.registerConsumer("world.setdefaultproducing", (args, qd) ->
  255. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultProducing = (boolean) args[1]);
  256. // -------------------------------------------------------------
  257. // Item-Bibliothek
  258. // -------------------------------------------------------------
  259. parser.registerConsumer("item.drop", (args, qd) ->
  260. dropItem(args));
  261. parser.registerFunction("item.gettype", (args, qd) ->
  262. ((ItemStack) args[0]).getItem().getRegistryName().toString());
  263. parser.registerFunction("item.getdata", (args, qd) ->
  264. new Fraction(((ItemStack) args[0]).getMetadata()));
  265. parser.registerConsumer("item.setdata", (args, qd) ->
  266. ((ItemStack) args[0]).setItemDamage(ScriptUtils.getInt(args[1])));
  267. parser.registerFunction("item.getamount", (args, qd) ->
  268. new Fraction(((ItemStack) args[0]).getCount()));
  269. parser.registerConsumer("item.setamount", (args, qd) ->
  270. ((ItemStack) args[0]).setCount(ScriptUtils.getInt(args[1])));
  271. parser.registerFunction("item.getname", (args, qd) ->
  272. ((ItemStack) args[0]).getDisplayName());
  273. parser.registerConsumer("item.setname", (args, qd) ->
  274. ((ItemStack) args[0]).setStackDisplayName(ScriptUtils.connect(args, 1)));
  275. parser.registerConsumer("item.getlore", (args, qd) ->
  276. qd.setVar(args[0].toString(), ItemStackUtils.getLore((ItemStack) args[1])));
  277. parser.registerConsumer("item.setlore", (args, qd) ->
  278. ItemStackUtils.setLore((ItemStack) args[0], (List<String>) args[1]));
  279. parser.registerConsumer("item.addlore", (args, qd) ->
  280. ItemStackUtils.addLore((ItemStack) args[0], ScriptUtils.connect(args, 2), ScriptUtils.getInt(args[1])));
  281. parser.registerFunction("item.getenchantlevel", (args, qd) ->
  282. new Fraction(EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByLocation(args[1].toString()), (ItemStack) args[0])));
  283. parser.registerConsumer("item.setcooldown", (args, qd) ->
  284. ((EntityPlayer) args[0]).getCooldownTracker().setCooldown(((ItemStack) args[1]).getItem(), ScriptUtils.getInt(args[2])));
  285. parser.registerFunction("item.gettooltype", (args, qd) ->
  286. Utils.getToolType((ItemStack) args[0]));
  287. // -------------------------------------------------------------
  288. // Location-Bibliothek
  289. // -------------------------------------------------------------
  290. parser.registerFunction("loc.distance", (args, qd) ->
  291. Fraction.fromDouble(((Location) args[0]).getPos().distanceTo(((Location) args[1]).getPos())));
  292. parser.registerConsumer("loc.setyaw", (args, qd) ->
  293. ((Location) args[0]).setYaw(ScriptUtils.getFloat(args[1])));
  294. parser.registerConsumer("loc.setpitch", (args, qd) ->
  295. ((Location) args[0]).setPitch(ScriptUtils.getFloat(args[1])));
  296. parser.registerFunction("loc.mod", (args, qd) ->
  297. ((Location) args[0]).copyAdd(ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
  298. parser.registerFunction("loc.getcoord", (args, qd) ->
  299. getCoordOfLocation(args));
  300. parser.registerFunction("loc.gettime", (args, qd) ->
  301. new Fraction(((Location) args[0]).getWorld().getWorldTime()));
  302. parser.registerFunction("loc.hasstorm", (args, qd) ->
  303. ((Location) args[0]).getWorld().isRaining());
  304. parser.registerFunction("loc.isbetween", (args, qd) ->
  305. isBetween(args));
  306. // -------------------------------------------------------------
  307. // Block-Bibliothek
  308. // -------------------------------------------------------------
  309. parser.registerFunction("block.gettype", (args, qd) ->
  310. ((Location) args[0]).getWorld().getBlockState(((Location) args[0]).getBlockPos()).getBlock().getRegistryName().toString());
  311. parser.registerFunction("block.getdata", (args, qd) ->
  312. getBlockData((Location) args[0]));
  313. parser.registerConsumer("block.clone", (args, qd) ->
  314. cloneBlock(args));
  315. parser.registerConsumer("block.set", (args, qd) ->
  316. setBlock(args, qd));
  317. parser.registerConsumer("block.set2", (args, qd) ->
  318. setBlockWithData(args, qd));
  319. parser.registerConsumer("block.setsign", (args, qd) ->
  320. setSign(args));
  321. parser.registerFunction("block.getsign", (args, qd) ->
  322. getSign(args));
  323. parser.registerConsumer("block.setdoorstatus", (args, qd) ->
  324. setDoorStatus(args));
  325. parser.registerFunction("block.getdoorstatus", (args, qd) ->
  326. getDoorStatus(args));
  327. parser.registerFunction("block.isdoor", (args, qd) ->
  328. isDoor(args));
  329. parser.registerFunction("block.issolid", (args, qd) ->
  330. isSolid(args));
  331. parser.registerFunction("block.tostack", (args, qd) ->
  332. getStackFromBlock((Location) args[0]));
  333. parser.registerFunction("block.getitemamount", (args, qd) ->
  334. getItemAmountChest(args));
  335. parser.registerFunction("block.additem", (args, qd) ->
  336. addItemAmountChest(args));
  337. parser.registerFunction("block.subitem", (args, qd) ->
  338. removeItemAmountChest(args));
  339. // -------------------------------------------------------------
  340. // Event-Bibliothek
  341. // -------------------------------------------------------------
  342. parser.registerConsumer("event.addloc", (args, qd) ->
  343. ((MinecraftScript) qd).addLocation((Location) args[0]));
  344. parser.registerConsumer("event.removeloc", (args, qd) ->
  345. ((MinecraftScript) qd).removeLocation((Location) args[0]));
  346. parser.registerConsumer("event.clearlocs", (args, qd) ->
  347. ((MinecraftScript) qd).clearLocations());
  348. // -------------------------------------------------------------
  349. // Skill-Bibliothek
  350. // -------------------------------------------------------------
  351. parser.registerConsumer("skill.register", (args, qd) ->
  352. KajetansMod.skills.registerSkill(ScriptUtils.getInt(args[0]), (ItemStack) args[1], me.km.effects.Effect.valueOf(args[2].toString()), args[3].toString(), args[4].toString()));
  353. parser.registerConsumer("skill.clear", (args, qd) ->
  354. KajetansMod.skills.clearSkills());
  355. // -------------------------------------------------------------
  356. // Job-Bibliothek
  357. // -------------------------------------------------------------
  358. parser.registerFunction("job.getlevel", (args, qd) ->
  359. new Fraction(KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]))));
  360. parser.registerConsumer("job.addlevel", (args, qd) ->
  361. KajetansMod.jobs.addLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  362. parser.registerConsumer("job.setlevel", (args, qd) ->
  363. KajetansMod.jobs.setLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  364. parser.registerFunction("job.getxp", (args, qd) ->
  365. new Fraction(KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]))));
  366. parser.registerConsumer("job.addxp", (args, qd) ->
  367. KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  368. parser.registerConsumer("job.setxp", (args, qd) ->
  369. KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  370. parser.registerConsumer("job.registerjob", (args, qd) ->
  371. KajetansMod.jobs.registerJob(ScriptUtils.getByte(args[0]), ScriptUtils.connect(args, 1)));
  372. parser.registerConsumer("job.registerrecipe", (args, qd) ->
  373. KajetansMod.jobs.registerRecipe(ScriptUtils.getByte(args[0]), ScriptHelper.getItem(args[1].toString()), ScriptUtils.getByte(args[2])));
  374. parser.registerConsumer("job.registermaterial", (args, qd) ->
  375. KajetansMod.jobs.registerPreferedBlock(ScriptUtils.getByte(args[0]), Block.getBlockFromName(args[1].toString())));
  376. parser.registerConsumer("job.registerskill", (args, qd) ->
  377. KajetansMod.jobs.registerSkill(ScriptUtils.getByte(args[0]), KajetansMod.skills.getSkill(ScriptUtils.getInt(args[1])), ScriptUtils.getByte(args[2]), ScriptUtils.getByte(args[3])));
  378. parser.registerFunction("job.getamount", (args, qd) ->
  379. new Fraction(KajetansMod.jobs.getNumberOfJobs()));
  380. parser.registerFunction("job.getname", (args, qd) ->
  381. KajetansMod.jobs.getJobName(ScriptUtils.getByte(args[0])));
  382. parser.registerFunction("job.geteffectlevel", (args, qd) ->
  383. new Fraction(EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString()))));
  384. parser.registerFunction("job.hasjob", (args, qd) ->
  385. KajetansMod.jobs.hasJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
  386. parser.registerFunction("job.hasrecipe", (args, qd) ->
  387. KajetansMod.jobs.hasRecipe((EntityPlayer) args[0], ScriptHelper.getItem(args[1].toString())));
  388. parser.registerConsumer("job.getjobs", (args, qd) ->
  389. qd.setVar(args[0].toString(), KajetansMod.jobs.getJobs((EntityPlayer) args[1]).stream().map(b -> new Fraction(b)).collect(Collectors.toList())));
  390. parser.registerFunction("job.isregmaterial", (args, qd) ->
  391. KajetansMod.jobs.isPreferedMaterial((EntityPlayer) args[0],Block.getBlockFromName(args[1].toString())));
  392. parser.registerConsumer("job.setjob", (args, qd) ->
  393. KajetansMod.jobs.setJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), (boolean) args[2]));
  394. parser.registerConsumer("job.reset", (args, qd) ->
  395. KajetansMod.jobs.resetAll());
  396. // -------------------------------------------------------------
  397. // Entity - Befehle
  398. // -------------------------------------------------------------
  399. parser.registerFunction("entity.getlocation", (args, qd) ->
  400. new Location(((Entity) args[0])));
  401. parser.registerConsumer("entity.damage", (args, qd) ->
  402. damageEntity(args));
  403. parser.registerFunction("entity.gethealth", (args, qd) ->
  404. Fraction.fromDouble(((EntityLivingBase) args[0]).getHealth()));
  405. parser.registerConsumer("entity.sethealth", (args, qd) ->
  406. ((EntityLivingBase) args[0]).setHealth(ScriptUtils.getFloat(args[1])));
  407. parser.registerConsumer("entity.setname", (args, qd) ->
  408. nameEntity(args));
  409. parser.registerConsumer("entity.throw", (args, qd) ->
  410. Utils.setVelocity((Entity) args[0], ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
  411. parser.registerConsumer("entity.teleport", (args, qd) ->
  412. Utils.teleportEntity((Entity) args[0], (Location) args[1]));
  413. parser.registerConsumer("entity.setequip", (args, qd) ->
  414. setEntityEquip(args));
  415. parser.registerFunction("entity.getequip", (args, qd) ->
  416. getEntityEquip(args));
  417. parser.registerConsumer("entity.removeall", (args, qd) ->
  418. removeEntities(args));
  419. parser.registerConsumer("entity.remove", (args, qd) ->
  420. ((Entity) args[0]).setDead());
  421. parser.registerConsumer("entity.setinvulnerable", (args, qd) ->
  422. ((Entity) args[0]).setEntityInvulnerable((boolean) args[1]));
  423. parser.registerConsumer("entity.setsilent", (args, qd) ->
  424. ((Entity) args[0]).setSilent((boolean) args[1]));
  425. parser.registerConsumer("entity.hide", (args, qd) ->
  426. ((Entity) args[0]).setInvisible(true));
  427. parser.registerConsumer("entity.show", (args, qd) ->
  428. ((Entity) args[0]).setInvisible(false));
  429. parser.registerConsumer("entity.ride", (args, qd) ->
  430. ((Entity) args[0]).startRiding(((Entity) args[1])));
  431. parser.registerConsumer("entity.setvars", (args, qd) ->
  432. ScriptVars.setEntityVars(qd, Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos(), 3, (Class<? extends Entity>) getClass("net.minecraft.entity." + args[1]))));
  433. parser.registerConsumer("entity.addeffect", (args, qd) ->
  434. addEffect(args));
  435. parser.registerFunction("entity.haseffect", (args, qd) ->
  436. ((EntityLivingBase) args[0]).isPotionActive(Potion.getPotionFromResourceLocation(args[1].toString())));
  437. parser.registerConsumer("entity.goto", (args, qd) ->
  438. NmsUtilities.walkTo((EntityLiving) args[0], ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2])));
  439. parser.registerConsumer("entity.explode", (args, qd) ->
  440. ((EntityCreeper) args[0]).ignite());
  441. parser.registerConsumer("entity.spawnitemframe", (args, qd) ->
  442. spawnItemFrame(args));
  443. parser.registerFunction("entity.getitemframe", (args, qd) ->
  444. Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos().addVector(0.5, 0, 0.5), 1, EntityItemFrame.class).getDisplayedItem());
  445. parser.registerFunction("entity.getpotiontype", (args, qd) ->
  446. getPotionType(args));
  447. parser.registerConsumer("entity.setgravity", (args, qd) ->
  448. ((Entity) args[0]).setNoGravity(!(boolean) args[1]));
  449. parser.registerConsumer("entity.iswet", (args, qd) ->
  450. ((Entity) args[0]).isWet());
  451. parser.registerConsumer("entity.setpickupdelay", (args, qd) ->
  452. ((EntityItem) args[0]).setPickupDelay(ScriptUtils.getInt(args[1])));
  453. parser.registerConsumer("entity.setage", (args, qd) ->
  454. ReflectionUtils.setAge((EntityItem) args[0], ScriptUtils.getInt(args[1])));
  455. // -------------------------------------------------------------
  456. // Status-Bibliothek
  457. // -------------------------------------------------------------
  458. parser.registerFunction("status.getmana", (args, qd) ->
  459. new Fraction(EnvironmentAPI.getMana(((EntityPlayer) args[0]))));
  460. parser.registerFunction("status.getcold", (args, qd) ->
  461. new Fraction(EnvironmentAPI.getCold(((EntityPlayer) args[0]))));
  462. parser.registerFunction("status.getenergy", (args, qd) ->
  463. new Fraction(EnvironmentAPI.getEnergy(((EntityPlayer) args[0]))));
  464. parser.registerFunction("status.getthirst", (args, qd) ->
  465. new Fraction(EnvironmentAPI.getThirst(((EntityPlayer) args[0]))));
  466. parser.registerConsumer("status.changemange", (args, qd) ->
  467. EnvironmentAPI.changeMana(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  468. parser.registerConsumer("status.changecold", (args, qd) ->
  469. EnvironmentAPI.changeCold(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  470. parser.registerConsumer("status.changeenergie", (args, qd) ->
  471. EnvironmentAPI.changeEnergy(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  472. parser.registerConsumer("status.changethirst", (args, qd) ->
  473. EnvironmentAPI.changeThirst(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  474. parser.registerConsumer("status.resetmana", (args, qd) ->
  475. EnvironmentAPI.resetMana(((EntityPlayer) args[0])));
  476. parser.registerConsumer("status.resetcold", (args, qd) ->
  477. EnvironmentAPI.resetCold(((EntityPlayer) args[0])));
  478. parser.registerConsumer("status.resetenergy", (args, qd) ->
  479. EnvironmentAPI.resetEnergy(((EntityPlayer) args[0])));
  480. parser.registerConsumer("status.resetthirst", (args, qd) ->
  481. EnvironmentAPI.resetThirst(((EntityPlayer) args[0])));
  482. parser.registerFunction("status.gettemperature", (args, qd) ->
  483. new Fraction(EnvironmentAPI.getTemperature(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos())));
  484. // -------------------------------------------------------------
  485. // GMap-Bibliothek
  486. // -------------------------------------------------------------
  487. parser.registerConsumer("gmap.removeall", (args, qd) ->
  488. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMap(args[0].toString()));
  489. parser.registerConsumer("gmap.add", (args, qd) ->
  490. KajetansMod.scripts.getDataBank(ScriptBank.class).addMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
  491. parser.registerConsumer("gmap.remove", (args, qd) ->
  492. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMapElement(args[0].toString(), args[1].toString()));
  493. parser.registerConsumer("gmap.totable", (args, qd) ->
  494. qd.setVar(args[0].toString(), KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalMapAsTable(args[1].toString())));
  495. parser.registerFunction("gmap.get", (args, qd) ->
  496. KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(args[0].toString(), args[1].toString()));
  497. // -------------------------------------------------------------
  498. // GDMap-Bibliothek
  499. // -------------------------------------------------------------
  500. parser.registerConsumer("gdmap.removeall", (args, qd) ->
  501. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(args[0].toString()));
  502. parser.registerConsumer("gdmap.add", (args, qd) ->
  503. KajetansMod.scripts.getDataBank(ScriptBank.class).addDualMapElement(args[0].toString(), args[1].toString(), args[2].toString(), args[3].toString()));
  504. parser.registerConsumer("gdmap.remove", (args, qd) ->
  505. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
  506. parser.registerConsumer("gdmap.totable", (args, qd) ->
  507. qd.setVar(args[0].toString(), KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalDualMapAsTable(args[1].toString(), args[2].toString())));
  508. parser.registerFunction("gdmap.get", (args, qd) ->
  509. KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(args[0].toString(), args[1].toString(), args[2].toString()));
  510. // -------------------------------------------------------------
  511. // Table-Bibliothek
  512. // -------------------------------------------------------------
  513. parser.registerConsumer("table.print", (args, qd) ->
  514. printTable(args, qd));
  515. parser.registerConsumer("table.new", (args, qd) ->
  516. qd.setVar(args[0].toString(), new Table(ScriptUtils.getInt(args[1]))));
  517. parser.registerConsumer("table.frommap", (args, qd) ->
  518. qd.setVar(args[0].toString(), new Table((Map<Object, Object>) args[1])));
  519. parser.registerConsumer("table.sort", (args, qd) ->
  520. ((Table) args[0]).sort());
  521. parser.registerConsumer("table.reverse", (args, qd) ->
  522. ((Table) args[0]).reverse());
  523. parser.registerConsumer("table.shuffle", (args, qd) ->
  524. ((Table) args[0]).shuffle());
  525. parser.registerConsumer("table.clear", (args, qd) ->
  526. ((Table) args[0]).clear());
  527. parser.registerConsumer("table.addrow", (args, qd) ->
  528. ((Table) args[0]).addRow(Arrays.copyOfRange(args, 1, args.length)));
  529. parser.registerConsumer("table.removerow", (args, qd) ->
  530. ((Table) args[0]).removeRow(ScriptUtils.getInt(args[1])));
  531. parser.registerFunction("table.get", (args, qd) ->
  532. ((Table) args[0]).getElement(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2])));
  533. parser.registerFunction("table.getindexof", (args, qd) ->
  534. new Fraction(((Table) args[0]).getIndexOf(args[1])));
  535. parser.registerConsumer("table.setsortcolumn", (args, qd) ->
  536. ((Table) args[0]).setSortColumn(ScriptUtils.getInt(args[1])));
  537. parser.registerFunction("table.getsize", (args, qd) ->
  538. new Fraction(((Table) args[0]).getSize()));
  539. // -------------------------------------------------------------
  540. // Plot-Bibliothek
  541. // -------------------------------------------------------------
  542. parser.registerFunction("plot.hastag", (args, qd) ->
  543. KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), args[1].toString()));
  544. parser.registerConsumer("plot.add", (args, qd) ->
  545. addPlot(args));
  546. parser.registerConsumer("plot.getids", (args, qd) ->
  547. qd.setVar(args[0].toString(), getPlotIds(args)));
  548. parser.registerFunction("plot.canbuild", (args, qd) ->
  549. KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), (EntityPlayer) args[1]));
  550. parser.registerFunction("plot.getname", (args, qd) ->
  551. KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
  552. parser.registerFunction("plot.doesintersect", (args, qd) ->
  553. doesIntersect(args));
  554. // -------------------------------------------------------------
  555. // Quest-Bibliothek
  556. // -------------------------------------------------------------
  557. parser.registerConsumer("quest.end", (args, qd) ->
  558. endPlayerScript(args, qd));
  559. parser.registerConsumer("quest.playerstolist", (args, qd) ->
  560. qd.setVar(args[0].toString(), new ArrayList<>(((PlayerScript) qd).getPlayers())));
  561. parser.registerFunction("quest.getplayeramount", (args, qd) ->
  562. new Fraction(((PlayerScript) qd).getPlayers().size()));
  563. parser.registerConsumer("quest.start", (args, qd) ->
  564. startPlayerScript(args, qd));
  565. parser.registerFunction("quest.isactive", (args, qd) ->
  566. KajetansMod.scripts.isActive(args[0].toString()));
  567. parser.registerFunction("quest.getleader", (args, qd) ->
  568. getPlayerScriptLeader(qd));
  569. // -------------------------------------------------------------
  570. // Scoreboard-Bibliothek
  571. // -------------------------------------------------------------
  572. parser.registerConsumer("sb.add", (args, qd) ->
  573. addToScoreBoard(args, qd));
  574. parser.registerConsumer("sb.remove", (args, qd) ->
  575. removeFromScoreBoard(args, qd));
  576. parser.registerConsumer("sb.reset", (args, qd) ->
  577. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.resetScoreboard((EntityPlayerMP) p)));
  578. // -------------------------------------------------------------
  579. // Effect-Bibliothek
  580. // -------------------------------------------------------------
  581. parser.registerConsumer("effect.playsound", (args, qd) ->
  582. playSound(args));
  583. parser.registerConsumer("effect.play", (args, qd) ->
  584. playParticle(args));
  585. // -------------------------------------------------------------
  586. // Inventory-Bibliothek
  587. // -------------------------------------------------------------
  588. parser.registerConsumer("inv.new", (args, qd) ->
  589. qd.setVar(args[0].toString(), new SnuviInventory(args[2].toString(), ScriptUtils.getInt(args[1]), ((MinecraftScript) qd).getNewId())));
  590. parser.registerConsumer("inv.loadblock", (args, qd) ->
  591. qd.setVar(args[0].toString(), newInventory((Location) args[1], (MinecraftScript) qd, args[2].toString())));
  592. parser.registerConsumer("inv.setitem", (args, qd) ->
  593. ((IInventory) args[0]).setInventorySlotContents(ScriptUtils.getInt(args[1]), (ItemStack) args[2]));
  594. parser.registerFunction("inv.getitem", (args, qd) ->
  595. ((IInventory) args[0]).getStackInSlot(ScriptUtils.getInt(args[1])));
  596. parser.registerConsumer("inv.open", (args, qd) ->
  597. new ScriptInventoryHolder((SnuviInventory) args[0], (EntityPlayerMP) args[1], (MinecraftScript) qd).openForPlayer((EntityPlayerMP) args[1]));
  598. parser.registerConsumer("inv.close", (args, qd) ->
  599. invClose(args));
  600. // -------------------------------------------------------------
  601. // Read-Bibliothek
  602. // -------------------------------------------------------------
  603. parser.registerFunction("read.player", (args, qd) ->
  604. Utils.getPlayerByName(args[0].toString()));
  605. parser.registerFunction("read.location", (args, qd) ->
  606. new Location(qd, args[0].toString()));
  607. parser.registerFunction("read.item", (args, qd) ->
  608. ScriptHelper.getItemStack(args, 0));
  609. parser.registerFunction("read.spawnmob", (args, qd) ->
  610. NmsUtilities.getEntityFromNbtString(qd, ScriptUtils.connect(args," ", 1).replace("'", "\""), (Location) args[0]));
  611. // -------------------------------------------------------------
  612. // Text-Bibliothek
  613. // -------------------------------------------------------------
  614. parser.registerFunction("text.location", (args, qd) ->
  615. ((Location) args[0]).toString());
  616. parser.registerFunction("text.locationblock", (args, qd) ->
  617. ((Location) args[0]).toBlockString());
  618. parser.registerFunction("text.item", (args, qd) ->
  619. ScriptHelper.getItemStackString((ItemStack) args[0]));
  620. // -------------------------------------------------------------
  621. // Ohne Bibliothek
  622. // -------------------------------------------------------------
  623. parser.registerConsumer("overload", (args, qd) ->
  624. qd.overload(ScriptUtils.readCode("scripts/" + args[0].toString(), ".txt")));
  625. parser.registerFunction("getglobalvar", (args, qd) ->
  626. getGlobalVar(args));
  627. parser.registerAlias("ggv", "getglobalvar");
  628. parser.registerConsumer("setglobalvar", (args, qd) ->
  629. setGlobalVar(args));
  630. parser.registerAlias("sgv", "setglobalvar");
  631. parser.registerConsumer("msg", (args, qd) ->
  632. sendMessageToGroup(args[0], qd, ScriptUtils.connect(args, 1)));
  633. parser.registerFunction("removeformat", (args, qd) ->
  634. ScriptUtils.connect(args, 0).replaceAll("§.", ""));
  635. parser.registerFunction("concatspace", (args, qd) ->
  636. ScriptUtils.connect(args, " ", 0));
  637. parser.registerFunction("onlyletters", (args, qd) ->
  638. onlyLetters(ScriptUtils.connect(args, 0)));
  639. parser.registerConsumer("command", (args, qd) ->
  640. KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0)));
  641. }
  642. @Override
  643. public void printException(Exception ex)
  644. {
  645. if(KajetansMod.debugMode || KajetansMod.scripts.getSnuviParser().printStack)
  646. {
  647. printConsoleException(ex, null, -1);
  648. }
  649. printGeneralException(ex, -1);
  650. }
  651. @Override
  652. public void printException(Exception ex, Script sc, int line)
  653. {
  654. if(KajetansMod.debugMode || KajetansMod.scripts.getSnuviParser().printStack)
  655. {
  656. printConsoleException(ex, sc, line);
  657. }
  658. sendToDevsWithSuffix("§cError in '" + sc.getName()+ "'");
  659. printGeneralException(ex, line);
  660. }
  661. @Override
  662. public void printInfo(String s)
  663. {
  664. sendToDevsWithSuffix(s);
  665. }
  666. @Override
  667. public void printWarning(String s)
  668. {
  669. sendWarningToAllDevs(s);
  670. }
  671. private void printGeneralException(Exception ex, int line)
  672. {
  673. if(line != -1)
  674. {
  675. sendToDevsWithHelpList("§cZeile:", String.valueOf(line));
  676. }
  677. sendToDevsWithHelpList("§cFehler:", ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage());
  678. }
  679. public void printConsoleException(Exception ex, Script sc, int line)
  680. {
  681. Module m = KajetansMod.scripts;
  682. m.sendWarningToConsole("Error in '" + (sc == null ? "null": sc.getName()) + "'");
  683. if(line != -1)
  684. {
  685. m.sendWarningToConsole("Zeilen: " + line);
  686. }
  687. m.sendWarningToConsole("Fehler: " + ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage());
  688. }
  689. private static void printTable(Object[] args, Script sc)
  690. {
  691. Table t = (Table) args[1];
  692. if(t.getSize() >= 60)
  693. {
  694. throw new IllegalArgumentException("table is too big");
  695. }
  696. TableAPI.getTable(t, ScriptUtils.getInt(args[2]), args[3].toString(),
  697. args.length >= 5 ? (boolean) args[4] : false)
  698. .forEach(s -> sendMessageToGroup(args[0], sc, s));
  699. }
  700. private static Location getBedLocation(Object[] args)
  701. {
  702. WorldServer ws = ModDimensions.getWorldFromName(args[1].toString());
  703. return new Location(ws, ((EntityPlayer) args[0]).getBedLocation(ws.provider.getDimension()));
  704. }
  705. private static boolean isDoor(Object[] args)
  706. {
  707. Location l = (Location) args[0];
  708. return l.getWorld().getBlockState(l.getBlockPos()).getBlock() instanceof BlockDoor;
  709. }
  710. private static boolean getDoorStatus(Object[] args)
  711. {
  712. Location l = (Location) args[0];
  713. return BlockDoor.isOpen(l.getWorld(), l.getBlockPos());
  714. }
  715. private static void setDoorStatus(Object[] args)
  716. {
  717. Location l = (Location) args[0];
  718. BlockPos pos = l.getBlockPos();
  719. ((BlockDoor) l.getWorld().getBlockState(pos).getBlock()).toggleDoor(l.getWorld(), pos, (boolean) args[1]);
  720. }
  721. private static void playerSay(Object[] args)
  722. {
  723. try
  724. {
  725. ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1)));
  726. }
  727. catch(ThreadQuickExitException ex)
  728. {
  729. // Minecraft needs this for canceling and queueing into main thread
  730. }
  731. }
  732. private static void respawnPlayer(Script sc, Object[] args)
  733. {
  734. KajetansMod.scheduler.scheduleTask(() ->
  735. {
  736. try
  737. {
  738. ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN));
  739. }
  740. catch(ThreadQuickExitException ex)
  741. {
  742. // Minecraft needs this for canceling and queueing into main thread
  743. }
  744. });
  745. }
  746. private static Class getClass(String s)
  747. {
  748. try
  749. {
  750. return Class.forName(s);
  751. }
  752. catch(ClassNotFoundException ex)
  753. {
  754. throw new IllegalStringException(s);
  755. }
  756. }
  757. private static Fraction getItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  758. {
  759. Location l = (Location) args[0];
  760. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  761. if(te == null || !(te instanceof TileEntityChest))
  762. {
  763. return new Fraction(0);
  764. }
  765. return new Fraction(InventoryUtils.searchInventoryFor(((TileEntityChest) te), (ItemStack) args[2], (boolean) args[1]));
  766. }
  767. private static ItemStack addItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  768. {
  769. Location l = (Location) args[0];
  770. ItemStack stack = ((ItemStack) args[1]);
  771. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  772. if(te == null || !(te instanceof TileEntityChest))
  773. {
  774. return stack;
  775. }
  776. stack.setCount(InventoryUtils.addToInventory((TileEntityChest) te, stack));
  777. return stack;
  778. }
  779. private static ItemStack removeItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  780. {
  781. Location l = (Location) args[0];
  782. ItemStack stack = ((ItemStack) args[1]);
  783. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  784. if(te == null || !(te instanceof TileEntityChest))
  785. {
  786. return stack;
  787. }
  788. stack.setCount(InventoryUtils.removeFromInventory((TileEntityChest) te, stack));
  789. return stack;
  790. }
  791. private static Object getCoordOfLocation(Object[] args) throws IllegalStringLocationException
  792. {
  793. Location l = (Location) args[0];
  794. switch(args[1].toString())
  795. {
  796. case "x":
  797. return Fraction.fromDouble(l.getX());
  798. case "y":
  799. return Fraction.fromDouble(l.getY());
  800. case "z":
  801. return Fraction.fromDouble(l.getZ());
  802. case "bx":
  803. return new Fraction(MathHelper.floor(l.getX()));
  804. case "by":
  805. return new Fraction(MathHelper.floor(l.getY()));
  806. case "bz":
  807. return new Fraction(MathHelper.floor(l.getZ()));
  808. case "w":
  809. return ModDimensions.getWorldName(l.getWorld());
  810. default:
  811. return null;
  812. }
  813. }
  814. private static void cloneBlock(Object[] args) throws IllegalStringLocationException
  815. {
  816. Location l = (Location) args[1];
  817. IBlockState state = getBlockState((Location) args[0]);
  818. l.getWorld().setBlockState(l.getBlockPos(), state);
  819. }
  820. private static ItemStack removeItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
  821. {
  822. ItemStack stack = ((ItemStack) args[1]).copy();
  823. stack.setCount(InventoryUtils.removeFromInventory(((EntityPlayer) args[0]).inventory, stack));
  824. return stack;
  825. }
  826. private static void dropItem(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  827. {
  828. Location l = (Location) args[0];
  829. World w = l.getWorld();
  830. BlockPos pos = l.getBlockPos();
  831. ItemStack stack = ((ItemStack) args[1]).copy();
  832. int amount = stack.getCount();
  833. while(amount > stack.getMaxStackSize())
  834. {
  835. stack.setCount(stack.getMaxStackSize());
  836. amount -= stack.getMaxStackSize();
  837. ItemStackUtils.drop(w, pos, stack.copy());
  838. }
  839. if(amount > 0)
  840. {
  841. stack.setCount(amount);
  842. ItemStackUtils.drop(w, pos, stack);
  843. }
  844. }
  845. private static ItemStack giveItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
  846. {
  847. ItemStack stack = ((ItemStack) args[1]).copy();
  848. stack.setCount(InventoryUtils.addToInventory(((EntityPlayer) args[0]).inventory, stack));
  849. return stack;
  850. }
  851. private static void endPlayerScript(Object[] args, Script qd) throws NumberFormatException, UnsupportedOperationException
  852. {
  853. if(qd.getClass() == MinecraftScript.class)
  854. {
  855. throw new UnsupportedOperationException();
  856. }
  857. ((PlayerScript) qd).getPlayers().stream().forEach((p) ->
  858. {
  859. KajetansMod.scripts.send(p, "Du hast die Quest geschafft!");
  860. });
  861. KajetansMod.scripts.getSnuviParser().termSafe(qd);
  862. throw new HoldCodeException();
  863. }
  864. private static void setBlock(Object[] args, Script qd) throws IllegalStringLocationException, IllegalItemStackStringException
  865. {
  866. Location l = (Location) args[0];
  867. ItemStack stack = (ItemStack) args[1];
  868. l.getWorld().setBlockState(l.getBlockPos(), Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata()));
  869. qd.incLoopCounter();
  870. }
  871. private static void setBlockWithData(Object[] args, Script qd) throws IllegalStringLocationException
  872. {
  873. Location l = (Location) args[0];
  874. if(args.length >= 4)
  875. {
  876. NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), ScriptUtils.connect(args, 3));
  877. }
  878. else
  879. {
  880. NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), null);
  881. }
  882. qd.incLoopCounter();
  883. }
  884. private static void dropInventory(Object[] args)
  885. {
  886. ((EntityPlayer) args[0]).inventory.dropAllItems();
  887. }
  888. private static void playSound(Object[] args) throws IllegalStringLocationException
  889. {
  890. Location l = ((Location) args[0]);
  891. Vec3d v = l.getPos();
  892. EffectUtils.playSound((WorldServer) l.getWorld(), SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER, v.x, v.y, v.z);
  893. }
  894. private static void playSoundPlayer(Object[] args) throws IllegalStringLocationException
  895. {
  896. EffectUtils.playSound((EntityPlayerMP) args[0], SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER);
  897. }
  898. private static void playParticle(Object[] args) throws IllegalStringLocationException
  899. {
  900. Location l = ((Location) args[0]).copyAdd(0.5, 0.5, 0.5);
  901. EffectUtils.spawnParticle((WorldServer) l.getWorld(), EnumParticleTypes.getByName(args[1].toString()), l.getPos(), ScriptUtils.getInt(args[2]));
  902. }
  903. private static void setEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException, IllegalItemStackStringException
  904. {
  905. EntityLivingBase liv = (EntityLivingBase) args[0];
  906. ItemStack stack = ((ItemStack) args[2]).copy();
  907. switch(args[1].toString())
  908. {
  909. case "hand":
  910. liv.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, stack);
  911. return;
  912. case "head":
  913. liv.setItemStackToSlot(EntityEquipmentSlot.HEAD, stack);
  914. return;
  915. case "chest":
  916. liv.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack);
  917. return;
  918. case "legs":
  919. liv.setItemStackToSlot(EntityEquipmentSlot.LEGS, stack);
  920. return;
  921. case "feet":
  922. liv.setItemStackToSlot(EntityEquipmentSlot.FEET, stack);
  923. return;
  924. case "offhand":
  925. liv.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, stack);
  926. }
  927. }
  928. private static ItemStack getEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException
  929. {
  930. EntityLivingBase liv = (EntityLivingBase) args[0];
  931. switch(args[1].toString())
  932. {
  933. case "hand":
  934. return liv.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
  935. case "head":
  936. return liv.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
  937. case "chest":
  938. return liv.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
  939. case "legs":
  940. return liv.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
  941. case "feet":
  942. return liv.getItemStackFromSlot(EntityEquipmentSlot.FEET);
  943. case "offhand":
  944. return liv.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
  945. }
  946. return ItemStack.EMPTY;
  947. }
  948. private static void invClose(Object[] args)
  949. {
  950. EntityPlayer p = (EntityPlayer) args[0];
  951. if(p.openContainer instanceof CustomContainer)
  952. {
  953. ((CustomContainer) p.openContainer).closeSafe(p);
  954. }
  955. else
  956. {
  957. p.closeScreen();
  958. }
  959. }
  960. @SuppressWarnings("unchecked")
  961. private static void removeEntities(Object[] args) throws IllegalStringLocationException
  962. {
  963. Class<? extends Entity> c = (Class<? extends Entity>) getClass(args[0].toString());
  964. if(c == Entity.class || c == EntityVillager.class || c == EntityArmorStand.class || c == EntityItemFrame.class || c == EntityHanging.class)
  965. {
  966. return;
  967. }
  968. Location l = (Location) args[1];
  969. Utils.getNearbyEntities(l.getWorld(), l.getPos(), ScriptUtils.getDouble(args[2]), c).stream().forEach(ent ->
  970. {
  971. ent.setDead();
  972. });
  973. }
  974. private static void setSign(Object[] args) throws IllegalStringLocationException
  975. {
  976. Location l = (Location) args[0];
  977. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  978. SpecialBlockUtils.setSignLine(sign, ScriptUtils.getInt(args[1]), ScriptUtils.connect(args, 2));
  979. }
  980. @SuppressWarnings("")
  981. private static String getSign(Object[] args) throws IllegalStringLocationException
  982. {
  983. Location l = (Location) args[0];
  984. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  985. return sign.signText[ScriptUtils.getInt(args[1])].getUnformattedText();
  986. }
  987. private static boolean isSolid(Object[] args)
  988. {
  989. IBlockState state = getBlockState((Location) args[0]);
  990. return state.isFullBlock() && state.isOpaqueCube();
  991. }
  992. private static void spawnItemFrame(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  993. {
  994. Location l = ((Location) args[0]);
  995. EntityItemFrame frame = new EntityItemFrame(l.getWorld(), l.getBlockPos(), EnumFacing.byName(args[1].toString()));
  996. frame.setDisplayedItem(((ItemStack) args[2]).copy());
  997. }
  998. private static void nameEntity(Object[] args) throws EntityNotFoundException
  999. {
  1000. Entity ent = (Entity) args[0];
  1001. ent.setCustomNameTag(ScriptUtils.connect(args, 1));
  1002. if(args.length >= 3)
  1003. {
  1004. ent.setAlwaysRenderNameTag((boolean) args[2]);
  1005. return;
  1006. }
  1007. ent.setAlwaysRenderNameTag(true);
  1008. }
  1009. private static EntityPlayer getPlayerScriptLeader(Script qd) throws PlayerNotFoundException
  1010. {
  1011. if(qd.getClass() == PlayerScript.class)
  1012. {
  1013. return((PlayerScript) qd).getPlayers().get(0);
  1014. }
  1015. throw new UnsupportedOperationException();
  1016. }
  1017. private static void startPlayerScript(Object[] args, Script qd) throws PlayerNotFoundException
  1018. {
  1019. if(qd.getClass() == MinecraftScript.class)
  1020. {
  1021. EntityPlayer p = ((EntityPlayer) args[0]);
  1022. if(!KajetansMod.scripts.hasScript(p))
  1023. {
  1024. KajetansMod.scripts.startQuest(KajetansMod.server, args[1].toString(), p);
  1025. }
  1026. return;
  1027. }
  1028. throw new UnsupportedOperationException();
  1029. }
  1030. private static void addToScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
  1031. {
  1032. int id = ScriptUtils.getInt(args[1]);
  1033. String message = ScriptUtils.connect(args, 2);
  1034. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).addText(id, message));
  1035. }
  1036. private static void removeFromScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
  1037. {
  1038. int id = ScriptUtils.getInt(args[1]);
  1039. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).removeText(id));
  1040. }
  1041. private static void sendToActionBar(Object[] args, Script qd) throws PlayerNotFoundException
  1042. {
  1043. String text = ScriptUtils.connect(args, 1);
  1044. doForGroup(args[0], qd, p -> NmsUtilities.sendActionBar((EntityPlayerMP) p, text));
  1045. }
  1046. private static void kickPlayerFromQuest(Object[] args, Script qd) throws PlayerNotFoundException, UnsupportedOperationException
  1047. {
  1048. if(qd.getClass() == PlayerScript.class)
  1049. {
  1050. KajetansMod.scripts.removePlayerFromScript((EntityPlayer) args[0], (PlayerScript) qd);
  1051. return;
  1052. }
  1053. throw new UnsupportedOperationException();
  1054. }
  1055. private static void damageEntity(Object[] args)
  1056. {
  1057. if(args.length >= 4)
  1058. {
  1059. ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.causeMobDamage((EntityLivingBase) args[2]), ScriptUtils.getFloat(args[1]));
  1060. return;
  1061. }
  1062. ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.GENERIC, ScriptUtils.getFloat(args[1]));
  1063. }
  1064. private static boolean doesIntersect(Object[] args)
  1065. {
  1066. Location l1 = (Location) args[0];
  1067. Location l2 = (Location) args[1];
  1068. int x1 = (int) Math.min(l1.getX(), l2.getX());
  1069. int x2 = (int) Math.max(l1.getX(), l2.getX());
  1070. int y1 = (int) Math.min(l1.getY(), l2.getY());
  1071. int y2 = (int) Math.max(l1.getY(), l2.getY());
  1072. int z1 = (int) Math.min(l1.getZ(), l2.getZ());
  1073. int z2 = (int) Math.max(l1.getZ(), l2.getZ());
  1074. return KajetansMod.plots.getDataBank(ProtectionBank.class)
  1075. .isPlotOverlapping(x1, y1, z1, x2, y2, z2, l1.getWorld());
  1076. }
  1077. private static boolean isBetween(Object[] args)
  1078. {
  1079. Location l1 = ((Location) args[0]);
  1080. Location l2 = ((Location) args[1]);
  1081. Location l3 = ((Location) args[2]);
  1082. return l1.getX() >= Math.min(l2.getX(), l3.getX()) && l1.getX() <= Math.max(l2.getX(), l3.getX()) &&
  1083. l1.getY() >= Math.min(l2.getY(), l3.getY()) && l1.getY() <= Math.max(l2.getY(), l3.getY()) &&
  1084. l1.getZ() >= Math.min(l2.getZ(), l3.getZ()) && l1.getZ() <= Math.max(l2.getZ(), l3.getZ());
  1085. }
  1086. private static void addPlot(Object[] args)
  1087. {
  1088. Location l1 = (Location) args[0];
  1089. Location l2 = (Location) args[1];
  1090. BlockPos pos1 = l1.getBlockPos();
  1091. BlockPos pos2 = l2.getBlockPos();
  1092. KajetansMod.plots.getDataBank(ProtectionBank.class).addPlot(Math.min(pos1.getX(), pos2.getX()),
  1093. Math.min(pos1.getY(), pos2.getY()),
  1094. Math.min(pos1.getZ(), pos2.getZ()),
  1095. Math.max(pos1.getX(), pos2.getX()),
  1096. Math.max(pos1.getY(), pos2.getY()),
  1097. Math.max(pos1.getZ(), pos2.getZ()),
  1098. ModDimensions.getWorldName(l1.getWorld()), null, args[2].toString());
  1099. }
  1100. private static Entity getLastDamager(Object[] args)
  1101. {
  1102. DamageSource ds = ((EntityPlayer) args[0]).getLastDamageSource();
  1103. if(ds == null)
  1104. {
  1105. return null;
  1106. }
  1107. return ds.getImmediateSource();
  1108. }
  1109. @SuppressWarnings("")
  1110. private static SnuviInventory newInventory(Location l, MinecraftScript qd, String s)
  1111. {
  1112. TileEntityChest chest = (TileEntityChest) l.getWorld().getTileEntity(l.getBlockPos());
  1113. int size = chest.getSizeInventory();
  1114. if(size % 9 != 0)
  1115. {
  1116. size /= 9;
  1117. size++;
  1118. size *= 9;
  1119. }
  1120. SnuviInventory inv = new SnuviInventory(s, size, qd.getNewId());
  1121. for(int i = 0; i < chest.getSizeInventory(); i++)
  1122. {
  1123. inv.setInventorySlotContents(i, chest.getStackInSlot(i).copy());
  1124. }
  1125. return inv;
  1126. }
  1127. private static boolean onlyLetters(String s)
  1128. {
  1129. for(char c : s.toCharArray())
  1130. {
  1131. if(!Character.isLetter(c))
  1132. {
  1133. return false;
  1134. }
  1135. }
  1136. return true;
  1137. }
  1138. private static String getName(Object[] args)
  1139. {
  1140. Object o = args[0];
  1141. if(o instanceof EntityPlayer)
  1142. {
  1143. return ((EntityPlayer) o).getName();
  1144. }
  1145. return KajetansMod.playerbank.getDataBank().getName(o.toString());
  1146. }
  1147. private static String getUuid(Object[] args)
  1148. {
  1149. Object o = args[0];
  1150. if(o instanceof EntityPlayer)
  1151. {
  1152. return ((EntityPlayer) o).getUniqueID().toString();
  1153. }
  1154. return KajetansMod.playerbank.getDataBank().getUUID(o.toString());
  1155. }
  1156. private static Set<Fraction> getPlotIds(Object[] args)
  1157. {
  1158. return KajetansMod.plots.getDataBank(ProtectionBank.class).getRegionIds(
  1159. ((Location) args[1]).getWorld(),
  1160. ((Location) args[1]).getBlockPos()).stream()
  1161. .map(o -> new Fraction(Integer.parseInt(o.toString())))
  1162. .collect(Collectors.toSet());
  1163. }
  1164. @SuppressWarnings("")
  1165. private static String getPotionType(Object[] args)
  1166. {
  1167. return PotionUtils.getPotionFromItem(((EntityPotion) args[0]).getPotion()).getRegistryName().toString();
  1168. }
  1169. private static void setTag(Object[] args)
  1170. {
  1171. if(args[0] instanceof EntityPlayer)
  1172. {
  1173. KajetansMod.playerbank.getDataBank().setTag((EntityPlayer) args[0], args[1].toString(), ScriptUtils.getInt(args[2]));
  1174. return;
  1175. }
  1176. KajetansMod.playerbank.getDataBank().setTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString(), ScriptUtils.getInt(args[2]));
  1177. }
  1178. private static Fraction getTag(Object[] args)
  1179. {
  1180. if(args[0] instanceof EntityPlayer)
  1181. {
  1182. return new Fraction(KajetansMod.playerbank.getDataBank().getTag((EntityPlayer) args[0], args[1].toString()));
  1183. }
  1184. return new Fraction(KajetansMod.playerbank.getDataBank().getTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString()));
  1185. }
  1186. private static void setGlobalVar(Object[] args)
  1187. {
  1188. if(args[0] instanceof EntityPlayer)
  1189. {
  1190. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
  1191. return;
  1192. }
  1193. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
  1194. }
  1195. private static Object getGlobalVar(Object[] args)
  1196. {
  1197. if(args[0] instanceof EntityPlayer)
  1198. {
  1199. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
  1200. }
  1201. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
  1202. }
  1203. // -------------------------------------------------------------------------
  1204. // Potion
  1205. // -------------------------------------------------------------------------
  1206. private static void addEffect(Object[] args)
  1207. {
  1208. EntityLivingBase base = (EntityLivingBase) args[0];
  1209. Potion potion = Potion.getPotionFromResourceLocation(args[1].toString());
  1210. if(base == null) // doing this only to prevent EffectUtils.addPotionTo doing shit
  1211. {
  1212. throw new NullPointerException("null not allowed for entity");
  1213. }
  1214. else if(potion == null)
  1215. {
  1216. throw new NullPointerException("potion does not exist");
  1217. }
  1218. EffectUtils.addPotionTo(base, potion, ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3]));
  1219. }
  1220. // -------------------------------------------------------------------------
  1221. // Block
  1222. // -------------------------------------------------------------------------
  1223. private static Fraction getBlockData(Location l)
  1224. {
  1225. IBlockState state = l.getWorld().getBlockState(l.getBlockPos());
  1226. return new Fraction(state.getBlock().getMetaFromState(state));
  1227. }
  1228. private static IBlockState getBlockState(Location l)
  1229. {
  1230. return l.getWorld().getBlockState(l.getBlockPos());
  1231. }
  1232. private static ItemStack getStackFromBlock(Location l)
  1233. {
  1234. World w = l.getWorld();
  1235. BlockPos pos = l.getBlockPos();
  1236. IBlockState state = w.getBlockState(pos);
  1237. return state.getBlock().getItem(w, pos, state);
  1238. }
  1239. // -------------------------------------------------------------------------
  1240. // Custom-Handler
  1241. // -------------------------------------------------------------------------
  1242. /*private static void registerShapelessRecipe(Object[] args)
  1243. {
  1244. ItemStack[] stacks = new ItemStack[args.length - 1];
  1245. for(int i = 0; i < stacks.length; i++)
  1246. {
  1247. stacks[i] = (ItemStack) args[i + 1];
  1248. }
  1249. RecipeUtils.registerShapelessRecipe((ItemStack) args[0], stacks);
  1250. }
  1251. private static void registerShapedRecipe(Object[] args)
  1252. {
  1253. int counter = 0;
  1254. while(args[counter + 1].getClass() == String.class)
  1255. {
  1256. counter++;
  1257. }
  1258. String[] s = new String[counter];
  1259. for(int i = 0; i < s.length; i++)
  1260. {
  1261. s[i] = args[i + 1].toString();
  1262. }
  1263. ItemStack[] stacks = new ItemStack[args.length - 1 - s.length];
  1264. for(int i = 0; i < stacks.length; i++)
  1265. {
  1266. stacks[i] = (ItemStack) args[i + 1 + counter];
  1267. }
  1268. RecipeUtils.registerShapedRecipe((ItemStack) args[0], s, stacks);
  1269. }*/
  1270. // -------------------------------------------------------------------------
  1271. // Gruppen-Handler
  1272. // -------------------------------------------------------------------------
  1273. private static void doForGroup(Object group, Script qd, Consumer<ICommandSender> c) throws UnsupportedOperationException, PlayerNotFoundException
  1274. {
  1275. if(group instanceof String)
  1276. {
  1277. switch(group.toString())
  1278. {
  1279. case "all":
  1280. if(qd.getClass() == MinecraftScript.class)
  1281. {
  1282. throw new UnsupportedOperationException();
  1283. }
  1284. ((PlayerScript) qd).getPlayers().forEach(p -> c.accept(p));
  1285. break;
  1286. case "online":
  1287. KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));
  1288. break;
  1289. case "dev":
  1290. if(qd != null && qd.getClass() == PlayerScript.class)
  1291. {
  1292. ((PlayerScript) qd).getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
  1293. return;
  1294. }
  1295. KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
  1296. break;
  1297. case "server":
  1298. c.accept(KajetansMod.server);
  1299. break;
  1300. default:
  1301. c.accept(Utils.getPlayerByName(group.toString()));
  1302. break;
  1303. }
  1304. return;
  1305. }
  1306. c.accept((EntityPlayer) group);
  1307. }
  1308. private static void sendMessageToGroup(Object group, Script sc, String message)
  1309. {
  1310. TextComponentString comp = new TextComponentString(message);
  1311. doForGroup(group, sc, p ->
  1312. {
  1313. p.sendMessage(comp);
  1314. });
  1315. }
  1316. public static void sendMessageWithSuffix(Script sc, String message)
  1317. {
  1318. Module m = KajetansMod.scripts;
  1319. doForGroup("all", sc, p -> m.send(p, message));
  1320. }
  1321. private static void sendToDevsWithSuffix(String message)
  1322. {
  1323. Module m = KajetansMod.scripts;
  1324. doForGroup("dev", null, p -> m.send(p, message));
  1325. }
  1326. public static void sendWarningToAllDevs(String message)
  1327. {
  1328. Module m = KajetansMod.scripts;
  1329. String warnMessage = "§4" + message;
  1330. doForGroup("dev", null, p -> m.send(p, warnMessage));
  1331. }
  1332. private static void sendToDevsWithList(String message)
  1333. {
  1334. Module m = KajetansMod.scripts;
  1335. doForGroup("dev", null, p -> m.sendListElement(p, message));
  1336. }
  1337. private static void sendToDevsWithHelpList(String message, String message2)
  1338. {
  1339. Module m = KajetansMod.scripts;
  1340. doForGroup("dev", null, p -> m.sendHelpListElement(p, message, message2));
  1341. }
  1342. }