Changeset 59c2dd0c6381876fa119b4c740931f0e843d5218
- Timestamp:
- 06/16/07 17:10:09 (2 years ago)
- git-parent:
- Files:
-
- src/net/driftingsouls/ds2/server/ships/Ship.java (modified) (5 diffs)
- src/net/driftingsouls/ds2/server/ships/Ships.java (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
src/net/driftingsouls/ds2/server/ships/Ship.java
ree931ae r59c2dd0 37 37 38 38 import net.driftingsouls.ds2.server.ContextCommon; 39 import net.driftingsouls.ds2.server.Location; 39 40 import net.driftingsouls.ds2.server.Offizier; 40 41 import net.driftingsouls.ds2.server.cargo.Cargo; 42 import net.driftingsouls.ds2.server.cargo.ItemCargoEntry; 41 43 import net.driftingsouls.ds2.server.cargo.Resources; 42 44 import net.driftingsouls.ds2.server.cargo.modules.Module; 43 45 import net.driftingsouls.ds2.server.cargo.modules.Modules; 46 import net.driftingsouls.ds2.server.config.Item; 44 47 import net.driftingsouls.ds2.server.config.ItemEffect; 45 48 import net.driftingsouls.ds2.server.entities.User; 49 import net.driftingsouls.ds2.server.entities.UserFlagschiffLocation; 46 50 import net.driftingsouls.ds2.server.framework.Common; 47 51 import net.driftingsouls.ds2.server.framework.Configuration; 52 import net.driftingsouls.ds2.server.framework.ContextLocalMessage; 48 53 import net.driftingsouls.ds2.server.framework.ContextMap; 49 54 import net.driftingsouls.ds2.server.framework.Loggable; 50 55 import net.driftingsouls.ds2.server.framework.db.Database; 51 56 import net.driftingsouls.ds2.server.framework.db.SQLResultRow; 57 import net.driftingsouls.ds2.server.ships.Ships.DockMode; 52 58 import net.driftingsouls.ds2.server.ships.Ships.ModuleEntry; 59 import net.driftingsouls.ds2.server.tasks.Task; 53 60 import net.driftingsouls.ds2.server.tasks.Taskmanager; 54 61 … … 65 72 @Table(name="ships") 66 73 public class Ship implements Loggable { 74 /** 75 * Objekt mit Funktionsmeldungen 76 */ 77 public static final ContextLocalMessage MESSAGE = new ContextLocalMessage(); 78 67 79 @Id @GeneratedValue 68 80 private int id; … … 1180 1192 public void generateLoot( int destroyer ) { 1181 1193 org.hibernate.Session db = ContextMap.getContext().getDB(); 1182 1194 1183 1195 ShipTypeData shiptype = this.getTypeData(); 1184 1196 … … 1291 1303 1292 1304 /** 1305 * Entfernt das Schiff aus der Datenbank 1306 */ 1307 public void destroy() { 1308 org.hibernate.Session db = ContextMap.getContext().getDB(); 1309 1310 // Checken wir mal ob die Flotte danach noch bestehen darf.... 1311 if( this.fleet != null ) { 1312 int fleetcount = (Integer)db.createQuery("select count(*) from Ship where fleet=?") 1313 .setInteger(0, fleet.getId()) 1314 .iterate().next(); 1315 if( fleetcount <= 2 ) { 1316 db.delete(this.fleet); 1317 this.fleet = null; 1318 } 1319 } 1320 1321 // Ist das Schiff selbst gedockt? -> Abdocken 1322 if( !this.docked.equals("") && (this.docked.charAt(0) != 'l') ) { 1323 Ships.dock( DockMode.UNDOCK, this.owner.getID(), Integer.parseInt(this.docked), new int[] {this.id} ); 1324 } 1325 1326 // Wenn es das Flagschiff ist -> Flagschiff auf null setzen 1327 if( (this.owner.getFlagschiff() != null) && (this.id == this.owner.getFlagschiff().getID()) ) { 1328 this.owner.setFlagschiff(null); 1329 } 1330 1331 // Evt. gedockte Schiffe abdocken 1332 ShipTypeData type = this.getTypeData(); 1333 if( type.getADocks() != 0 ) { 1334 Ships.dock( DockMode.UNDOCK, this.owner.getID(), this.id, null ); 1335 } 1336 if( type.getJDocks() != 0 ) { 1337 Ships.dock( DockMode.START, this.owner.getID(), this.id, null ); 1338 } 1339 1340 // Gibts bereits eine Loesch-Task? Wenn ja, dann diese entfernen 1341 Taskmanager taskmanager = Taskmanager.getInstance(); 1342 Task[] tasks = taskmanager.getTasksByData( Taskmanager.Types.SHIP_DESTROY_COUNTDOWN, Integer.toString(this.id), "*", "*"); 1343 for( int i=0; i < tasks.length; i++ ) { 1344 taskmanager.removeTask(tasks[i].getTaskID()); 1345 } 1346 1347 // Falls eine respawn-Zeit gesetzt ist und ein Respawn-Image existiert -> respawn-Task setzen 1348 if( this.respawn != 0 ) { 1349 Ship negship = (Ship)db.get(Ship.class, -this.id); 1350 if( negship != null ) { 1351 taskmanager.addTask(Taskmanager.Types.SHIP_RESPAWN_COUNTDOWN, this.respawn, Integer.toString(-this.id), "", ""); 1352 } 1353 } 1354 1355 // Und nun loeschen wir es... 1356 db.createQuery("delete from Offizier where dest=?") 1357 .setString(0, "s "+this.id) 1358 .executeUpdate(); 1359 1360 db.createQuery("delete from Jump where shipid=?") 1361 .setInteger(0, this.id) 1362 .executeUpdate(); 1363 1364 ContextMap.getContext().getDatabase().update("DELETE FROM werften WHERE shipid=",this.id); 1365 1366 db.createQuery("delete from ShipModules where id=?") 1367 .setInteger(0, this.id) 1368 .executeUpdate(); 1369 db.delete(this); 1370 } 1371 1372 /** 1373 * Uebergibt ein Schiff an einen anderen Spieler. Gedockte/Gelandete Schiffe 1374 * werden, falls moeglich, mituebergeben. 1375 * @param newowner Der neue Besitzer des Schiffs 1376 * @param testonly Soll nur getestet (<code>true</code>) oder wirklich uebergeben werden (<code>false</code>) 1377 * @return <code>true</code>, falls ein Fehler bei der Uebergabe aufgetaucht ist (Uebergabe nicht erfolgreich) 1378 */ 1379 public boolean consign( User newowner, boolean testonly ) { 1380 org.hibernate.Session db = ContextMap.getContext().getDB(); 1381 1382 if( this.id < 0 ) { 1383 throw new UnsupportedOperationException("consign kann nur bei Schiffen mit positiver ID ausgefuhert werden!"); 1384 } 1385 1386 if( newowner == null ) { 1387 MESSAGE.get().append("Der angegebene Spieler existiert nicht"); 1388 return true; 1389 } 1390 1391 if( (newowner.getVacationCount() != 0) && (newowner.getWait4VacationCount() == 0) ) { 1392 MESSAGE.get().append("Sie können keine Schiffe an Spieler übergeben, welche sich im Vacation-Modus befinden"); 1393 return true; 1394 } 1395 1396 if( newowner.hasFlag( User.FLAG_NO_SHIP_CONSIGN ) ) { 1397 MESSAGE.get().append("Sie können diesem Spieler keine Schiffe übergeben"); 1398 } 1399 1400 if( this.lock != null ) { 1401 MESSAGE.get().append("Die '"+this.name+"'("+this.id+") kann nicht übergeben werden, da diese in ein Quest eingebunden ist"); 1402 return true; 1403 } 1404 1405 if( this.status.indexOf("noconsign") != -1 ) { 1406 MESSAGE.get().append("Die '"+this.name+"' ("+this.id+") kann nicht übergeben werden"); 1407 return true; 1408 } 1409 1410 UserFlagschiffLocation flagschiff = this.owner.getFlagschiff(); 1411 1412 boolean result = true; 1413 if( (flagschiff != null) && (flagschiff.getID() == this.id) ) { 1414 result = newowner.hasFlagschiffSpace(); 1415 } 1416 1417 if( !result ) { 1418 MESSAGE.get().append("Die "+this.name+" ("+this.id+") kann nicht übergeben werden, da der Spieler bereits über ein Flagschiff verfügt"); 1419 return true; 1420 } 1421 1422 User oldOwner = this.owner; 1423 1424 if( !testonly ) { 1425 this.history += "Übergeben am [tick="+ContextMap.getContext().get(ContextCommon.class).getTick()+"] an "+newowner.getName()+" ("+newowner.getID()+")\n"; 1426 1427 this.owner = newowner; 1428 db.createQuery("update Offizier set userid=? where dest=?") 1429 .setEntity(0, newowner) 1430 .setString(1, "s "+this.id) 1431 .executeUpdate(); 1432 1433 Common.dblog( "consign", Integer.toString(this.id), Integer.toString(newowner.getID()), 1434 "pos", new Location(this.system, this.x, this.y).toString(), 1435 "shiptype", Integer.toString(this.type) ); 1436 1437 if( (flagschiff != null) && (flagschiff.getType() == UserFlagschiffLocation.Type.SHIP) && 1438 (flagschiff.getID() == this.id) ) { 1439 oldOwner.setFlagschiff(null); 1440 newowner.setFlagschiff(this.id); 1441 } 1442 } 1443 1444 StringBuilder message = MESSAGE.get(); 1445 List s = db.createQuery("from Ship where id>0 and docked in (?,?)") 1446 .setString(0, Integer.toString(this.id)) 1447 .setString(1, "l "+this.id) 1448 .list(); 1449 for( Iterator iter=s.iterator(); iter.hasNext(); ) { 1450 Ship aship = (Ship)iter.next(); 1451 int oldlength = message.length(); 1452 boolean tmp = aship.consign(newowner, testonly ); 1453 if( tmp && !testonly ) { 1454 Ships.dock( (aship.getDocked().charAt(0) == 'l' ? DockMode.START : DockMode.UNDOCK), newowner.getID(),this.id, new int[] {aship.getId()}); 1455 } 1456 1457 if( oldlength != message.length() ) { 1458 message.insert(oldlength-1, "<br />"); 1459 } 1460 } 1461 1462 Cargo cargo = this.cargo; 1463 List<ItemCargoEntry> itemlist = cargo.getItems(); 1464 for( ItemCargoEntry item : itemlist ) { 1465 Item itemobject = item.getItemObject(); 1466 if( itemobject.isUnknownItem() ) { 1467 newowner.addKnownItem(item.getItemID()); 1468 } 1469 } 1470 1471 return false; 1472 } 1473 1474 /** 1475 * Entfernt das Schiff aus der Flotte. 1476 */ 1477 public void removeFromFleet() { 1478 org.hibernate.Session db = ContextMap.getContext().getDB(); 1479 1480 if( this.id < 0 ) { 1481 throw new UnsupportedOperationException("removeFromFleet kann nur bei Schiffen mit positiver ID ausgefuhert werden!"); 1482 } 1483 1484 if( this.fleet == null ) { 1485 return; 1486 } 1487 1488 int fleetcount = (Integer)db.createQuery("select count(*) from Ship where fleet=? and id>0") 1489 .setInteger(0, fleet.getId()) 1490 .iterate().next(); 1491 1492 if( fleetcount > 2 ) { 1493 this.fleet = null; 1494 MESSAGE.get().append("aus der Flotte ausgetreten"); 1495 } 1496 else { 1497 db.delete(this.fleet); 1498 this.fleet = null; 1499 MESSAGE.get().append("Flotte aufgelößt"); 1500 } 1501 } 1502 1503 /** 1293 1504 * Gibt die Liste aller Flags zurueck, ueber die der angegebene 1294 1505 * Schiffstyp verfuegt … … 1357 1568 1358 1569 Database database = ContextMap.getContext().getDatabase(); 1359 SQLResultRow shipdata = database.prepare("SELECT type,status FROM ships WHERE id >0 AND id= ?")1570 SQLResultRow shipdata = database.prepare("SELECT type,status FROM ships WHERE id= ?") 1360 1571 .first(shiptype); 1361 1572 src/net/driftingsouls/ds2/server/ships/Ships.java
ree931ae r59c2dd0 30 30 import net.driftingsouls.ds2.server.battles.Battle; 31 31 import net.driftingsouls.ds2.server.cargo.Cargo; 32 import net.driftingsouls.ds2.server.cargo.ItemCargoEntry;33 32 import net.driftingsouls.ds2.server.cargo.modules.Modules; 34 import net.driftingsouls.ds2.server.config.Item;35 33 import net.driftingsouls.ds2.server.config.Rassen; 36 34 import net.driftingsouls.ds2.server.config.StarSystem; 37 35 import net.driftingsouls.ds2.server.config.Systems; 38 36 import net.driftingsouls.ds2.server.entities.User; 39 import net.driftingsouls.ds2.server.entities.UserFlagschiffLocation;40 37 import net.driftingsouls.ds2.server.framework.CacheMap; 41 38 import net.driftingsouls.ds2.server.framework.Common; … … 50 47 import net.driftingsouls.ds2.server.scripting.Quests; 51 48 import net.driftingsouls.ds2.server.scripting.ScriptParser; 52 import net.driftingsouls.ds2.server.tasks.Task;53 import net.driftingsouls.ds2.server.tasks.Taskmanager;54 49 55 50 import org.apache.commons.lang.StringUtils; … … 1599 1594 */ 1600 1595 public static void destroy(int shipid) { 1601 Database db = ContextMap.getContext().getDatabase(); 1602 1603 SQLResultRow ship = db.first("SELECT id,fleet,owner,docked,type,status,respawn FROM ships WHERE id='",shipid,"'"); 1604 1605 if( ship.isEmpty() ) { 1606 return; 1607 } 1608 1609 SQLResultRow user = db.first("SELECT id,flagschiff FROM users WHERE id='",ship.getInt("owner"),"'"); 1610 1611 // Checken wir mal ob die Flotte danach noch bestehen darf.... 1612 if( ship.getInt("fleet") != 0 ) { 1613 int fleetcount = db.first("SELECT count(*) count FROM ships WHERE fleet=",ship.getInt("fleet")).getInt("count"); 1614 if( fleetcount <= 2 ) { 1615 db.update("DELETE FROM ship_fleets WHERE id=",ship.getInt("fleet")); 1616 db.update("UPDATE ships SET fleet=null WHERE fleet=",ship.getInt("fleet")); 1617 } 1618 } 1619 1620 // Ist das Schiff selbst gedockt? -> Abdocken 1621 if( !ship.getString("docked").equals("") && (ship.getString("docked").charAt(0) != 'l') ) { 1622 dock( DockMode.UNDOCK, ship.getInt("owner"), Integer.parseInt(ship.getString("docked")), new int[] {ship.getInt("id")} ); 1623 } 1624 1625 // Wenn es das Flagschiff ist -> Flagschiff auf null setzen 1626 if( ship.getInt("id") == user.getInt("flagschiff") ) { 1627 db.update("UPDATE users SET flagschiff=null WHERE id=",ship.getInt("owner")); 1628 } 1629 1630 // Evt. gedockte Schiffe abdocken 1631 ShipTypeData type = Ship.getShipType( ship ); 1632 if( type.getADocks() != 0 ) { 1633 dock( DockMode.UNDOCK, ship.getInt("owner"), ship.getInt("id"), null ); 1634 } 1635 if( type.getJDocks() != 0 ) { 1636 dock( DockMode.START, ship.getInt("owner"), ship.getInt("id"), null ); 1637 } 1638 1639 // Gibts bereits eine Loesch-Task? Wenn ja, dann diese entfernen 1640 Taskmanager taskmanager = Taskmanager.getInstance(); 1641 Task[] tasks = taskmanager.getTasksByData( Taskmanager.Types.SHIP_DESTROY_COUNTDOWN, Integer.toString(ship.getInt("id")), "*", "*"); 1642 for( int i=0; i < tasks.length; i++ ) { 1643 taskmanager.removeTask(tasks[i].getTaskID()); 1644 } 1645 1646 // Falls eine respawn-Zeit gesetzt ist und ein Respawn-Image existiert -> respawn-Task setzen 1647 if( ship.getInt("respawn") != 0 ) { 1648 int negid = db.first("SELECT id FROM ships WHERE id='",(-shipid),"'").getInt("id"); 1649 if( negid < 0 ) { 1650 taskmanager.addTask(Taskmanager.Types.SHIP_RESPAWN_COUNTDOWN, ship.getInt("respawn"), Integer.toString(negid), "", ""); 1651 } 1652 } 1653 1654 // Und nun loeschen wir es... 1655 db.update("DELETE FROM offiziere WHERE dest='s ",ship.getInt("id"),"'"); 1656 db.update("DELETE FROM jumps WHERE shipid=",ship.getInt("id")); 1657 1658 db.update("DELETE FROM werften WHERE shipid=",ship.getInt("id")); 1659 db.update("DELETE FROM ships_modules WHERE id=",ship.getInt("id")); 1660 db.update("DELETE FROM ships WHERE id=",ship.getInt("id")); 1596 org.hibernate.Session db = ContextMap.getContext().getDB(); 1597 1598 Ship ship = (Ship)db.get(Ship.class, shipid); 1599 1600 ship.destroy(); 1601 1602 MESSAGE.get().append(Ship.MESSAGE.getMessage()); 1661 1603 } 1662 1604 … … 1679 1621 * werden, falls moeglich, mituebergeben. 1680 1622 * @param user Der aktuelle Besitzer des Schiffs 1681 * @param ship Das zu uebergebende Schiff1623 * @param shipRow Das zu uebergebende Schiff 1682 1624 * @param newowner Der neue Besitzer des Schiffs 1683 1625 * @param testonly Soll nur getestet (<code>true</code>) oder wirklich uebergeben werden (<code>false</code>) 1684 1626 * @return <code>true</code>, falls ein Fehler bei der Uebergabe aufgetaucht ist (Uebergabe nicht erfolgreich) 1685 1627 */ 1686 public static boolean consign( User user, SQLResultRow ship, User newowner, boolean testonly ) { 1687 if( newowner == null ) { 1688 MESSAGE.get().append("Der angegebene Spieler existiert nicht"); 1689 return true; 1690 } 1691 1692 if( (newowner.getVacationCount() != 0) && (newowner.getWait4VacationCount() == 0) ) { 1693 MESSAGE.get().append("Sie können keine Schiffe an Spieler übergeben, welche sich im Vacation-Modus befinden"); 1694 return true; 1695 } 1696 1697 if( newowner.hasFlag( User.FLAG_NO_SHIP_CONSIGN ) ) { 1698 MESSAGE.get().append("Sie können diesem Spieler keine Schiffe übergeben"); 1699 } 1700 1701 if( ship.getString("lock").length() != 0 ) { 1702 MESSAGE.get().append("Die '"+ship.getString("name")+"'("+ship.getInt("id")+") kann nicht übergeben werden, da diese in ein Quest eingebunden ist"); 1703 return true; 1704 } 1705 1706 if( ship.getString("status").indexOf("noconsign") != -1 ) { 1707 MESSAGE.get().append("Die '"+ship.getString("name")+"' ("+ship.getInt("id")+") kann nicht übergeben werden"); 1708 return true; 1709 } 1710 1711 UserFlagschiffLocation flagschiff = user.getFlagschiff(); 1712 1713 boolean result = true; 1714 if( (flagschiff != null) && (flagschiff.getID() == ship.getInt("id")) ) { 1715 result = newowner.hasFlagschiffSpace(); 1716 } 1717 1718 if( !result ) { 1719 MESSAGE.get().append("Die "+ship.getString("name")+" ("+ship.getInt("id")+") kann nicht übergeben werden, da der Spieler bereits über ein Flagschiff verfügt"); 1720 return true; 1721 } 1722 1723 Database db = ContextMap.getContext().getDatabase(); 1724 1725 if( !testonly ) { 1726 ship.put("history", ship.getString("history")+"Übergeben am [tick="+ContextMap.getContext().get(ContextCommon.class).getTick()+"] an "+newowner.getName()+" ("+newowner.getID()+")\n"); 1727 1728 db.prepare("UPDATE ships SET owner= ?,fleet=null,history= ? ,alarm='0' WHERE id= ? AND owner= ?") 1729 .update(newowner.getID(), ship.getString("history"), ship.getInt("id"), ship.getInt("owner")); 1730 db.update("UPDATE offiziere SET userid='",newowner.getID(),"' WHERE dest='s ",ship.getInt("id"),"'"); 1731 1732 Common.dblog( "consign", Integer.toString(ship.getInt("id")), Integer.toString(newowner.getID()), 1733 "pos", Location.fromResult(ship).toString(), 1734 "shiptype", Integer.toString(ship.getInt("type")) ); 1735 1736 if( (flagschiff != null) && (flagschiff.getType() == UserFlagschiffLocation.Type.SHIP) && 1737 (flagschiff.getID() == ship.getInt("id")) ) { 1738 user.setFlagschiff(null); 1739 newowner.setFlagschiff(ship.getInt("id")); 1740 } 1741 } 1742 1743 StringBuilder message = MESSAGE.get(); 1744 SQLQuery s = db.query("SELECT * FROM ships WHERE id>0 AND docked IN ('",ship.getInt("id")+"','l "+ship.getInt("id")+"')"); 1745 while( s.next() ) { 1746 int oldlength = message.length(); 1747 boolean tmp = consign( user, s.getRow(), newowner, testonly ); 1748 if( tmp && !testonly ) { 1749 dock( (s.getString("docked").charAt(0) == 'l' ? DockMode.START : DockMode.UNDOCK), newowner.getID(), ship.getInt("id"), new int[] {s.getInt("id")}); 1750 } 1751 1752 if( oldlength != message.length() ) { 1753 message.insert(oldlength-1, "<br />"); 1754 } 1755 } 1756 s.free(); 1757 1758 Cargo cargo = new Cargo( Cargo.Type.STRING, ship.getString("cargo") ); 1759 List<ItemCargoEntry> itemlist = cargo.getItems(); 1760 for( ItemCargoEntry item : itemlist ) { 1761 Item itemobject = item.getItemObject(); 1762 if( itemobject.isUnknownItem() ) { 1763 newowner.addKnownItem(item.getItemID()); 1764 } 1765 } 1766 1767 return false; 1628 public static boolean consign( User user, SQLResultRow shipRow, User newowner, boolean testonly ) { 1629 org.hibernate.Session db = ContextMap.getContext().getDB(); 1630 1631 Ship ship = (Ship)db.get(Ship.class, shipRow.getInt("id")); 1632 1633 boolean result = ship.consign(newowner, testonly); 1634 1635 MESSAGE.get().append(Ship.MESSAGE.getMessage()); 1636 1637 return result; 1768 1638 } 1769 1639 … … 1855 1725 } 1856 1726 1857 private static Map<Integer,Integer> fleetCountList = Collections.synchronizedMap(new CacheMap<Integer,Integer>(500));1858 1859 1727 /** 1860 1728 * Entfernt das Schiff aus der Flotte. 1861 * @param ship Die SQL-Ergebniszeile des Schiffs 1862 */ 1863 public static void removeFromFleet( SQLResultRow ship ) { 1864 Database db = ContextMap.getContext().getDatabase(); 1865 1866 if( ship.getInt("fleet") == 0 ) { 1867 return; 1868 } 1869 1870 if( !fleetCountList.containsKey(ship.getInt("fleet")) ) { 1871 // Kein Check auf id > 0, da auch (Spawn)Schiffe mit einer id < 0 der Flotte angehoeren koennen! 1872 fleetCountList.put(ship.getInt("fleet"), db.first("SELECT count(*) count FROM ships WHERE fleet="+ship.getInt("fleet")).getInt("count")); 1873 } 1874 int fleetcount = fleetCountList.get(ship.getInt("fleet")); 1875 1876 if( fleetcount > 2 ) { 1877 db.tUpdate(1, "UPDATE ships SET fleet=null WHERE id>0 AND id=",ship.getInt("id")); 1878 MESSAGE.get().append("aus der Flotte ausgetreten"); 1879 1880 fleetCountList.put(ship.getInt("fleet"), --fleetcount); 1881 } 1882 else { 1883 db.tUpdate(1, "UPDATE ships SET fleet=null WHERE fleet="+ship.getInt("fleet")); 1884 db.tUpdate(1, "DELETE FROM ship_fleets WHERE id="+ship.getInt("fleet")); 1885 MESSAGE.get().append("Flotte aufgelößt"); 1886 1887 fleetCountList.remove(ship.getInt("fleet")); 1888 } 1729 * @param shipRow Die SQL-Ergebniszeile des Schiffs 1730 */ 1731 public static void removeFromFleet( SQLResultRow shipRow ) { 1732 org.hibernate.Session db = ContextMap.getContext().getDB(); 1733 1734 Ship ship = (Ship)db.get(Ship.class, shipRow.getInt("id")); 1735 1736 ship.removeFromFleet(); 1737 1738 MESSAGE.get().append(Ship.MESSAGE.getMessage()); 1889 1739 } 1890 1740 }
