001 package net.minecraft.client.gui;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.text.DateFormat;
006 import java.text.SimpleDateFormat;
007 import java.util.Collections;
008 import java.util.List;
009 import net.minecraft.util.MathHelper;
010 import net.minecraft.util.StringTranslate;
011 import net.minecraft.world.EnumGameType;
012 import net.minecraft.world.WorldSettings;
013 import net.minecraft.world.storage.ISaveFormat;
014 import net.minecraft.world.storage.ISaveHandler;
015 import net.minecraft.world.storage.SaveFormatComparator;
016 import net.minecraft.world.storage.WorldInfo;
017
018 @SideOnly(Side.CLIENT)
019 public class GuiSelectWorld extends GuiScreen
020 {
021 /** simple date formater */
022 private final DateFormat dateFormatter = new SimpleDateFormat();
023
024 /**
025 * A reference to the screen object that created this. Used for navigating between screens.
026 */
027 protected GuiScreen parentScreen;
028
029 /** The title string that is displayed in the top-center of the screen. */
030 protected String screenTitle = "Select world";
031
032 /** True if a world has been selected. */
033 private boolean selected = false;
034
035 /** the currently selected world */
036 private int selectedWorld;
037
038 /** The save list for the world selection screen */
039 private List saveList;
040 private GuiWorldSlot worldSlotContainer;
041
042 /** E.g. World, Welt, Monde, Mundo */
043 private String localizedWorldText;
044 private String localizedMustConvertText;
045
046 /**
047 * The game mode text that is displayed with each world on the world selection list.
048 */
049 private String[] localizedGameModeText = new String[3];
050
051 /** set to true if you arein the process of deleteing a world/save */
052 private boolean deleting;
053
054 /** the rename button in the world selection gui */
055 private GuiButton buttonRename;
056
057 /** the select button in the world selection gui */
058 private GuiButton buttonSelect;
059
060 /** the delete button in the world selection gui */
061 private GuiButton buttonDelete;
062 private GuiButton field_82316_w;
063
064 public GuiSelectWorld(GuiScreen par1GuiScreen)
065 {
066 this.parentScreen = par1GuiScreen;
067 }
068
069 /**
070 * Adds the buttons (and other controls) to the screen in question.
071 */
072 public void initGui()
073 {
074 StringTranslate var1 = StringTranslate.getInstance();
075 this.screenTitle = var1.translateKey("selectWorld.title");
076 this.localizedWorldText = var1.translateKey("selectWorld.world");
077 this.localizedMustConvertText = var1.translateKey("selectWorld.conversion");
078 this.localizedGameModeText[EnumGameType.SURVIVAL.getID()] = var1.translateKey("gameMode.survival");
079 this.localizedGameModeText[EnumGameType.CREATIVE.getID()] = var1.translateKey("gameMode.creative");
080 this.localizedGameModeText[EnumGameType.ADVENTURE.getID()] = var1.translateKey("gameMode.adventure");
081 this.loadSaves();
082 this.worldSlotContainer = new GuiWorldSlot(this);
083 this.worldSlotContainer.registerScrollButtons(this.controlList, 4, 5);
084 this.initButtons();
085 }
086
087 /**
088 * loads the saves
089 */
090 private void loadSaves()
091 {
092 ISaveFormat var1 = this.mc.getSaveLoader();
093 this.saveList = var1.getSaveList();
094 Collections.sort(this.saveList);
095 this.selectedWorld = -1;
096 }
097
098 /**
099 * returns the file name of the specified save number
100 */
101 protected String getSaveFileName(int par1)
102 {
103 return ((SaveFormatComparator)this.saveList.get(par1)).getFileName();
104 }
105
106 /**
107 * returns the name of the saved game
108 */
109 protected String getSaveName(int par1)
110 {
111 String var2 = ((SaveFormatComparator)this.saveList.get(par1)).getDisplayName();
112
113 if (var2 == null || MathHelper.stringNullOrLengthZero(var2))
114 {
115 StringTranslate var3 = StringTranslate.getInstance();
116 var2 = var3.translateKey("selectWorld.world") + " " + (par1 + 1);
117 }
118
119 return var2;
120 }
121
122 /**
123 * intilize the buttons for this GUI
124 */
125 public void initButtons()
126 {
127 StringTranslate var1 = StringTranslate.getInstance();
128 this.controlList.add(this.buttonSelect = new GuiButton(1, this.width / 2 - 154, this.height - 52, 150, 20, var1.translateKey("selectWorld.select")));
129 this.controlList.add(new GuiButton(3, this.width / 2 + 4, this.height - 52, 150, 20, var1.translateKey("selectWorld.create")));
130 this.controlList.add(this.buttonDelete = new GuiButton(6, this.width / 2 - 154, this.height - 28, 72, 20, var1.translateKey("selectWorld.rename")));
131 this.controlList.add(this.buttonRename = new GuiButton(2, this.width / 2 - 76, this.height - 28, 72, 20, var1.translateKey("selectWorld.delete")));
132 this.controlList.add(this.field_82316_w = new GuiButton(7, this.width / 2 + 4, this.height - 28, 72, 20, var1.translateKey("selectWorld.recreate")));
133 this.controlList.add(new GuiButton(0, this.width / 2 + 82, this.height - 28, 72, 20, var1.translateKey("gui.cancel")));
134 this.buttonSelect.enabled = false;
135 this.buttonRename.enabled = false;
136 this.buttonDelete.enabled = false;
137 this.field_82316_w.enabled = false;
138 }
139
140 /**
141 * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
142 */
143 protected void actionPerformed(GuiButton par1GuiButton)
144 {
145 if (par1GuiButton.enabled)
146 {
147 if (par1GuiButton.id == 2)
148 {
149 String var2 = this.getSaveName(this.selectedWorld);
150
151 if (var2 != null)
152 {
153 this.deleting = true;
154 GuiYesNo var3 = getDeleteWorldScreen(this, var2, this.selectedWorld);
155 this.mc.displayGuiScreen(var3);
156 }
157 }
158 else if (par1GuiButton.id == 1)
159 {
160 this.selectWorld(this.selectedWorld);
161 }
162 else if (par1GuiButton.id == 3)
163 {
164 this.mc.displayGuiScreen(new GuiCreateWorld(this));
165 }
166 else if (par1GuiButton.id == 6)
167 {
168 this.mc.displayGuiScreen(new GuiRenameWorld(this, this.getSaveFileName(this.selectedWorld)));
169 }
170 else if (par1GuiButton.id == 0)
171 {
172 this.mc.displayGuiScreen(this.parentScreen);
173 }
174 else if (par1GuiButton.id == 7)
175 {
176 GuiCreateWorld var5 = new GuiCreateWorld(this);
177 ISaveHandler var6 = this.mc.getSaveLoader().getSaveLoader(this.getSaveFileName(this.selectedWorld), false);
178 WorldInfo var4 = var6.loadWorldInfo();
179 var6.flush();
180 var5.func_82286_a(var4);
181 this.mc.displayGuiScreen(var5);
182 }
183 else
184 {
185 this.worldSlotContainer.actionPerformed(par1GuiButton);
186 }
187 }
188 }
189
190 /**
191 * Gets the selected world.
192 */
193 public void selectWorld(int par1)
194 {
195 this.mc.displayGuiScreen((GuiScreen)null);
196
197 if (!this.selected)
198 {
199 this.selected = true;
200 String var2 = this.getSaveFileName(par1);
201
202 if (var2 == null)
203 {
204 var2 = "World" + par1;
205 }
206
207 String var3 = this.getSaveName(par1);
208
209 if (var3 == null)
210 {
211 var3 = "World" + par1;
212 }
213
214 if (this.mc.getSaveLoader().canLoadWorld(var2))
215 {
216 this.mc.launchIntegratedServer(var2, var3, (WorldSettings)null);
217 }
218 }
219 }
220
221 public void confirmClicked(boolean par1, int par2)
222 {
223 if (this.deleting)
224 {
225 this.deleting = false;
226
227 if (par1)
228 {
229 ISaveFormat var3 = this.mc.getSaveLoader();
230 var3.flushCache();
231 var3.deleteWorldDirectory(this.getSaveFileName(par2));
232 this.loadSaves();
233 }
234
235 this.mc.displayGuiScreen(this);
236 }
237 }
238
239 /**
240 * Draws the screen and all the components in it.
241 */
242 public void drawScreen(int par1, int par2, float par3)
243 {
244 this.worldSlotContainer.drawScreen(par1, par2, par3);
245 this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 20, 16777215);
246 super.drawScreen(par1, par2, par3);
247 }
248
249 /**
250 * Gets a GuiYesNo screen with the warning, buttons, etc.
251 */
252 public static GuiYesNo getDeleteWorldScreen(GuiScreen par0GuiScreen, String par1Str, int par2)
253 {
254 StringTranslate var3 = StringTranslate.getInstance();
255 String var4 = var3.translateKey("selectWorld.deleteQuestion");
256 String var5 = "\'" + par1Str + "\' " + var3.translateKey("selectWorld.deleteWarning");
257 String var6 = var3.translateKey("selectWorld.deleteButton");
258 String var7 = var3.translateKey("gui.cancel");
259 GuiYesNo var8 = new GuiYesNo(par0GuiScreen, var4, var5, var6, var7, par2);
260 return var8;
261 }
262
263 static List getSize(GuiSelectWorld par0GuiSelectWorld)
264 {
265 return par0GuiSelectWorld.saveList;
266 }
267
268 /**
269 * called whenever an element in this gui is selected
270 */
271 static int onElementSelected(GuiSelectWorld par0GuiSelectWorld, int par1)
272 {
273 return par0GuiSelectWorld.selectedWorld = par1;
274 }
275
276 /**
277 * returns the world currently selected
278 */
279 static int getSelectedWorld(GuiSelectWorld par0GuiSelectWorld)
280 {
281 return par0GuiSelectWorld.selectedWorld;
282 }
283
284 /**
285 * returns the select button
286 */
287 static GuiButton getSelectButton(GuiSelectWorld par0GuiSelectWorld)
288 {
289 return par0GuiSelectWorld.buttonSelect;
290 }
291
292 /**
293 * returns the rename button
294 */
295 static GuiButton getRenameButton(GuiSelectWorld par0GuiSelectWorld)
296 {
297 return par0GuiSelectWorld.buttonRename;
298 }
299
300 /**
301 * returns the delete button
302 */
303 static GuiButton getDeleteButton(GuiSelectWorld par0GuiSelectWorld)
304 {
305 return par0GuiSelectWorld.buttonDelete;
306 }
307
308 static GuiButton func_82312_f(GuiSelectWorld par0GuiSelectWorld)
309 {
310 return par0GuiSelectWorld.field_82316_w;
311 }
312
313 static String func_82313_g(GuiSelectWorld par0GuiSelectWorld)
314 {
315 return par0GuiSelectWorld.localizedWorldText;
316 }
317
318 static DateFormat func_82315_h(GuiSelectWorld par0GuiSelectWorld)
319 {
320 return par0GuiSelectWorld.dateFormatter;
321 }
322
323 static String func_82311_i(GuiSelectWorld par0GuiSelectWorld)
324 {
325 return par0GuiSelectWorld.localizedMustConvertText;
326 }
327
328 static String[] func_82314_j(GuiSelectWorld par0GuiSelectWorld)
329 {
330 return par0GuiSelectWorld.localizedGameModeText;
331 }
332 }