00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.scripts;
00023
00024 import com.realtime.crossfire.jxclient.items.FloorView;
00025 import com.realtime.crossfire.jxclient.items.ItemSet;
00026 import com.realtime.crossfire.jxclient.map.MapUpdaterState;
00027 import com.realtime.crossfire.jxclient.queue.CommandQueue;
00028 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawinfoListener;
00029 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00030 import com.realtime.crossfire.jxclient.skills.SkillSet;
00031 import com.realtime.crossfire.jxclient.spells.Spell;
00032 import com.realtime.crossfire.jxclient.stats.Stats;
00033 import java.io.IOException;
00034 import java.util.Collection;
00035 import java.util.HashSet;
00036 import java.util.Set;
00037 import java.util.concurrent.CopyOnWriteArraySet;
00038 import org.jetbrains.annotations.NotNull;
00039
00044 public class ScriptManager {
00045
00049 @NotNull
00050 private final CommandQueue commandQueue;
00051
00055 @NotNull
00056 private final CrossfireServerConnection crossfireServerConnection;
00057
00061 @NotNull
00062 private final Stats stats;
00063
00067 @NotNull
00068 private final FloorView floorView;
00069
00073 @NotNull
00074 private final ItemSet itemSet;
00075
00079 @NotNull
00080 private final Iterable<Spell> spellsManager;
00081
00085 @NotNull
00086 private final MapUpdaterState mapUpdaterState;
00087
00091 @NotNull
00092 private final SkillSet skillSet;
00093
00097 @NotNull
00098 private final Collection<ScriptProcess> scriptProcesses = new CopyOnWriteArraySet<ScriptProcess>();
00099
00103 private int nextScriptId = 1;
00104
00116 public ScriptManager(@NotNull final CommandQueue commandQueue, @NotNull final CrossfireServerConnection crossfireServerConnection, @NotNull final Stats stats, @NotNull final FloorView floorView, @NotNull final ItemSet itemSet, @NotNull final Iterable<Spell> spellsManager, @NotNull final MapUpdaterState mapUpdaterState, @NotNull final SkillSet skillSet) {
00117 this.commandQueue = commandQueue;
00118 this.crossfireServerConnection = crossfireServerConnection;
00119 this.stats = stats;
00120 this.floorView = floorView;
00121 this.itemSet = itemSet;
00122 this.spellsManager = spellsManager;
00123 this.mapUpdaterState = mapUpdaterState;
00124 this.skillSet = skillSet;
00125 }
00126
00131 public void newScript(@NotNull final String command) {
00132 final DefaultScriptProcess scriptProcess;
00133 try {
00134 scriptProcess = new DefaultScriptProcess(nextScriptId, command, commandQueue, crossfireServerConnection, stats, floorView, itemSet, spellsManager, mapUpdaterState, skillSet);
00135 } catch (final IOException ex) {
00136 crossfireServerConnection.drawInfo("Unable to run script: "+ex.getMessage(), CrossfireDrawinfoListener.NDI_RED);
00137 return;
00138 }
00139 nextScriptId++;
00140 scriptProcesses.add(scriptProcess);
00141 scriptProcess.addScriptProcessListener(new ScriptProcessListener() {
00142
00143 @Override
00144 public void scriptTerminated(final String result) {
00145 scriptProcesses.remove(scriptProcess);
00146 if (result == null) {
00147 crossfireServerConnection.drawInfo("Script '"+scriptProcess+"' finished.", CrossfireDrawinfoListener.NDI_BLACK);
00148 } else {
00149 crossfireServerConnection.drawInfo("Script '"+scriptProcess+"' failed: "+result, CrossfireDrawinfoListener.NDI_RED);
00150 }
00151 }
00152
00153 });
00154 crossfireServerConnection.drawInfo("Script '"+scriptProcess+"' started.", CrossfireDrawinfoListener.NDI_BLACK);
00155 new Thread(scriptProcess, "JXClient:ScriptProcess:"+scriptProcess).start();
00156 }
00157
00165 @NotNull
00166 public Set<ScriptProcess> getScripts(@NotNull final String partialScriptName) {
00167 try {
00168 return getScriptByScriptId(Integer.parseInt(partialScriptName));
00169 } catch (final NumberFormatException ignored) {
00170 return getScriptsByName(partialScriptName);
00171 }
00172 }
00173
00179 @NotNull
00180 private Set<ScriptProcess> getScriptByScriptId(final int scriptId) {
00181 final Set<ScriptProcess> result = new HashSet<ScriptProcess>();
00182 for (final ScriptProcess scriptProcess : scriptProcesses) {
00183 if (scriptProcess.getScriptId() == scriptId) {
00184 result.add(scriptProcess);
00185 break;
00186 }
00187 }
00188 return result;
00189 }
00190
00197 @NotNull
00198 private Set<ScriptProcess> getScriptsByName(@NotNull final CharSequence partialScriptName) {
00199 final Set<ScriptProcess> result = new HashSet<ScriptProcess>();
00200 for (final ScriptProcess scriptProcess : scriptProcesses) {
00201 if (scriptProcess.getFilename().contains(partialScriptName)) {
00202 result.add(scriptProcess);
00203 }
00204 }
00205 return result;
00206 }
00207
00212 public boolean hasScripts() {
00213 return !scriptProcesses.isEmpty();
00214 }
00215
00216 }