SnuviParser.java 91 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910
  1. package me.km.snuviscript;
  2. import com.google.common.collect.HashBiMap;
  3. import me.km.KajetansMod;
  4. import me.km.afk.AfkListener;
  5. import me.km.api.Module;
  6. import me.km.api.Utils;
  7. import me.km.environment.EnvironmentAPI;
  8. import me.km.exception.CodeTooLongException;
  9. import me.km.exception.EntityNotFoundException;
  10. import me.km.exception.GotoLabelNotFoundException;
  11. import me.km.exception.HoldCodeException;
  12. import me.km.exception.IfWithoutStatementException;
  13. import me.km.exception.IllegalItemStackStringException;
  14. import me.km.exception.IllegalStringException;
  15. import me.km.exception.IllegalStringLocationException;
  16. import me.km.exception.NoChildTreeException;
  17. import me.km.exception.PlayerNotFoundException;
  18. import me.km.nms.NmsUtilities;
  19. import me.km.plots.ProtectionBank;
  20. import me.km.table.TableAPI;
  21. import java.math.BigDecimal;
  22. import java.math.RoundingMode;
  23. import java.time.ZonedDateTime;
  24. import java.util.ArrayList;
  25. import java.util.Arrays;
  26. import java.util.Calendar;
  27. import java.util.Collections;
  28. import java.util.GregorianCalendar;
  29. import java.util.HashMap;
  30. import java.util.HashSet;
  31. import java.util.List;
  32. import java.util.Map;
  33. import java.util.UUID;
  34. import java.util.function.BiFunction;
  35. import java.util.function.Consumer;
  36. import java.util.function.Function;
  37. import java.util.function.BiConsumer;
  38. import java.util.stream.Collectors;
  39. import me.km.api.Location;
  40. import me.km.api.TitleAPI;
  41. import me.km.dimensions.ModDimensions;
  42. import me.km.effects.EffectUtils;
  43. import me.km.inventory.InventoryUtils;
  44. import me.km.permissions.Permissions;
  45. import me.km.table.Table;
  46. import me.km.utils.ItemStackUtils;
  47. import me.km.utils.RecipeUtils;
  48. import me.km.utils.ReflectionUtils;
  49. import me.km.utils.SpecialBlockUtils;
  50. import net.minecraft.block.Block;
  51. import net.minecraft.block.state.IBlockState;
  52. import net.minecraft.command.ICommandSender;
  53. import net.minecraft.enchantment.Enchantment;
  54. import net.minecraft.enchantment.EnchantmentHelper;
  55. import net.minecraft.entity.Entity;
  56. import net.minecraft.entity.EntityHanging;
  57. import net.minecraft.entity.EntityLiving;
  58. import net.minecraft.entity.EntityLivingBase;
  59. import net.minecraft.entity.item.EntityArmorStand;
  60. import net.minecraft.entity.item.EntityItemFrame;
  61. import net.minecraft.entity.monster.EntityCreeper;
  62. import net.minecraft.entity.passive.EntityVillager;
  63. import net.minecraft.entity.player.EntityPlayer;
  64. import net.minecraft.entity.player.EntityPlayerMP;
  65. import net.minecraft.entity.projectile.EntityPotion;
  66. import net.minecraft.inventory.EntityEquipmentSlot;
  67. import net.minecraft.inventory.IInventory;
  68. import net.minecraft.item.ItemStack;
  69. import net.minecraft.network.play.client.CPacketChatMessage;
  70. import net.minecraft.network.play.client.CPacketClientStatus;
  71. import net.minecraft.network.play.server.SPacketSpawnPosition;
  72. import net.minecraft.potion.Potion;
  73. import net.minecraft.potion.PotionUtils;
  74. import net.minecraft.tileentity.TileEntity;
  75. import net.minecraft.tileentity.TileEntityChest;
  76. import net.minecraft.tileentity.TileEntitySign;
  77. import net.minecraft.util.DamageSource;
  78. import net.minecraft.util.EnumFacing;
  79. import net.minecraft.util.EnumParticleTypes;
  80. import net.minecraft.util.ResourceLocation;
  81. import net.minecraft.util.SoundCategory;
  82. import net.minecraft.util.SoundEvent;
  83. import net.minecraft.util.math.BlockPos;
  84. import net.minecraft.util.math.Vec3d;
  85. import net.minecraft.util.text.TextComponentString;
  86. import net.minecraft.world.World;
  87. import net.minecraft.world.WorldServer;
  88. public class SnuviParser
  89. {
  90. private final BiFunction<Object[], Script, Object>[] methods;
  91. private final HashBiMap<String, Integer> translator;
  92. public Integer translateMethod(String s)
  93. {
  94. return translator.get(s);
  95. }
  96. private void registerFunction(List<BiFunction<Object[], Script, Object>> list, String s, BiFunction<Object[], Script, Object> f)
  97. {
  98. translator.put(s, list.size());
  99. list.add(f);
  100. }
  101. private void registerConsumer(List<BiFunction<Object[], Script, Object>> list, String s, BiConsumer<Object[], Script> f)
  102. {
  103. translator.put(s, list.size());
  104. list.add((BiFunction<Object[], Script, Object>) (args, qd) ->
  105. {
  106. f.accept(args, qd);
  107. return 0;
  108. });
  109. }
  110. private void registerAlias(List<BiFunction<Object[], Script, Object>> list, String s, String original)
  111. {
  112. registerFunction(list, s, list.get(translator.get(original)));
  113. }
  114. @SuppressWarnings("unchecked")
  115. public SnuviParser()
  116. {
  117. ArrayList<BiFunction<Object[], Script, Object>> list = new ArrayList<>();
  118. translator = HashBiMap.create(300);
  119. registerFunction(list, "nothing", (args, qd) ->
  120. 0);
  121. registerConsumer(list, "godeeper", (args, qd) ->
  122. qd.goDeeper(false));
  123. registerConsumer(list, "benchmark", (args, qd) ->
  124. qd.printBenchmarks((ICommandSender) args[0]));
  125. registerConsumer(list, "togglebenchmark", (args, qd) ->
  126. qd.toggleBenchmark());
  127. registerConsumer(list, "clearbenchmark", (args, qd) ->
  128. qd.clearBenchmark());
  129. // -------------------------------------------------------------
  130. // Command-Bibliothek
  131. // -------------------------------------------------------------
  132. registerConsumer(list, "command.add", (args, qd) ->
  133. KajetansMod.scripts.registerScriptCommand(args[0].toString()));
  134. registerConsumer(list, "command.remove", (args, qd) ->
  135. KajetansMod.scripts.unregisterScriptCommand(args[0].toString()));
  136. registerFunction(list, "command.exists", (args, qd) ->
  137. KajetansMod.scripts.isRegisteredScriptCommand(args[0].toString()));
  138. registerConsumer(list, "command.clear", (args, qd) ->
  139. KajetansMod.scripts.clearScriptCommands());
  140. // -------------------------------------------------------------
  141. // Permission-Bibliothek
  142. // -------------------------------------------------------------
  143. registerConsumer(list, "perm.clear", (args, qd) ->
  144. KajetansMod.perms.clear());
  145. registerConsumer(list, "perm.registergroup", (args, qd) ->
  146. KajetansMod.perms.registerGroupPermission(ScriptUtils.getInt(args[0]), args[1].toString()));
  147. registerConsumer(list, "perm.registerplayer", (args, qd) ->
  148. KajetansMod.perms.registerPlayerGroup(UUID.fromString(args[0].toString()), ScriptUtils.getInt(args[1])));
  149. // -------------------------------------------------------------
  150. // Title-Bibliothek
  151. // -------------------------------------------------------------
  152. registerConsumer(list, "title.settime", (args, qd) ->
  153. TitleAPI.setTitleTime((EntityPlayerMP) args[0], ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
  154. registerConsumer(list, "title.clear", (args, qd) ->
  155. TitleAPI.clearTitle((EntityPlayerMP) args[0]));
  156. registerConsumer(list, "title.reset", (args, qd) ->
  157. TitleAPI.resetTitle((EntityPlayerMP) args[0]));
  158. registerConsumer(list, "title.send", (args, qd) ->
  159. TitleAPI.setTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
  160. registerConsumer(list, "title.setsub", (args, qd) ->
  161. TitleAPI.setSubTitle((EntityPlayerMP) args[0], ScriptUtils.connect(args, 1)));
  162. // -------------------------------------------------------------
  163. // Villager-Bibliothek
  164. // -------------------------------------------------------------
  165. registerConsumer(list, "villager.showtrades", (args, qd) ->
  166. ((EntityPlayer) args[0]).displayVillagerTradeGui(((EntityVillager) args[1])));
  167. // -------------------------------------------------------------
  168. // Player-Bibliothek
  169. // -------------------------------------------------------------
  170. registerFunction(list, "player.getitemamount", (args, qd) ->
  171. InventoryUtils.searchInventoryFor(((EntityPlayer) args[0]).inventory, (ItemStack) args[2], (boolean) args[1]));
  172. registerFunction(list, "player.removeitem", (args, qd) ->
  173. removeItem(args));
  174. registerFunction(list, "player.giveitem", (args, qd) ->
  175. giveItem(args));
  176. registerConsumer(list, "player.shootprojectile", (args, qd) ->
  177. EffectUtils.launchProjectile((EntityPlayer) args[0], getClass(args[1].toString()), ScriptUtils.getDouble(args[2]), args[3]));
  178. registerConsumer(list, "player.respawn", (args, qd) ->
  179. ((EntityPlayerMP) args[0]).connection.processClientStatus(new CPacketClientStatus(CPacketClientStatus.State.PERFORM_RESPAWN)));
  180. registerConsumer(list, "player.inventorytolist", (args, qd) ->
  181. qd.setVar(args[0], ((EntityPlayer) args[1]).inventory.mainInventory));
  182. registerFunction(list, "player.getamount", (args, qd) ->
  183. KajetansMod.server.getCurrentPlayerCount());
  184. registerFunction(list, "player.getnearest", (args, qd) ->
  185. Utils.getNearestPlayer(((Location) args[0]).getWorld(), ((Location) args[0]).getPos()));
  186. registerConsumer(list, "player.say", (args, qd) ->
  187. ((EntityPlayerMP) args[0]).connection.processChatMessage(new CPacketChatMessage(ScriptUtils.connect(args, 1))));
  188. registerFunction(list, "player.isafk", (args, qd) ->
  189. KajetansMod.afkManager.getEvent(AfkListener.class).isAfk(((EntityPlayer) args[0])));
  190. registerConsumer(list, "player.speak", (args, qd) ->
  191. sendMessageToGroup(args[0], qd, "§7[§r" + args[1] + "§7] " + ScriptUtils.connect(args, 2)));
  192. registerFunction(list, "player.getquestleader", (args, qd) ->
  193. getQuestLeader(qd));
  194. registerConsumer(list, "player.setcompass", (args, qd) ->
  195. ((EntityPlayerMP) args[0]).connection.sendPacket(new SPacketSpawnPosition(((Location) args[1]).getBlockPos())));
  196. registerFunction(list, "player.gethunger", (args, qd) ->
  197. ((EntityPlayer) args[0]).getFoodStats().getFoodLevel());
  198. registerConsumer(list, "player.sethunger", (args, qd) ->
  199. ((EntityPlayer) args[0]).getFoodStats().setFoodLevel(ScriptUtils.getInt(args[1])));
  200. registerFunction(list, "player.getsaturation", (args, qd) ->
  201. ReflectionUtils.getSaturation(((EntityPlayer) args[0]).getFoodStats()));
  202. registerConsumer(list, "player.setsaturation", (args, qd) ->
  203. ReflectionUtils.setSaturation(((EntityPlayer) args[0]).getFoodStats(), ScriptUtils.getFloat(args[1])));
  204. registerFunction(list, "player.getname", (args, qd) ->
  205. getName(args));
  206. registerFunction(list, "player.getfullname", (args, qd) ->
  207. KajetansMod.chatManager.getFullName((EntityPlayer) args[0]));
  208. registerFunction(list, "player.getuuid", (args, qd) ->
  209. getUuid(args));
  210. registerFunction(list, "player.getip", (args, qd) ->
  211. ((EntityPlayerMP) args[0]).connection.netManager.getRemoteAddress().toString());
  212. registerFunction(list, "player.iscreative", (args, qd) ->
  213. ((EntityPlayer) args[0]).isCreative());
  214. registerFunction(list, "player.isspectator", (args, qd) ->
  215. ((EntityPlayer) args[0]).isSpectator());
  216. registerFunction(list, "player.issurvival", (args, qd) ->
  217. !((EntityPlayer) args[0]).isCreative() && !((EntityPlayer) args[0]).isSpectator());
  218. registerFunction(list, "player.isadventure", (args, qd) ->
  219. !((EntityPlayer) args[0]).capabilities.allowEdit);
  220. registerFunction(list, "player.hasfly", (args, qd) ->
  221. ((EntityPlayer) args[0]).capabilities.allowFlying);
  222. registerFunction(list, "player.getlastdamager", (args, qd) ->
  223. getLastDamager(args));
  224. registerConsumer(list, "player.settag", (args, qd) ->
  225. setTag(args));
  226. registerFunction(list, "player.gettag", (args, qd) ->
  227. getTag(args));
  228. registerConsumer(list, "player.dropinventory", (args, qd) ->
  229. dropInventory(args));
  230. registerFunction(list, "player.gettarget", (args, qd) ->
  231. Utils.getPlayerTarget((EntityPlayer) args[0], ScriptUtils.getInt(args[1])));
  232. registerFunction(list, "player.hasquest", (args, qd) ->
  233. KajetansMod.scripts.hasQuest((EntityPlayer) args[0]));
  234. registerConsumer(list, "player.action", (args, qd) ->
  235. sendToActionBar(args, qd));
  236. registerConsumer(list, "player.kick", (args, qd) ->
  237. kickPlayerFromQuest(args, qd));
  238. registerConsumer(list, "player.playsound", (args, qd) ->
  239. playSoundPlayer(args));
  240. registerFunction(list, "player.getbedspawn", (args, qd) ->
  241. ((EntityPlayer) args[0]).getBedLocation(ScriptUtils.getInt(args[1])));
  242. registerConsumer(list, "player.setbedspawn", (args, qd) ->
  243. ((EntityPlayer) args[0]).bedLocation = ((Location) args[1]).getBlockPos());
  244. registerConsumer(list, "player.damageitem", (args, qd) ->
  245. ((EntityPlayer) args[0]).getHeldItemMainhand().damageItem(ScriptUtils.getInt(args[1]), (EntityPlayer) args[0]));
  246. // -------------------------------------------------------------
  247. // Players-Bibliothek
  248. // -------------------------------------------------------------
  249. registerConsumer(list, "players.tolist", (args, qd) ->
  250. qd.setVar(args[0].toString(), Arrays.asList(KajetansMod.server.getOnlinePlayerNames())));
  251. registerConsumer(list, "players.toworldlist", (args, qd) ->
  252. qd.setVar(args[0].toString(), new ArrayList(ModDimensions.getWorldFromName(args[1].toString()).playerEntities)));
  253. registerConsumer(list, "players.near", (args, qd) ->
  254. qd.setVar(args[0].toString(), Utils.getNearbyEntities(((Location) args[1]).getWorld(), ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2]), EntityPlayer.class).stream().map(p -> p.getName()).collect(Collectors.toList())));
  255. // -------------------------------------------------------------
  256. // Rank-Bibliothek
  257. // -------------------------------------------------------------
  258. registerConsumer(list, "rank.get", (args, qd) ->
  259. qd.setVar(args[0], KajetansMod.chatManager.getRanks((EntityPlayer) args[1])));
  260. registerConsumer(list, "rank.register", (args, qd) ->
  261. KajetansMod.chatManager.registerRank(args[0].toString(), ScriptUtils.getInt(args[1]), args[2].toString()));
  262. registerConsumer(list, "rank.player", (args, qd) ->
  263. KajetansMod.chatManager.registerPlayerRank(UUID.fromString(args[0].toString()), args[1].toString()));
  264. registerConsumer(list, "rank.clear", (args, qd) ->
  265. KajetansMod.chatManager.clearRanks());
  266. // -------------------------------------------------------------
  267. // Custom-Bibliothek
  268. // -------------------------------------------------------------
  269. registerConsumer(list, "custom.registershapelessrecipe", (args, qd) ->
  270. registerShapelessRecipe(args));
  271. registerConsumer(list, "custom.registershapedrecipe", (args, qd) ->
  272. registerShapedRecipe(args));
  273. registerConsumer(list, "custom.registerfurnacerecipe", (args, qd) ->
  274. RecipeUtils.registerFurnaceRecipe((ItemStack) args[0], (ItemStack) args[1]));
  275. registerConsumer(list, "custom.clearrecipes", (args, qd) ->
  276. RecipeUtils.clearRecipes());
  277. // -------------------------------------------------------------
  278. // World-Bibliothek
  279. // -------------------------------------------------------------
  280. registerAlias(list, "world.getplayers", "players.toworldlist");
  281. registerConsumer(list, "world.setskills", (args, qd) ->
  282. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).skills = (boolean) args[1]);
  283. registerConsumer(list, "world.setblockprotections", (args, qd) ->
  284. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).blockProtection = (boolean) args[1]);
  285. registerConsumer(list, "world.setdefaultenchanting", (args, qd) ->
  286. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultEnchanting = (boolean) args[1]);
  287. registerConsumer(list, "world.setpvpprotection", (args, qd) ->
  288. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).pvpProtection = (boolean) args[1]);
  289. registerConsumer(list, "world.setstatuseffects", (args, qd) ->
  290. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).statusEffects = (boolean) args[1]);
  291. registerConsumer(list, "world.setmanabar", (args, qd) ->
  292. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).manabar = (boolean) args[1]);
  293. registerConsumer(list, "world.setscrolls", (args, qd) ->
  294. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).scrolls = (boolean) args[1]);
  295. registerConsumer(list, "world.setdefaultproducing", (args, qd) ->
  296. KajetansMod.worldManager.getWorldPreferences(ModDimensions.getWorldFromName(args[0].toString())).defaultProducing = (boolean) args[1]);
  297. // -------------------------------------------------------------
  298. // Item-Bibliothek
  299. // -------------------------------------------------------------
  300. registerConsumer(list, "item.drop", (args, qd) ->
  301. dropItem(args));
  302. registerFunction(list, "item.gettype", (args, qd) ->
  303. ((ItemStack) args[0]).getItem().getRegistryName());
  304. registerFunction(list, "item.getdata", (args, qd) ->
  305. ((ItemStack) args[0]).getMetadata());
  306. registerConsumer(list, "item.setdata", (args, qd) ->
  307. ((ItemStack) args[0]).setItemDamage(ScriptUtils.getInt(args[1])));
  308. registerFunction(list, "item.getamount", (args, qd) ->
  309. ((ItemStack) args[0]).getCount());
  310. registerConsumer(list, "item.setamount", (args, qd) ->
  311. ((ItemStack) args[0]).setCount(ScriptUtils.getInt(args[1])));
  312. registerFunction(list, "item.getname", (args, qd) ->
  313. ((ItemStack) args[0]).getDisplayName());
  314. registerConsumer(list, "item.setname", (args, qd) ->
  315. ((ItemStack) args[0]).setStackDisplayName(ScriptUtils.connect(args, 1)));
  316. registerConsumer(list, "item.getlore", (args, qd) ->
  317. qd.setVar(args[0], ItemStackUtils.getLore((ItemStack) args[1])));
  318. registerConsumer(list, "item.setlore", (args, qd) ->
  319. ItemStackUtils.setLore((ItemStack) args[0], (List<String>) args[1]));
  320. registerConsumer(list, "item.addlore", (args, qd) ->
  321. ItemStackUtils.addLore((ItemStack) args[0], ScriptUtils.connect(args, 2), ScriptUtils.getInt(args[1])));
  322. registerFunction(list, "item.getenchantlevel", (args, qd) ->
  323. EnchantmentHelper.getEnchantmentLevel(Enchantment.getEnchantmentByLocation(args[1].toString()), (ItemStack) args[0]));
  324. registerConsumer(list, "item.setcooldown", (args, qd) ->
  325. ((EntityPlayer) args[0]).getCooldownTracker().setCooldown(((ItemStack) args[1]).getItem(), ScriptUtils.getInt(args[2])));
  326. registerFunction(list, "item.gettooltype", (args, qd) ->
  327. Utils.getToolType((ItemStack) args[0]));
  328. // -------------------------------------------------------------
  329. // Location-Bibliothek
  330. // -------------------------------------------------------------
  331. registerFunction(list, "loc.distance", (args, qd) ->
  332. ((Location) args[0]).getPos().distanceTo(((Location) args[1]).getPos()));
  333. registerFunction(list, "loc.mod", (args, qd) ->
  334. ((Location) args[0]).add(ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
  335. registerFunction(list, "loc.getcoord", (args, qd) ->
  336. getCoordOfLocation(args));
  337. registerFunction(list, "loc.gettime", (args, qd) ->
  338. ((Long) ((Location) args[0]).getWorld().getWorldTime()).intValue());
  339. registerFunction(list, "loc.hasstorm", (args, qd) ->
  340. ((Location) args[0]).getWorld().isRaining());
  341. registerFunction(list, "loc.isbetween", (args, qd) ->
  342. isBetween(args));
  343. // -------------------------------------------------------------
  344. // Block-Bibliothek
  345. // -------------------------------------------------------------
  346. registerFunction(list, "block.gettype", (args, qd) ->
  347. ((Location) args[0]).getWorld().getBlockState(((Location) args[0]).getBlockPos()).getBlock().getRegistryName());
  348. registerFunction(list, "block.getdata", (args, qd) ->
  349. getBlockData((Location) args[0]));
  350. registerConsumer(list, "block.clone", (args, qd) ->
  351. cloneBlock(args));
  352. registerConsumer(list, "block.set", (args, qd) ->
  353. setBlock(args, qd));
  354. registerConsumer(list, "block.set2", (args, qd) ->
  355. setBlockWithData(args, qd));
  356. registerConsumer(list, "block.setsign", (args, qd) ->
  357. setSign(args));
  358. registerFunction(list, "block.getsign", (args, qd) ->
  359. getSign(args));
  360. registerFunction(list, "block.issolid", (args, qd) ->
  361. getBlockState((Location) args[0]).isFullCube());
  362. registerFunction(list, "block.tostack", (args, qd) ->
  363. getStackFromBlock((Location) args[0]));
  364. registerFunction(list, "block.getitemamount", (args, qd) ->
  365. getItemAmountChest(args));
  366. registerFunction(list, "block.additem", (args, qd) ->
  367. addItemAmountChest(args));
  368. registerFunction(list, "block.subitem", (args, qd) ->
  369. removeItemAmountChest(args));
  370. // -------------------------------------------------------------
  371. // Event-Bibliothek
  372. // -------------------------------------------------------------
  373. registerConsumer(list, "event.addloc", (args, qd) ->
  374. qd.addLocation(ScriptUtils.roundLocation((Location) args[0])));
  375. registerConsumer(list, "event.removeloc", (args, qd) ->
  376. qd.removeLocation(ScriptUtils.roundLocation((Location) args[0])));
  377. registerConsumer(list, "event.clearlocs", (args, qd) ->
  378. qd.clearLocations());
  379. registerConsumer(list, "event.load", (args, qd) ->
  380. qd.loadEvent(args[0].toString()));
  381. registerConsumer(list, "event.unload", (args, qd) ->
  382. qd.unloadEvent(args[0].toString()));
  383. // -------------------------------------------------------------
  384. // Skill-Bibliothek
  385. // -------------------------------------------------------------
  386. registerConsumer(list, "skill.register", (args, qd) ->
  387. KajetansMod.skills.registerSkill(ScriptUtils.getInt(args[0]), (ItemStack) args[1], me.km.effects.Effect.valueOf(args[2].toString()), args[3].toString(), args[4].toString()));
  388. registerConsumer(list, "skill.clear", (args, qd) ->
  389. KajetansMod.skills.clearSkills());
  390. // -------------------------------------------------------------
  391. // Job-Bibliothek
  392. // -------------------------------------------------------------
  393. registerFunction(list, "job.getlevel", (args, qd) ->
  394. KajetansMod.jobs.getLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
  395. registerConsumer(list, "job.addlevel", (args, qd) ->
  396. KajetansMod.jobs.addLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  397. registerConsumer(list, "job.setlevel", (args, qd) ->
  398. KajetansMod.jobs.setLevel((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  399. registerFunction(list, "job.getxp", (args, qd) ->
  400. KajetansMod.jobs.getXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
  401. registerConsumer(list, "job.addxp", (args, qd) ->
  402. KajetansMod.jobs.addXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  403. registerConsumer(list, "job.setxp", (args, qd) ->
  404. KajetansMod.jobs.setXP((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), ScriptUtils.getByte(args[2])));
  405. registerConsumer(list, "job.registerjob", (args, qd) ->
  406. KajetansMod.jobs.registerJob(ScriptUtils.getByte(args[0]), ScriptUtils.connect(args, 1)));
  407. registerConsumer(list, "job.registerrecipe", (args, qd) ->
  408. KajetansMod.jobs.registerRecipe(ScriptUtils.getByte(args[0]), ScriptUtils.getItem(args[1].toString()), ScriptUtils.getByte(args[2])));
  409. registerConsumer(list, "job.registermaterial", (args, qd) ->
  410. KajetansMod.jobs.registerPreferedBlock(ScriptUtils.getByte(args[0]), Block.getBlockFromName(args[1].toString())));
  411. registerConsumer(list, "job.registerskill", (args, qd) ->
  412. KajetansMod.jobs.registerSkill(ScriptUtils.getByte(args[0]), KajetansMod.skills.getSkill(ScriptUtils.getInt(args[1])), ScriptUtils.getByte(args[2]), ScriptUtils.getByte(args[3])));
  413. registerFunction(list, "job.getamount", (args, qd) ->
  414. KajetansMod.jobs.getNumberOfJobs());
  415. registerFunction(list, "job.getname", (args, qd) ->
  416. KajetansMod.jobs.getJobName(ScriptUtils.getByte(args[0])));
  417. registerFunction(list, "job.geteffectlevel", (args, qd) ->
  418. EffectUtils.getEffectLevel((EntityPlayer) args[0], me.km.effects.Effect.valueOf(args[1].toString())));
  419. registerFunction(list, "job.hasjob", (args, qd) ->
  420. KajetansMod.jobs.hasJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1])));
  421. registerFunction(list, "job.hasrecipe", (args, qd) ->
  422. KajetansMod.jobs.hasRecipe((EntityPlayer) args[0], ScriptUtils.getItem(args[1].toString())));
  423. registerConsumer(list, "job.getjobs", (args, qd) ->
  424. qd.setVar(args[0], KajetansMod.jobs.getJobs((EntityPlayer) args[1])));
  425. registerFunction(list, "job.isregmaterial", (args, qd) ->
  426. KajetansMod.jobs.isPreferedMaterial((EntityPlayer) args[0],Block.getBlockFromName(args[1].toString())));
  427. registerConsumer(list, "job.setjob", (args, qd) ->
  428. KajetansMod.jobs.setJob((EntityPlayer) args[0], ScriptUtils.getByte(args[1]), (boolean) args[2]));
  429. registerConsumer(list, "job.reset", (args, qd) ->
  430. KajetansMod.jobs.resetAll());
  431. // -------------------------------------------------------------
  432. // Bit-Bibliothek
  433. // -------------------------------------------------------------
  434. registerFunction(list, "bit.rightshift", (args, qd) ->
  435. ScriptUtils.getInt(args[0]) >> ScriptUtils.getInt(args[1]));
  436. registerFunction(list, "bit.leftshift", (args, qd) ->
  437. ScriptUtils.getInt(args[0]) << ScriptUtils.getInt(args[1]));
  438. registerFunction(list, "bit.and", (args, qd) ->
  439. ScriptUtils.getInt(args[0]) & ScriptUtils.getInt(args[1]));
  440. registerFunction(list, "bit.or", (args, qd) ->
  441. ScriptUtils.getInt(args[0]) | ScriptUtils.getInt(args[1]));
  442. registerFunction(list, "bit.xor", (args, qd) ->
  443. ScriptUtils.getInt(args[0]) ^ ScriptUtils.getInt(args[1]));
  444. registerFunction(list, "bit.invert", (args, qd) ->
  445. ~ScriptUtils.getInt(args[0]));
  446. registerFunction(list, "bit.set", (args, qd) ->
  447. ScriptUtils.getInt(args[0]) | (1 << ScriptUtils.getInt(args[1])));
  448. registerFunction(list, "bit.get", (args, qd) ->
  449. (ScriptUtils.getInt(args[0]) & (1 << ScriptUtils.getInt(args[1]))) != 0);
  450. // -------------------------------------------------------------
  451. // Mathe-Bibliothek
  452. // -------------------------------------------------------------
  453. registerFunction(list, "math.mod", (args, qd) ->
  454. numberHandler(args[0], args[1], (a, b) -> a % b, (a, b) -> a % b, (a, b) -> a % b));
  455. registerFunction(list, "math.abs", (args, qd) ->
  456. numberHandler(args[0], (a) -> Math.abs(a), (a) -> Math.abs(a), (a) -> Math.abs(a)));
  457. registerFunction(list, "math.pow", (args, qd) ->
  458. Math.pow(ScriptUtils.getDouble(args[0]), ScriptUtils.getDouble(args[1])));
  459. registerFunction(list, "math.root", (args, qd) ->
  460. Math.pow(ScriptUtils.getDouble(args[0]), 1d / ScriptUtils.getDouble(args[1])));
  461. registerFunction(list, "math.sin", (args, qd) ->
  462. Math.sin(ScriptUtils.getDouble(args[0])));
  463. registerFunction(list, "math.cos", (args, qd) ->
  464. Math.cos(ScriptUtils.getDouble(args[0])));
  465. registerFunction(list, "math.e", (args, qd) ->
  466. Math.E);
  467. registerFunction(list, "math.pi", (args, qd) ->
  468. Math.PI);
  469. registerFunction(list, "math.ln", (args, qd) ->
  470. Math.log(ScriptUtils.getDouble(args[0])));
  471. registerFunction(list, "math.log", (args, qd) ->
  472. Math.log10(ScriptUtils.getDouble(args[0])));
  473. registerFunction(list, "math.random", (args, qd) ->
  474. Utils.randomInt(ScriptUtils.getInt(args[0]), ScriptUtils.getInt(args[1])));
  475. registerFunction(list, "math.round", (args, qd) ->
  476. round(args[0]));
  477. registerFunction(list, "math.rounddown", (args, qd) ->
  478. roundDown(args[0]));
  479. registerFunction(list, "math.roundup", (args, qd) ->
  480. roundUp(args[0]));
  481. registerFunction(list, "math.roundcomma", (args, qd) ->
  482. new BigDecimal(ScriptUtils.getDouble(args[0])).setScale(ScriptUtils.getInt(args[1]), RoundingMode.HALF_UP).doubleValue());
  483. // -------------------------------------------------------------
  484. // Entity - Befehle
  485. // -------------------------------------------------------------
  486. registerFunction(list, "entity.getlocation", (args, qd) ->
  487. new Location(((Entity) args[0])));
  488. registerConsumer(list, "entity.damage", (args, qd) ->
  489. damageEntity(args));
  490. registerFunction(list, "entity.gethealth", (args, qd) ->
  491. ((EntityLivingBase) args[0]).getHealth());
  492. registerConsumer(list, "entity.sethealth", (args, qd) ->
  493. ((EntityLivingBase) args[0]).setHealth(ScriptUtils.getFloat(args[1])));
  494. registerConsumer(list, "entity.setname", (args, qd) ->
  495. nameEntity(args));
  496. registerConsumer(list, "entity.throw", (args, qd) ->
  497. Utils.setVelocity((Entity) args[0], ScriptUtils.getDouble(args[1]), ScriptUtils.getDouble(args[2]), ScriptUtils.getDouble(args[3])));
  498. registerConsumer(list, "entity.teleport", (args, qd) ->
  499. Utils.teleportEntity((Entity) args[0], (Location) args[1]));
  500. registerConsumer(list, "entity.setequip", (args, qd) ->
  501. setEntityEquip(args));
  502. registerFunction(list, "entity.getequip", (args, qd) ->
  503. getEntityEquip(args));
  504. registerConsumer(list, "entity.removeall", (args, qd) ->
  505. removeEntities(args));
  506. registerConsumer(list, "entity.remove", (args, qd) ->
  507. ((Entity) args[0]).setDead());
  508. registerConsumer(list, "entity.setinvulnerable", (args, qd) ->
  509. ((Entity) args[0]).setEntityInvulnerable((boolean) args[1]));
  510. registerConsumer(list, "entity.setsilent", (args, qd) ->
  511. ((Entity) args[0]).setSilent((boolean) args[1]));
  512. registerConsumer(list, "entity.hide", (args, qd) ->
  513. ((Entity) args[0]).setInvisible(true));
  514. registerConsumer(list, "entity.show", (args, qd) ->
  515. ((Entity) args[0]).setInvisible(false));
  516. registerConsumer(list, "entity.ride", (args, qd) ->
  517. ((Entity) args[0]).startRiding(((Entity) args[1])));
  518. registerConsumer(list, "entity.setvars", (args, qd) ->
  519. ScriptVars.setEntityVars(qd, Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos(), 3, (Class<? extends Entity>) getClass("net.minecraft.entity." + args[1]))));
  520. registerConsumer(list, "entity.addeffect", (args, qd) ->
  521. EffectUtils.addPotionTo((EntityLivingBase) args[0], Potion.getPotionFromResourceLocation(args[1].toString()), ScriptUtils.getInt(args[2]), ScriptUtils.getInt(args[3])));
  522. registerFunction(list, "entity.haseffect", (args, qd) ->
  523. ((EntityLivingBase) args[0]).isPotionActive(Potion.getPotionFromResourceLocation(args[1].toString())));
  524. registerConsumer(list, "entity.goto", (args, qd) ->
  525. NmsUtilities.walkTo((EntityLiving) args[0], ((Location) args[1]).getPos(), ScriptUtils.getDouble(args[2])));
  526. registerConsumer(list, "entity.explode", (args, qd) ->
  527. ((EntityCreeper) args[0]).ignite());
  528. registerConsumer(list, "entity.spawnitemframe", (args, qd) ->
  529. spawnItemFrame(args));
  530. registerFunction(list, "entity.getitemframe", (args, qd) ->
  531. Utils.getNearestEntity(((Location) args[0]).getWorld(), ((Location) args[0]).getPos().addVector(0.5, 0, 0.5), 1, EntityItemFrame.class).getDisplayedItem());
  532. registerFunction(list, "entity.getpotiontype", (args, qd) ->
  533. getPotionType(args));
  534. registerConsumer(list, "entity.setgravity", (args, qd) ->
  535. ((Entity) args[0]).setNoGravity(!(boolean) args[1]));
  536. // -------------------------------------------------------------
  537. // Status-Bibliothek
  538. // -------------------------------------------------------------
  539. registerFunction(list, "status.getmana", (args, qd) ->
  540. EnvironmentAPI.getMana(((EntityPlayer) args[0])));
  541. registerFunction(list, "status.getcold", (args, qd) ->
  542. EnvironmentAPI.getCold(((EntityPlayer) args[0])));
  543. registerFunction(list, "status.getenergy", (args, qd) ->
  544. EnvironmentAPI.getEnergy(((EntityPlayer) args[0])));
  545. registerFunction(list, "status.getthirst", (args, qd) ->
  546. EnvironmentAPI.getThirst(((EntityPlayer) args[0])));
  547. registerConsumer(list, "status.changemange", (args, qd) ->
  548. EnvironmentAPI.changeMana(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  549. registerConsumer(list, "status.changecold", (args, qd) ->
  550. EnvironmentAPI.changeCold(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  551. registerConsumer(list, "status.changeenergie", (args, qd) ->
  552. EnvironmentAPI.changeEnergy(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  553. registerConsumer(list, "status.changethirst", (args, qd) ->
  554. EnvironmentAPI.changeThirst(((EntityPlayer) args[0]), ScriptUtils.getInt(args[1])));
  555. registerConsumer(list, "status.resetmana", (args, qd) ->
  556. EnvironmentAPI.resetMana(((EntityPlayer) args[0])));
  557. registerConsumer(list, "status.resetcold", (args, qd) ->
  558. EnvironmentAPI.resetCold(((EntityPlayer) args[0])));
  559. registerConsumer(list, "status.resetenergy", (args, qd) ->
  560. EnvironmentAPI.resetEnergy(((EntityPlayer) args[0])));
  561. registerConsumer(list, "status.resetthirst", (args, qd) ->
  562. EnvironmentAPI.resetThirst(((EntityPlayer) args[0])));
  563. registerConsumer(list, "status.gettemperature", (args, qd) ->
  564. EnvironmentAPI.getTemperature(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
  565. // -------------------------------------------------------------
  566. // Listen-Bibliothek
  567. // -------------------------------------------------------------
  568. registerConsumer(list, "list.new", (args, qd) ->
  569. qd.setVar(args[0], new ArrayList<>()));
  570. registerFunction(list, "list.exists", (args, qd) ->
  571. args[0] instanceof List);
  572. registerConsumer(list, "list.add", (args, qd) ->
  573. ((List) args[0]).add(args[1]));
  574. registerConsumer(list, "list.remove", (args, qd) ->
  575. ((List) args[0]).remove(args[1]));
  576. registerConsumer(list, "list.removeindex", (args, qd) ->
  577. ((List) args[0]).remove(ScriptUtils.getInt(args[1])));
  578. registerFunction(list, "list.contains", (args, qd) ->
  579. ((List) args[0]).contains(args[1]));
  580. registerFunction(list, "list.getsize", (args, qd) ->
  581. ((List) args[0]).size());
  582. registerFunction(list, "list.getindex", (args, qd) ->
  583. ((List) args[0]).get(ScriptUtils.getInt(args[1])));
  584. registerConsumer(list, "list.setindex", (args, qd) ->
  585. ((List) args[0]).set(ScriptUtils.getInt(args[1]), args[2]));
  586. registerConsumer(list, "list.clear", (args, qd) ->
  587. ((List) args[0]).clear());
  588. registerFunction(list, "list.getindexof", (args, qd) ->
  589. ((List) args[0]).indexOf(args[1]));
  590. registerConsumer(list, "list.sort", (args, qd) ->
  591. sortList((List<Object>) args[0], qd));
  592. registerConsumer(list, "list.reverse", (args, qd) ->
  593. Collections.reverse((List<Object>) args[0]));
  594. registerConsumer(list, "list.shuffle", (args, qd) ->
  595. Collections.shuffle((List<Object>) args[0]));
  596. // -------------------------------------------------------------
  597. // Map-Bibliothek
  598. // -------------------------------------------------------------
  599. registerConsumer(list, "map.new", (args, qd) ->
  600. qd.setVar(args[0], new HashMap<>()));
  601. registerFunction(list, "map.exists", (args, qd) ->
  602. args[0] instanceof HashMap);
  603. registerConsumer(list, "map.add", (args, qd) ->
  604. ((HashMap) args[0]).put(args[1], args[2]));
  605. registerConsumer(list, "map.remove", (args, qd) ->
  606. ((HashMap) args[0]).remove(args[1]));
  607. registerFunction(list, "map.contains", (args, qd) ->
  608. ((HashMap) args[0]).containsKey(args[1]));
  609. registerFunction(list, "map.getsize", (args, qd) ->
  610. ((HashMap) args[0]).size());
  611. registerFunction(list, "map.get", (args, qd) ->
  612. ((HashMap) args[0]).get(args[1]));
  613. registerConsumer(list, "map.clear", (args, qd) ->
  614. ((HashMap) args[0]).clear());
  615. // -------------------------------------------------------------
  616. // Set-Bibliothek
  617. // -------------------------------------------------------------
  618. registerConsumer(list, "set.new", (args, qd) ->
  619. qd.setVar(args[0], new HashSet<>()));
  620. registerFunction(list, "set.exists", (args, qd) ->
  621. args[0] instanceof HashSet);
  622. registerConsumer(list, "set.add", (args, qd) ->
  623. ((HashSet) args[0]).add(args[1]));
  624. registerConsumer(list, "set.remove", (args, qd) ->
  625. ((HashSet) args[0]).remove(args[1]));
  626. registerFunction(list, "set.contains", (args, qd) ->
  627. ((HashSet) args[0]).contains(args[1]));
  628. registerFunction(list, "set.getsize", (args, qd) ->
  629. ((HashSet) args[0]).size());
  630. // -------------------------------------------------------------
  631. // GMap-Bibliothek
  632. // -------------------------------------------------------------
  633. registerConsumer(list, "gmap.removeall", (args, qd) ->
  634. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMap(args[0].toString()));
  635. registerConsumer(list, "gmap.add", (args, qd) ->
  636. KajetansMod.scripts.getDataBank(ScriptBank.class).addMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
  637. registerConsumer(list, "gmap.remove", (args, qd) ->
  638. KajetansMod.scripts.getDataBank(ScriptBank.class).removeMapElement(args[0].toString(), args[1].toString()));
  639. registerConsumer(list, "gmap.totable", (args, qd) ->
  640. qd.setVar(args[0], KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalMapAsTable(args[1].toString())));
  641. registerFunction(list, "gmap.get", (args, qd) ->
  642. KajetansMod.scripts.getDataBank(ScriptBank.class).getMapValue(args[0].toString(), args[1].toString()));
  643. // -------------------------------------------------------------
  644. // GDMap-Bibliothek
  645. // -------------------------------------------------------------
  646. registerConsumer(list, "gdmap.removeall", (args, qd) ->
  647. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMap(args[0].toString()));
  648. registerConsumer(list, "gdmap.add", (args, qd) ->
  649. KajetansMod.scripts.getDataBank(ScriptBank.class).addDualMapElement(args[0].toString(), args[1].toString(), args[2].toString(), args[3].toString()));
  650. registerConsumer(list, "gdmap.remove", (args, qd) ->
  651. KajetansMod.scripts.getDataBank(ScriptBank.class).removeDualMapElement(args[0].toString(), args[1].toString(), args[2].toString()));
  652. registerConsumer(list, "gdmap.totable", (args, qd) ->
  653. qd.setVar(args[0], KajetansMod.scripts.getDataBank(ScriptBank.class).getGlobalDualMapAsTable(args[1].toString(), args[2].toString())));
  654. registerFunction(list, "gdmap.get", (args, qd) ->
  655. KajetansMod.scripts.getDataBank(ScriptBank.class).getDualMapValue(args[0].toString(), args[1].toString(), args[2].toString()));
  656. // -------------------------------------------------------------
  657. // Table-Bibliothek
  658. // -------------------------------------------------------------
  659. registerConsumer(list, "table.printstart", (args, qd) ->
  660. sendMessageToGroup(args[0], qd, TableAPI.getTableStart(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));
  661. registerConsumer(list, "table.printmiddle", (args, qd) ->
  662. sendMessageToGroup(args[0], qd, TableAPI.getTableMiddle(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));
  663. registerConsumer(list, "table.print", (args, qd) ->
  664. sendMessageToGroup(args[0], qd, TableAPI.getTable(ScriptUtils.getInt(args[1]), args[2].toString(), Arrays.stream(args, 3, args.length).map(o -> o.toString()).collect(Collectors.toList()))));
  665. registerConsumer(list, "table.printend", (args, qd) ->
  666. sendMessageToGroup(args[0], qd, TableAPI.getTableEnd(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2]), args[3].toString())));
  667. registerConsumer(list, "table.new", (args, qd) ->
  668. qd.setVar(args[0], new Table(ScriptUtils.getInt(args[1]))));
  669. registerConsumer(list, "table.frommap", (args, qd) ->
  670. qd.setVar(args[0], new Table((Map<Object, Object>) args[1])));
  671. registerConsumer(list, "table.sort", (args, qd) ->
  672. ((Table) args[0]).sort());
  673. registerConsumer(list, "table.reverse", (args, qd) ->
  674. ((Table) args[0]).reverse());
  675. registerConsumer(list, "table.shuffle", (args, qd) ->
  676. ((Table) args[0]).shuffle());
  677. registerConsumer(list, "table.clear", (args, qd) ->
  678. ((Table) args[0]).clear());
  679. registerConsumer(list, "table.addrow", (args, qd) ->
  680. ((Table) args[0]).addRow(Arrays.copyOfRange(args, 1, args.length)));
  681. registerConsumer(list, "table.removerow", (args, qd) ->
  682. ((Table) args[0]).removeRow(ScriptUtils.getInt(args[1])));
  683. registerFunction(list, "table.get", (args, qd) ->
  684. ((Table) args[0]).getElement(ScriptUtils.getInt(args[1]), ScriptUtils.getInt(args[2])));
  685. registerFunction(list, "table.getindexof", (args, qd) ->
  686. ((Table) args[0]).getIndexOf(args[1]));
  687. registerConsumer(list, "table.setsortcolumn", (args, qd) ->
  688. ((Table) args[0]).setSortColumn(ScriptUtils.getInt(args[1])));
  689. registerFunction(list, "table.getsize", (args, qd) ->
  690. ((Table) args[0]).getSize());
  691. // -------------------------------------------------------------
  692. // Plot-Bibliothek
  693. // -------------------------------------------------------------
  694. registerFunction(list, "plot.hastag", (args, qd) ->
  695. KajetansMod.plots.getDataBank(ProtectionBank.class).hasTag(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), args[1].toString()));
  696. registerConsumer(list, "plot.add", (args, qd) ->
  697. addPlot(args));
  698. registerFunction(list, "plot.getid", (args, qd) ->
  699. KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionId(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
  700. registerFunction(list, "plot.canbuild", (args, qd) ->
  701. KajetansMod.plots.getDataBank(ProtectionBank.class).canBuild(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos(), (EntityPlayer) args[1]));
  702. registerFunction(list, "plot.getname", (args, qd) ->
  703. KajetansMod.plots.getDataBank(ProtectionBank.class).getFirstRegionName(((Location) args[0]).getWorld(), ((Location) args[0]).getBlockPos()));
  704. // -------------------------------------------------------------
  705. // Quest-Bibliothek
  706. // -------------------------------------------------------------
  707. registerConsumer(list, "quest.setinfo", (args, qd) ->
  708. qd.setInfo(ScriptUtils.connect(args, 0)));
  709. registerConsumer(list, "quest.end", (args, qd) ->
  710. endQuest(args, qd));
  711. registerConsumer(list, "quest.playerstolist", (args, qd) ->
  712. questersToList(args, qd));
  713. registerFunction(list, "quest.getplayeramount", (args, qd) ->
  714. getNumberOfQuesters(qd));
  715. registerConsumer(list, "quest.give", (args, qd) ->
  716. giveQuest(args, qd));
  717. registerFunction(list, "quest.isactive", (args, qd) ->
  718. KajetansMod.scripts.getQuests().stream().anyMatch(q -> q.getName().equals(args[0])));
  719. // -------------------------------------------------------------
  720. // Scoreboard-Bibliothek
  721. // -------------------------------------------------------------
  722. registerConsumer(list, "sb.add", (args, qd) ->
  723. addToScoreBoard(args, qd));
  724. registerConsumer(list, "sb.remove", (args, qd) ->
  725. removeFromScoreBoard(args, qd));
  726. registerConsumer(list, "sb.reset", (args, qd) ->
  727. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.resetScoreboard((EntityPlayerMP) p)));
  728. // -------------------------------------------------------------
  729. // Effect-Bibliothek
  730. // -------------------------------------------------------------
  731. registerConsumer(list, "effect.playsound", (args, qd) ->
  732. playSound(args));
  733. registerConsumer(list, "effect.play", (args, qd) ->
  734. playParticle(args));
  735. // -------------------------------------------------------------
  736. // Inventory-Bibliothek
  737. // -------------------------------------------------------------
  738. registerConsumer(list, "inv.new", (args, qd) ->
  739. qd.setVar(args[0], new SnuviInventory(args[2].toString(), ScriptUtils.getInt(args[1]), qd.getNewId())));
  740. registerConsumer(list, "inv.loadblock", (args, qd) ->
  741. qd.setVar(args[0], newInventory((Location) args[1], qd, args[2].toString())));
  742. registerConsumer(list, "inv.setitem", (args, qd) ->
  743. ((IInventory) args[0]).setInventorySlotContents(ScriptUtils.getInt(args[1]), (ItemStack) args[2]));
  744. registerFunction(list, "inv.getitem", (args, qd) ->
  745. ((IInventory) args[0]).getStackInSlot(ScriptUtils.getInt(args[1])));
  746. registerConsumer(list, "inv.open", (args, qd) ->
  747. new ScriptInventoryHolder((SnuviInventory) args[0], (EntityPlayerMP) args[1], qd).openForPlayer((EntityPlayerMP) args[1]));
  748. registerConsumer(list, "inv.close", (args, qd) ->
  749. ((EntityPlayer) args[0]).closeScreen());
  750. // -------------------------------------------------------------
  751. // Time-Bibliothek
  752. // -------------------------------------------------------------
  753. registerFunction(list, "time.get", (args, qd) ->
  754. System.currentTimeMillis());
  755. registerFunction(list, "time.nextday", (args, qd) ->
  756. getNextDay(args));
  757. registerFunction(list, "time.getyear", (args, qd) ->
  758. getYear(args));
  759. registerFunction(list, "time.getmonth", (args, qd) ->
  760. getMonth(args));
  761. registerFunction(list, "time.getday", (args, qd) ->
  762. getDay(args));
  763. registerFunction(list, "time.gethour", (args, qd) ->
  764. getHour(args));
  765. registerFunction(list, "time.getminute", (args, qd) ->
  766. getMinute(args));
  767. registerFunction(list, "time.getsecond", (args, qd) ->
  768. getSecond(args));
  769. // -------------------------------------------------------------
  770. // Read-Bibliothek
  771. // -------------------------------------------------------------
  772. registerFunction(list, "read.player", (args, qd) ->
  773. Utils.getPlayerByName(args[0].toString()));
  774. registerFunction(list, "read.location", (args, qd) ->
  775. ScriptUtils.getLocation(args[0].toString()));
  776. registerFunction(list, "read.item", (args, qd) ->
  777. ScriptUtils.getItemStack(args, 0));
  778. registerFunction(list, "read.spawnmob", (args, qd) ->
  779. NmsUtilities.getEntityFromNbtString(ScriptUtils.connect(args," ", 1).replace("'", "\""), (Location) args[0]));
  780. // -------------------------------------------------------------
  781. // Text-Bibliothek
  782. // -------------------------------------------------------------
  783. registerFunction(list, "text.location", (args, qd) ->
  784. ScriptUtils.getLocationString((Location) args[0]));
  785. registerFunction(list, "text.item", (args, qd) ->
  786. ScriptUtils.getItemStackString((ItemStack) args[0]));
  787. // -------------------------------------------------------------
  788. // Ohne Bibliothek
  789. // -------------------------------------------------------------
  790. registerFunction(list, "add", (args, qd) ->
  791. convertDouble(Arrays.stream(args).mapToDouble(s -> ScriptUtils.getDouble(s)).sum()));
  792. registerFunction(list, "sub", (args, qd) ->
  793. numberHandler(args[0], args[1], (a, b) -> a - b, (a, b) -> a - b, (a, b) -> a - b));
  794. registerFunction(list, "inc", (args, qd) ->
  795. increaseVar(args[0], qd, 1));
  796. registerFunction(list, "dec", (args, qd) ->
  797. increaseVar(args[0], qd, -1));
  798. registerFunction(list, "mul", (args, qd) ->
  799. numberHandler(args[0], args[1], (a, b) -> a * b, (a, b) -> a * b, (a, b) -> a * b));
  800. registerFunction(list, "div", (args, qd) ->
  801. ScriptUtils.getDouble(args[0]) / ScriptUtils.getDouble(args[1]));
  802. registerFunction(list, "getvar", (args, qd) ->
  803. qd.getVar(args[0].toString()));
  804. registerConsumer(list, "setvar", (args, qd) ->
  805. qd.setVar(args[0].toString(), args[1]));
  806. registerConsumer(list, "removevar", (args, qd) ->
  807. qd.removeVar(args[0].toString()));
  808. registerFunction(list, "getglobalvar", (args, qd) ->
  809. getGlobalVar(args));
  810. registerAlias(list, "ggv", "getglobalvar");
  811. registerConsumer(list, "setglobalvar", (args, qd) ->
  812. setGlobalVar(args));
  813. registerAlias(list, "sgv", "setglobalvar");
  814. registerConsumer(list, "msg", (args, qd) ->
  815. sendMessageToGroup(args[0], qd, ScriptUtils.connect(args, 1)));
  816. registerConsumer(list, "reset", (args, qd) ->
  817. qd.resetOverflowProtection());
  818. registerConsumer(list, "wait", (args, qd) ->
  819. { qd.resetOverflowProtection(); throw new HoldCodeException(); });
  820. registerConsumer(list, "term", (args, qd) ->
  821. { KajetansMod.scripts.term(qd); throw new HoldCodeException(); });
  822. registerConsumer(list, "goto", (args, qd) ->
  823. qd.gotoLabel(args[0].toString()));
  824. registerConsumer(list, "sgoto", (args, qd) ->
  825. scheduleGoto(args, qd));
  826. registerConsumer(list, "gosub", (args, qd) ->
  827. qd.gotoLabelWithReturn(args[0].toString()));
  828. registerConsumer(list, "return", (args, qd) ->
  829. qd.doReturn());
  830. registerConsumer(list, "try", (args, qd) ->
  831. tryFunction(args, qd));
  832. registerConsumer(list, "catch", (args, qd) ->
  833. catchFunction(qd));
  834. registerConsumer(list, "if", (args, qd) ->
  835. ifFunction(args, qd));
  836. registerConsumer(list, "else", (args, qd) ->
  837. elseFunction(args, qd));
  838. registerConsumer(list, "while", (args, qd) ->
  839. whileFunction(args, qd));
  840. registerFunction(list, "equal", (args, qd) ->
  841. isEqual(args));
  842. registerAlias(list, "equals", "equal");
  843. registerFunction(list, "less", (args, qd) ->
  844. ScriptUtils.getDouble(args[0]) < ScriptUtils.getDouble(args[1]));
  845. registerFunction(list, "greater", (args, qd) ->
  846. ScriptUtils.getDouble(args[0]) > ScriptUtils.getDouble(args[1]));
  847. registerFunction(list, "notequal", (args, qd) ->
  848. !isEqual(args));
  849. registerFunction(list, "lessequal", (args, qd) ->
  850. ScriptUtils.getDouble(args[0]) <= ScriptUtils.getDouble(args[1]));
  851. registerFunction(list, "greaterequal", (args, qd) ->
  852. ScriptUtils.getDouble(args[0]) >= ScriptUtils.getDouble(args[1]));
  853. registerFunction(list, "invert", (args, qd) ->
  854. !((boolean) args[0]));
  855. registerFunction(list, "and", (args, qd) ->
  856. Arrays.stream(args).allMatch(s -> s.equals(true)));
  857. registerFunction(list, "or", (args, qd) ->
  858. Arrays.stream(args).anyMatch(s -> s.equals(true)));
  859. registerFunction(list, "removeformat", (args, qd) ->
  860. ScriptUtils.connect(args, 0).replaceAll("§.", ""));
  861. registerFunction(list, "concatlist", (args, qd) ->
  862. ((List<Object>) args[0]).stream().limit(ScriptUtils.getInt(args[3]) + 1).skip(ScriptUtils.getInt(args[2])).map(o -> o.toString()).collect(Collectors.joining(args[1].toString())));
  863. registerConsumer(list, "split", (args, qd) ->
  864. split(args, qd));
  865. registerFunction(list, "concat", (args, qd) ->
  866. ScriptUtils.connect(args, 0));
  867. registerFunction(list, "tolowercase", (args, qd) ->
  868. ScriptUtils.connect(args, 0).toLowerCase());
  869. registerFunction(list, "touppercase", (args, qd) ->
  870. ScriptUtils.connect(args, 0).toUpperCase());
  871. registerFunction(list, "concatspace", (args, qd) ->
  872. ScriptUtils.connect(args, " ", 0));
  873. registerFunction(list, "onlyletters", (args, qd) ->
  874. onlyLetters(ScriptUtils.connect(args, 0)));
  875. registerConsumer(list, "command", (args, qd) ->
  876. KajetansMod.server.commandManager.executeCommand(KajetansMod.server, ScriptUtils.connect(args, 0)));
  877. registerConsumer(list, "waitfor", (args, qd) ->
  878. waitFor(args, qd));
  879. methods = list.toArray(new BiFunction[list.size()]);
  880. }
  881. public boolean printStack = false;
  882. @SuppressWarnings("unchecked")
  883. public Object parseFunction(Script qd, int function, Object[] args)
  884. {
  885. try
  886. {
  887. qd.exeClock.pushTime(qd.isBenchmarking());
  888. Object o = methods[function].apply(args, qd);
  889. qd.exeClock.pushTime(qd.isBenchmarking());
  890. return o;
  891. }
  892. catch(Exception ex)
  893. {
  894. if(ex instanceof HoldCodeException)
  895. {
  896. throw new HoldCodeException();
  897. }
  898. if(printStack)
  899. {
  900. ex.printStackTrace();
  901. }
  902. if(qd.getTryMode())
  903. {
  904. qd.setTryMode(false);
  905. qd.setTryFail(true);
  906. qd.setVar("error", ex.getClass().getSimpleName());
  907. qd.goHigher();
  908. return 0;
  909. }
  910. printQuestException(qd, ex, translator.inverse().get(function) + "(" + Arrays.stream(args).map(o -> String.valueOf(o)).collect(Collectors.joining(", ")) + ")");
  911. throw new HoldCodeException();
  912. }
  913. }
  914. public void printQuestException(Script qd, Exception ex, String line)
  915. {
  916. qd.resetOverflowProtection();
  917. sendToDevsWithSuffix(qd, "§cError in");
  918. if(qd.isScript())
  919. {
  920. sendToDevsWithHelpList(qd, "§cScript", qd.getName());
  921. }
  922. else
  923. {
  924. sendToDevsWithHelpList(qd, "§cQuest", qd.getName());
  925. }
  926. sendToDevsWithHelpList(qd, "§cZeile", line);
  927. sendToDevsWithHelpList(qd, "§cZeilennummer", String.valueOf(qd.getActualCodeLine() + 1));
  928. sendToDevsWithHelpList(qd, "§cZeilenpfad", qd.getTreePath());
  929. if(ex.getLocalizedMessage() == null)
  930. {
  931. sendToDevsWithHelpList(qd, "§cException", ex.getClass().getSimpleName());
  932. }
  933. else
  934. {
  935. sendToDevsWithHelpList(qd, "§cException", ex.getClass().getSimpleName() + " - " + ex.getLocalizedMessage());
  936. }
  937. if(ex instanceof IllegalStringException)
  938. {
  939. sendToDevsWithHelpList(qd, "§cUngültiger Wert", ((IllegalStringException) ex).getBadString());
  940. }
  941. }
  942. // -----------------------
  943. // Quest Befehle
  944. // -----------------------
  945. private Class getClass(String s)
  946. {
  947. try
  948. {
  949. return Class.forName(s);
  950. }
  951. catch(ClassNotFoundException ex)
  952. {
  953. throw new IllegalStringException(s);
  954. }
  955. }
  956. private int getItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  957. {
  958. Location l = (Location) args[0];
  959. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  960. if(te == null || !(te instanceof TileEntityChest))
  961. {
  962. return 0;
  963. }
  964. return InventoryUtils.searchInventoryFor(((TileEntityChest) te), (ItemStack) args[2], (boolean) args[1]);
  965. }
  966. private ItemStack addItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  967. {
  968. Location l = (Location) args[0];
  969. ItemStack stack = ((ItemStack) args[1]);
  970. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  971. if(te == null || !(te instanceof TileEntityChest))
  972. {
  973. return stack;
  974. }
  975. stack.setCount(InventoryUtils.addToInventory((TileEntityChest) te, stack));
  976. return stack;
  977. }
  978. private ItemStack removeItemAmountChest(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  979. {
  980. Location l = (Location) args[0];
  981. ItemStack stack = ((ItemStack) args[1]);
  982. TileEntity te = l.getWorld().getTileEntity(l.getBlockPos());
  983. if(te == null || !(te instanceof TileEntityChest))
  984. {
  985. return stack;
  986. }
  987. stack.setCount(InventoryUtils.removeFromInventory((TileEntityChest) te, stack));
  988. return stack;
  989. }
  990. private Object getCoordOfLocation(Object[] args) throws IllegalStringLocationException
  991. {
  992. Location l = (Location) args[0];
  993. switch(args[1].toString())
  994. {
  995. case "x":
  996. return l.getPos().xCoord;
  997. case "y":
  998. return l.getPos().yCoord;
  999. case "z":
  1000. return l.getPos().zCoord;
  1001. case "bx":
  1002. return (int) l.getPos().xCoord;
  1003. case "by":
  1004. return (int) l.getPos().yCoord;
  1005. case "bz":
  1006. return (int) l.getPos().zCoord;
  1007. case "w":
  1008. return ModDimensions.getWorldName(l.getWorld());
  1009. default:
  1010. return null;
  1011. }
  1012. }
  1013. private void cloneBlock(Object[] args) throws IllegalStringLocationException
  1014. {
  1015. Location l = (Location) args[1];
  1016. IBlockState state = getBlockState((Location) args[0]);
  1017. l.getWorld().setBlockState(l.getBlockPos(), state);
  1018. }
  1019. private ItemStack removeItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
  1020. {
  1021. ItemStack stack = ((ItemStack) args[1]).copy();
  1022. stack.setCount(InventoryUtils.removeFromInventory(((EntityPlayer) args[0]).inventory, stack));
  1023. return stack;
  1024. }
  1025. private void dropItem(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  1026. {
  1027. Location l = (Location) args[0];
  1028. World w = l.getWorld();
  1029. BlockPos pos = l.getBlockPos();
  1030. ItemStack stack = ((ItemStack) args[1]).copy();
  1031. int amount = stack.getCount();
  1032. while(amount > stack.getMaxStackSize())
  1033. {
  1034. stack.setCount(stack.getMaxStackSize());
  1035. amount -= stack.getMaxStackSize();
  1036. ItemStackUtils.drop(w, pos, stack.copy());
  1037. }
  1038. if(amount > 0)
  1039. {
  1040. stack.setCount(amount);
  1041. ItemStackUtils.drop(w, pos, stack);
  1042. }
  1043. }
  1044. private ItemStack giveItem(Object[] args) throws PlayerNotFoundException, IllegalItemStackStringException
  1045. {
  1046. ItemStack stack = ((ItemStack) args[1]).copy();
  1047. stack.setCount(InventoryUtils.addToInventory(((EntityPlayer) args[0]).inventory, stack));
  1048. return stack;
  1049. }
  1050. private void endQuest(Object[] args, Script qd) throws NumberFormatException, UnsupportedOperationException
  1051. {
  1052. if(qd.isScript())
  1053. {
  1054. throw new UnsupportedOperationException();
  1055. }
  1056. qd.getPlayers().stream().forEach((p) ->
  1057. {
  1058. KajetansMod.scripts.send(p, "Du hast die Quest geschafft!");
  1059. });
  1060. KajetansMod.scripts.term(qd);
  1061. throw new HoldCodeException();
  1062. }
  1063. private void setBlock(Object[] args, Script qd) throws IllegalStringLocationException, IllegalItemStackStringException
  1064. {
  1065. Location l = (Location) args[0];
  1066. ItemStack stack = (ItemStack) args[1];
  1067. l.getWorld().setBlockState(l.getBlockPos(), Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata()));
  1068. qd.increaseOverflowProtection();
  1069. }
  1070. private void setBlockWithData(Object[] args, Script qd) throws IllegalStringLocationException
  1071. {
  1072. Location l = (Location) args[0];
  1073. if(args.length >= 4)
  1074. {
  1075. NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), ScriptUtils.connect(args, 3));
  1076. }
  1077. else
  1078. {
  1079. NmsUtilities.setBlockWithData(l.getWorld(), l.getBlockPos(), ScriptUtils.getInt(args[2]), Block.getBlockFromName(args[1].toString()), null);
  1080. }
  1081. qd.increaseOverflowProtection();
  1082. }
  1083. private void dropInventory(Object[] args)
  1084. {
  1085. ((EntityPlayer) args[0]).inventory.dropAllItems();
  1086. }
  1087. private void playSound(Object[] args) throws IllegalStringLocationException
  1088. {
  1089. Location l = ((Location) args[0]);
  1090. Vec3d v = l.getPos();
  1091. EffectUtils.playSound((WorldServer) l.getWorld(), SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER, v.xCoord, v.yCoord, v.zCoord);
  1092. }
  1093. private void playSoundPlayer(Object[] args) throws IllegalStringLocationException
  1094. {
  1095. EffectUtils.playSound((EntityPlayerMP) args[0], SoundEvent.REGISTRY.getObject(new ResourceLocation(args[1].toString())), SoundCategory.MASTER);
  1096. }
  1097. private void playParticle(Object[] args) throws IllegalStringLocationException
  1098. {
  1099. Location l = ((Location) args[0]).add(0.5, 0.5, 0.5);
  1100. EffectUtils.spawnParticle((WorldServer) l.getWorld(), EnumParticleTypes.getByName(args[1].toString()), l.getPos(), ScriptUtils.getInt(args[2]));
  1101. }
  1102. private void setEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException, IllegalItemStackStringException
  1103. {
  1104. EntityLivingBase liv = (EntityLivingBase) args[0];
  1105. ItemStack stack = ((ItemStack) args[2]).copy();
  1106. switch(args[1].toString())
  1107. {
  1108. case "hand":
  1109. liv.setItemStackToSlot(EntityEquipmentSlot.MAINHAND, stack);
  1110. return;
  1111. case "head":
  1112. liv.setItemStackToSlot(EntityEquipmentSlot.HEAD, stack);
  1113. return;
  1114. case "chest":
  1115. liv.setItemStackToSlot(EntityEquipmentSlot.CHEST, stack);
  1116. return;
  1117. case "legs":
  1118. liv.setItemStackToSlot(EntityEquipmentSlot.LEGS, stack);
  1119. return;
  1120. case "feet":
  1121. liv.setItemStackToSlot(EntityEquipmentSlot.FEET, stack);
  1122. return;
  1123. case "offhand":
  1124. liv.setItemStackToSlot(EntityEquipmentSlot.OFFHAND, stack);
  1125. }
  1126. }
  1127. private ItemStack getEntityEquip(Object[] args) throws IllegalStringLocationException, EntityNotFoundException
  1128. {
  1129. EntityLivingBase liv = (EntityLivingBase) args[0];
  1130. switch(args[1].toString())
  1131. {
  1132. case "hand":
  1133. return liv.getItemStackFromSlot(EntityEquipmentSlot.MAINHAND);
  1134. case "head":
  1135. return liv.getItemStackFromSlot(EntityEquipmentSlot.HEAD);
  1136. case "chest":
  1137. return liv.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
  1138. case "legs":
  1139. return liv.getItemStackFromSlot(EntityEquipmentSlot.LEGS);
  1140. case "feet":
  1141. return liv.getItemStackFromSlot(EntityEquipmentSlot.FEET);
  1142. case "offhand":
  1143. return liv.getItemStackFromSlot(EntityEquipmentSlot.OFFHAND);
  1144. }
  1145. return ItemStack.EMPTY;
  1146. }
  1147. @SuppressWarnings("unchecked")
  1148. private void removeEntities(Object[] args) throws IllegalStringLocationException
  1149. {
  1150. Class<? extends Entity> c = (Class<? extends Entity>) getClass("org.bukkit.entity." + args[0]);
  1151. if(c == Entity.class || c == EntityVillager.class || c == EntityArmorStand.class || c == EntityItemFrame.class || c == EntityHanging.class)
  1152. {
  1153. return;
  1154. }
  1155. Location l = (Location) args[1];
  1156. Utils.getNearbyEntities(l.getWorld(), l.getPos(), ScriptUtils.getDouble(args[2]), c).stream().forEach(ent ->
  1157. {
  1158. ent.setDead();
  1159. });
  1160. }
  1161. private void ifFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
  1162. {
  1163. if(Arrays.stream(args).allMatch(s -> s.equals(true)))
  1164. {
  1165. qd.goDeeper(false);
  1166. qd.setElseMode(false);
  1167. return;
  1168. }
  1169. qd.setElseMode(true);
  1170. }
  1171. private void elseFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
  1172. {
  1173. if(qd.getElseMode())
  1174. {
  1175. qd.setElseMode(false);
  1176. qd.goDeeper(false);
  1177. }
  1178. }
  1179. private void whileFunction(Object[] args, Script qd) throws IfWithoutStatementException, NoChildTreeException
  1180. {
  1181. if(Arrays.stream(args).allMatch(s -> s.equals(true)))
  1182. {
  1183. qd.goDeeper(true);
  1184. }
  1185. }
  1186. private void setSign(Object[] args) throws IllegalStringLocationException
  1187. {
  1188. Location l = (Location) args[0];
  1189. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  1190. SpecialBlockUtils.setSignLine(sign, ScriptUtils.getInt(args[1]), ScriptUtils.connect(args, 2));
  1191. }
  1192. private String getSign(Object[] args) throws IllegalStringLocationException
  1193. {
  1194. Location l = (Location) args[0];
  1195. TileEntitySign sign = (TileEntitySign) l.getWorld().getTileEntity(l.getBlockPos());
  1196. return sign.signText[ScriptUtils.getInt(args[1])].getUnformattedText();
  1197. }
  1198. private void spawnItemFrame(Object[] args) throws IllegalStringLocationException, IllegalItemStackStringException
  1199. {
  1200. Location l = ((Location) args[0]);
  1201. EntityItemFrame frame = new EntityItemFrame(l.getWorld(), l.getBlockPos(), EnumFacing.byName(args[1].toString()));
  1202. frame.setDisplayedItem(((ItemStack) args[2]).copy());
  1203. }
  1204. private void nameEntity(Object[] args) throws EntityNotFoundException
  1205. {
  1206. Entity ent = (Entity) args[0];
  1207. ent.setCustomNameTag(ScriptUtils.connect(args, 1));
  1208. if(args.length >= 3)
  1209. {
  1210. ent.setAlwaysRenderNameTag((boolean) args[2]);
  1211. return;
  1212. }
  1213. ent.setAlwaysRenderNameTag(true);
  1214. }
  1215. private EntityPlayer getQuestLeader(Script qd) throws PlayerNotFoundException
  1216. {
  1217. if(qd.isScript())
  1218. {
  1219. throw new UnsupportedOperationException();
  1220. }
  1221. return qd.getPlayers().get(0);
  1222. }
  1223. @SuppressWarnings(value = "unchecked")
  1224. private void sortList(List<Object> args, Script qd)
  1225. {
  1226. Collections.sort(args, (Object o1, Object o2) -> ((Comparable) o1).compareTo(o2));
  1227. }
  1228. private void questersToList(Object[] args, Script qd) throws UnsupportedOperationException
  1229. {
  1230. if(qd.isScript())
  1231. {
  1232. throw new UnsupportedOperationException();
  1233. }
  1234. qd.setVar(args[0], qd.getPlayers());
  1235. }
  1236. private int getNumberOfQuesters(Script qd) throws UnsupportedOperationException
  1237. {
  1238. if(qd.isScript())
  1239. {
  1240. throw new UnsupportedOperationException();
  1241. }
  1242. return qd.getPlayers().size();
  1243. }
  1244. private void giveQuest(Object[] args, Script qd) throws PlayerNotFoundException
  1245. {
  1246. if(qd.isScript())
  1247. {
  1248. EntityPlayer p = ((EntityPlayer) args[0]);
  1249. if(!KajetansMod.scripts.hasQuest(p))
  1250. {
  1251. KajetansMod.scripts.startQuest(KajetansMod.server, args[1].toString(), p, null, null);
  1252. }
  1253. return;
  1254. }
  1255. EntityPlayer p = qd.getPlayers().get(0);
  1256. if(KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR))
  1257. {
  1258. qd.loadNewCode(args[0].toString(), p);
  1259. return;
  1260. }
  1261. qd.loadNewCode(args[0].toString(), KajetansMod.server);
  1262. }
  1263. private void addToScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
  1264. {
  1265. int id = ScriptUtils.getInt(args[1]);
  1266. String message = ScriptUtils.connect(args, 2);
  1267. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).addText(id, message));
  1268. }
  1269. private void removeFromScoreBoard(Object[] args, Script qd) throws PlayerNotFoundException
  1270. {
  1271. int id = ScriptUtils.getInt(args[1]);
  1272. doForGroup(args[0], qd, p -> KajetansMod.scoreboard.getScoreboard((EntityPlayerMP) p).removeText(id));
  1273. }
  1274. private void sendToActionBar(Object[] args, Script qd) throws PlayerNotFoundException
  1275. {
  1276. String text = ScriptUtils.connect(args, 1);
  1277. doForGroup(args[0], qd, p -> NmsUtilities.sendActionBar((EntityPlayerMP) p, text));
  1278. }
  1279. private void kickPlayerFromQuest(Object[] args, Script qd) throws PlayerNotFoundException, UnsupportedOperationException
  1280. {
  1281. if(qd.isScript())
  1282. {
  1283. throw new UnsupportedOperationException();
  1284. }
  1285. KajetansMod.scripts.removePlayerFromQuest((EntityPlayer) args[0], qd);
  1286. }
  1287. private void scheduleGoto(Object[] args, Script qd)
  1288. {
  1289. KajetansMod.scheduler.scheduleTask(() ->
  1290. {
  1291. if(!qd.isValid())
  1292. {
  1293. return;
  1294. }
  1295. try
  1296. {
  1297. qd.gotoLabel(args[1].toString());
  1298. qd.setIsWaiting(false);
  1299. qd.runCode();
  1300. }
  1301. catch(NoChildTreeException | CodeTooLongException | GotoLabelNotFoundException ex)
  1302. {
  1303. printQuestException(qd, ex, "(Scheduled Goto)");
  1304. }
  1305. }, ScriptUtils.getInt(args[0]));
  1306. }
  1307. private void waitFor(Object[] args, Script qd) throws UnsupportedOperationException
  1308. {
  1309. qd.resetOverflowProtection();
  1310. int i = ScriptUtils.getInt(args[0]);
  1311. if(i < 1)
  1312. {
  1313. throw new UnsupportedOperationException();
  1314. }
  1315. qd.setIsWaiting(true);
  1316. KajetansMod.scheduler.scheduleTask(() ->
  1317. {
  1318. if(qd == null || !qd.isValid())
  1319. {
  1320. return;
  1321. }
  1322. qd.setIsWaiting(false);
  1323. qd.runCode();
  1324. }, i);
  1325. throw new HoldCodeException();
  1326. }
  1327. private void damageEntity(Object[] args)
  1328. {
  1329. if(args.length >= 4)
  1330. {
  1331. ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.causeMobDamage((EntityLivingBase) args[2]), ScriptUtils.getFloat(args[1]));
  1332. return;
  1333. }
  1334. ((EntityLivingBase) args[0]).attackEntityFrom(DamageSource.GENERIC, ScriptUtils.getFloat(args[1]));
  1335. }
  1336. private boolean isBetween(Object[] args)
  1337. {
  1338. Vec3d l1 = ((Location) args[0]).getPos();
  1339. Vec3d l2 = ((Location) args[1]).getPos();
  1340. Vec3d l3 = ((Location) args[2]).getPos();
  1341. return l1.xCoord >= Math.min(l2.xCoord, l3.xCoord) &&
  1342. l1.xCoord <= Math.max(l2.xCoord, l3.xCoord) &&
  1343. l1.yCoord >= Math.min(l2.yCoord, l3.yCoord) &&
  1344. l1.yCoord <= Math.max(l2.yCoord, l3.yCoord) &&
  1345. l1.zCoord >= Math.min(l2.zCoord, l3.zCoord) &&
  1346. l1.zCoord <= Math.max(l2.zCoord, l3.zCoord);
  1347. }
  1348. private Number increaseVar(Object var, Script qd, int value)
  1349. {
  1350. Number n = numberHandler(qd.getVar(var.toString()), (a) -> a + value, (a) -> a + value, (a) -> a + value);
  1351. qd.setVar(var.toString(), n);
  1352. return n;
  1353. }
  1354. private void addPlot(Object[] args)
  1355. {
  1356. Location l1 = (Location) args[0];
  1357. Location l2 = (Location) args[1];
  1358. BlockPos pos1 = l1.getBlockPos();
  1359. BlockPos pos2 = l2.getBlockPos();
  1360. KajetansMod.plots.getDataBank(ProtectionBank.class).addPlot(Math.min(pos1.getX(), pos2.getX()),
  1361. Math.min(pos1.getY(), pos2.getY()),
  1362. Math.min(pos1.getZ(), pos2.getZ()),
  1363. Math.max(pos1.getX(), pos2.getX()),
  1364. Math.max(pos1.getY(), pos2.getY()),
  1365. Math.max(pos1.getZ(), pos2.getZ()),
  1366. ModDimensions.getWorldName(l1.getWorld()), null, args[2].toString());
  1367. }
  1368. private boolean isEqual(Object[] args)
  1369. {
  1370. if(args[0] == null)
  1371. {
  1372. return args[1] == null;
  1373. }
  1374. else if(args[1] == null)
  1375. {
  1376. return args[0] == null;
  1377. }
  1378. else if(args[1] instanceof ItemStack && args[0] instanceof ItemStack)
  1379. {
  1380. return InventoryUtils.stackEqualExact((ItemStack) args[0], (ItemStack) args[1]);
  1381. }
  1382. else if(args[1] instanceof Number && args[0] instanceof Number)
  1383. {
  1384. return ((Number) args[0]).doubleValue() == ((Number) args[1]).doubleValue();
  1385. }
  1386. else if(args[0] instanceof Location && args[1] instanceof Location)
  1387. {
  1388. Location l = (Location) args[0];
  1389. Location l2 = (Location) args[1];
  1390. return l.getPos().equals(l2.getPos()) && l.getWorld().equals(l2.getWorld());
  1391. }
  1392. return args[0].equals(args[1]);
  1393. }
  1394. private void tryFunction(Object[] args, Script qd) throws NoChildTreeException
  1395. {
  1396. qd.goDeeper(false);
  1397. qd.setTryMode(true);
  1398. }
  1399. private void catchFunction(Script qd) throws NoChildTreeException
  1400. {
  1401. if(qd.getTryFail())
  1402. {
  1403. qd.setTryFail(false);
  1404. qd.goDeeper(false);
  1405. }
  1406. }
  1407. private Entity getLastDamager(Object[] args)
  1408. {
  1409. DamageSource ds = ((EntityPlayer) args[0]).getLastDamageSource();
  1410. if(ds == null)
  1411. {
  1412. return null;
  1413. }
  1414. return ds.getSourceOfDamage();
  1415. }
  1416. private SnuviInventory newInventory(Location l, Script qd, String s)
  1417. {
  1418. TileEntityChest chest = (TileEntityChest) l.getWorld().getTileEntity(l.getBlockPos());
  1419. int size = chest.getSizeInventory();
  1420. if(size % 9 != 0)
  1421. {
  1422. size /= 9;
  1423. size++;
  1424. size *= 9;
  1425. }
  1426. SnuviInventory inv = new SnuviInventory(s, size, qd.getNewId());
  1427. for(int i = 0; i < chest.getSizeInventory(); i++)
  1428. {
  1429. inv.setInventorySlotContents(i, chest.getStackInSlot(i).copy());
  1430. }
  1431. return inv;
  1432. }
  1433. private void split(Object[] args, Script qd)
  1434. {
  1435. String[] parts = ScriptUtils.connect(args, 2).split(args[1].toString());
  1436. ArrayList<Object> list = new ArrayList<>();
  1437. for(String s : parts)
  1438. {
  1439. list.add(ScriptUtils.convertInput(s));
  1440. }
  1441. qd.setVar(args[0], list);
  1442. }
  1443. private boolean onlyLetters(String s)
  1444. {
  1445. for(char c : s.toCharArray())
  1446. {
  1447. if(!Character.isLetter(c))
  1448. {
  1449. return false;
  1450. }
  1451. }
  1452. return true;
  1453. }
  1454. private String getName(Object[] args)
  1455. {
  1456. Object o = args[0];
  1457. if(o instanceof EntityPlayer)
  1458. {
  1459. return ((EntityPlayer) o).getName();
  1460. }
  1461. return KajetansMod.playerbank.getDataBank().getName(o.toString());
  1462. }
  1463. private String getUuid(Object[] args)
  1464. {
  1465. Object o = args[0];
  1466. if(o instanceof EntityPlayer)
  1467. {
  1468. return ((EntityPlayer) o).getUniqueID().toString();
  1469. }
  1470. return KajetansMod.playerbank.getDataBank().getUUID(o.toString());
  1471. }
  1472. private String getPotionType(Object[] args)
  1473. {
  1474. return PotionUtils.getPotionFromItem(((EntityPotion) args[0]).getPotion()).getRegistryName().getResourcePath();
  1475. }
  1476. private void setTag(Object[] args)
  1477. {
  1478. if(args[0] instanceof EntityPlayer)
  1479. {
  1480. KajetansMod.playerbank.getDataBank().setTag((EntityPlayer) args[0], args[1].toString(), ScriptUtils.getInt(args[2]));
  1481. return;
  1482. }
  1483. KajetansMod.playerbank.getDataBank().setTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString(), ScriptUtils.getInt(args[2]));
  1484. }
  1485. private int getTag(Object[] args)
  1486. {
  1487. if(args[0] instanceof EntityPlayer)
  1488. {
  1489. return KajetansMod.playerbank.getDataBank().getTag((EntityPlayer) args[0], args[1].toString());
  1490. }
  1491. return KajetansMod.playerbank.getDataBank().getTag(KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()), args[1].toString());
  1492. }
  1493. private void setGlobalVar(Object[] args)
  1494. {
  1495. if(args[0] instanceof EntityPlayer)
  1496. {
  1497. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
  1498. return;
  1499. }
  1500. KajetansMod.scripts.getDataBank(ScriptBank.class).setVar(args[2].toString(), args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
  1501. }
  1502. private Object getGlobalVar(Object[] args)
  1503. {
  1504. if(args[0] instanceof EntityPlayer)
  1505. {
  1506. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), ((EntityPlayer) args[0]).getUniqueID().toString());
  1507. }
  1508. return KajetansMod.scripts.getDataBank(ScriptBank.class).getVar(args[1].toString(), KajetansMod.playerbank.getDataBank().getUUID(args[0].toString()));
  1509. }
  1510. // -------------------------------------------------------------------------
  1511. // Block
  1512. // -------------------------------------------------------------------------
  1513. private int getBlockData(Location l)
  1514. {
  1515. IBlockState state = l.getWorld().getBlockState(l.getBlockPos());
  1516. return state.getBlock().getMetaFromState(state);
  1517. }
  1518. private IBlockState getBlockState(Location l)
  1519. {
  1520. return l.getWorld().getBlockState(l.getBlockPos());
  1521. }
  1522. private ItemStack getStackFromBlock(Location l)
  1523. {
  1524. World w = l.getWorld();
  1525. BlockPos pos = l.getBlockPos();
  1526. IBlockState state = w.getBlockState(pos);
  1527. return state.getBlock().getItem(w, pos, state);
  1528. }
  1529. // -------------------------------------------------------------------------
  1530. // Custom-Handler
  1531. // -------------------------------------------------------------------------
  1532. private void registerShapelessRecipe(Object[] args)
  1533. {
  1534. ItemStack[] stacks = new ItemStack[args.length - 1];
  1535. for(int i = 0; i < stacks.length; i++)
  1536. {
  1537. stacks[i] = (ItemStack) args[i + 1];
  1538. }
  1539. RecipeUtils.registerShapelessRecipe((ItemStack) args[0], stacks);
  1540. }
  1541. private void registerShapedRecipe(Object[] args)
  1542. {
  1543. int counter = 0;
  1544. while(args[counter + 1].getClass() == String.class)
  1545. {
  1546. counter++;
  1547. }
  1548. String[] s = new String[counter];
  1549. for(int i = 0; i < s.length; i++)
  1550. {
  1551. s[i] = args[i + 1].toString();
  1552. }
  1553. ItemStack[] stacks = new ItemStack[args.length - 1 - s.length];
  1554. for(int i = 0; i < stacks.length; i++)
  1555. {
  1556. stacks[i] = (ItemStack) args[i + 1 + counter];
  1557. }
  1558. RecipeUtils.registerShapedRecipe((ItemStack) args[0], s, stacks);
  1559. }
  1560. // -------------------------------------------------------------------------
  1561. // Zeit-Handler
  1562. // -------------------------------------------------------------------------
  1563. private long getNextDay(Object[] args)
  1564. {
  1565. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1566. cal.setTimeInMillis((long) args[0]);
  1567. cal.add(Calendar.DAY_OF_YEAR, 1);
  1568. cal.set(Calendar.HOUR, 0);
  1569. cal.set(Calendar.SECOND, 0);
  1570. cal.set(Calendar.MINUTE, 0);
  1571. cal.set(Calendar.MILLISECOND, 0);
  1572. return cal.getTimeInMillis();
  1573. }
  1574. private int getYear(Object[] args)
  1575. {
  1576. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1577. cal.setTimeInMillis((long) args[0]);
  1578. return cal.get(Calendar.YEAR);
  1579. }
  1580. private int getMonth(Object[] args)
  1581. {
  1582. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1583. cal.setTimeInMillis((long) args[0]);
  1584. return cal.get(Calendar.MONTH) + 1;
  1585. }
  1586. private int getDay(Object[] args)
  1587. {
  1588. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1589. cal.setTimeInMillis((long) args[0]);
  1590. return cal.get(Calendar.DAY_OF_MONTH);
  1591. }
  1592. private int getHour(Object[] args)
  1593. {
  1594. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1595. cal.setTimeInMillis((long) args[0]);
  1596. return cal.get(Calendar.HOUR_OF_DAY);
  1597. }
  1598. private int getMinute(Object[] args)
  1599. {
  1600. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1601. cal.setTimeInMillis((long) args[0]);
  1602. return cal.get(Calendar.MINUTE);
  1603. }
  1604. private int getSecond(Object[] args)
  1605. {
  1606. GregorianCalendar cal = GregorianCalendar.from(ZonedDateTime.now());
  1607. cal.setTimeInMillis((long) args[0]);
  1608. return cal.get(Calendar.SECOND);
  1609. }
  1610. // -------------------------------------------------------------------------
  1611. // Gruppen-Handler
  1612. // -------------------------------------------------------------------------
  1613. private void doForGroup(Object group, Script qd, Consumer<ICommandSender> c) throws UnsupportedOperationException, PlayerNotFoundException
  1614. {
  1615. if(group instanceof String)
  1616. {
  1617. switch(group.toString())
  1618. {
  1619. case "all":
  1620. if(qd.isScript())
  1621. {
  1622. throw new UnsupportedOperationException();
  1623. }
  1624. qd.getPlayers().forEach(p -> c.accept(p));
  1625. break;
  1626. case "online":
  1627. KajetansMod.server.getPlayerList().getPlayers().forEach(p -> c.accept(p));
  1628. break;
  1629. case "dev":
  1630. if(qd.isScript())
  1631. {
  1632. KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
  1633. return;
  1634. }
  1635. qd.getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> c.accept(p));
  1636. break;
  1637. case "server":
  1638. c.accept(KajetansMod.server);
  1639. break;
  1640. default:
  1641. c.accept(Utils.getPlayerByName(group.toString()));
  1642. break;
  1643. }
  1644. return;
  1645. }
  1646. c.accept((EntityPlayer) group);
  1647. }
  1648. private void sendMessageToGroup(Object group, Script qd, String message)
  1649. {
  1650. TextComponentString comp = new TextComponentString(message);
  1651. doForGroup(group, qd, p -> p.sendMessage(comp));
  1652. }
  1653. public void sendMessageWithSuffix(Script qd, String message)
  1654. {
  1655. Module m = KajetansMod.scripts;
  1656. int id = qd.isScript() ? 1 : 0;
  1657. doForGroup("all", qd, p -> m.send(p, message, id));
  1658. }
  1659. private void sendToDevsWithSuffix(Script qd, String message)
  1660. {
  1661. Module m = KajetansMod.scripts;
  1662. int id = qd.isScript() ? 1 : 0;
  1663. doForGroup("dev", qd, p -> m.send(p, message, id));
  1664. }
  1665. public void sendWarningToAllDevs(String message)
  1666. {
  1667. Module m = KajetansMod.scripts;
  1668. String warnMessage = "§4" + message;
  1669. KajetansMod.server.getPlayerList().getPlayers().stream().filter(p -> KajetansMod.perms.has(p, Permissions.SCRIPT_ERROR)).forEach(p -> m.send(p, warnMessage));
  1670. }
  1671. private void sendToDevsWithList(Script qd, String message)
  1672. {
  1673. Module m = KajetansMod.scripts;
  1674. int id = qd.isScript() ? 1 : 0;
  1675. doForGroup("dev", qd, p -> m.sendListElement(p, message, id));
  1676. }
  1677. private void sendToDevsWithHelpList(Script qd, String message, String message2)
  1678. {
  1679. Module m = KajetansMod.scripts;
  1680. int id = qd.isScript() ? 1 : 0;
  1681. doForGroup("dev", qd, p -> m.sendHelpListElement(p, message, message2, id));
  1682. }
  1683. // -------------------------------------------------------------------------
  1684. // Integer-Double-Long-Handler
  1685. // -------------------------------------------------------------------------
  1686. private Number numberHandler(Number a,
  1687. Function<Integer, Integer> f,
  1688. Function<Long, Long> f2,
  1689. Function<Double, Double> f3)
  1690. {
  1691. if(a instanceof Integer)
  1692. {
  1693. return f.apply(a.intValue());
  1694. }
  1695. else if(a instanceof Long)
  1696. {
  1697. return f2.apply(a.longValue());
  1698. }
  1699. return f3.apply(a.doubleValue());
  1700. }
  1701. private Number numberHandler(Object a,
  1702. Function<Integer, Integer> f,
  1703. Function<Long, Long> f2,
  1704. Function<Double, Double> f3)
  1705. {
  1706. return numberHandler((Number) a, f, f2, f3);
  1707. }
  1708. private Number numberHandler(Number a, Number b,
  1709. BiFunction<Integer, Integer, Integer> f,
  1710. BiFunction<Long, Long, Long> f2,
  1711. BiFunction<Double, Double, Double> f3)
  1712. {
  1713. if(a instanceof Integer && b instanceof Integer)
  1714. {
  1715. return f.apply(a.intValue(), b.intValue());
  1716. }
  1717. else if((a instanceof Long || a instanceof Integer) && (b instanceof Long || b instanceof Integer))
  1718. {
  1719. return f2.apply(a.longValue(), b.longValue());
  1720. }
  1721. return f3.apply(a.doubleValue(), b.doubleValue());
  1722. }
  1723. private Number numberHandler(Object a, Object b,
  1724. BiFunction<Integer, Integer, Integer> f,
  1725. BiFunction<Long, Long, Long> f2,
  1726. BiFunction<Double, Double, Double> f3)
  1727. {
  1728. return numberHandler((Number) a, (Number) b, f, f2, f3);
  1729. }
  1730. private Number convertDouble(Double d)
  1731. {
  1732. if(d == d.intValue())
  1733. {
  1734. return d.intValue();
  1735. }
  1736. else if(d == d.longValue())
  1737. {
  1738. return d.longValue();
  1739. }
  1740. return d;
  1741. }
  1742. // -------------------------------------------------------------------------
  1743. // Rundungs-Handler
  1744. // -------------------------------------------------------------------------
  1745. private Number round(Object o)
  1746. {
  1747. Long l = Math.round(ScriptUtils.getDouble(o));
  1748. if(l == l.intValue())
  1749. {
  1750. return l.intValue();
  1751. }
  1752. return l;
  1753. }
  1754. private Number roundDown(Object o)
  1755. {
  1756. Double d = Math.floor(ScriptUtils.getDouble(o));
  1757. if(d == d.intValue())
  1758. {
  1759. return d.intValue();
  1760. }
  1761. return d.longValue();
  1762. }
  1763. private Number roundUp(Object o)
  1764. {
  1765. Double d = Math.ceil(ScriptUtils.getDouble(o));
  1766. if(d == d.intValue())
  1767. {
  1768. return d.intValue();
  1769. }
  1770. return d.longValue();
  1771. }
  1772. }