package me.km.snuviscript; import me.km.KajetansMod; import me.km.api.Module; import java.util.HashMap; import java.util.HashSet; import java.util.UUID; import me.hammerle.code.SnuviParser; import me.hammerle.code.ScriptUtils; import me.hammerle.exceptions.PreScriptException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.text.TextFormatting; public class ScriptModule extends Module { private final SnuviParser parser; protected final MinecraftFunctions logger; private final HashMap playerScript; private final HashSet scriptCommands; public ScriptModule(String mname, String prefix, TextFormatting color) { super(mname, prefix, color); logger = new MinecraftFunctions(); parser = new SnuviParser(logger, KajetansMod.scheduler); MinecraftFunctions.registerFunctions(parser); playerScript = new HashMap<>(); scriptCommands = new HashSet<>(); } public SnuviParser getSnuviParser() { return parser; } // ------------------------------------------------------------------------- // custom commands // ------------------------------------------------------------------------- public boolean isRegisteredScriptCommand(String s) { return scriptCommands.contains(s); } public void registerScriptCommand(String s) { scriptCommands.add(s); } public void unregisterScriptCommand(String s) { scriptCommands.remove(s); } public void clearScriptCommands() { scriptCommands.clear(); } // ------------------------------------------------------------------------- // Quest - Control // ------------------------------------------------------------------------- private void addPlayerToScript(EntityPlayer p, EntityPlayer p2, PlayerScript qd) { if(hasScript(p)) { this.send(p, "Du hast bereits eine Quest."); return; } if(qd == null) { if(p2 != null) { this.send(p, p2.getName() + " hat keine aktive Quest."); } return; } if(qd.getBooleanVar("no_join")) { this.send(p, "Du darfst dieser Quest nicht beitreten."); return; } playerScript.put(p.getUniqueID(), qd.getId()); qd.addPlayer(p); if(!qd.getBooleanVar("no_quest_msg")) { MinecraftFunctions.sendMessageWithSuffix(qd, p.getName() + " ist deiner Quest beigetreten."); if(p2 != null) { this.send(p, "Du bist nun in der Quest von " + p2.getName() + "."); } else { this.send(p, "Du bist einer bereits laufenden Quest beigetreten."); } } qd.setVar("event", "player_join"); ScriptVars.setPlayerVars(qd, p); qd.runCode(); } public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2) { addPlayerToScript(p, p2, getScript(p2)); } public void addPlayerToQuest(EntityPlayer p, PlayerScript qd) { addPlayerToScript(p, null, qd); } public boolean hasScript(EntityPlayer p) { return playerScript.containsKey(p.getUniqueID()); } public PlayerScript getScript(EntityPlayer p) { Integer id = playerScript.get(p.getUniqueID()); if(id == null) { return null; } try { PlayerScript qd = (PlayerScript) parser.getScript(id); if(qd == null) { playerScript.remove(p.getUniqueID()); MinecraftFunctions.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt."); return null; } return qd; } catch(ClassCastException ex) { return null; } } public void removePlayerFromScript(EntityPlayer p, PlayerScript qd) { if(qd == null) { return; } if(qd.removePlayer(p)) { parser.termSafe(qd); } playerScript.remove(p.getUniqueID()); } public boolean isActive(String name) { return parser.getScripts().stream().anyMatch(sc -> sc.getName().equals(name)); } // ----------------------- // Quests / Scripts loading and starting // ----------------------- public void startQuest(ICommandSender sender, String name, EntityPlayer p) { if(hasScript(p)) { this.send(sender, "Du hast bereits eine Quest."); return; } PlayerScript other = (PlayerScript) parser.getScripts().stream() .filter(qd -> qd.getClass() == PlayerScript.class) .filter(qd -> qd.getVar("add_if_name") != null) .filter(qd -> qd.getVar("add_if_name").equals(name)) .findAny().orElse(null); if(other != null) { addPlayerToQuest(p, other); return; } parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p); } public void startScript(ICommandSender sender, String name) { try { parser.startScript(MinecraftScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), true); } catch(PreScriptException ex) { logger.printException(ex); } } }