Changeset 4e3480232150fec3f0d7484fb98198030b98b813
- Timestamp:
- 06/09/07 23:40:50 (1 year ago)
- git-parent:
- Files:
-
- db/tables/bases.sql (modified) (1 diff)
- db/updates.xml (modified) (1 diff)
- src/net/driftingsouls/ds2/server/bases/Base.java (modified) (3 diffs)
- src/net/driftingsouls/ds2/server/entities/User.java (modified) (1 diff)
- src/net/driftingsouls/ds2/server/modules/TransportController.java (modified) (1 diff)
- src/net/driftingsouls/ds2/server/ships/Ship.java (modified) (3 diffs)
- src/net/driftingsouls/ds2/server/ships/Ships.java (modified) (3 diffs)
- src/net/driftingsouls/ds2/server/tick/AbstractTickExecuter.java (modified) (1 diff)
- src/net/driftingsouls/ds2/server/tick/TickController.java (modified) (1 diff)
- src/net/driftingsouls/ds2/server/tick/regular/BaseTick.java (modified) (11 diffs)
- src/net/driftingsouls/ds2/server/tick/regular/BattleTick.java (modified) (1 diff)
- src/net/driftingsouls/ds2/server/tick/regular/SchiffsTick.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
db/tables/bases.sql
r8825186 r4e34802 23 23 `coreactive` tinyint(3) unsigned NOT NULL default '0', 24 24 `autogtuacts` text NOT NULL default '', 25 `version` int(11) NOT NULL default '0', 25 26 PRIMARY KEY (`id`), 26 27 KEY `owner` (`owner`,`id`), db/updates.xml
r23d6d8b r4e34802 283 283 UPDATE ships SET fleet=NULL WHERE fleet=0; 284 284 ALTER TABLE ships ADD CONSTRAINT ships_fk_ship_fleets FOREIGN KEY (fleet) REFERENCES ship_fleets(id); 285 ALTER TABLE bases ADD COLUMN version INT NOT NULL DEFAULT '0'; 285 286 ]]></update> 286 287 </updates> src/net/driftingsouls/ds2/server/bases/Base.java
r283e6c7 r4e34802 35 35 import javax.persistence.Table; 36 36 import javax.persistence.Transient; 37 import javax.persistence.Version; 37 38 38 39 import net.driftingsouls.ds2.server.cargo.Cargo; … … 94 95 @Column(name="autogtuacts") 95 96 private String autoGtuActs; 97 @Version 98 private int version; 96 99 97 100 @Transient … … 671 674 return false; 672 675 } 676 677 /** 678 * Gibt die Versionsnummer des Eintrags zurueck 679 * @return Die Versionsnummer 680 */ 681 public int getVersion() { 682 return version; 683 } 673 684 } src/net/driftingsouls/ds2/server/entities/User.java
r283e6c7 r4e34802 836 836 837 837 /** 838 * Setzt die Nahrungsbilanz des letzten Ticks 839 * @param stat Die Nahrungsbilanz des letzten Ticks 840 */ 841 public void setNahrungsStat(String stat) { 842 this.nstat = stat; 843 } 844 845 /** 838 846 * Liefert die Anzahl der NPC-Punkte des Benutzers zurueck. 839 847 * @return Die Anzahl der NPC-Punkte src/net/driftingsouls/ds2/server/modules/TransportController.java
r283e6c7 r4e34802 428 428 Database db = ContextMap.getContext().getDatabase(); 429 429 430 db.tUpdate(1,"UPDATE bases SET cargo='",getCargo().save(),"' WHERE id='",getData().getInt("id"),"' AND cargo='",getCargo().save(true),"'");430 db.tUpdate(1,"UPDATE bases SET cargo='",getCargo().save(),"',version=version+1 WHERE id='",getData().getInt("id"),"' AND cargo='",getCargo().save(true),"'"); 431 431 } 432 432 } src/net/driftingsouls/ds2/server/ships/Ship.java
r23d6d8b r4e34802 20 20 21 21 import java.sql.Blob; 22 import java.util.ArrayList; 23 import java.util.List; 22 24 23 25 import javax.persistence.Column; … … 29 31 import javax.persistence.Table; 30 32 33 import net.driftingsouls.ds2.server.Offizier; 31 34 import net.driftingsouls.ds2.server.cargo.Cargo; 35 import net.driftingsouls.ds2.server.cargo.Resources; 36 import net.driftingsouls.ds2.server.config.ItemEffect; 32 37 import net.driftingsouls.ds2.server.entities.User; 38 import net.driftingsouls.ds2.server.framework.Common; 33 39 import net.driftingsouls.ds2.server.framework.ContextMap; 34 40 import net.driftingsouls.ds2.server.framework.Loggable; … … 729 735 730 736 /** 737 * Gibt die Typen-Daten des Schiffs zurueck 738 * @return die Typen-Daten 739 */ 740 public ShipTypeData getTypeData() { 741 ShipModules modules = null; 742 743 if( status.indexOf("tblmodules") != -1 ) { 744 org.hibernate.Session db = ContextMap.getContext().getDB(); 745 modules = (ShipModules)db.get(ShipModules.class, this.id); 746 } 747 748 return getShipType(this.type, modules, false); 749 } 750 751 private static final int MANGEL_TICKS = 9; 752 753 /** 754 * Berechnet das Status-Feld des Schiffes neu. Diese Aktion sollte nach jeder 755 * Operation angewendet werden, die das Schiff in irgendeiner Weise veraendert. 756 * @return der neue Status-String 757 */ 758 public String recalculateShipStatus() { 759 if( this.id < 0 ) { 760 throw new UnsupportedOperationException("recalculateShipStatus kann nur bei Schiffen mit positiver ID ausgefuhert werden!"); 761 } 762 763 org.hibernate.Session db = ContextMap.getContext().getDB(); 764 765 ShipTypeData type = this.getTypeData(); 766 767 Cargo cargo = this.cargo; 768 769 List<String> status = new ArrayList<String>(); 770 771 // Alten Status lesen und ggf Elemente uebernehmen 772 String[] oldstatus = StringUtils.split(this.status, ' '); 773 774 if( oldstatus.length > 0 ) { 775 for( int i=0; i < oldstatus.length; i++ ) { 776 String astatus = oldstatus[i]; 777 if( !astatus.equals("disable_iff") && !astatus.equals("mangel_nahrung") && 778 !astatus.equals("mangel_reaktor") && !astatus.equals("offizier") && 779 !astatus.equals("nocrew") && !astatus.equals("nebel") && !astatus.equals("tblmodules") ) { 780 status.add(astatus); 781 } 782 } 783 } 784 785 // Treibstoffverbrauch bereichnen 786 if( type.getRm() > 0 ) { 787 long ep = cargo.getResourceCount( Resources.URAN ) * type.getRu() + 788 cargo.getResourceCount( Resources.DEUTERIUM ) * type.getRd() + 789 cargo.getResourceCount( Resources.ANTIMATERIE ) * type.getRa(); 790 long er = ep/type.getRm(); 791 792 int turns = 2; 793 if( (this.alarm == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 794 turns = 4; 795 } 796 797 if( er <= MANGEL_TICKS/turns ) { 798 status.add("mangel_reaktor"); 799 } 800 } 801 802 // Ist Crew an Bord? 803 if( (type.getCrew() != 0) && (this.crew == 0) ) { 804 status.add("nocrew"); 805 } 806 807 // Die Items nach IFF und Hydros durchsuchen 808 boolean disableIFF = false; 809 810 if( cargo.getItemWithEffect(ItemEffect.Type.DISABLE_IFF) != null ) { 811 disableIFF = true; 812 } 813 814 if( disableIFF ) { 815 status.add("disable_iff"); 816 } 817 818 Cargo usercargo = new Cargo(Cargo.Type.STRING, this.owner.getCargo()); 819 820 // Den Nahrungsverbrauch berechnen 821 if( this.crew > 0 ) { 822 double scale = 1; 823 if( (this.alarm == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 824 scale = 0.9; 825 } 826 827 int nn = (int)Math.ceil(this.crew/scale) - type.getHydro(); 828 if( (nn > 0) || ((nn == 0) && (type.getHydro() == 0)) ) { 829 if( nn == 0 ) nn = 1; 830 long nr = usercargo.getResourceCount( Resources.NAHRUNG )/nn; 831 832 if( nr <= MANGEL_TICKS ) { 833 status.add("mangel_nahrung"); 834 } 835 } 836 } 837 838 // Ist ein Offizier an Bord? 839 Offizier offi = Offizier.getOffizierByDest('s', this.id); 840 if( offi != null ) { 841 status.add("offizier"); 842 } 843 844 ShipModules modules = (ShipModules)db.get(ShipModules.class, this.id); 845 if( modules != null ) { 846 status.add("tblmodules"); 847 } 848 849 this.status = Common.implode(" ", status); 850 851 return this.status; 852 } 853 854 /** 731 855 * Gibt die Liste aller Flags zurueck, ueber die der angegebene 732 856 * Schiffstyp verfuegt src/net/driftingsouls/ds2/server/ships/Ships.java
r23d6d8b r4e34802 36 36 import net.driftingsouls.ds2.server.cargo.modules.Modules; 37 37 import net.driftingsouls.ds2.server.config.Item; 38 import net.driftingsouls.ds2.server.config.ItemEffect;39 38 import net.driftingsouls.ds2.server.config.Rassen; 40 39 import net.driftingsouls.ds2.server.config.StarSystem; … … 68 67 */ 69 68 public class Ships implements Loggable { 70 private static final int MANGEL_TICKS = 9;71 72 69 /** 73 70 * Repraesentiert ein in ein Schiff eingebautes Modul (oder vielmehr die Daten, … … 123 120 */ 124 121 public static String recalculateShipStatus(int shipID) { 125 Database db = ContextMap.getContext().getDatabase(); 122 if( shipID < 0 ) { 123 throw new IllegalArgumentException("shipID muss groesser 0 sein!"); 124 } 125 126 org.hibernate.Session db = ContextMap.getContext().getDB(); 126 127 127 SQLResultRow ship = db.first("SELECT id,type,crew,status,cargo,owner,alarm,system,x,y FROM ships WHERE id>0 AND id='",shipID,"'"); 128 129 ShipTypeData type = Ship.getShipType(ship); 130 131 Cargo cargo = new Cargo( Cargo.Type.STRING, ship.getString("cargo") ); 132 133 List<String> status = new ArrayList<String>(); 134 135 // Alten Status lesen und ggf Elemente uebernehmen 136 String[] oldstatus = StringUtils.split(ship.getString("status"), ' '); 137 138 if( oldstatus.length > 0 ) { 139 for( int i=0; i < oldstatus.length; i++ ) { 140 String astatus = oldstatus[i]; 141 if( !astatus.equals("disable_iff") && !astatus.equals("mangel_nahrung") && 142 !astatus.equals("mangel_reaktor") && !astatus.equals("offizier") && 143 !astatus.equals("nocrew") && !astatus.equals("nebel") && !astatus.equals("tblmodules") ) { 144 status.add(astatus); 145 } 146 } 147 } 148 149 // Treibstoffverbrauch bereichnen 150 if( type.getRm() > 0 ) { 151 long ep = cargo.getResourceCount( Resources.URAN ) * type.getRu() + 152 cargo.getResourceCount( Resources.DEUTERIUM ) * type.getRd() + 153 cargo.getResourceCount( Resources.ANTIMATERIE ) * type.getRa(); 154 long er = ep/type.getRm(); 155 156 int turns = 2; 157 if( (ship.getInt("alarm") == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 158 turns = 4; 159 } 160 161 if( er <= MANGEL_TICKS/turns ) { 162 status.add("mangel_reaktor"); 163 } 164 } 165 166 // Ist Crew an Bord? 167 if( (type.getCrew() != 0) && (ship.getInt("crew") == 0) ) { 168 status.add("nocrew"); 169 } 170 171 // Die Items nach IFF und Hydros durchsuchen 172 boolean disableIFF = false; 173 174 if( cargo.getItemWithEffect(ItemEffect.Type.DISABLE_IFF) != null ) { 175 disableIFF = true; 176 } 177 178 if( disableIFF ) { 179 status.add("disable_iff"); 180 } 181 182 Cargo usercargo = new Cargo( Cargo.Type.STRING, db.first("SELECT cargo FROM users WHERE id='"+ship.getInt("owner")+"'").getString("cargo")); 183 184 // Den Nahrungsverbrauch berechnen 185 if( ship.getInt("crew") > 0 ) { 186 double scale = 1; 187 if( (ship.getInt("alarm") == 1) && (type.getShipClass() != ShipClasses.GESCHUETZ.ordinal()) ) { 188 scale = 0.9; 189 } 190 191 int nn = (int)Math.ceil(ship.getInt("crew")/scale) - type.getHydro(); 192 if( (nn > 0) || ((nn == 0) && (type.getHydro() == 0)) ) { 193 if( nn == 0 ) nn = 1; 194 long nr = usercargo.getResourceCount( Resources.NAHRUNG )/nn; 195 196 if( nr <= MANGEL_TICKS ) { 197 status.add("mangel_nahrung"); 198 } 199 } 200 } 201 202 // Ist ein Offizier an Bord? 203 Offizier offi = Offizier.getOffizierByDest('s', shipID); 204 if( offi != null ) { 205 status.add("offizier"); 206 } 207 208 SQLResultRow modules = db.first("SELECT id FROM ships_modules WHERE id="+shipID); 209 if( !modules.isEmpty() ) { 210 status.add("tblmodules"); 211 } 212 213 boolean savestatus = true; 214 215 String statusString = Common.implode(" ", status); 216 if( ship.getString("status").equals(statusString) ) { 217 savestatus = false; 218 } 219 220 if( savestatus ) { 221 db.tUpdate(1, "UPDATE ships SET status='"+statusString+"' WHERE id>0 AND id='",shipID,"' AND status='",ship.getString("status")+"'"); 222 } 223 224 return statusString; 128 Ship ship = (Ship)db.get(Ship.class, shipID); 129 130 return ship.recalculateShipStatus(); 225 131 } 226 132 src/net/driftingsouls/ds2/server/tick/AbstractTickExecuter.java
r283e6c7 r4e34802 108 108 tick.execute(); 109 109 tick.dispose(); 110 111 getDB().flush(); 112 getDB().clear(); 110 113 } 111 114 src/net/driftingsouls/ds2/server/tick/TickController.java
r3924571 r4e34802 129 129 */ 130 130 public void execute() { 131 log("-----------------"+Common.date("d.m.Y H:i:s")+"-------------------"); 132 133 prepare(); 134 if( getErrorList().length == 0 ) { 135 tick(); 136 } 137 138 if( getErrorList().length > 0 ) { 131 getDB().beginTransaction(); 132 try { 133 log("-----------------"+Common.date("d.m.Y H:i:s")+"-------------------"); 134 135 prepare(); 136 if( getErrorList().length == 0 ) { 137 tick(); 138 } 139 140 if( getErrorList().length > 0 ) { 141 log(""); 142 log("Fehlerliste:"); 143 144 for( net.driftingsouls.ds2.server.framework.pipeline.Error error : getErrorList() ) { 145 slog("* "); 146 log(error.getDescription()); 147 } 148 } 149 150 if( context.getResponse().getContent().length() > 0 ) { 151 log("\n-------------Weitere Ausgaben---------------\n"); 152 log(context.getResponse().getContent().toString()); 153 } 154 context.getResponse().setContent(""); 155 139 156 log(""); 140 log("Fehlerliste:"); 141 142 for( net.driftingsouls.ds2.server.framework.pipeline.Error error : getErrorList() ) { 143 slog("* "); 144 log(error.getDescription()); 145 } 146 } 147 148 if( context.getResponse().getContent().length() > 0 ) { 149 log("\n-------------Weitere Ausgaben---------------\n"); 150 log(context.getResponse().getContent().toString()); 151 } 152 context.getResponse().setContent(""); 153 154 log(""); 155 log("QCount: "+getDatabase().getQCount()); 156 157 log("Execution-Time: "+(System.currentTimeMillis()-exectime)+"s"); 157 log("QCount: "+getDatabase().getQCount()); 158 159 log("Execution-Time: "+(System.currentTimeMillis()-exectime)+"s"); 160 } 161 catch( Exception e ) { 162 getDB().getTransaction().rollback(); 163 } 164 finally { 165 getDB().flush(); 166 if( getDB().getTransaction().isActive() && !getDB().getTransaction().wasRolledBack() ) { 167 getDB().getTransaction().commit(); 168 } 169 } 158 170 } 159 171 src/net/driftingsouls/ds2/server/tick/regular/BaseTick.java
r283e6c7 r4e34802 24 24 import java.util.Map; 25 25 26 import org.hibernate.FlushMode; 27 26 28 import net.driftingsouls.ds2.server.ContextCommon; 27 29 import net.driftingsouls.ds2.server.bases.AutoGTUAction; … … 34 36 import net.driftingsouls.ds2.server.comm.PM; 35 37 import net.driftingsouls.ds2.server.config.Faction; 38 import net.driftingsouls.ds2.server.entities.GtuWarenKurse; 36 39 import net.driftingsouls.ds2.server.entities.User; 37 40 import net.driftingsouls.ds2.server.framework.Common; 38 41 import net.driftingsouls.ds2.server.framework.db.Database; 39 import net.driftingsouls.ds2.server.framework.db.PreparedQuery;40 import net.driftingsouls.ds2.server.framework.db.SQLQuery;41 42 import net.driftingsouls.ds2.server.framework.db.SQLResultRow; 42 43 import net.driftingsouls.ds2.server.tick.TickController; … … 54 55 private Cargo usercargo; 55 56 private int tick; 56 private int retries;57 private PreparedQuery updateBaseQuery = null;58 57 59 58 @Override 60 59 protected void prepare() { 61 Database db = getDatabase();60 getDB().setFlushMode(FlushMode.MANUAL); 62 61 63 62 // Aktuelle Warenkurse fuer die Kommandozentrale laden 64 String curse = db.first("SELECT kurse FROM gtu_warenkurse WHERE place='asti'").getString("kurse");65 this.curse = new Cargo( Cargo.Type.STRING, curse);63 GtuWarenKurse kurs = (GtuWarenKurse)getDB().get(GtuWarenKurse.class, "asti"); 64 this.curse = kurs.getKurse(); 66 65 67 66 this.pmcache = new StringBuilder(); … … 70 69 this.gtustatslist = new HashMap<Integer,Cargo>(); 71 70 this.tick = getContext().get(ContextCommon.class).getTick(); 72 this.retries = 0;73 71 } 74 72 … … 76 74 Database db = getContext().getDatabase(); 77 75 78 long usercargostart = this.usercargo.getResourceCount(Resources.NAHRUNG);79 76 Map<Integer,Cargo> oldgtustatslist = new HashMap<Integer,Cargo>(); 80 77 for( Integer sysid : this.gtustatslist.keySet() ) { 81 78 oldgtustatslist.put(sysid, (Cargo)gtustatslist.get(sysid).clone() ); 82 79 } 83 StringBuilder oldpmcache = new StringBuilder(this.pmcache); 84 Base oldbase = (Base)base.clone(); 85 80 86 81 Cargo cargo = (Cargo)base.getCargo().clone(); 87 82 cargo.setOption( Cargo.Option.NOHTML, true ); … … 273 268 get += get2; 274 269 } 275 276 db.tBegin(true); 277 270 278 271 // Haben wir was verkauft? Wenn ja nun das Geld ueberweisen 279 272 if( get > 0 ) { … … 282 275 } 283 276 284 if( (basedata.getArbeiter() != oldbase.getArbeiter()) || (bewohner != oldbase.getBewohner()) || 285 (e != oldbase.getEnergy()) || !nc.save().equals(oldbase.getCargo().save()) ) { 286 287 updateBaseQuery.tUpdate(1, basedata.getArbeiter(), bewohner, newe, nc.save(), 288 base.getID(), oldbase.getArbeiter(), oldbase.getBewohner(), oldbase.getEnergy(), oldbase.getCargo().save() ); 289 base.setCargo(nc); 290 } 291 if( !db.tCommit() ) { 292 this.log("\t++++++++++++++ COMMIT ERROR - RETRYING ++++++++++++++"); 293 this.usercargo.setResource(Resources.NAHRUNG, usercargostart); 294 this.gtustatslist = oldgtustatslist; 295 this.pmcache = oldpmcache; 296 297 this.retries--; 298 if( this.retries > 0 ) { 299 base = new Base(db.first("SELECT * FROM bases WHERE id=",oldbase.getID())); 300 301 tickBase( base ); 302 return; 303 } 304 this.log("\t+++++++++++++++ GEBE AUF +++++++++++++++"); 305 } 277 base.setArbeiter(basedata.getArbeiter()); 278 base.setBewohner(bewohner); 279 base.setEnergy(newe); 280 base.setCargo(nc); 306 281 } 307 282 // Offenbar haben wir es mit chaotischen Zustaenden zu tun.... … … 314 289 this.usercargo.setResource(Resources.NAHRUNG, 0); 315 290 } 316 317 db.tBegin(true); 318 319 if( (basedata.getArbeiter() != oldbase.getArbeiter()) || (basedata.getBewohner() != oldbase.getBewohner()) || 320 (newe != oldbase.getEnergy()) || !cargo.save().equals(oldbase.getCargo().save()) ) { 321 322 this.log("Schreibe neue Werte..."); 323 324 updateBaseQuery.tUpdate(1, basedata.getArbeiter(), basedata.getBewohner(), newe, cargo.save(), 325 base.getID(), oldbase.getArbeiter(), oldbase.getBewohner(), oldbase.getEnergy(), oldbase.getCargo().save() ); 326 base.setCargo(cargo); 327 } 328 291 292 base.setArbeiter(basedata.getArbeiter()); 293 base.setBewohner(basedata.getBewohner()); 294 base.setEnergy(newe); 295 base.setCargo(cargo); 296 329 297 this.pmcache.append("[b]"); 330 298 this.pmcache.append(base.getName()); … … 349 317 } 350 318 base.setCoreActive(false); 351 352 if( (arbeiter != oldbase.getArbeiter()) || (arbeiter != oldbase.getBewohner()) ) { 353 this.log("Schreibe neue Werte [hungersnot]..."); 354 355 db.tUpdate(1,"UPDATE bases " , 356 "SET arbeiter=",arbeiter,"," , 357 "bewohner=",arbeiter,"," , 358 "active='",Common.implode("|",bebon),"'," , 359 "coreactive='",base.isCoreActive() ? 1 : 0,"' " , 360 "WHERE id='",base.getID(),"' AND " , 361 "arbeiter='",basedata.getArbeiter(),"' AND " , 362 "bewohner='",basedata.getBewohner(),"' AND " , 363 "active='",Common.implode("|", oldbase.getActive()),"' AND " , 364 "coreactive='",oldbase.isCoreActive() ? 1 : 0,"'"); 365 } 366 } 367 368 if( !db.tCommit() ) { 369 this.log("\t++++++++++++++ COMMIT ERROR - RETRYING ++++++++++++++"); 370 this.usercargo.setResource(Resources.NAHRUNG, usercargostart); 371 this.gtustatslist = oldgtustatslist; 372 this.pmcache = oldpmcache; 373 374 this.retries--; 375 if( this.retries > 0 ) { 376 base = new Base(db.first("SELECT * FROM bases WHERE id=",oldbase.getID())); 377 378 tickBase( base ); 379 return; 380 } 381 this.log("\t+++++++++++++++ GEBE AUF +++++++++++++++"); 382 } 383 } 319 base.setArbeiter(arbeiter); 320 base.setBewohner(arbeiter); 321 base.setActive(bebon); 322 base.setCoreActive(false); 323 } 324 } 325 getDB().saveOrUpdate(base); 384 326 this.log(""); 385 327 } … … 390 332 391 333 // Da wir als erstes mit dem Usercargo rumspielen -> sichern der alten Nahrungswerte 392 SQLQuery auser = db.query("SELECT id,cargo FROM users WHERE id!=0 AND (vaccount=0 OR wait4vac!=0)"); 393 while( auser.next() ) { 394 Cargo cargo = new Cargo( Cargo.Type.STRING, auser.getString("cargo") ); 395 396 db.update("UPDATE users SET nstat='",cargo.getResourceCount(Resources.NAHRUNG),"' WHERE id='",auser.getInt("id"),"'"); 397 } 398 auser.free(); 334 List users = getDB().createQuery("from User where id!=0 and (vaccount=0 or wait4vac!=0)").list(); 335 for( Iterator iter = users.iterator(); iter.hasNext(); ) { 336 User auser = (User)iter.next(); 337 338 auser.setNahrungsStat(Long.toString(new Cargo(Cargo.Type.STRING, auser.getCargo()).getResourceCount(Resources.NAHRUNG))); 339 } 399 340 400 341 // User-Accs sperren 401 342 block(0); 402 403 PreparedQuery updateUserCargo = db.prepare("UPDATE users SET cargo= ? WHERE id= ?"); 404 updateBaseQuery = db.prepare("UPDATE bases " , 405 "SET arbeiter= ? ," , 406 "bewohner= ? ," , 407 "e= ? ," , 408 "cargo= ? " , 409 "WHERE id= ? AND " , 410 "arbeiter= ? AND " , 411 "bewohner= ? AND " , 412 "e= ? AND " , 413 "cargo= ? "); 414 343 415 344 // Nun holen wir uns mal die Basen... 416 SQLQuery base = db.query("SELECT b.* " + 417 "FROM bases b JOIN users u ON b.owner=u.id " + 418 "WHERE b.owner!=0 AND (u.vaccount=0 OR u.wait4vac!=0) " + 419 "ORDER BY b.owner"); 420 421 log("Kolonien: "+base.numRows()); 345 List bases = getDB().createQuery("from Base b join fetch b.owner where b.owner!=0 and (b.owner.vaccount=0 or b.owner.wait4vac!=0) order by b.owner").list(); 346 347 log("Kolonien: "+bases.size()); 422 348 log(""); 423 349 424 while( base.next() ) { 350 int index = 0; 351 352 for( Iterator iter = bases.iterator(); iter.hasNext(); ) { 353 Base base = (Base)iter.next(); 425 354 // Muessen ggf noch alte Userdaten geschrieben und neue geladen werden? 426 if( base.get Int("owner") != this.lastowner ) {427 log(base.get Int("owner")+":");355 if( base.getOwner().getID() != this.lastowner ) { 356 log(base.getOwner().getID()+":"); 428 357 if( this.pmcache.length() != 0 ) { 429 358 PM.send(getContext(),-1, this.lastowner, "Basis-Tick", this.pmcache.toString(),false); 430 359 this.pmcache.setLength(0); 431 360 } 361 362 this.usercargo = new Cargo( Cargo.Type.STRING, base.getOwner().getCargo()); 363 } 364 this.lastowner = base.getOwner().getID(); 365 try { 366 // Nun wollen wir die Basis mal berechnen.... 367 this.tickBase(base); 368 getDB().flush(); 369 getDB().getTransaction().commit(); 370 } 371 catch( Exception e ) { 372 getDB().getTransaction().rollback(); 373 this.log("Base "+base.getID()+" failed: "+e); 374 e.printStackTrace(); 375 Common.mailThrowable(e, "BaseTick Exception", "Base: "+base.getID()); 432 376 433 if( this.usercargo != null ) { 434 updateUserCargo.update(this.usercargo.save(), this.lastowner); 435 } 436 437 this.usercargo = new Cargo( Cargo.Type.STRING, db.first("SELECT cargo FROM users WHERE id='",base.getInt("owner"),"'").getString("cargo")); 438 } 439 this.lastowner = base.getInt("owner"); 440 441 this.retries = 5; // Max 5 versuche. Wenn die Basis dann noch immer nicht korrekt berechnet wurde: aufgeben 442 443 try { 444 // Nun wollen wir die Basis mal berechnen.... 445 this.tickBase(new Base(base.getRow())); 446 } 447 catch( Exception e ) { 448 this.log("Base "+base.getInt("id")+" failed: "+e); 449 e.printStackTrace(); 450 Common.mailThrowable(e, "BaseTick Exception", "Base: "+base.getInt("id")); 451
