diff --git a/.gitignore b/.gitignore index 8560d241..63147709 100644 --- a/.gitignore +++ b/.gitignore @@ -60,6 +60,7 @@ odb/chatRooms/je.info.* odb/resourcehistory/je.info.* odb/resourceroots/je.info.* odb/resources/je.info.* +odb/auction/je.info.* # External tool builders .externalToolBuilders/ diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index 502ebef4..2c3d0db4 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -150,7 +150,10 @@ public class BuildingObject extends TangibleObject implements IPersistent { public Vector getItemsList() { Vector items = new Vector(); - getCells().forEach(c -> c.viewChildren(c, true, false, (item) -> items.add((TangibleObject) item))); + getCells().forEach(c -> c.viewChildren(c, true, false, (item) -> { + if(!(item instanceof CreatureObject)) + items.add((TangibleObject) item); + })); return items; } @@ -237,8 +240,11 @@ public class BuildingObject extends TangibleObject implements IPersistent { } public Vector getCells() { - Vector cells = new Vector(); - this.viewChildren(this, true, false, (cell) -> cells.add((CellObject) cell)); + final Vector cells = new Vector(); + this.viewChildren(this, true, false, (obj) -> { + if(obj instanceof CellObject) + cells.add((CellObject) obj); + }); return cells; } diff --git a/src/resources/objects/harvester/HarvesterObject.java b/src/resources/objects/harvester/HarvesterObject.java index b10755f2..7fe12cbb 100644 --- a/src/resources/objects/harvester/HarvesterObject.java +++ b/src/resources/objects/harvester/HarvesterObject.java @@ -394,97 +394,7 @@ public class HarvesterObject extends InstallationObject { public void placeHarvester(){ NGECore.getInstance().objectService.getObject(owner).getClient().getSession().write(messageBuilder.buildResourceHarvesterActivatePageMessage(this)); } - - public static void createAndPlaceHarvester(SWGObject object){ - CreatureObject actor = (CreatureObject) object.getAttachment("Owner"); - - String structureTemplate = (String)object.getAttachment("Deed_StructureTemplate"); - HarvesterObject harvester = (HarvesterObject) NGECore.getInstance().objectService.createObject(structureTemplate, actor.getPlanet()); - long objectId = harvester.getObjectID(); - - Vector adminList = harvester.getAdminList(); - String[] fullName = ((CreatureObject)actor).getCustomName().split(" "); - adminList.add(fullName[0]); - harvester.setAdminList(adminList); - // Set BER and outputhopper capacity here, take it from deed - harvester.setBER((int)object.getAttachment("Deed_BER")); - harvester.setSpecRate((int)(1.5F*(int)object.getAttachment("Deed_BER"))); - harvester.setOutputHopperCapacity((int)object.getAttachment("Deed_Capacity")); - harvester.setDeedTemplate((String)object.getAttachment("Deed_DeedTemplate")); - if ((int)object.getAttachment("Deed_SurplusMaintenance")>0){ - harvester.setMaintenanceAmount((int)object.getAttachment("Deed_SurplusMaintenance")); - } - if ((int)object.getAttachment("Deed_SurplusPower")>0){ - harvester.setPowerLevel((int)object.getAttachment("Deed_SurplusPower")); - } - - // build harvester - int resCRC = CRC.StringtoCRC(structureTemplate); - float positionY = NGECore.getInstance().terrainService.getHeight(actor.getPlanetId(), object.getPosition().x, object.getPosition().z); - SceneCreateObjectByCrc createObjectMsg = new SceneCreateObjectByCrc(objectId, object.getOrientation().x, object.getOrientation().y, object.getOrientation().z, object.getOrientation().w, object.getPosition().x, positionY, object.getPosition().z, resCRC, (byte) 0); - actor.getClient().getSession().write(createObjectMsg.serialize()); - tools.CharonPacketUtils.printAnalysis(createObjectMsg.serialize()); - - harvester.setPosition(new Point3D(object.getPosition().x,positionY, object.getPosition().z)); - - resources.objects.installation.InstallationMessageBuilder messenger = new resources.objects.installation.InstallationMessageBuilder((InstallationObject)harvester); - actor.getClient().getSession().write(messenger.buildBaseline3((InstallationObject)harvester)); - SceneEndBaselines sceneEndBaselinesMsg = new SceneEndBaselines(harvester.getObjectID()); - actor.getClient().getSession().write(sceneEndBaselinesMsg.serialize()); - tools.CharonPacketUtils.printAnalysis(sceneEndBaselinesMsg.serialize()); - - PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost"); - WaypointObject constructionWaypoint = (WaypointObject)NGECore.getInstance().objectService.createObject("object/waypoint/shared_world_waypoint_blue.iff", actor.getPlanet(), harvester.getPosition().x, 0 ,harvester.getPosition().z); - String displayname = "@installation_n:"+harvester.getStfName(); - constructionWaypoint.setName(displayname); - constructionWaypoint.setPlanetCRC(engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName())); - constructionWaypoint.setPosition(new Point3D(object.getPosition().x,0, object.getPosition().z)); - player.waypointAdd(constructionWaypoint); - constructionWaypoint.setPosition(new Point3D(object.getPosition().x,0, object.getPosition().z)); - constructionWaypoint.setActive(true); - constructionWaypoint.setColor((byte)1); - constructionWaypoint.setStringAttribute("", ""); - player.waypointAdd(constructionWaypoint); - constructionWaypoint.setName(displayname); - constructionWaypoint.setPlanetCRC(engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName())); - player.setLastSurveyWaypoint(constructionWaypoint); - - List attachments = new ArrayList(); - WaypointAttachment attachment = new WaypointAttachment(); - attachment.active = true; - attachment.cellID = constructionWaypoint.getCellId(); - attachment.color = (byte)1; - attachment.name = displayname; - attachment.planetCRC = engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName()); - attachment.positionX = object.getPosition().x; - attachment.positionY = 0; - attachment.positionZ = object.getPosition().z; - attachments.add(attachment); - - // remove constructor - NGECore.getInstance().objectService.destroyObject(object); - SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(object.getObjectID()); - actor.getClient().getSession().write(destroyObjectMsg.serialize()); - - // ToDo: waypoint attachment fix - Date date = new Date(); - Mail constructionNotificationMail = new Mail(); - constructionNotificationMail.setSenderName("Structure Service"); - constructionNotificationMail.setSubject("Your structure"); - constructionNotificationMail.setRecieverId(actor.getObjectID()); - constructionNotificationMail.setTimeStamp((int) (date.getTime() / 1000)); - constructionNotificationMail.setMailId(NGECore.getInstance().chatService.generateMailId()); - String message = "Your construction is ready"; - constructionNotificationMail.setMessage(message); - constructionNotificationMail.setStatus(Mail.NEW); - constructionNotificationMail.setAttachments(attachments); - //NGECore.getInstance().chatService.sendPersistentMessage(actor.getClient(), constructionNotificationMail); - NGECore.getInstance().chatService.storePersistentMessage(constructionNotificationMail); - NGECore.getInstance().chatService.sendPersistentMessageHeader(actor.getClient(), constructionNotificationMail); - - } - public void createNewHopperContainer(){ Vector planetResourcesVector = NGECore.getInstance().resourceService.getSpawnedResourcesByPlanetAndHarvesterType(this.getPlanetId(),this.getHarvester_type()); NGECore.getInstance().objectService.getObject(owner).getClient().getSession().write(messageBuilder.buildHINOBaseline7(this, planetResourcesVector)); @@ -506,16 +416,10 @@ public class HarvesterObject extends InstallationObject { return; } - destination.getSession().write(messageBuilder.buildBaseline3()); - destination.getSession().write(messageBuilder.buildBaseline6()); - destination.getSession().write(messageBuilder.buildBaseline8()); - destination.getSession().write(messageBuilder.buildBaseline9()); + destination.getSession().write(installationMessageBuilder.buildBaseline3(this)); + //destination.getSession().write(installationMessageBuilder.buildBaseline6(this)); + //destination.getSession().write(installationMessageBuilder.buildBaseline8()); + //destination.getSession().write(installationMessageBuilder.buildBaseline9()); - if(getPvPBitmask() != 0) { - UpdatePVPStatusMessage upvpm = new UpdatePVPStatusMessage(getObjectID()); - upvpm.setFaction(UpdatePVPStatusMessage.factionCRC.Neutral); - upvpm.setStatus(getPvPBitmask()); - destination.getSession().write(upvpm.serialize()); - } } } diff --git a/src/resources/objects/installation/InstallationObject.java b/src/resources/objects/installation/InstallationObject.java index 3392e5fd..856eeb59 100644 --- a/src/resources/objects/installation/InstallationObject.java +++ b/src/resources/objects/installation/InstallationObject.java @@ -24,6 +24,7 @@ package resources.objects.installation; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.Persistent; +import engine.clients.Client; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -35,4 +36,9 @@ public class InstallationObject extends TangibleObject { public InstallationObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ super(objectID, planet, template, position, orientation); } + + @Override + public void sendBaselines(Client destination) { + + } } \ No newline at end of file diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 5ee88004..e375abe0 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -276,8 +276,6 @@ public class HousingService implements INetworkDispatch { deed.setSurplusMaintenance((int)building.getMaintenanceAmount()); deed.setAttributes(); - SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(building.getObjectID()); - owner.getClient().getSession().write(destroyObjectMsg.serialize()); core.objectService.destroyObject(building.getObjectID()); SWGObject ownerInventory = owner.getSlottedObject("inventory"); diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index ca22a7fc..aba0b902 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -54,6 +54,7 @@ import org.python.core.Py; import org.python.core.PyObject; import com.sleepycat.je.Transaction; +import com.sleepycat.je.TransactionConfig; import com.sleepycat.persist.EntityCursor; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.PrimaryKey; @@ -976,7 +977,8 @@ public class ObjectService implements INetworkDispatch { CrcStringTableVisitor crcTable = ClientFileManager.loadFile("misc/object_template_crc_string_table.iff", CrcStringTableVisitor.class); List persistentBuildings = new ArrayList(); Map duplicate = new HashMap(); - + Transaction txn = core.getDuplicateIdODB().getEnvironment().beginTransaction(null, null); + for (int i = 0; i < buildoutTable.getRowCount(); i++) { String template; @@ -1055,15 +1057,17 @@ public class ObjectService implements INetworkDispatch { newObjectId = core.getDuplicateIdODB().get(key, String.class, DuplicateId.class).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(); } duplicate.put(objectId, newObjectId); objectId = newObjectId; } - + if(txn.isValid()) { + System.out.println("Committed doid transaction."); + txn.commitSync(); + } + List containers = new ArrayList(); SWGObject object; if(objectId != 0 && containerId == 0) { diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 93e076c9..6caccdd1 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -21,8 +21,11 @@ ******************************************************************************/ package services.resources; +import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.Date; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.Vector; @@ -30,6 +33,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; + import protocol.swg.EnterStructurePlacementModeMessage; import protocol.swg.SceneCreateObjectByCrc; import protocol.swg.SceneDestroyObject; @@ -53,6 +57,8 @@ import resources.objects.resource.ResourceContainerObject; import resources.objects.resource.ResourceRoot; import resources.objects.tangible.TangibleObject; import resources.objects.waypoint.WaypointObject; +import services.chat.Mail; +import services.chat.WaypointAttachment; import services.sui.SUIWindow; import services.sui.SUIWindow.SUICallback; import services.sui.SUIWindow.Trigger; @@ -383,8 +389,6 @@ public class HarvesterService implements INetworkDispatch { deed.setSurplusPower((int)harvester.getPowerLevel()); deed.setAttributes(); - SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(harvester.getObjectID()); - owner.getClient().getSession().write(destroyObjectMsg.serialize()); core.objectService.destroyObject(harvester.getObjectID()); SWGObject crafterInventory = owner.getSlottedObject("inventory"); @@ -557,9 +561,7 @@ public class HarvesterService implements INetworkDispatch { int containerEnergy = containerVector.get(i).getStackCount(); if (containerEnergy <= deductedEnergy){ deductedEnergy -= containerEnergy; - playerInventory._remove(containerVector.get(i)); - SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(containerVector.get(i).getObjectID()); - owner.getClient().getSession().write(destroyObjectMsg.serialize()); + playerInventory.remove(containerVector.get(i)); } else { containerEnergy -= deductedEnergy; containerVector.get(i).setStackCount(containerEnergy,(CreatureObject)owner); @@ -888,17 +890,9 @@ public class HarvesterService implements INetworkDispatch { // destroy deed TangibleObject playerInventory = (TangibleObject) actor.getSlottedObject("inventory"); - playerInventory._remove(usedDeed); - SceneDestroyObject destroyObjectMsg = new SceneDestroyObject(usedDeed.getObjectID()); - actor.getClient().getSession().write(destroyObjectMsg.serialize()); + playerInventory.remove(usedDeed); - int resCRC = CRC.StringtoCRC(constructorTemplate); - SceneCreateObjectByCrc createObjectMsg = new SceneCreateObjectByCrc(installation.getObjectID(), quaternion.x, quaternion.y, quaternion.z, quaternion.w, posX, positionY, posZ, resCRC, (byte) 0); - actor.getClient().getSession().write(createObjectMsg.serialize()); - tools.CharonPacketUtils.printAnalysis(createObjectMsg.serialize()); - SceneEndBaselines sceneEndBaselinesMsg = new SceneEndBaselines(installation.getObjectID()); - actor.getClient().getSession().write(sceneEndBaselinesMsg.serialize()); - tools.CharonPacketUtils.printAnalysis(sceneEndBaselinesMsg.serialize()); + core.simulationService.add(installation, posX, posZ, true); PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost"); player.setLotsRemaining(player.getLotsRemaining()-(int)((Harvester_Deed)usedDeed).getLotRequirement()); @@ -907,8 +901,81 @@ public class HarvesterService implements INetworkDispatch { } } - public void placeHarvester(SWGObject object){ - HarvesterObject.createAndPlaceHarvester(object); + public void placeHarvester(SWGObject object) { + CreatureObject actor = (CreatureObject) object.getAttachment("Owner"); + + String structureTemplate = (String)object.getAttachment("Deed_StructureTemplate"); + HarvesterObject harvester = (HarvesterObject) NGECore.getInstance().objectService.createObject(structureTemplate, actor.getPlanet()); + long objectId = harvester.getObjectID(); + + Vector adminList = harvester.getAdminList(); + //String[] fullName = ((CreatureObject)actor).getCustomName().split(" "); + adminList.add(actor.getCustomName()); + // Set BER and outputhopper capacity here, take it from deed + harvester.setBER((int)object.getAttachment("Deed_BER")); + harvester.setSpecRate((int)(1.5F*(int)object.getAttachment("Deed_BER"))); + harvester.setOutputHopperCapacity((int)object.getAttachment("Deed_Capacity")); + harvester.setDeedTemplate((String)object.getAttachment("Deed_DeedTemplate")); + if ((int)object.getAttachment("Deed_SurplusMaintenance")>0){ + harvester.setMaintenanceAmount((int)object.getAttachment("Deed_SurplusMaintenance")); + } + if ((int)object.getAttachment("Deed_SurplusPower")>0){ + harvester.setPowerLevel((int)object.getAttachment("Deed_SurplusPower")); + } + + + // build harvester + float positionY = NGECore.getInstance().terrainService.getHeight(actor.getPlanetId(), object.getPosition().x, object.getPosition().z); + harvester.setPosition(new Point3D(object.getPosition().x,positionY, object.getPosition().z)); + core.simulationService.add(harvester, harvester.getPosition().x, harvester.getPosition().x, true); + + + PlayerObject player = (PlayerObject) actor.getSlottedObject("ghost"); + WaypointObject constructionWaypoint = (WaypointObject)NGECore.getInstance().objectService.createObject("object/waypoint/shared_world_waypoint_blue.iff", actor.getPlanet(), harvester.getPosition().x, 0 ,harvester.getPosition().z); + String displayname = "@installation_n:"+harvester.getStfName(); + constructionWaypoint.setName(displayname); + constructionWaypoint.setPlanetCRC(engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName())); + constructionWaypoint.setPosition(new Point3D(object.getPosition().x,0, object.getPosition().z)); + player.waypointAdd(constructionWaypoint); + constructionWaypoint.setPosition(new Point3D(object.getPosition().x,0, object.getPosition().z)); + constructionWaypoint.setActive(true); + constructionWaypoint.setColor((byte)1); + constructionWaypoint.setStringAttribute("", ""); + player.waypointAdd(constructionWaypoint); + constructionWaypoint.setName(displayname); + constructionWaypoint.setPlanetCRC(engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName())); + player.setLastSurveyWaypoint(constructionWaypoint); + + List attachments = new ArrayList(); + WaypointAttachment attachment = new WaypointAttachment(); + attachment.active = true; + attachment.cellID = constructionWaypoint.getCellId(); + attachment.color = (byte)1; + attachment.name = displayname; + attachment.planetCRC = engine.resources.common.CRC.StringtoCRC(actor.getPlanet().getName()); + attachment.positionX = object.getPosition().x; + attachment.positionY = 0; + attachment.positionZ = object.getPosition().z; + attachments.add(attachment); + + // remove constructor + NGECore.getInstance().objectService.destroyObject(object); + + // ToDo: waypoint attachment fix + Date date = new Date(); + Mail constructionNotificationMail = new Mail(); + constructionNotificationMail.setSenderName("Structure Service"); + constructionNotificationMail.setSubject("Your structure"); + constructionNotificationMail.setRecieverId(actor.getObjectID()); + constructionNotificationMail.setTimeStamp((int) (date.getTime() / 1000)); + constructionNotificationMail.setMailId(NGECore.getInstance().chatService.generateMailId()); + String message = "Your construction is ready"; + constructionNotificationMail.setMessage(message); + constructionNotificationMail.setStatus(Mail.NEW); + constructionNotificationMail.setAttachments(attachments); + //NGECore.getInstance().chatService.sendPersistentMessage(actor.getClient(), constructionNotificationMail); + NGECore.getInstance().chatService.storePersistentMessage(constructionNotificationMail); + NGECore.getInstance().chatService.sendPersistentMessageHeader(actor.getClient(), constructionNotificationMail); } diff --git a/src/services/sui/SUIService.java b/src/services/sui/SUIService.java index 0e76c325..a2d32ce3 100644 --- a/src/services/sui/SUIService.java +++ b/src/services/sui/SUIService.java @@ -99,13 +99,15 @@ public class SUIService implements INetworkDispatch { if (! admins.contains(owner.getCustomName()) && hoppers.contains(owner.getCustomName())){ // authorized for hopper // change radialOptions to hopper access - harvester.setAttachment("radial_filename", "harvesterHopper"); + core.scriptService.callScript("scripts/radial/", "harvesterHopper", "createRadial", core, owner, target, request.getRadialOptions()); + sendRadial(owner, target, request.getRadialOptions(), request.getRadialCount()); + return; } } if(target.getGrandparent() != null && target.getGrandparent().getAttachment("structureAdmins") != null) { - if(core.housingService.getPermissions(owner, target.getContainer())) + if(core.housingService.getPermissions(owner, target.getContainer()) && !getRadialFilename(target).equals("structure_management_terminal")) { core.scriptService.callScript("scripts/radial/", "moveable", "createRadial", core, owner, target, request.getRadialOptions()); sendRadial(owner, target, request.getRadialOptions(), request.getRadialCount());