diff options
| author | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-12 22:33:32 -0800 |
| commit | c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9 (patch) | |
| tree | df9f48bf128a6c0186a8e91857d6ff30fe0e9f18 /NET/worlds/network/Galaxy.java | |
| download | worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.tar.xz worldsplayer-c7a9d4a6bd53ed7d61731770f2f10e8b9fd435f9.zip | |
Initial commit
Diffstat (limited to 'NET/worlds/network/Galaxy.java')
| -rw-r--r-- | NET/worlds/network/Galaxy.java | 768 |
1 files changed, 768 insertions, 0 deletions
diff --git a/NET/worlds/network/Galaxy.java b/NET/worlds/network/Galaxy.java new file mode 100644 index 0000000..5d00115 --- /dev/null +++ b/NET/worlds/network/Galaxy.java @@ -0,0 +1,768 @@ +package NET.worlds.network; + +import NET.worlds.console.Console; +import NET.worlds.console.DialogReceiver; +import NET.worlds.console.InternetConnectionDialog; +import NET.worlds.console.LoginWizard; +import NET.worlds.core.IniFile; +import java.util.Enumeration; +import java.util.Hashtable; + +public class Galaxy implements DialogReceiver { + private static Hashtable<String, Galaxy> _galaxyHash = new Hashtable<String, Galaxy>(); + private static boolean _globalUserAllowsOnline = true; + private boolean _localUserAllowsOnline = true; + private ServerURL _serverURL; + private int _serverType; + private int _worldCount; + private Hashtable<String, NetworkObject> _nFlongID; + private ServerTracker _serverTracker; + private RoomMgr _roomTable; + private String _channel; + private String _username; + private String _usernameU; + private String _password; + private String _serial; + private String _newUsername; + private String _newPassword; + private int _mode; + private NetworkMulti _consoleList; + private int _retriesLeft = 2; + private InternetConnectionDialog _icd; + private LoginWizard _wizard; + private Object _wizardMutex = new Object(); + private static int _debugLevel = IniFile.gamma().getIniInt("netdebug", 0); + private WaitList _waiters; + private boolean _relogin; + private boolean _onlineEnabled; + private boolean _online; + private boolean sentFriendsList; + private int protocolLevel; + + static { + if (_debugLevel > 0) { + System.out.println("NETWORK DEBUGGING LEVEL = " + _debugLevel); + } + } + + private Galaxy(ServerURL serverURL) { + this._serverURL = serverURL; + this._serverType = 0; + this._nFlongID = new Hashtable<String, NetworkObject>(); + this._worldCount = 0; + this._channel = ""; + this._serverTracker = new ServerTracker(this); + this._waiters = new WaitList(this); + this._username = ""; + this._usernameU = ""; + this._consoleList = new NetworkMulti(this._username, this); + this.regObject(this._username, this._consoleList); + if (serverURL == null) { + this._onlineEnabled = false; + this._online = false; + } else { + this._onlineEnabled = true; + this._online = false; + } + + this.setOnlineState(this._onlineEnabled, this._online); + } + + private synchronized void incWorldCount() { + this._worldCount++; + } + + public synchronized void decWorldCount() { + this._worldCount--; + + assert this._worldCount >= 0; + + if (this._worldCount <= 0) { + if (this._serverURL != null) { + _galaxyHash.remove(this._serverURL.getHost()); + } + + this._waiters.clear(); + this._serverTracker = new ServerTracker(this); + } + } + + public static Galaxy getGalaxy(String strServerURL) throws InvalidServerURLException { + ServerURL serverURL = new ServerURL(strServerURL); + String serverHost = serverURL.getHost(); + Galaxy reqGal = _galaxyHash.get(serverHost); + if (reqGal == null) { + reqGal = new Galaxy(serverURL); + _galaxyHash.put(serverHost, reqGal); + } + + assert reqGal != null; + + reqGal.incWorldCount(); + return reqGal; + } + + public static Galaxy getGalaxy(URL serverURL) throws InvalidServerURLException { + return getGalaxy(serverURL.unalias()); + } + + public static Galaxy getAnonGalaxy() { + Galaxy reqGal = new Galaxy(null); + reqGal.incWorldCount(); + return reqGal; + } + + public boolean isAnonymous() { + return this._serverURL == null; + } + + public WorldServer getServer(String StrServerURL) throws InvalidServerURLException { + if (this._serverURL == null) { + return null; + } else if (!_globalUserAllowsOnline) { + return null; + } else if (!this._localUserAllowsOnline) { + return null; + } else if (this._icd != null) { + return null; + } else { + synchronized (this._wizardMutex) { + if (this._wizard != null && !this._wizard.waitingForConnection() && !this._wizard.safeToQueryServer()) { + return null; + } + } + + return this._serverTracker.getServer(StrServerURL); + } + } + + public WorldServer getServer(URL serverURL) throws InvalidServerURLException { + return this.getServer(serverURL.unalias()); + } + + public boolean isActive() { + return this._serverTracker.isActive(); + } + + protected boolean addPendingServer(WorldServer ws) { + assert ws != null; + + boolean firstOnline = this._serverTracker.addPendingServer(ws); + if (firstOnline) { + this._retriesLeft = 2; + this.setOnlineState(true, true); + synchronized (this) { + this._roomTable = new RoomMgr(); + } + } + + return firstOnline; + } + + void addActiveServer(WorldServer ws) { + boolean firstActive = this._serverTracker.addActiveServer(ws); + if (firstActive) { + this._waiters.notify(true); + if (this._wizard != null) { + System.out.println("LWDB: calling " + this._wizard + " setConnected"); + this._wizard.setConnected(); + } + } + } + + boolean addClosingServer(WorldServer ws) { + assert this._nFlongID != null; + + assert ws != null; + + boolean lastActive = this._serverTracker.addClosingServer(ws); + if (lastActive) { + this.forceDisconnect(); + } + + return lastActive; + } + + void markClosedServer(WorldServer ws) { + this._serverTracker.markClosedServer(ws); + } + + void killServer(WorldServer serv) { + this._serverTracker.killServer(serv); + } + + protected void noteServerDeath(VarErrorException lastError) { + synchronized (this._serverTracker) { + if (!this._serverTracker.isActive()) { + synchronized (this) { + this._roomTable = null; + } + + this.setOnlineState(false, false); + if (this.getProtocol() == 0) { + this._icd = new InternetConnectionDialog(this, lastError); + } else { + if (lastError != null && (!lastError.getStatusFlag() || this._relogin)) { + _globalUserAllowsOnline = true; + boolean tryBackup = false; + synchronized (this._serverTracker) { + Enumeration<WorldServer> list = this._serverTracker.getAllServers(); + + while (list.hasMoreElements()) { + WorldServer ws = list.nextElement(); + if (ws.useBackupServer()) { + tryBackup = true; + } + } + } + + if (tryBackup) { + System.out.println("Server death noted, trying alternate."); + this.setChatname(this._username); + this.goOnline(); + } else { + System.out.println("Server death noted, no more alternates. How sad."); + if (this._retriesLeft <= 0 || !this._relogin && !lastError.getRetryFlag()) { + this.setChatname(""); + this.killZombies(); + if (this._wizard == null) { + this._wizard = new LoginWizard(this, this.getIniSection(), lastError.getMsg()); + System.out.println("LWDB: brought up " + this._wizard + " error " + lastError.getMsg()); + } else { + System.out.println("LWDB: reporting error " + lastError.getMsg() + " to " + this._wizard); + this._wizard.loginError(lastError.getMsg()); + } + } else { + System.out.println(this + ": doing retry on " + lastError); + this._retriesLeft = this._retriesLeft - lastError.getRetryCount(); + this.setChatname(this._username); + this.goOnline(); + } + } + + this._relogin = false; + } else { + this.setOnlineState(true, false); + } + } + } + } + } + + public void waitForConnection(ConnectionWaiter cw) { + this._waiters.addWaiter(cw); + } + + public void goOffline(boolean relogin) { + this._relogin = relogin; + if (!this._serverTracker.isActive()) { + this._relogin = false; + } + + synchronized (this._serverTracker) { + Enumeration<WorldServer> list = this._serverTracker.getAllServers(); + + while (list.hasMoreElements()) { + WorldServer ws = list.nextElement(); + ws.forceOffline(); + } + } + } + + private void killZombies() { + synchronized (this._serverTracker) { + Enumeration<WorldServer> list = this._serverTracker.getAllServers(); + + while (list.hasMoreElements()) { + list.nextElement().killZombies(); + } + } + } + + void goOnline() { + synchronized (this._serverTracker) { + Enumeration<WorldServer> list = this._serverTracker.getAllServers(); + + while (list.hasMoreElements()) { + WorldServer ws = list.nextElement(); + ws.goOnline(); + } + } + + this.reacquireServer(null); + } + + public static synchronized void forceOffline(boolean relogin) { + if (_globalUserAllowsOnline) { + _globalUserAllowsOnline = false; + synchronized (_galaxyHash) { + Enumeration<Galaxy> list = _galaxyHash.elements(); + + while (list.hasMoreElements()) { + Galaxy g = list.nextElement(); + g.goOffline(relogin); + } + } + } + } + + public void localForceOnline() { + _globalUserAllowsOnline = true; + this._relogin = false; + if (!this.isActive()) { + this.setOnlineState(false, false); + this._localUserAllowsOnline = true; + if (this.getGalaxyType() != 0) { + this.setChatname(""); + this._wizard = new LoginWizard(this, this.getIniSection()); + System.out.println("LWDB: brought up " + this._wizard + " in localForceOnline"); + } else { + this.reacquireServer(null); + } + } + } + + public static int getDebugLevel() { + return _debugLevel; + } + + public static void printDebugging() { + System.out.println("----GALAXY DEBUGGING-------"); + Enumeration<Galaxy> e = _galaxyHash.elements(); + + while (e.hasMoreElements()) { + Galaxy g = e.nextElement(); + System.out.println(g + " : "); + System.out.println(g._serverTracker); + } + + System.out.println("---------------------------"); + } + + public String getChannel() { + return this._channel; + } + + void setChannel(String channel) { + this.changeChannel(channel, false); + } + + public void changeChannel(String channel) { + if (channel == null) { + channel = ""; + } + + channel = channel.replace(' ', '_'); + channel = channel.replace('<', '{'); + channel = channel.replace('>', '}'); + this.changeChannel(channel, true); + } + + private void changeChannel(String channel, boolean sendMsg) { + if (!channel.equals(this._channel)) { + String oldChannel = this._channel; + this._channel = channel; + Hashtable<String, NetworkObject> tmpIDtable = (Hashtable<String, NetworkObject>)this._nFlongID.clone(); + Enumeration<NetworkObject> e = tmpIDtable.elements(); + + while (e.hasMoreElements()) { + NetworkObject no = e.nextElement(); + + assert no != null; + + no.changeChannel(this, oldChannel, this._channel); + } + + if (sendMsg) { + WorldServer ws = this._serverTracker.getActive(this); + if (ws != null) { + ws.tmpRefCnt(this); + + try { + ws.sendNetworkMsg(new ChannelCmd(channel)); + } catch (PacketTooLargeException var8) { + assert false; + } catch (InfiniteWaitException var9) { + } + } + } + } + } + + public ServerURL getServerURL() { + return this._serverURL; + } + + @Override + public String toString() { + return this._serverURL == null ? "AnonGalaxy=" + super.toString() : "Galaxy[" + this._serverURL + "]"; + } + + void swapServer(WorldServer oldServ, WorldServer newServ) { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".swapServer(" + oldServ + ", " + newServ + ")"); + } + + this._serverTracker.swapServer(oldServ, newServ); + this.reacquireServer(oldServ); + } + + void reacquireServer(WorldServer oldServ) { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".reacquireServer(" + oldServ + ")"); + } + + Enumeration<NetworkObject> e = this._nFlongID.elements(); + + while (e.hasMoreElements()) { + e.nextElement().reacquireServer(oldServ); + } + } + + public void regObject(String longID, NetworkObject obj) { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".regObject(" + longID + ", " + obj + ")"); + } + + this._nFlongID.put(longID, obj); + } + + public NetworkObject getObject(String longID) { + return this._nFlongID.get(longID); + } + + public void delObject(String longID) { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".delObject(" + longID + ")"); + } + + this._nFlongID.remove(longID); + } + + public void forceObjectRereg() { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".forceObjectRereg()"); + } + + Hashtable<String, NetworkObject> oldTable = this._nFlongID; + this._nFlongID = new Hashtable<String, NetworkObject>(); + Enumeration<NetworkObject> e = oldTable.elements(); + + while (e.hasMoreElements()) { + e.nextElement().register(); + } + } + + private void forceDisconnect() { + if ((_debugLevel & 8192) > 0) { + System.out.println(this + ".forceDisconnect()"); + } + + Enumeration<NetworkObject> e = this._nFlongID.elements(); + + while (e.hasMoreElements()) { + NetworkObject no = e.nextElement(); + + assert no != null; + + no.galaxyDisconnected(); + } + } + + void addRoomRequest(String roomName, NetworkRoom room) { + assert this._roomTable != null; + + this._roomTable.addRequest(roomName, room); + } + + void delRoomRequest(String roomName) { + if (this._roomTable != null) { + this._roomTable.delRequest(roomName); + } + } + + NetworkRoom regRoomID(int roomID, String roomName) { + assert this._roomTable != null; + + NetworkRoom room = this._roomTable.getRequest(roomName); + if (roomID != 0 && room != null) { + this._roomTable.regRoomID(roomID, room); + } + + return room; + } + + public void setRoomID(int roomID, NetworkRoom room) { + assert this._roomTable != null; + + assert roomID != 0; + + assert room != null; + + this._roomTable.regRoomID(roomID, room); + } + + void delRoomID(int roomID, NetworkRoom room) { + if (this._roomTable != null) { + this._roomTable.delRoomID(roomID, room); + } + } + + NetworkRoom getRoom(int roomID) { + return this._roomTable == null ? null : this._roomTable.getRoom(roomID); + } + + void setGalaxyType(int type) { + this._serverType = type; + if (_globalUserAllowsOnline) { + this.setOnlineState(false, this._online); + this.setChatname(""); + this._wizard = new LoginWizard(this, this.getIniSection()); + System.out.println("LWDB: brought up " + this._wizard + " in setGalaxyType"); + } + } + + public int getGalaxyType() { + return this._serverType; + } + + public synchronized void setAuthInfo(String usernm, String newUsernm, String passwd, String newPasswd, String serial, int mode) { + _globalUserAllowsOnline = true; + this._localUserAllowsOnline = true; + + assert this._serverType != 0; + + this.setUsernameU(usernm); + this.setChatname(usernm); + this._newUsername = newUsernm; + this._password = passwd; + this._newPassword = newPasswd; + this._serial = serial; + this._mode = mode; + switch (this._serverType) { + case 1: + switch (this._mode) { + case 1: + default: + break; + case 2: + this._serial = null; + break; + case 3: + this._password = null; + this._serial = null; + } + + assert this._mode != 4; + break; + case 3: + assert false; + break; + case 4: + assert this._mode == 2; + case 2: + assert this._mode != 1; + + assert this._mode != 4; + + if (this._password != null && this._password.length() != 0) { + System.out.println(this + ": Password shouldn't be specified."); + } + + this._password = null; + if (this._serial != null && this._serial.length() != 0) { + System.out.println(this + ": Serial number shouldn't be specified."); + } + + this._serial = null; + } + + this.goOnline(); + } + + public String getSerialNum() { + return this._serial; + } + + public String getPassword() { + return this._password; + } + + String getNewPassword() { + return this._newPassword; + } + + public String getChatname() { + return this._username; + } + + String getNewChatname() { + return this._newUsername; + } + + String getGuestExpiration() { + assert false; + + return null; + } + + public int getLoginMode() { + return this._mode; + } + + void setOnlineState(boolean enabled, boolean online) { + synchronized (this) { + this._onlineEnabled = enabled; + this._online = online; + } + + synchronized (this._consoleList) { + Enumeration<NetworkObject> cList = this.getConsoles(); + + while (cList.hasMoreElements()) { + Console c = (Console)cList.nextElement(); + c.setOnlineState(enabled, online); + } + } + } + + public boolean getOnlineEnabled() { + return this._onlineEnabled; + } + + public boolean getOnline() { + return this._online; + } + + void setPassword(String password) { + this._password = password; + } + + void setNewPassword(String password) { + this._newPassword = password; + } + + void setNewChatname(String chatname) { + this._newUsername = chatname; + } + + void setSerialNum(String sn) { + this._serial = sn; + } + + public void setUsernameU(String username) { + this._usernameU = username; + } + + public String getUsernameU() { + return this._usernameU; + } + + void setChatname(String newname) { + synchronized (this) { + this._consoleList = new NetworkMulti(newname, this._consoleList, this); + if (this._username != null) { + this.delObject(this._username); + } + + this.regObject(newname, this._consoleList); + this._username = newname; + } + + synchronized (this._consoleList) { + Enumeration<NetworkObject> cList = this.getConsoles(); + + while (cList.hasMoreElements()) { + Console c = (Console)cList.nextElement(); + c.setChatname(this._username); + } + } + + synchronized (this._serverTracker) { + Enumeration<WorldServer> list = this._serverTracker.getAllServers(); + + while (list.hasMoreElements()) { + WorldServer ws = list.nextElement(); + ws.regShortID(1, this._username); + } + } + } + + public IniFile getIniSection() { + if (this._serverURL == null) { + return new IniFile("UNSHARED"); + } else { + if (this._serverURL.getHost().equals("www.3dcd.com:6650")) { + IniFile i = new IniFile("209.240.84.122:6650"); + if (i.getIniString("User0", "").length() != 0) { + return i; + } + } + + return new IniFile(this._serverURL.getHost()); + } + } + + @Override + public void dialogDone(Object who, boolean confirmed) { + if (who instanceof LoginWizard) { + synchronized (this._wizardMutex) { + System.out.println("LWDB: setting who " + who + " wiz " + this._wizard + " to null"); + this._wizard = null; + } + + if (!confirmed) { + this.setOnlineState(true, false); + this._localUserAllowsOnline = false; + } else { + this._localUserAllowsOnline = true; + _globalUserAllowsOnline = true; + } + } else if (who instanceof InternetConnectionDialog) { + this._icd = null; + if (!confirmed) { + this.setOnlineState(true, false); + this._localUserAllowsOnline = false; + } else { + this._localUserAllowsOnline = true; + _globalUserAllowsOnline = true; + this.reacquireServer(null); + } + } else { + assert false; + } + } + + public void addConsole(Console c) { + assert this._consoleList != null; + + this._consoleList.addObject(c); + this.setOnlineState(this._onlineEnabled, this._online); + } + + public void delConsole(Console c) { + assert this._consoleList != null; + + this._consoleList.delObject(c); + } + + public Enumeration<NetworkObject> getConsoles() { + return this._consoleList.elements(); + } + + public void sentFriendsList(boolean state) { + this.sentFriendsList = state; + } + + public boolean sentFriendsList() { + return this.sentFriendsList; + } + + public int getProtocol() { + return this.protocolLevel; + } + + void setProtocol(int level) { + this.protocolLevel = level; + } +} |