diff --git a/.gitignore b/.gitignore index 63147709..fffabff6 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,7 @@ odb/resourcehistory/je.info.* odb/resourceroots/je.info.* odb/resources/je.info.* odb/auction/je.info.* +odb/swgobjects/je.info.* # External tool builders .externalToolBuilders/ diff --git a/ngengine_public.jar b/ngengine_public.jar index a78a6cba..87416db2 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/odb/swgobjects/placeholder.txt b/odb/swgobjects/placeholder.txt new file mode 100644 index 00000000..e69de29b diff --git a/scripts/mobiles/dynamicgroups/placeholder.txt b/scripts/mobiles/dynamicgroups/placeholder.txt new file mode 100644 index 00000000..e69de29b diff --git a/src/main/NGECore.java b/src/main/NGECore.java index c99d4912..bf8b9767 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -48,6 +48,9 @@ import net.engio.mbassy.bus.config.BusConfiguration; import resources.common.RadialOptions; import resources.common.ThreadMonitor; import resources.objects.creature.CreatureObject; +import resources.objects.guild.GuildObject; +import resources.objects.resource.GalacticResource; +import resources.objects.resource.ResourceRoot; import services.AttributeService; import services.BuffService; import services.CharacterService; @@ -71,8 +74,11 @@ import services.SurveyService; import services.TerrainService; import services.WeatherService; import services.ai.AIService; +import services.bazaar.AuctionItem; import services.bazaar.BazaarService; +import services.chat.ChatRoom; import services.chat.ChatService; +import services.chat.Mail; import services.collections.CollectionService; import services.combat.CombatService; import services.command.CombatCommand; @@ -83,6 +89,8 @@ import services.guild.GuildService; import services.LoginService; import services.map.MapService; import services.mission.MissionService; +import services.object.DuplicateId; +import services.object.ObjectId; import services.object.ObjectService; import services.object.UpdateService; import services.pet.MountService; @@ -110,6 +118,7 @@ import engine.resources.config.Config; import engine.resources.config.DefaultConfig; import engine.resources.container.Traverser; import engine.resources.database.DatabaseConnection; +import engine.resources.database.ODBCursor; import engine.resources.database.ObjectDatabase; import engine.resources.objects.SWGObject; import engine.resources.scene.Point3D; @@ -199,7 +208,6 @@ public class NGECore { public InteractiveJythonAcceptor jythonAcceptor; private InteractiveJythonServer jythonServer; - private ObjectDatabase creatureODB; private ObjectDatabase mailODB; private ObjectDatabase guildODB; private ObjectDatabase objectIdODB; @@ -208,11 +216,11 @@ public class NGECore { private BusConfiguration eventBusConfig = BusConfiguration.Default(1, new ThreadPoolExecutor(1, 4, 1, TimeUnit.MINUTES, new LinkedBlockingQueue())); - private ObjectDatabase buildingODB; private ObjectDatabase auctionODB; private ObjectDatabase resourcesODB; private ObjectDatabase resourceRootsODB; private ObjectDatabase resourceHistoryODB; + private ObjectDatabase swgObjectODB; public static boolean PACKET_DEBUG = false; @@ -263,17 +271,17 @@ public class NGECore { } setGalaxyStatus(1); - creatureODB = new ObjectDatabase("creature", true, false, true); - buildingODB = new ObjectDatabase("building", true, false, true); - mailODB = new ObjectDatabase("mails", true, false, true); - guildODB = new ObjectDatabase("guild", true, false, true); - objectIdODB = new ObjectDatabase("oids", true, false, false); - duplicateIdODB = new ObjectDatabase("doids", true, false, true); - chatRoomODB = new ObjectDatabase("chatRooms", true, false, true); - resourcesODB = new ObjectDatabase("resources", true, false, true); - resourceRootsODB = new ObjectDatabase("resourceroots", true, false, true); - resourceHistoryODB = new ObjectDatabase("resourcehistory", true, false, true); - auctionODB = new ObjectDatabase("auction", true, false, true); + swgObjectODB = new ObjectDatabase("swgobjects", true, true, true, SWGObject.class); + + mailODB = new ObjectDatabase("mails", true, true, true, Mail.class); + guildODB = new ObjectDatabase("guild", true, true, true, GuildObject.class); + objectIdODB = new ObjectDatabase("oids", true, true, false, ObjectId.class); + duplicateIdODB = new ObjectDatabase("doids", true, true, true, DuplicateId.class); + chatRoomODB = new ObjectDatabase("chatRooms", true, true, true, ChatRoom.class); + resourcesODB = new ObjectDatabase("resources", true, true, true, GalacticResource.class); + resourceRootsODB = new ObjectDatabase("resourceroots", true, true, true, ResourceRoot.class); + resourceHistoryODB = new ObjectDatabase("resourcehistory", true, true, true, GalacticResource.class); + auctionODB = new ObjectDatabase("auction", true, true, true, AuctionItem.class); // Services loginService = new LoginService(this); @@ -480,6 +488,7 @@ public class NGECore { spawnService.loadMobileTemplates(); spawnService.loadLairTemplates(); spawnService.loadLairGroups(); + spawnService.loadDynamicGroups();; spawnService.loadSpawnAreas(); housingService.loadHousingTemplates(); @@ -495,24 +504,21 @@ public class NGECore { } private void cleanupCreatureODB() { - EntityCursor cursor = creatureODB.getCursor(Long.class, CreatureObject.class); + ODBCursor cursor = swgObjectODB.getCursor(); - Iterator it = cursor.iterator(); List deletedObjects = new ArrayList(); - while(it.hasNext()) { - CreatureObject creature = it.next(); - if(!characterService.playerExists(creature.getObjectID())) - deletedObjects.add(creature); + while(cursor.hasNext()) { + SWGObject creature = (SWGObject) cursor.next(); + if(!characterService.playerExists(creature.getObjectID()) && creature instanceof CreatureObject) + deletedObjects.add((CreatureObject) creature); } - cursor.close(); - Transaction txn = creatureODB.getEnvironment().beginTransaction(null, null); for(CreatureObject creature : deletedObjects) { - creatureODB.delete(creature.getObjectID(), Long.class, CreatureObject.class, txn); + swgObjectODB.remove(creature.getObjectID()); } - txn.commitSync(); + System.out.println("Deleted " + deletedObjects.size() + " creatures."); } @@ -598,8 +604,8 @@ public class NGECore { return databaseConnection2; } - public ObjectDatabase getCreatureODB() { - return creatureODB; + public ObjectDatabase getSWGObjectODB() { + return swgObjectODB; } public ObjectDatabase getMailODB() { @@ -609,11 +615,7 @@ public class NGECore { public ObjectDatabase getGuildODB() { return guildODB; } - - public ObjectDatabase getBuildingODB() { - return buildingODB; - } - + public ObjectDatabase getObjectIdODB() { return objectIdODB; } @@ -738,6 +740,19 @@ public class NGECore { return System.currentTimeMillis() - galacticTime; } + public void closeODBs() { + swgObjectODB.close(); + mailODB.close(); + guildODB.close(); + chatRoomODB.close(); + resourcesODB.close(); + resourceRootsODB.close(); + resourceHistoryODB.close(); + objectIdODB.close(); + duplicateIdODB.close(); + auctionODB.close(); + } + } diff --git a/src/resources/common/AString.java b/src/resources/common/AString.java index 1a9f73f2..14677cb6 100644 --- a/src/resources/common/AString.java +++ b/src/resources/common/AString.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.common; +import java.io.Serializable; import java.nio.ByteOrder; import org.apache.mina.core.buffer.IoBuffer; @@ -30,8 +31,9 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.Delta; @Persistent -public final class AString extends Delta { +public final class AString extends Delta implements Serializable { + private static final long serialVersionUID = 1L; private String string; public AString() { diff --git a/src/resources/common/UString.java b/src/resources/common/UString.java index dec215af..37564bd1 100644 --- a/src/resources/common/UString.java +++ b/src/resources/common/UString.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.common; +import java.io.Serializable; import java.io.UnsupportedEncodingException; import com.sleepycat.persist.model.Persistent; @@ -28,8 +29,9 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.Delta; @Persistent -public final class UString extends Delta { +public final class UString extends Delta implements Serializable { + private static final long serialVersionUID = 1L; private String string; public UString() { diff --git a/src/resources/gcw/CurrentServerGCWZoneHistory.java b/src/resources/gcw/CurrentServerGCWZoneHistory.java index 66874d64..c8f81fda 100644 --- a/src/resources/gcw/CurrentServerGCWZoneHistory.java +++ b/src/resources/gcw/CurrentServerGCWZoneHistory.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.gcw; +import java.io.Serializable; + import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; @@ -28,8 +30,9 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.Delta; @Persistent(version=0) -public class CurrentServerGCWZoneHistory extends Delta implements Cloneable { +public class CurrentServerGCWZoneHistory extends Delta implements Cloneable, Serializable { + private static final long serialVersionUID = 1L; private int lastUpdateTime; private int percent; diff --git a/src/resources/gcw/CurrentServerGCWZonePercent.java b/src/resources/gcw/CurrentServerGCWZonePercent.java index ea825d7a..6e5bf56a 100644 --- a/src/resources/gcw/CurrentServerGCWZonePercent.java +++ b/src/resources/gcw/CurrentServerGCWZonePercent.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.gcw; +import java.io.Serializable; import java.math.BigDecimal; import java.math.MathContext; @@ -29,12 +30,12 @@ import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; import engine.resources.scene.Point2D; - import resources.objects.Delta; @Persistent(version=0) -public class CurrentServerGCWZonePercent extends Delta implements Cloneable { +public class CurrentServerGCWZonePercent extends Delta implements Cloneable, Serializable { + private static final long serialVersionUID = 1L; private Point2D position; private float radius = 0; private BigDecimal weight; diff --git a/src/resources/gcw/OtherServerGCWZonePercent.java b/src/resources/gcw/OtherServerGCWZonePercent.java index ab8048eb..15d9da9d 100644 --- a/src/resources/gcw/OtherServerGCWZonePercent.java +++ b/src/resources/gcw/OtherServerGCWZonePercent.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.gcw; +import java.io.Serializable; + import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; @@ -28,8 +30,9 @@ import com.sleepycat.persist.model.Persistent; import resources.objects.Delta; @Persistent(version=0) -public class OtherServerGCWZonePercent extends Delta implements Cloneable { +public class OtherServerGCWZonePercent extends Delta implements Cloneable, Serializable { + private static final long serialVersionUID = 1L; private String zone = ""; private int percent = 50; diff --git a/src/resources/guild/Guild.java b/src/resources/guild/Guild.java index 5651c2d0..7ecdd2bb 100644 --- a/src/resources/guild/Guild.java +++ b/src/resources/guild/Guild.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.guild; +import java.io.Serializable; import java.util.List; import org.apache.mina.core.buffer.IoBuffer; @@ -28,12 +29,12 @@ import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; import resources.objects.Delta; - import engine.resources.objects.SWGObject; @Persistent(version=0) -public class Guild extends Delta { +public class Guild extends Delta implements Serializable { + private static final long serialVersionUID = 1L; private int id; private String abbreviation; private String name; diff --git a/src/resources/objects/Buff.java b/src/resources/objects/Buff.java index fd6aa4e0..ebcbb17b 100644 --- a/src/resources/objects/Buff.java +++ b/src/resources/objects/Buff.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.nio.ByteOrder; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; @@ -39,10 +40,11 @@ import com.sleepycat.persist.model.Persistent; import engine.resources.common.CRC; @Persistent(version=10) -public class Buff implements IDelta { +public class Buff implements IDelta, Serializable { + private static final long serialVersionUID = 1L; @NotPersistent - private SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); + private transient SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); private String group1, group2; private int priority; private float duration; @@ -64,7 +66,7 @@ public class Buff implements IDelta { private int totalPlayTime; private byte decayCounter = 0; @NotPersistent - private ScheduledFuture removalTask; + private transient ScheduledFuture removalTask; private int stacks = 1; private long groupBufferId; private int buffCRC; diff --git a/src/resources/objects/BuffItem.java b/src/resources/objects/BuffItem.java index b87ce0af..167aff9a 100644 --- a/src/resources/objects/BuffItem.java +++ b/src/resources/objects/BuffItem.java @@ -21,10 +21,14 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; @Persistent -public class BuffItem { +public class BuffItem implements Serializable { + + private static final long serialVersionUID = 1L; private int affectAmount; private int entertainerBonus; private int invested; diff --git a/src/resources/objects/DamageOverTime.java b/src/resources/objects/DamageOverTime.java index ce367916..b7c69810 100644 --- a/src/resources/objects/DamageOverTime.java +++ b/src/resources/objects/DamageOverTime.java @@ -21,20 +21,22 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.util.concurrent.ScheduledFuture; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; @Persistent(version=1) -public class DamageOverTime { +public class DamageOverTime implements Serializable { + private static final long serialVersionUID = 1L; private Buff buff; private String type; private int duration; private int intensity; @NotPersistent - private ScheduledFuture task; + private transient ScheduledFuture task; private long startTime; private String commandName; diff --git a/src/resources/objects/Delta.java b/src/resources/objects/Delta.java index 35ef4299..6e57706e 100644 --- a/src/resources/objects/Delta.java +++ b/src/resources/objects/Delta.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -33,12 +34,13 @@ import com.sleepycat.persist.model.Persistent; import resources.common.StringUtilities; @Persistent -public abstract class Delta implements IDelta { +public abstract class Delta implements IDelta, Serializable { + private static final long serialVersionUID = 1L; @NotPersistent - protected final Object objectMutex = new Object(); + protected transient final Object objectMutex = new Object(); @NotPersistent - private static SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); + private transient static SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); public Delta() { diff --git a/src/resources/objects/IDelta.java b/src/resources/objects/IDelta.java index cf1d8802..874715b0 100644 --- a/src/resources/objects/IDelta.java +++ b/src/resources/objects/IDelta.java @@ -21,10 +21,12 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; @Persistent -public interface IDelta { +public interface IDelta { public byte[] getBytes(); diff --git a/src/resources/objects/SWGList.java b/src/resources/objects/SWGList.java index 7471305c..d7d63f68 100644 --- a/src/resources/objects/SWGList.java +++ b/src/resources/objects/SWGList.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; @@ -43,16 +44,17 @@ import com.sleepycat.persist.model.Persistent; /* A SWGList element MUST implement IDelta, or it will refuse to work with it */ @Persistent -public class SWGList implements List { +public class SWGList implements List, Serializable { + private static final long serialVersionUID = 1L; private List list = new ArrayList(); @NotPersistent - private int updateCounter = 1; + private transient int updateCounter = 1; private ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent - protected final Object objectMutex = new Object(); + protected transient final Object objectMutex = new Object(); public SWGList() { } diff --git a/src/resources/objects/SWGMap.java b/src/resources/objects/SWGMap.java index b8f9610d..5e4a28a9 100644 --- a/src/resources/objects/SWGMap.java +++ b/src/resources/objects/SWGMap.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; @@ -43,16 +44,17 @@ import com.sleepycat.persist.model.Persistent; @SuppressWarnings("unused") @Persistent -public class SWGMap implements Map { +public class SWGMap implements Map, Serializable { + private static final long serialVersionUID = 1L; private Map map = new TreeMap(); @NotPersistent - private int updateCounter = 0; + private transient int updateCounter = 0; private ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent - protected final Object objectMutex = new Object(); + protected transient final Object objectMutex = new Object(); public SWGMap() { } diff --git a/src/resources/objects/SWGMultiMap.java b/src/resources/objects/SWGMultiMap.java index 850b55f9..a632c20c 100644 --- a/src/resources/objects/SWGMultiMap.java +++ b/src/resources/objects/SWGMultiMap.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; @@ -46,16 +47,17 @@ import com.sleepycat.persist.model.Persistent; @SuppressWarnings("unused") @Persistent -public class SWGMultiMap implements Multimap { +public class SWGMultiMap implements Multimap, Serializable { + private static final long serialVersionUID = 1L; private Multimap map = ArrayListMultimap.create(); @NotPersistent - private int updateCounter = 0; + private transient int updateCounter = 0; private ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent - protected final Object objectMutex = new Object(); + protected transient final Object objectMutex = new Object(); public SWGMultiMap() { } diff --git a/src/resources/objects/SkillMod.java b/src/resources/objects/SkillMod.java index 1a2fef63..d2d71dcc 100644 --- a/src/resources/objects/SkillMod.java +++ b/src/resources/objects/SkillMod.java @@ -21,13 +21,17 @@ ******************************************************************************/ package resources.objects; +import java.io.Serializable; + import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; @Persistent(version=0) -public class SkillMod extends Delta { +public class SkillMod extends Delta implements Serializable { + private static final long serialVersionUID = 1L; + private int base; private int modifier; diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index 6b4fd8fa..b0eb2d30 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.building; +import java.io.Serializable; import java.util.Vector; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; @@ -44,12 +45,13 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Entity(version=6) -public class BuildingObject extends TangibleObject implements IPersistent { +public class BuildingObject extends TangibleObject implements IPersistent, Serializable { + private static final long serialVersionUID = 1L; @NotPersistent - private BuildingMessageBuilder messageBuilder; + private transient BuildingMessageBuilder messageBuilder; @NotPersistent - private Transaction txn; + private transient Transaction txn; private float maintenanceAmount = 0; private int BMR = 0; diff --git a/src/resources/objects/cell/CellObject.java b/src/resources/objects/cell/CellObject.java index 32f1e86b..2552c85c 100644 --- a/src/resources/objects/cell/CellObject.java +++ b/src/resources/objects/cell/CellObject.java @@ -21,10 +21,13 @@ ******************************************************************************/ package resources.objects.cell; +import java.io.Serializable; + import protocol.swg.UpdateCellPermissionMessage; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; + import engine.clients.Client; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -32,11 +35,12 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=0) -public class CellObject extends SWGObject { +public class CellObject extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; private int cellNumber = 0; @NotPersistent - private CellMessageBuilder messageBuilder; + private transient CellMessageBuilder messageBuilder; public CellObject() { super(); diff --git a/src/resources/objects/craft/DraftSchematic.java b/src/resources/objects/craft/DraftSchematic.java index 3e47ae31..888f5cdb 100644 --- a/src/resources/objects/craft/DraftSchematic.java +++ b/src/resources/objects/craft/DraftSchematic.java @@ -21,7 +21,10 @@ ******************************************************************************/ package resources.objects.craft; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; + import engine.clients.Client; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -29,9 +32,10 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent -public class DraftSchematic extends SWGObject { - +public class DraftSchematic extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; + public DraftSchematic(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ super(objectID, planet, position, orientation, template); } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 20e460e4..cdb3b3e7 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.creature; +import java.io.Serializable; import java.lang.System; import java.util.ArrayList; import java.util.Collections; @@ -68,17 +69,16 @@ import resources.objects.tangible.TangibleObject; import services.command.BaseSWGCommand; @Entity(version=9) -public class CreatureObject extends TangibleObject implements IPersistent { +public class CreatureObject extends TangibleObject implements Serializable { - @NotPersistent - private Transaction txn; + private static final long serialVersionUID = 1L; // CREO 1 private int bankCredits = 0; private int cashCredits = 0; private List skills; @NotPersistent - private int skillsUpdateCounter = 0; + private transient int skillsUpdateCounter = 0; // CREO 3 private byte posture = 0; @@ -105,7 +105,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { private SWGList missionCriticalObjects; @NotPersistent - private int missionCriticalObjectsUpdateCounter = 0; + private transient int missionCriticalObjectsUpdateCounter = 0; // CREO6 @@ -130,30 +130,30 @@ public class CreatureObject extends TangibleObject implements IPersistent { private boolean acceptBandflourishes = true; private boolean groupDance = true; @NotPersistent - private CreatureObject performanceWatchee; + private transient CreatureObject performanceWatchee; @NotPersistent - private CreatureObject performanceListenee; + private transient CreatureObject performanceListenee; @NotPersistent - private Vector performanceAudience = new Vector(); + private transient Vector performanceAudience = new Vector(); private int health = 1000; private int action = 300; @NotPersistent - private int HAMListCounter = 0; + private transient int HAMListCounter = 0; private int maxHealth = 1000; private int maxAction = 300; @NotPersistent - private int maxHAMListCounter = 0; + private transient int maxHAMListCounter = 0; private SWGList equipmentList; @NotPersistent - private int equipmentListUpdateCounter = 0; + private transient int equipmentListUpdateCounter = 0; private SWGList buffList = new SWGList(); @NotPersistent - private int buffListUpdateCounter = 0; + private transient int buffListUpdateCounter = 0; private byte difficulty = 0; private SWGList appearanceEquipmentList; @NotPersistent - private int appearanceEquipmentListUpdateCounter = 0; + private transient int appearanceEquipmentListUpdateCounter = 0; private boolean inStealth = false; private boolean radarVisible = true; // radar @@ -161,34 +161,34 @@ public class CreatureObject extends TangibleObject implements IPersistent { // non-baseline vars @NotPersistent - private List duelList = Collections.synchronizedList(new ArrayList()); + private transient List duelList = Collections.synchronizedList(new ArrayList()); @NotPersistent - private CreatureMessageBuilder messageBuilder; + private transient CreatureMessageBuilder messageBuilder; private SWGList dotList = new SWGList(); @NotPersistent - private ScheduledFuture incapTask; + private transient ScheduledFuture incapTask; @NotPersistent - private ScheduledFuture entertainerExperience; + private transient ScheduledFuture entertainerExperience; @NotPersistent - private ScheduledFuture inspirationTick; + private transient ScheduledFuture inspirationTick; @NotPersistent - private ScheduledFuture spectatorTask; + private transient ScheduledFuture spectatorTask; private boolean staticNPC = false; // temp @NotPersistent - private int flourishCount = 0; + private transient int flourishCount = 0; @NotPersistent - private boolean performingEffect; + private transient boolean performingEffect; @NotPersistent - private boolean performingFlourish; + private transient boolean performingFlourish; private int coverCharge; @NotPersistent - private TangibleObject conversingNpc; + private transient TangibleObject conversingNpc; @NotPersistent - private ConcurrentHashMap cooldowns = new ConcurrentHashMap(); + private transient ConcurrentHashMap cooldowns = new ConcurrentHashMap(); @NotPersistent - private long tefTime = System.currentTimeMillis(); + private transient long tefTime = System.currentTimeMillis(); public CreatureObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, Template, position, orientation); @@ -226,10 +226,6 @@ public class CreatureObject extends TangibleObject implements IPersistent { notifyObservers(messageBuilder.buildCustomNameDelta(customName), true); } - - public Transaction getTransaction() { return txn; } - - public void createTransaction(Environment env) { txn = env.beginTransaction(null, null); } public int getBankCredits() { synchronized(objectMutex) { diff --git a/src/resources/objects/factorycrate/FactoryCrateObject.java b/src/resources/objects/factorycrate/FactoryCrateObject.java index d7b7b7d6..b613aa26 100644 --- a/src/resources/objects/factorycrate/FactoryCrateObject.java +++ b/src/resources/objects/factorycrate/FactoryCrateObject.java @@ -21,11 +21,11 @@ ******************************************************************************/ package resources.objects.factorycrate; +import java.io.Serializable; import java.util.Map; import java.util.Vector; import main.NGECore; - import protocol.swg.SceneCreateObjectByCrc; import protocol.swg.SceneDestroyObject; import protocol.swg.SceneEndBaselines; @@ -41,7 +41,6 @@ import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; - import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; @@ -50,8 +49,10 @@ import resources.objects.tangible.TangibleObject; */ @Persistent(version=0) -public class FactoryCrateObject extends TangibleObject { +public class FactoryCrateObject extends TangibleObject implements Serializable { + private static final long serialVersionUID = 1L; + private Vector contents; private byte capacity; private byte contentObjectQuantity; @@ -59,7 +60,7 @@ public class FactoryCrateObject extends TangibleObject { private TangibleObject contentObjectType; @NotPersistent - private FactoryCrateMessageBuilder messageBuilder; + private transient FactoryCrateMessageBuilder messageBuilder; public FactoryCrateObject() { diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index 0f5c4622..561bf7e7 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -21,10 +21,10 @@ ******************************************************************************/ package resources.objects.group; +import java.io.Serializable; import java.util.Vector; import resources.objects.universe.UniverseObject; - import engine.clients.Client; import engine.resources.objects.SWGObject; import engine.resources.scene.Point3D; diff --git a/src/resources/objects/guild/GuildObject.java b/src/resources/objects/guild/GuildObject.java index 5890756b..3e186fd7 100644 --- a/src/resources/objects/guild/GuildObject.java +++ b/src/resources/objects/guild/GuildObject.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.guild; +import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -28,7 +29,6 @@ import java.util.TreeMap; import org.apache.mina.core.buffer.IoBuffer; import main.NGECore; - import resources.gcw.CurrentServerGCWZoneHistory; import resources.gcw.CurrentServerGCWZonePercent; import resources.gcw.OtherServerGCWZonePercent; @@ -51,16 +51,15 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Entity(version=1) -public class GuildObject extends UniverseObject implements IPersistent { +public class GuildObject extends UniverseObject implements Serializable { + private static final long serialVersionUID = 1L; protected NGECore core; @NotPersistent - private GuildMessageBuilder messageBuilder = new GuildMessageBuilder(this); + private transient GuildMessageBuilder messageBuilder = new GuildMessageBuilder(this); private Map serverFirst = new HashMap(); private Map> zoneMap = new TreeMap>(); - @NotPersistent - private Transaction txn; private long nextInstanceId = 0; @@ -302,12 +301,5 @@ public class GuildObject extends UniverseObject implements IPersistent { } } - public Transaction getTransaction() { - return txn; - } - - public void createTransaction(Environment env) { - txn = env.beginTransaction(null, null); - } } diff --git a/src/resources/objects/harvester/HarvesterObject.java b/src/resources/objects/harvester/HarvesterObject.java index 8964d7e1..7863c67b 100644 --- a/src/resources/objects/harvester/HarvesterObject.java +++ b/src/resources/objects/harvester/HarvesterObject.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.harvester; +import java.io.Serializable; import java.util.Vector; import main.NGECore; @@ -42,8 +43,10 @@ import resources.objects.resource.ResourceContainerObject; */ @Persistent(version=0) -public class HarvesterObject extends InstallationObject { +public class HarvesterObject extends InstallationObject implements Serializable { + private static final long serialVersionUID = 1L; + private HarvesterMessageBuilder messageBuilder; private InstallationMessageBuilder installationMessageBuilder; diff --git a/src/resources/objects/installation/InstallationObject.java b/src/resources/objects/installation/InstallationObject.java index 4d78229d..65c61bae 100644 --- a/src/resources/objects/installation/InstallationObject.java +++ b/src/resources/objects/installation/InstallationObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.installation; +import java.io.Serializable; + import com.sleepycat.persist.model.Entity; import engine.clients.Client; @@ -30,8 +32,10 @@ import engine.resources.scene.Quaternion; import resources.objects.tangible.TangibleObject; @Entity(version=0) -public class InstallationObject extends TangibleObject { +public class InstallationObject extends TangibleObject implements Serializable { + private static final long serialVersionUID = 1L; + public InstallationObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ super(objectID, planet, template, position, orientation); } diff --git a/src/resources/objects/intangible/IntangibleObject.java b/src/resources/objects/intangible/IntangibleObject.java index 23801ed6..7e0d3c57 100644 --- a/src/resources/objects/intangible/IntangibleObject.java +++ b/src/resources/objects/intangible/IntangibleObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.intangible; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; import engine.clients.Client; @@ -30,8 +32,10 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=0) -public class IntangibleObject extends SWGObject { +public class IntangibleObject extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; + private int genericInt; public IntangibleObject() { diff --git a/src/resources/objects/loot/LootGroup.java b/src/resources/objects/loot/LootGroup.java index 1c626c05..3e7ab123 100644 --- a/src/resources/objects/loot/LootGroup.java +++ b/src/resources/objects/loot/LootGroup.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.loot; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; /** @@ -28,8 +30,10 @@ import com.sleepycat.persist.model.Persistent; */ @Persistent(version=0) -public class LootGroup { +public class LootGroup implements Serializable { + private static final long serialVersionUID = 1L; + private String[] lootPoolNames; private double[] lootPoolChances; private double lootGroupChance; diff --git a/src/resources/objects/manufacture/ManufactureSchematicObject.java b/src/resources/objects/manufacture/ManufactureSchematicObject.java index 4ed340ef..96c363ee 100644 --- a/src/resources/objects/manufacture/ManufactureSchematicObject.java +++ b/src/resources/objects/manufacture/ManufactureSchematicObject.java @@ -22,8 +22,12 @@ package resources.objects.manufacture; +import java.io.Serializable; + import resources.objects.intangible.IntangibleObject; + import com.sleepycat.persist.model.Persistent; + import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -34,8 +38,9 @@ import engine.resources.scene.Quaternion; */ @Persistent(version=0) -public class ManufactureSchematicObject extends IntangibleObject{ +public class ManufactureSchematicObject extends IntangibleObject implements Serializable { + private static final long serialVersionUID = 1L; //@NotPersistent //private ManufactureSchematicMessageBuilder messageBuilder; diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 12ed3fa8..4d9e200e 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.mission; +import java.io.Serializable; + import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.NotPersistent; @@ -36,8 +38,9 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=1) -public class MissionObject extends IntangibleObject implements IPersistent { - +public class MissionObject extends IntangibleObject implements Serializable { + + private static final long serialVersionUID = 1L; private Point3D destination; private Point3D startLocation; private String startPlanet = ""; @@ -56,11 +59,8 @@ public class MissionObject extends IntangibleObject implements IPersistent { private MissionObjective objective; @NotPersistent - MissionMessageBuilder messageBuilder = new MissionMessageBuilder(this); - - @NotPersistent - private Transaction txn; - + private transient MissionMessageBuilder messageBuilder = new MissionMessageBuilder(this); + public MissionObject() { super(); } @@ -286,14 +286,6 @@ public class MissionObject extends IntangibleObject implements IPersistent { this.missionId = missionId; } - public Transaction getTransaction() { - return txn; - } - - public void createTransaction(Environment env) { - txn = env.beginTransaction(null, null); - } - @Override public void sendBaselines(Client destination) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index bcbc3b21..fe337552 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.player; +import java.io.Serializable; import java.util.ArrayList; import java.util.BitSet; import java.util.HashMap; @@ -45,8 +46,9 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=13) -public class PlayerObject extends IntangibleObject { +public class PlayerObject extends IntangibleObject implements Serializable { + private static final long serialVersionUID = 1L; // PLAY 3 private String title; @@ -71,11 +73,11 @@ public class PlayerObject extends IntangibleObject { private Map xpList = new HashMap(); @NotPersistent - private int xpListUpdateCounter = 0; + private transient int xpListUpdateCounter = 0; private List waypoints = new ArrayList(); @NotPersistent - private int waypointListUpdateCounter = 0; + private transient int waypointListUpdateCounter = 0; private int currentForcePower = 0; // unused in NGE private int maxForcePower = 0; // unused in NGE @@ -85,7 +87,7 @@ public class PlayerObject extends IntangibleObject { private List questJournal = new ArrayList(); @NotPersistent - private int questJournalUpdateCounter = 0; + private transient int questJournalUpdateCounter = 0; private String professionWheelPosition; @@ -97,17 +99,17 @@ public class PlayerObject extends IntangibleObject { private List draftSchematicList = new ArrayList(); @NotPersistent - private int draftSchematicListUpdateCounter = 0; + private transient int draftSchematicListUpdateCounter = 0; private int experimentationPoints = 0; private int accomplishmentCounter = 0; private List friendList = new ArrayList(); @NotPersistent - private int friendListUpdateCounter = 0; + private transient int friendListUpdateCounter = 0; private List ignoreList = new ArrayList(); @NotPersistent - private int ignoreListUpdateCounter = 0; + private transient int ignoreListUpdateCounter = 0; private int languageId = 0; // unused in NGE private int currentStomach = 0; // unused in NGE @@ -129,10 +131,10 @@ public class PlayerObject extends IntangibleObject { private int lotsRemaining = 10; @NotPersistent - private PlayerMessageBuilder messageBuilder; + private transient PlayerMessageBuilder messageBuilder; @NotPersistent - private long lastPlayTimeUpdate = System.currentTimeMillis(); + private transient long lastPlayTimeUpdate = System.currentTimeMillis(); private Map factionStandingMap = new TreeMap(); @@ -145,7 +147,7 @@ public class PlayerObject extends IntangibleObject { private List chatChannels = new ArrayList(); @NotPersistent - private boolean callingCompanion = false; + private transient boolean callingCompanion = false; public PlayerObject() { super(); diff --git a/src/resources/objects/resource/GalacticResource.java b/src/resources/objects/resource/GalacticResource.java index 9f23a171..4a88c7a6 100644 --- a/src/resources/objects/resource/GalacticResource.java +++ b/src/resources/objects/resource/GalacticResource.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.resource; +import java.io.Serializable; import java.util.List; import java.util.Random; import java.util.Vector; @@ -48,10 +49,9 @@ import engine.resources.scene.Quaternion; */ @Entity(version=0) -public class GalacticResource extends SWGObject implements IPersistent { +public class GalacticResource extends SWGObject implements Serializable { - @NotPersistent - private Transaction txn; + private static final long serialVersionUID = 1L; private String name; private String fileName; @@ -63,30 +63,30 @@ public class GalacticResource extends SWGObject implements IPersistent { @NotPersistent - public static final int INT_COLDRESISTANCE = 0; + public transient static final int INT_COLDRESISTANCE = 0; @NotPersistent - public static final int INT_CONDUCTIVITY = 1; + public transient static final int INT_CONDUCTIVITY = 1; @NotPersistent - public static final int INT_DECAYRESISTANCE = 2; + public transient static final int INT_DECAYRESISTANCE = 2; @NotPersistent - public static final int INT_HEATRESISTANCE = 3; + public transient static final int INT_HEATRESISTANCE = 3; @NotPersistent - public static final int INT_MALLEABILITY = 4; + public transient static final int INT_MALLEABILITY = 4; @NotPersistent - public static final int INT_SHOCKRESISTANCE = 5; + public transient static final int INT_SHOCKRESISTANCE = 5; @NotPersistent - public static final int INT_UNITTOUGHNESS = 6; + public transient static final int INT_UNITTOUGHNESS = 6; @NotPersistent - public static final int INT_ENTANGLERESISTANCE = 7; + public transient static final int INT_ENTANGLERESISTANCE = 7; @NotPersistent - public static final int INT_POTENTIALENERGY = 8; + public transient static final int INT_POTENTIALENERGY = 8; @NotPersistent - public static final int INT_OVERALLQUALITY = 9; + public transient static final int INT_OVERALLQUALITY = 9; @NotPersistent - public static final int INT_FLAVOR = 10; + public transient static final int INT_FLAVOR = 10; @NotPersistent - public static final String[] statNamesLookup = {"Cold Resistance", + public transient static final String[] statNamesLookup = {"Cold Resistance", "Conductivity", "Decay Resistance", "Heat Resistance", @@ -117,16 +117,16 @@ public class GalacticResource extends SWGObject implements IPersistent { short[] resourceStats = new short[11]; @NotPersistent - private static int RES_CAT_HI = 1; // Up to 99%, easy to find spots over 90% + private transient static int RES_CAT_HI = 1; // Up to 99%, easy to find spots over 90% @NotPersistent - private static int RES_CAT_MID = 2; // Up to 90%, often have to settle at around 80% + private transient static int RES_CAT_MID = 2; // Up to 90%, often have to settle at around 80% @NotPersistent - private static int RES_CAT_LO = 3; // Up to 70%, often have to settle around 60% + private transient static int RES_CAT_LO = 3; // Up to 70%, often have to settle around 60% @NotPersistent - private static int RES_CAT_CRE = 4; // Creature resource + private transient static int RES_CAT_CRE = 4; // Creature resource @NotPersistent // Direct Persistence Layer entity reference restriction - private ResourceRoot resourceRoot; + private transient ResourceRoot resourceRoot; private int resourceRootID; // This is for re-referencing the resourceRoot in the reloaded resourceRoot collection // due to the DPL entity reference restriction @@ -633,13 +633,6 @@ public class GalacticResource extends SWGObject implements IPersistent { "zau"}; - @Override - public void createTransaction(Environment env) { txn = env.beginTransaction(null, null);} - - - @Override - public Transaction getTransaction() { return txn; } - @Override public void sendBaselines(Client arg0) { } diff --git a/src/resources/objects/resource/PlanetDeposits.java b/src/resources/objects/resource/PlanetDeposits.java index 712ec89b..9daea331 100644 --- a/src/resources/objects/resource/PlanetDeposits.java +++ b/src/resources/objects/resource/PlanetDeposits.java @@ -1,12 +1,14 @@ package resources.objects.resource; +import java.io.Serializable; import java.util.List; import com.sleepycat.persist.model.Persistent; @Persistent(version=0) -public class PlanetDeposits { +public class PlanetDeposits implements Serializable { + private static final long serialVersionUID = 1L; private int planetId; private List depositList; diff --git a/src/resources/objects/resource/ResourceContainerObject.java b/src/resources/objects/resource/ResourceContainerObject.java index c5b84a9f..e48cd761 100644 --- a/src/resources/objects/resource/ResourceContainerObject.java +++ b/src/resources/objects/resource/ResourceContainerObject.java @@ -22,6 +22,8 @@ package resources.objects.resource; +import java.io.Serializable; + import main.NGECore; import com.sleepycat.persist.model.NotPersistent; @@ -40,8 +42,9 @@ import resources.objects.tangible.TangibleObject; */ @Persistent(version=0) -public class ResourceContainerObject extends TangibleObject { +public class ResourceContainerObject extends TangibleObject implements Serializable { + private static final long serialVersionUID = 1L; // Unique ID private long containerID; @@ -131,10 +134,10 @@ public class ResourceContainerObject extends TangibleObject { */ @NotPersistent - public static int maximalStackCapacity = 100000; + public transient static int maximalStackCapacity = 100000; @NotPersistent - private ResourceContainerMessageBuilder messageBuilder; + private transient ResourceContainerMessageBuilder messageBuilder; public ResourceContainerObject(){ diff --git a/src/resources/objects/resource/ResourceDeposit.java b/src/resources/objects/resource/ResourceDeposit.java index 9a6572fc..b3772f52 100644 --- a/src/resources/objects/resource/ResourceDeposit.java +++ b/src/resources/objects/resource/ResourceDeposit.java @@ -1,5 +1,7 @@ package resources.objects.resource; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; /** @@ -7,7 +9,9 @@ import com.sleepycat.persist.model.Persistent; */ @Persistent(version=0) -public class ResourceDeposit { +public class ResourceDeposit implements Serializable { + + private static final long serialVersionUID = 1L; private float spawnCoordsX; private float spawnCoordsZ; private float spawnRadius; diff --git a/src/resources/objects/resource/ResourceRoot.java b/src/resources/objects/resource/ResourceRoot.java index 34bba280..31d558da 100644 --- a/src/resources/objects/resource/ResourceRoot.java +++ b/src/resources/objects/resource/ResourceRoot.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.resource; +import java.io.Serializable; + import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.Entity; @@ -32,8 +34,9 @@ import com.sleepycat.persist.model.PrimaryKey; */ @Entity(version=0) -public class ResourceRoot { +public class ResourceRoot implements Serializable { + private static final long serialVersionUID = 1L; // Publish 15: // - Total: 61, Minimum pool: 15, Random pool: 24 (3 was removed), Fixed pool: 22. @@ -84,7 +87,7 @@ public class ResourceRoot { // All 38 Organic types for each planet @NotPersistent - private Transaction txn; + private transient Transaction txn; private static int highestID = 0; diff --git a/src/resources/objects/ship/ShipObject.java b/src/resources/objects/ship/ShipObject.java index 62d4d6a4..d2afa673 100644 --- a/src/resources/objects/ship/ShipObject.java +++ b/src/resources/objects/ship/ShipObject.java @@ -21,11 +21,14 @@ ******************************************************************************/ package resources.objects.ship; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; import resources.objects.tangible.TangibleObject; @Persistent(version=0) -public class ShipObject extends TangibleObject { - +public class ShipObject extends TangibleObject implements Serializable { + + private static final long serialVersionUID = 1L; } diff --git a/src/resources/objects/staticobject/StaticObject.java b/src/resources/objects/staticobject/StaticObject.java index 53297b00..02c1fb70 100644 --- a/src/resources/objects/staticobject/StaticObject.java +++ b/src/resources/objects/staticobject/StaticObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.staticobject; +import java.io.Serializable; + import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; @@ -31,10 +33,11 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=0) -public class StaticObject extends SWGObject { +public class StaticObject extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; @NotPersistent - private StaticMessageBuilder messageBuilder; + private transient StaticMessageBuilder messageBuilder; public StaticObject() { super(); diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 4a5f11c3..b9adf140 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -22,6 +22,7 @@ package resources.objects.tangible; import java.io.ByteArrayOutputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -55,8 +56,9 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=12) -public class TangibleObject extends SWGObject { +public class TangibleObject extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; // TODO: Thread safety protected int incapTimer = 10; @@ -72,9 +74,9 @@ public class TangibleObject extends SWGObject { protected String faction = ""; // Says you're "Imperial Special Forces" if it's 0 for some reason protected int factionStatus = 0; @NotPersistent - private Vector defendersList = new Vector(); // unused in packets but useful for the server + private transient Vector defendersList = new Vector(); // unused in packets but useful for the server @NotPersistent - private TangibleMessageBuilder messageBuilder; + private transient TangibleMessageBuilder messageBuilder; private int respawnTime = 0; private Point3D spawnCoordinates = new Point3D(0, 0, 0); @@ -83,13 +85,13 @@ public class TangibleObject extends SWGObject { private List lootGroups = new ArrayList(); @NotPersistent - private boolean looted = false; // These 4 should not need to be persisted, since a looted corpse will get wiped with server restart + private transient boolean looted = false; // These 4 should not need to be persisted, since a looted corpse will get wiped with server restart @NotPersistent - private boolean lootLock = false; + private transient boolean lootLock = false; @NotPersistent - private boolean creditRelieved = false; + private transient boolean creditRelieved = false; @NotPersistent - private boolean lootItem = false; + private transient boolean lootItem = false; private boolean stackable = false; private int stackCount = 1; @@ -101,7 +103,7 @@ public class TangibleObject extends SWGObject { private String serialNumber; @NotPersistent - private TangibleObject killer = null; + private transient TangibleObject killer = null; public TangibleObject(long objectID, Planet planet, String template) { super(objectID, planet, new Point3D(0, 0, 0), new Quaternion(1, 0, 1, 0), template); diff --git a/src/resources/objects/tool/SurveyTool.java b/src/resources/objects/tool/SurveyTool.java index 90dfbc18..48f4facb 100644 --- a/src/resources/objects/tool/SurveyTool.java +++ b/src/resources/objects/tool/SurveyTool.java @@ -21,6 +21,7 @@ ******************************************************************************/ package resources.objects.tool; +import java.io.Serializable; import java.util.Vector; import main.NGECore; @@ -41,8 +42,9 @@ import resources.objects.tangible.TangibleObject; */ @Persistent(version=0) -public class SurveyTool extends TangibleObject{ +public class SurveyTool extends TangibleObject implements Serializable { + private static final long serialVersionUID = 1L; private byte toolType=0; private long surveyResourceID; private long userID=0; @@ -50,25 +52,25 @@ public class SurveyTool extends TangibleObject{ private byte SurveyRangeSetting=0; @NotPersistent - private String surveyEffectString=""; + private transient String surveyEffectString=""; @NotPersistent - private String sampleEffectString=""; + private transient String sampleEffectString=""; @NotPersistent - private boolean currentlySurveying=false; + private transient boolean currentlySurveying=false; @NotPersistent - private boolean currentlySampling=false; + private transient boolean currentlySampling=false; @NotPersistent - private boolean currentlyCoolingDown=false; + private transient boolean currentlyCoolingDown=false; @NotPersistent - private boolean exceptionalState=false; + private transient boolean exceptionalState=false; @NotPersistent - private boolean recoveryMode=false; + private transient boolean recoveryMode=false; @NotPersistent - private Long lastSurveyTime=0L; + private transient Long lastSurveyTime=0L; @NotPersistent - private Long lastSampleTime=0L; + private transient Long lastSampleTime=0L; @NotPersistent - private Long recoveryTime=10L; + private transient Long recoveryTime=10L; public static byte MineralSurveyDevice = 1; public static byte ChemicalSurveyDevice = 2; diff --git a/src/resources/objects/universe/UniverseObject.java b/src/resources/objects/universe/UniverseObject.java index 723d5a1e..d2e934d4 100644 --- a/src/resources/objects/universe/UniverseObject.java +++ b/src/resources/objects/universe/UniverseObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.universe; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; import engine.clients.Client; @@ -30,8 +32,10 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=0) -public class UniverseObject extends SWGObject { +public class UniverseObject extends SWGObject implements Serializable { + private static final long serialVersionUID = 1L; + public UniverseObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, position, orientation, Template); } diff --git a/src/resources/objects/waypoint/WaypointObject.java b/src/resources/objects/waypoint/WaypointObject.java index 32d73e1b..0c84d251 100644 --- a/src/resources/objects/waypoint/WaypointObject.java +++ b/src/resources/objects/waypoint/WaypointObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.waypoint; +import java.io.Serializable; + import resources.objects.intangible.IntangibleObject; import com.sleepycat.persist.model.Persistent; @@ -31,8 +33,10 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=0) -public class WaypointObject extends IntangibleObject { +public class WaypointObject extends IntangibleObject implements Serializable { + private static final long serialVersionUID = 1L; + private int cellId; // ??? private long locationNetworkId; private int planetCRC; diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index 2d0fa6ba..28b8c67f 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -21,6 +21,8 @@ ******************************************************************************/ package resources.objects.weapon; +import java.io.Serializable; + import resources.datatables.WeaponType; import resources.objects.tangible.TangibleObject; @@ -33,12 +35,14 @@ import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @Persistent(version=1) -public class WeaponObject extends TangibleObject { +public class WeaponObject extends TangibleObject implements Serializable { + private static final long serialVersionUID = 1L; + // TODO: Thread safety @NotPersistent - private WeaponMessageBuilder messageBuilder; + private transient WeaponMessageBuilder messageBuilder; public WeaponObject(long objectID, Planet planet, String template) { super(objectID, planet, template, new Point3D(0, 0, 0), new Quaternion(1, 0, 1, 0)); diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index b11bd350..82b4749c 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -269,10 +269,7 @@ public class CharacterService implements INetworkDispatch { core.skillModService.addSkillMod(object, "language_basic_speak", 100); core.skillModService.addSkillMod(object, "creature_harvesting", 25); core.skillModService.addSkillMod(object, "language_wookiee_comprehend", 100); - - - object.createTransaction(core.getCreatureODB().getEnvironment()); - + PlayerObject player = (PlayerObject) core.objectService.createObject("object/player/shared_player.iff", object.getPlanet()); object._add(player); core.skillService.addSkill(object, "species_" + object.getStfName()); @@ -337,9 +334,7 @@ public class CharacterService implements INetworkDispatch { createStarterClothing(object, sharedRaceTemplate, clientCreateCharacter.getStarterProfession()); //core.scriptService.callScript("scripts/", "demo", "CreateStartingCharacter", core, object); - core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction()); - // might not need to commit transaction but better safe than sorry - object.getTransaction().commitSync(); + core.getSWGObjectODB().put(object.getObjectID(), object); PreparedStatement ps = databaseConnection.preparedStatement("INSERT INTO characters (id, \"firstName\", \"lastName\", \"accountId\", \"galaxyId\", \"statusId\", appearance, gmflag) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); ps.setLong(1, object.getObjectID()); diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index ff79d72c..0645ee7a 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -281,9 +281,7 @@ public class ConnectionService implements INetworkDispatch { schedulers.clear(); core.playerService.getSchedulers().remove(object.getObjectID()); - object.createTransaction(core.getCreatureODB().getEnvironment()); - core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction()); - object.getTransaction().commitSync(); + core.getSWGObjectODB().put(object.getObjectID(), object); core.objectService.destroyObject(object); } diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 374400ef..5f72c715 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -206,7 +206,7 @@ public class LoginService implements INetworkDispatch{ core.objectService.destroyObject(object); } - core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + core.getSWGObjectODB().remove(object.getObjectID()); DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(0); session.write(reply.serialize()); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 0b941eb6..ee8bfa50 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -53,6 +53,7 @@ import engine.resources.common.Event; import engine.resources.common.Mesh3DTriangle; import engine.resources.common.Ray; import engine.resources.container.Traverser; +import engine.resources.database.ODBCursor; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -186,13 +187,11 @@ public class SimulationService implements INetworkDispatch { } public void insertPersistentBuildings() { - EntityCursor cursor = core.getBuildingODB().getCursor(Long.class, BuildingObject.class); + ODBCursor cursor = core.getSWGObjectODB().getCursor(); - Iterator it = cursor.iterator(); - - while(it.hasNext()) { - final BuildingObject building = (BuildingObject) core.objectService.getObject(it.next().getObjectID()); - if(building == null) + while(cursor.hasNext()) { + SWGObject building = core.objectService.getObject(((SWGObject) cursor.next()).getObjectID()); + if(building == null || !(building instanceof BuildingObject)) continue; if(building.getAttachment("hasLoadedServerTemplate") == null) core.objectService.loadServerTemplate(building); diff --git a/src/services/bazaar/AuctionItem.java b/src/services/bazaar/AuctionItem.java index 92e1e41f..ffa3f6d4 100644 --- a/src/services/bazaar/AuctionItem.java +++ b/src/services/bazaar/AuctionItem.java @@ -21,6 +21,8 @@ ******************************************************************************/ package services.bazaar; +import java.io.Serializable; + import com.sleepycat.je.Environment; import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.Entity; @@ -31,8 +33,10 @@ import engine.resources.objects.IPersistent; import engine.resources.objects.SWGObject; @Entity(version=1) -public class AuctionItem implements IPersistent, Comparable { +public class AuctionItem implements Comparable, Serializable { + private static final long serialVersionUID = 1L; + @PrimaryKey private long objectId; private SWGObject item; @@ -62,10 +66,7 @@ public class AuctionItem implements IPersistent, Comparable { public final static int EXPIRED = 4; public final static int OFFERED = 5; public final static int RETRIEVED = 6; - - @NotPersistent - private Transaction txn; - + public AuctionItem() { } @@ -256,16 +257,6 @@ public class AuctionItem implements IPersistent, Comparable { this.auctionOptions = auctionOptions; } - @Override - public void createTransaction(Environment env) { - txn = env.beginTransaction(null, null); - } - - @Override - public Transaction getTransaction() { - return txn; - } - public SWGObject getItem() { return item; } diff --git a/src/services/bazaar/BazaarService.java b/src/services/bazaar/BazaarService.java index 4d074039..b6e542b1 100644 --- a/src/services/bazaar/BazaarService.java +++ b/src/services/bazaar/BazaarService.java @@ -38,6 +38,7 @@ import com.sleepycat.persist.EntityCursor; import main.NGECore; import engine.clients.Client; +import engine.resources.database.ODBCursor; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -81,16 +82,18 @@ public class BazaarService implements INetworkDispatch { public BazaarService(NGECore core) { this.core = core; loadAuctionItems(); - Runtime.getRuntime().addShutdownHook(new Thread(() -> { - System.out.println("Saving auction items..."); - auctionItems.forEach(item -> core.objectService.persistObject(item, Long.class, AuctionItem.class, core.getAuctionODB())); - })); + } + + public void saveAllItems() { + System.out.println("Saving auction items..."); + auctionItems.forEach(item -> core.objectService.persistObject(item.getObjectId(), item, core.getAuctionODB())); } private void loadAuctionItems() { - EntityCursor cursor = core.getAuctionODB().getCursor(Long.class, AuctionItem.class); - Iterator it = cursor.iterator(); - it.forEachRemaining(this::addAuctionItem); + ODBCursor cursor = core.getAuctionODB().getCursor(); + while(cursor.hasNext()) { + addAuctionItem((AuctionItem) cursor.next()); + } cursor.close(); } @@ -412,7 +415,7 @@ public class BazaarService implements INetworkDispatch { if(seller == null) { seller = core.objectService.getCreatureFromDB(item.getOwnerId()); seller.setBankCredits(seller.getBankCredits() + item.getPrice()); - core.objectService.persistObject(seller, Long.class, CreatureObject.class, core.getAuctionODB()); + core.objectService.persistObject(seller.getObjectID(), seller, core.getSWGObjectODB()); } } @@ -752,8 +755,8 @@ public class BazaarService implements INetworkDispatch { if(commodityLimit.get(auctionItem.getOwnerId()) != null) commodityNumber = commodityLimit.get(auctionItem.getOwnerId()); commodityLimit.put(auctionItem.getOwnerId(), commodityNumber + 1); - if(!core.getAuctionODB().contains(auctionItem.getObjectId(), Long.class, AuctionItem.class)) { - core.objectService.persistObject(auctionItem, Long.class, AuctionItem.class, core.getAuctionODB()); + if(!core.getAuctionODB().contains(auctionItem.getObjectId())) { + core.objectService.persistObject(auctionItem.getObjectId(), auctionItem, core.getAuctionODB()); } } @@ -763,7 +766,7 @@ public class BazaarService implements INetworkDispatch { if(commodityLimit.get(auctionItem.getOwnerId()) != null) commodityNumber = commodityLimit.get(auctionItem.getOwnerId()); commodityLimit.put(auctionItem.getOwnerId(), commodityNumber - 1); - core.objectService.deletePersistentObject(auctionItem, Long.class, AuctionItem.class, core.getAuctionODB(), auctionItem.getObjectId()); + core.objectService.deletePersistentObject(auctionItem.getObjectId(), core.getAuctionODB()); } } diff --git a/src/services/chat/ChatRoom.java b/src/services/chat/ChatRoom.java index 10f853c1..dd243d2d 100644 --- a/src/services/chat/ChatRoom.java +++ b/src/services/chat/ChatRoom.java @@ -21,15 +21,19 @@ ******************************************************************************/ package services.chat; +import java.io.Serializable; import java.util.Vector; + import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.PrimaryKey; @Entity(version=1) -public class ChatRoom { +public class ChatRoom implements Serializable { + + private static final long serialVersionUID = 1L; private String creator; // creator of the room (first name only, lowercase) private String description; // title @PrimaryKey @@ -39,7 +43,7 @@ public class ChatRoom { private Vector moderatorList = new Vector(); private Vector banList = new Vector(); @NotPersistent - private Vector userList = new Vector(); // current users + private transient Vector userList = new Vector(); // current users private boolean moderatorsOnly; private boolean privateRoom; diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index be4cbb43..26e6c611 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -42,6 +42,7 @@ import engine.clientdata.visitors.DatatableVisitor; import engine.clients.Client; import engine.resources.config.Config; import engine.resources.config.DefaultConfig; +import engine.resources.database.ODBCursor; import engine.resources.database.ObjectDatabase; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; @@ -317,7 +318,7 @@ public class ChatService implements INetworkDispatch { return; SWGObject obj = client.getParent(); - Mail mail = mailODB.get(new Integer(packet.getMailId()), Integer.class, Mail.class); + Mail mail = (Mail) mailODB.get((long) packet.getMailId()); if(obj == null || mail == null) return; @@ -352,7 +353,7 @@ public class ChatService implements INetworkDispatch { return; SWGObject obj = client.getParent(); - Mail mail = mailODB.get(new Integer(packet.getMailId()), Integer.class, Mail.class); + Mail mail = (Mail) mailODB.get((long) packet.getMailId()); if(obj == null || mail == null) return; @@ -689,15 +690,11 @@ public class ChatService implements INetworkDispatch { public void storePersistentMessage(Mail mail) { - Transaction txn = mailODB.getEnvironment().beginTransaction(null, null); - mailODB.put(mail, Integer.class, Mail.class, txn); - txn.commitSync(); + mailODB.put((long) mail.getMailId(), mail); } public void deletePersistentMessage(Mail mail) { - Transaction txn = mailODB.getEnvironment().beginTransaction(null, null); - mailODB.delete(new Integer(mail.getMailId()), Integer.class, Mail.class, txn); - txn.commitSync(); + mailODB.remove((long) mail.getMailId()); } public void loadMailHeaders(Client client) { @@ -707,14 +704,16 @@ public class ChatService implements INetworkDispatch { if(obj == null || client.getSession() == null) return; - EntityCursor cursor = mailODB.getCursor(Integer.class, Mail.class); + ODBCursor cursor = mailODB.getCursor(); - for(Mail mail : cursor) { - + while(cursor.hasNext()) { + Mail mail = (Mail) cursor.next(); if(mail.getRecieverId() == obj.getObjectID()) { sendPersistentMessageHeader(client, mail); } + } + cursor.close(); } @@ -747,7 +746,7 @@ public class ChatService implements INetworkDispatch { int id = rand.nextInt(); - if(mailODB.contains(new Integer(id), Integer.class, Mail.class)) + if(mailODB.contains((long) id)) return generateMailId(); else return id; @@ -755,7 +754,7 @@ public class ChatService implements INetworkDispatch { public Mail getMailById(int mailId) { - Mail mail = mailODB.get(new Integer(mailId), Integer.class, Mail.class); + Mail mail = (Mail) mailODB.get((long) mailId); return mail; } @@ -776,7 +775,7 @@ public class ChatService implements INetworkDispatch { Random rand = new Random(); int id = rand.nextInt(); - if (chatRoomsODB.contains(new Integer(id), Integer.class, ChatRoom.class)) + if (chatRoomsODB.contains((long) id)) return generateChatRoomId(); else return id; @@ -819,11 +818,13 @@ public class ChatService implements INetworkDispatch { createChatRoom("Politician chat for this galaxy", "Politician", "system", true); //createChatRoom("Pilot chat for this galaxy", "Pilot", "system", true); - EntityCursor cursor = chatRoomsODB.getCursor(Integer.class, ChatRoom.class); - cursor.forEach(room -> { + ODBCursor cursor = chatRoomsODB.getCursor(); + + while(cursor.hasNext()) { + ChatRoom room = (ChatRoom) cursor.next(); if (!chatRooms.containsValue(room)) chatRooms.put(room.getRoomId(), room); - }); + } cursor.close(); List planets = core.terrainService.getPlanetList(); @@ -891,9 +892,7 @@ public class ChatService implements INetworkDispatch { chatRooms.put(room.getRoomId(), room); if(store){ - Transaction txn = chatRoomsODB.getEnvironment().beginTransaction(null, null); - chatRoomsODB.put(room, Integer.class, ChatRoom.class, txn); - txn.commitSync(); + chatRoomsODB.put((long) room.getRoomId(), room); } //Console.println("Created room " + address + " with ID " + room.getRoomId()); diff --git a/src/services/chat/Mail.java b/src/services/chat/Mail.java index 5709a059..42143371 100644 --- a/src/services/chat/Mail.java +++ b/src/services/chat/Mail.java @@ -21,13 +21,17 @@ ******************************************************************************/ package services.chat; +import java.io.Serializable; import java.util.List; + import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.PrimaryKey; @Entity(version=1) -public class Mail { +public class Mail implements Serializable { + private static final long serialVersionUID = 1L; + @PrimaryKey private int mailId; private String senderName; diff --git a/src/services/chat/WaypointAttachment.java b/src/services/chat/WaypointAttachment.java index 314cb08f..1a3c2d84 100644 --- a/src/services/chat/WaypointAttachment.java +++ b/src/services/chat/WaypointAttachment.java @@ -21,11 +21,15 @@ ******************************************************************************/ package services.chat; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; @Persistent -public class WaypointAttachment { +public class WaypointAttachment implements Serializable { + private static final long serialVersionUID = 1L; + public WaypointAttachment() { } public long cellID; diff --git a/src/services/collections/ServerFirst.java b/src/services/collections/ServerFirst.java index 2b855fb4..0811d9c9 100644 --- a/src/services/collections/ServerFirst.java +++ b/src/services/collections/ServerFirst.java @@ -21,6 +21,8 @@ ******************************************************************************/ package services.collections; +import java.io.Serializable; + import org.apache.mina.core.buffer.IoBuffer; import resources.objects.Delta; @@ -28,8 +30,10 @@ import resources.objects.Delta; import com.sleepycat.persist.model.Persistent; @Persistent -public class ServerFirst extends Delta { +public class ServerFirst extends Delta implements Serializable { + private static final long serialVersionUID = 1L; + private String name; private String collection; private long time; diff --git a/src/services/guild/GuildService.java b/src/services/guild/GuildService.java index 022895de..3197e9e1 100644 --- a/src/services/guild/GuildService.java +++ b/src/services/guild/GuildService.java @@ -49,7 +49,6 @@ public class GuildService implements INetworkDispatch { object = (GuildObject) this.core.objectService.createObject("object/guild/shared_guild_object.iff", core.terrainService.getPlanetList().get(0)); } - object.createTransaction(core.getGuildODB().getEnvironment()); } public Guild createGuild(String abbreviation, String name, SWGObject leader) { diff --git a/src/services/mission/MissionObjective.java b/src/services/mission/MissionObjective.java index c81fcc0a..cb8716fc 100644 --- a/src/services/mission/MissionObjective.java +++ b/src/services/mission/MissionObjective.java @@ -21,13 +21,17 @@ ******************************************************************************/ package services.mission; +import java.io.Serializable; + import com.sleepycat.persist.model.Persistent; import resources.objects.mission.MissionObject; @Persistent(version=0) -public abstract class MissionObjective { +public abstract class MissionObjective implements Serializable { + private static final long serialVersionUID = 1L; + protected long startTime; protected boolean activated; protected MissionObject parent; diff --git a/src/services/object/DuplicateId.java b/src/services/object/DuplicateId.java index db618527..55b03ab6 100644 --- a/src/services/object/DuplicateId.java +++ b/src/services/object/DuplicateId.java @@ -21,12 +21,16 @@ ******************************************************************************/ package services.object; +import java.io.Serializable; + import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.PrimaryKey; @Entity -public class DuplicateId { +public class DuplicateId implements Serializable { + private static final long serialVersionUID = 1L; + @PrimaryKey private String key; private long objectId; diff --git a/src/services/object/ObjectId.java b/src/services/object/ObjectId.java index 36df1736..1f8362fb 100644 --- a/src/services/object/ObjectId.java +++ b/src/services/object/ObjectId.java @@ -21,12 +21,16 @@ ******************************************************************************/ package services.object; +import java.io.Serializable; + import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.PrimaryKey; @Entity -public class ObjectId { +public class ObjectId implements Serializable { + private static final long serialVersionUID = 1L; + @PrimaryKey public long objectId; diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index c445cd5f..fab11e04 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -88,6 +88,7 @@ import engine.resources.container.Traverser; import engine.resources.container.WorldCellPermissions; import engine.resources.container.WorldPermissions; import engine.resources.database.DatabaseConnection; +import engine.resources.database.ODBCursor; import engine.resources.database.ObjectDatabase; import engine.resources.objects.IPersistent; import engine.resources.objects.SWGObject; @@ -147,7 +148,6 @@ public class ObjectService implements INetworkDispatch { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { - core.getObjectIdODB().getEnvironment().flushLog(true); synchronized(objectList) { for(SWGObject obj : objectList.values()) { @@ -157,6 +157,8 @@ public class ObjectService implements INetworkDispatch { } } + core.bazaarService.saveAllItems(); + core.closeODBs(); } }); @@ -175,25 +177,20 @@ public class ObjectService implements INetworkDispatch { } public void loadBuildings() { - EntityCursor cursor = core.getBuildingODB().getCursor(Long.class, BuildingObject.class); - - Iterator it = cursor.iterator(); - - while(it.hasNext()) { - final BuildingObject building = it.next(); + ODBCursor cursor = core.getSWGObjectODB().getCursor(); + + while(cursor.hasNext()) { + final SWGObject building = (SWGObject) cursor.next(); + if(!(building instanceof BuildingObject)) + continue; objectList.put(building.getObjectID(), building); Planet planet = core.terrainService.getPlanetByID(building.getPlanetId()); building.setPlanet(planet); - building.viewChildren(building, true, true, new Traverser() { - - @Override - public void process(SWGObject object) { - objectList.put(object.getObjectID(), object); - if(object.getParentId() != 0 && object.getContainer() == null) - object.setParent(building); - object.getContainerInfo(object.getTemplate()); - } - + building.viewChildren(building, true, true, (object) -> { + objectList.put(object.getObjectID(), object); + if(object.getParentId() != 0 && object.getContainer() == null) + object.setParent(building); + object.getContainerInfo(object.getTemplate()); }); } @@ -346,8 +343,8 @@ public class ObjectService implements INetworkDispatch { object.setAttachment("customServerTemplate", customServerTemplate); object.setisInSnapshot(isSnapshot); - if(!core.getObjectIdODB().contains(objectID, Long.class, ObjectId.class)) { - core.getObjectIdODB().put(new ObjectId(objectID), Long.class, ObjectId.class); + if(!core.getObjectIdODB().contains(objectID)) { + core.getObjectIdODB().put(objectID, new ObjectId(objectID)); } if(loadServerTemplate) loadServerTemplate(object); @@ -546,13 +543,11 @@ public class ObjectService implements INetworkDispatch { } - EntityCursor cursor = core.getCreatureODB().getCursor(Long.class, CreatureObject.class); + ODBCursor cursor = core.getSWGObjectODB().getCursor(); - Iterator it = cursor.iterator(); - - while(it.hasNext()) { - if(it.next().getCustomName().equals(customName)) - return it.next(); + while(cursor.hasNext()) { + if(((SWGObject) cursor.next()).getCustomName().equals(customName)) + return (SWGObject) cursor.next(); } return null; @@ -572,13 +567,11 @@ public class ObjectService implements INetworkDispatch { } - EntityCursor cursor = core.getCreatureODB().getCursor(Long.class, CreatureObject.class); + ODBCursor cursor = core.getSWGObjectODB().getCursor(); - Iterator it = cursor.iterator(); - - while(it.hasNext()) { - if(it.next().getCustomName().startsWith(customName)) - return it.next(); + while(cursor.hasNext()) { + if(((SWGObject) cursor.next()).getCustomName().startsWith(customName)) + return (SWGObject) cursor.next(); } return null; @@ -586,21 +579,15 @@ public class ObjectService implements INetworkDispatch { } public CreatureObject getCreatureFromDB(long objectId) { - CreatureObject object = core.getCreatureODB().get(new Long(objectId), Long.class, CreatureObject.class); - + SWGObject object = (SWGObject) core.getSWGObjectODB().get(objectId); + if(!(object instanceof CreatureObject)) + return null; if (object != null && getObject(object.getObjectID()) == null) { loadServerTemplate(object); - - object.viewChildren(object, true, true, new Traverser() { - - public void process(SWGObject child) { - loadServerTemplate(child); - } - - }); + object.viewChildren(object, true, true, (child) -> loadServerTemplate(child)); } - return object; + return (CreatureObject) object; } public long generateObjectID() { @@ -633,7 +620,7 @@ public class ObjectService implements INetworkDispatch { } catch (SQLException e) { e.printStackTrace(); } - if(getObject(newId) != null || core.getObjectIdODB().contains(newId, Long.class, ObjectId.class)) + if(getObject(newId) != null || core.getObjectIdODB().contains(newId)) found = false; else found = true; @@ -1089,13 +1076,11 @@ public class ObjectService implements INetworkDispatch { String key = "" + CRC.StringtoCRC(planet.getName()) + CRC.StringtoCRC(template) + type + containerId + cellIndex + x + py + z; long newObjectId = 0; - if (core.getDuplicateIdODB().contains(key, String.class, DuplicateId.class)) { - newObjectId = core.getDuplicateIdODB().get(key, String.class, DuplicateId.class).getObjectId(); + if (core.getDuplicateIdODB().contains(key)) { + newObjectId = ((DuplicateId) core.getDuplicateIdODB().get(key)).getObjectId(); } else { newObjectId = generateObjectID(); - Transaction txn = core.getDuplicateIdODB().getEnvironment().beginTransaction(null, null); - core.getDuplicateIdODB().put(new DuplicateId(key, newObjectId), String.class, DuplicateId.class, txn); - txn.commitSync(); + core.getDuplicateIdODB().put(key, new DuplicateId(key, newObjectId)); } duplicate.put(objectId, newObjectId); @@ -1106,7 +1091,7 @@ public class ObjectService implements INetworkDispatch { SWGObject object; if(objectId != 0 && containerId == 0) { if(portalCRC != 0) { - if (core.getBuildingODB().contains(objectId, Long.class, BuildingObject.class) && !duplicate.containsValue(objectId)) + if (core.getSWGObjectODB().contains(objectId) && !duplicate.containsValue(objectId)) continue; containers.add(objectId); object = createObject(template, objectId, planet, new Point3D(px + x1, py, pz + z1), new Quaternion(qw, qx, qy, qz), null, true, false); @@ -1158,9 +1143,7 @@ public class ObjectService implements INetworkDispatch { } for(BuildingObject building : persistentBuildings) { - building.createTransaction(core.getBuildingODB().getEnvironment()); - core.getBuildingODB().put(building, Long.class, BuildingObject.class, building.getTransaction()); - building.getTransaction().commitSync(); + core.getSWGObjectODB().put(building.getObjectID(), building); destroyObject(building); } @@ -1187,16 +1170,12 @@ public class ObjectService implements INetworkDispatch { return count.get(); } - public void persistObject(IPersistent object, Class keyClass, Class valueClass, ObjectDatabase odb) { - object.createTransaction(odb.getEnvironment()); - core.getAuctionODB().put(object, keyClass, valueClass, object.getTransaction()); - object.getTransaction().commitSync(); + public void persistObject(long key, Object value, ObjectDatabase odb) { + odb.put(key, value); } - public void deletePersistentObject(IPersistent object, Class keyClass, Class valueClass, ObjectDatabase odb, Object key) { - object.createTransaction(odb.getEnvironment()); - core.getAuctionODB().delete(key, keyClass, valueClass, object.getTransaction()); - object.getTransaction().commitSync(); + public void deletePersistentObject(long key, ObjectDatabase odb) { + odb.remove(key); } } diff --git a/src/services/playercities/PlayerCity.java b/src/services/playercities/PlayerCity.java index 34afeef9..1f8e9c70 100644 --- a/src/services/playercities/PlayerCity.java +++ b/src/services/playercities/PlayerCity.java @@ -21,6 +21,7 @@ ******************************************************************************/ package services.playercities; +import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -40,8 +41,10 @@ import engine.resources.scene.Point3D; * @author Charon */ -public class PlayerCity { +public class PlayerCity implements Serializable { + private static final long serialVersionUID = 1L; + public static final int DESERTED = 0; public static final int OUTPOST = 1; public static final int VILLAGE = 2; diff --git a/src/services/resources/ResourceService.java b/src/services/resources/ResourceService.java index 0cb2cab1..d6719c0b 100644 --- a/src/services/resources/ResourceService.java +++ b/src/services/resources/ResourceService.java @@ -33,6 +33,7 @@ import com.sleepycat.persist.EntityCursor; import main.NGECore; import engine.resources.common.CRC; +import engine.resources.database.ODBCursor; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; @@ -114,9 +115,8 @@ public class ResourceService implements INetworkDispatch { // createCollections2(); // createCollections3(); // } else { - EntityCursor cursor = core.getResourceRootsODB().getCursor(Integer.class, ResourceRoot.class); - Iterator it = cursor.iterator(); - if(!it.hasNext()) { + ODBCursor cursor = core.getResourceRootsODB().getCursor(); + if(!cursor.hasNext()) { createCollections(); createCollections2(); createCollections3(); @@ -133,12 +133,11 @@ public class ResourceService implements INetworkDispatch { // loads the resource roots at server start public void loadResourceRoots() { - EntityCursor cursor = core.getResourceRootsODB().getCursor(Integer.class, ResourceRoot.class); - Iterator it = cursor.iterator(); + ODBCursor cursor = core.getResourceRootsODB().getCursor(); int loadedResourceRootsCounter = 0; System.out.println("Loading resource roots..."); - while(it.hasNext()) { - final ResourceRoot resourceRoot = it.next(); + while(cursor.hasNext()) { + final ResourceRoot resourceRoot = (ResourceRoot) cursor.next(); System.err.println("resourceRoot loaded ID: " + resourceRoot.getResourceRootID() + " " + resourceRoot.getResourceFileName()); core.resourceService.add_resourceRoot(resourceRoot); loadedResourceRootsCounter++; @@ -154,12 +153,11 @@ public class ResourceService implements INetworkDispatch { // loads the currently spawned resources at server start public void loadResources() { - EntityCursor cursor = core.getResourcesODB().getCursor(Long.class, GalacticResource.class); - Iterator it = cursor.iterator(); + ODBCursor cursor = core.getResourcesODB().getCursor(); int loadedResourceCounter = 0; System.out.println("Loading resources..."); - while(it.hasNext()) { - final GalacticResource resource = it.next(); + while(cursor.hasNext()) { + final GalacticResource resource = (GalacticResource) cursor.next(); System.err.println("resource " + resource.getName() + " rootID " + resource.getResourceRootID()); core.objectService.getObjectList().put(resource.getId(), resource); @@ -10800,9 +10798,7 @@ public class ResourceService implements INetworkDispatch { for (int i=0;i mobiles = new Vector(); + + public DynamicSpawnArea(Planet planet, AbstractCollidable area, DynamicSpawnGroup spawnGroup) { super(planet, area); + this.spawnGroup = spawnGroup; } @Override @Handler public void onEnter(EnterEvent event) { + SWGObject object = event.object; + + if(object == null || !(object instanceof CreatureObject)) + return; + + CreatureObject creature = (CreatureObject) object; + + if(creature.getSlottedObject("ghost") == null) + return; + + creature.getEventBus().subscribe(this); + // spawn some creatures + for(int i = 0; i < 5; i++) + spawnCreature(creature); + } @Override @Handler public void onExit(ExitEvent event) { + SWGObject object = event.object; + + if(object == null || !(object instanceof CreatureObject)) + return; + + CreatureObject creature = (CreatureObject) object; + + if(creature.getSlottedObject("ghost") == null) + return; + + creature.getEventBus().unsubscribe(this); + + } + + @Handler + public void onMove(MoveEvent event) { + + SWGObject object = event.object; + + if(object == null || !(object instanceof CreatureObject) || object.getContainer() != null) + return; + + CreatureObject creature = (CreatureObject) object; + + if(creature.getSlottedObject("ghost") == null) + return; + + if(new Random().nextFloat() <= 0.25) + spawnCreature(creature); + + } + + + private void spawnCreature(CreatureObject creature) { + + NGECore core = NGECore.getInstance(); + + Iterator it = mobiles.iterator(); + it.forEachRemaining(mobile -> { + if(mobile.getPosture() == Posture.Dead) + it.remove(); + }); + + if(mobiles.size() >= spawnGroup.getMaxSpawns()) + return; + + boolean foundPos = false; + int tries = 0; + Point3D randomPosition = null; + + while(!foundPos && ++tries < 10) { + + randomPosition = getRandomPosition(creature.getWorldPosition(), 32.f, 200.f); + + if(randomPosition == null) + return; + + TerrainService terrainSvc = core.terrainService; + + float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); + randomPosition.y = height; + + for(CreatureObject mobile : mobiles) { + if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) + foundPos = true; + } + + if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) + foundPos = false; + + } + + if(!foundPos) + return; + + Random random = new Random(); + + String mobileTemplate = spawnGroup.getMobiles().get(random.nextInt(spawnGroup.getMobiles().size())); + CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); + if(spawnedCreature != null) + mobiles.add(spawnedCreature); + } } diff --git a/src/services/spawn/DynamicSpawnGroup.java b/src/services/spawn/DynamicSpawnGroup.java new file mode 100644 index 00000000..a29f6ae2 --- /dev/null +++ b/src/services/spawn/DynamicSpawnGroup.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package services.spawn; + +import java.util.Vector; + +public class DynamicSpawnGroup { + + private Vector mobiles; + private String name; + private int maxSpawns; + private int minSpawnDistance; + + public Vector getMobiles() { + return mobiles; + } + + public void setMobiles(Vector mobiles) { + this.mobiles = mobiles; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getMaxSpawns() { + return maxSpawns; + } + + public void setMaxSpawns(int maxSpawns) { + this.maxSpawns = maxSpawns; + } + + public int getMinSpawnDistance() { + return minSpawnDistance; + } + + public void setMinSpawnDistance(int minSpawnDistance) { + this.minSpawnDistance = minSpawnDistance; + } + +} diff --git a/src/services/spawn/LairSpawnArea.java b/src/services/spawn/LairSpawnArea.java index 026268cd..a4f29896 100644 --- a/src/services/spawn/LairSpawnArea.java +++ b/src/services/spawn/LairSpawnArea.java @@ -79,7 +79,7 @@ public class LairSpawnArea extends SpawnArea { randomPosition.y = height; for(LairActor otherLair : lairs) { - if(otherLair.getLairObject().getWorldPosition().getDistance(randomPosition) < 10) + if(otherLair.getLairObject().getWorldPosition().getDistance(randomPosition) < 30) return; } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index dcde2707..b388cd47 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -61,6 +61,7 @@ public class SpawnService { private Map lairGroupTemplates = new ConcurrentHashMap(); private Map lairTemplates = new ConcurrentHashMap(); private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(4); + private Map dynamicGroupTemplates = new ConcurrentHashMap(); public SpawnService(NGECore core) { this.core = core; @@ -304,6 +305,26 @@ public class SpawnService { } } + public void loadDynamicGroups() { + Path p = Paths.get("scripts/mobiles/dynamicgroups"); + FileVisitor fv = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + core.scriptService.callScript("scripts/mobiles/dynamicgroups/", file.getFileName().toString().replace(".py", ""), "addDynamicGroup", core); + return FileVisitResult.CONTINUE; + } + }; + try { + Files.walkFileTree(p, fv); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void addDynamicGroup(String name, DynamicSpawnGroup dynamicSpawnGroup) { + dynamicGroupTemplates.put(name, dynamicSpawnGroup); + } + public void addLairGroup(String name, Vector lairSpawnTemplates) { lairGroupTemplates.put(name, new LairGroupTemplate(name, lairSpawnTemplates)); } @@ -334,6 +355,18 @@ public class SpawnService { spawnAreas.get(planet).add(lairSpawnArea); core.simulationService.addCollidable(collidableCircle, x, z); } + + public void addDynamicSpawnArea(String dynamicGroup, float x, float z, float radius, String planetName) { + DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates .get(dynamicGroup); + Planet planet = core.terrainService.getPlanetByName(planetName); + if(dynamicGroupTemplate == null || planet == null) + return; + CollidableCircle collidableCircle = new CollidableCircle(new Point3D(x, 0, z), radius, planet); + DynamicSpawnArea dynamicSpawnArea = new DynamicSpawnArea(planet, collidableCircle, dynamicGroupTemplate); + spawnAreas.get(planet).add(dynamicSpawnArea); + core.simulationService.addCollidable(collidableCircle, x, z); + } + }