QuestParser.java 91 KB

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