diff --git a/ngengine_public.jar b/ngengine_public.jar index 901385d6..bbf671b2 100644 Binary files a/ngengine_public.jar and b/ngengine_public.jar differ diff --git a/scripts/commands/createvendor.py b/scripts/commands/createvendor.py new file mode 100644 index 00000000..23893fff --- /dev/null +++ b/scripts/commands/createvendor.py @@ -0,0 +1,25 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + + if actor.getCombatFlag() > 0: + return + + cell = actor.getContainer() + building = actor.getGrandparent() + ghost = actor.getSlottedObject('ghost') + + if not ghost or not cell or not building or not core.housingService.getPermissions(player, cell) + return + + if ghost.getAmountOfVendors() >= actor.getSkillModBase('manage_vendor'): + actor.sendSystemMessage('@player_structure:full_vendors', 0) + return + + + + return + \ No newline at end of file diff --git a/scripts/radial/structure/structure_management_terminal.py b/scripts/radial/structure/structure_management_terminal.py index b6e7ae3a..8bdc5878 100644 --- a/scripts/radial/structure/structure_management_terminal.py +++ b/scripts/radial/structure/structure_management_terminal.py @@ -24,6 +24,8 @@ def createRadial(core, owner, target, radials): radials.add(RadialOptions(2, 172, 0, 'Pack Up This Building')) radials.add(RadialOptions(3, 121, 0, '@player_structure:permission_enter')) radials.add(RadialOptions(3, 123, 0, '@player_structure:permission_banned')) + if owner.getSkillModBase('manage_vendor') >= 1: + radials.add(RadialOptions(2, 130, 0, '@player_structure:create_vendor')) return @@ -73,5 +75,7 @@ def handleSelection(core, owner, target, option): if owner is not None: core.housingService.handlePermissionBan(owner,target) return - - + if option == 130: + if owner is not None and owner.getSkillModBase('manage_vendor') >= 1: + core.commandService.callCommand(owner, 'createvendor', None, '') + return diff --git a/src/main/NGECore.java b/src/main/NGECore.java index 1fb03377..9e97ddb9 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -450,6 +450,7 @@ public class NGECore { simulationService = new SimulationService(this); objectService.loadBuildings(); + harvesterService.loadHarvesters(); if (optionsConfigLoaded && options.getInt("LOAD.RESOURCE.SYSTEM") > 0) { resourceService.loadResourceRoots(); diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index 079c29b9..6994658b 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -28,6 +28,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; +import java.util.Vector; import resources.objects.ObjectMessageBuilder; import resources.objects.intangible.IntangibleObject; @@ -151,6 +152,7 @@ public class PlayerObject extends IntangibleObject implements Serializable { private transient boolean callingCompanion = false; private long bountyMissionId; + private Vector ownedVendors = new Vector(); public PlayerObject() { super(); @@ -921,5 +923,21 @@ public class PlayerObject extends IntangibleObject implements Serializable { public ObjectMessageBuilder getMessageBuilder() { return messageBuilder; } + + public Vector getOwnedVendors() { + return ownedVendors; + } + + public void addVendor(long vendorId) { + ownedVendors.add(vendorId); + } + + public void removeVendor(long vendorId) { + ownedVendors.remove(vendorId); + } + + public int getAmountOfVendors() { + return ownedVendors.size(); + } } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 0ed4d075..2a74b4b7 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -78,6 +78,7 @@ import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; +import resources.objects.harvester.HarvesterObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.common.*; @@ -192,7 +193,7 @@ public class SimulationService implements INetworkDispatch { while(cursor.hasNext()) { SWGObject building = core.objectService.getObject(((SWGObject) cursor.next()).getObjectID()); - if(building == null || !(building instanceof BuildingObject)) + if(building == null || (!(building instanceof BuildingObject) && !(building instanceof HarvesterObject))) continue; if(building.getAttachment("hasLoadedServerTemplate") == null) core.objectService.loadServerTemplate(building); diff --git a/src/services/bazaar/BazaarService.java b/src/services/bazaar/BazaarService.java index c94feb02..d3aea497 100644 --- a/src/services/bazaar/BazaarService.java +++ b/src/services/bazaar/BazaarService.java @@ -81,6 +81,7 @@ public class BazaarService implements INetworkDispatch { public BazaarService(NGECore core) { this.core = core; + core.commandService.registerCommand("createvendor"); loadAuctionItems(); } diff --git a/src/services/chat/ChatService.java b/src/services/chat/ChatService.java index 26e6c611..e75acf0a 100644 --- a/src/services/chat/ChatService.java +++ b/src/services/chat/ChatService.java @@ -708,6 +708,8 @@ public class ChatService implements INetworkDispatch { while(cursor.hasNext()) { Mail mail = (Mail) cursor.next(); + if(mail == null) + continue; if(mail.getRecieverId() == obj.getObjectID()) { sendPersistentMessageHeader(client, mail); } diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 2b092b6f..67642d31 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -168,10 +168,15 @@ public class HousingService implements INetworkDispatch { } } - // Save structure to DB - /*building.createTransaction(core.getBuildingODB().getEnvironment()); - core.getBuildingODB().put(building, Long.class, BuildingObject.class, building.getTransaction()); - building.getTransaction().commitSync();*/ + //core.objectService.persistObject(building.getObjectID(), building, core.getSWGObjectODB()); + + } + + public void saveBuildings() { + core.objectService.getObjectList() + .values().stream() + .filter(obj -> obj instanceof BuildingObject && obj.getAttachment("structureOwner") != null) + .forEach(building -> core.objectService.persistObject(building.getObjectID(), building, core.getSWGObjectODB())); } @SuppressWarnings("unchecked") diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index b15e8cbe..657661f3 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -157,6 +157,8 @@ public class ObjectService implements INetworkDispatch { } } core.bazaarService.saveAllItems(); + core.housingService.saveBuildings(); + core.harvesterService.saveHarvesters(); core.closeODBs(); } }); @@ -239,13 +241,7 @@ public class ObjectService implements INetworkDispatch { object = new SurveyTool(objectID, planet, Template, position, orientation); - } -// else if(Template.startsWith("object/tangible/container/drum/shared_treasure_drum.iff")) { -// -// object = new CreatureObject(objectID, planet, position, orientation, Template); -// -// } - else if(Template.startsWith("object/tangible")) { + } else if(Template.startsWith("object/tangible")) { object = new TangibleObject(objectID, planet, Template, position, orientation); @@ -253,7 +249,7 @@ public class ObjectService implements INetworkDispatch { object = new IntangibleObject(objectID, planet, position, orientation,Template); - }else if(Template.startsWith("object/weapon")) { + } else if(Template.startsWith("object/weapon")) { object = new WeaponObject(objectID, planet, Template, position, orientation); @@ -336,9 +332,10 @@ public class ObjectService implements INetworkDispatch { object.setAttachment("customServerTemplate", customServerTemplate); object.setisInSnapshot(isSnapshot); - if(!core.getObjectIdODB().contains(objectID)) - core.getObjectIdODB().put(objectID, new ObjectId(objectID)); - + synchronized(objectMutex) { + if(!core.getObjectIdODB().contains(objectID)) + core.getObjectIdODB().put(objectID, new ObjectId(objectID)); + } // Set Options - easier to set them across the board here // because we'll be spawning them despite most of them being unscripted. // Any such settings can be completely reset with setOptionsBitmask @@ -618,24 +615,22 @@ public class ObjectService implements INetworkDispatch { long newId = 0; boolean found = false; // stack overflow when using recursion - while(!found) { - synchronized(objectMutex) { + synchronized(objectMutex) { + while(!found) { newId = highestId.incrementAndGet(); + PreparedStatement ps2; + try { + ps2 = databaseConnection.preparedStatement("UPDATE highestid SET id=" + newId + " WHERE id=(SELECT MAX(id) FROM highestid)"); + ps2.executeUpdate(); + ps2.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + if(objectList.containsKey(newId) || core.getObjectIdODB().contains(newId)) + found = false; + else + found = true; } - - PreparedStatement ps2; - - try { - ps2 = databaseConnection.preparedStatement("UPDATE highestid SET id=" + newId + " WHERE id=" + (newId-1)); - ps2.executeUpdate(); - ps2.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - if(getObject(newId) != null || core.getObjectIdODB().contains(newId)) - found = false; - else - found = true; } return newId; diff --git a/src/services/resources/HarvesterService.java b/src/services/resources/HarvesterService.java index 151a6d67..b49e048e 100644 --- a/src/services/resources/HarvesterService.java +++ b/src/services/resources/HarvesterService.java @@ -47,12 +47,15 @@ import main.NGECore; import engine.clients.Client; import engine.resources.common.CRC; 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; import engine.resources.scene.Quaternion; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import resources.common.ObjControllerOpcodes; +import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; import resources.objects.harvester.HarvesterMessageBuilder; import resources.objects.harvester.HarvesterObject; @@ -95,6 +98,35 @@ public class HarvesterService implements INetworkDispatch { scheduleHarvesterService(); } + public void loadHarvesters() { + ODBCursor cursor = core.getSWGObjectODB().getCursor(); + + while(cursor.hasNext()) { + final SWGObject harvester = (SWGObject) cursor.next(); + if(!(harvester instanceof HarvesterObject) || harvester == null) + continue; + core.objectService.getObjectList().put(harvester.getObjectID(), harvester); + Planet planet = core.terrainService.getPlanetByID(harvester.getPlanetId()); + harvester.setPlanet(planet); + harvester.viewChildren(harvester, true, true, (object) -> { + core.objectService.getObjectList().put(object.getObjectID(), object); + if(object.getParentId() != 0 && object.getContainer() == null) + object.setParent(harvester); + object.getContainerInfo(object.getTemplate()); + }); + allHarvesters.add((HarvesterObject) harvester); + } + + cursor.close(); + } + + public void saveHarvesters() { + for(HarvesterObject harvester : allHarvesters) { + core.objectService.persistObject(harvester.getObjectID(), harvester, core.getSWGObjectODB()); + } + } + + @Override public void insertOpcodes(Map swgOpcodes, Map objControllerOpcodes) { @@ -1055,6 +1087,7 @@ public class HarvesterService implements INetworkDispatch { //NGECore.getInstance().chatService.sendPersistentMessage(actor.getClient(), constructionNotificationMail); NGECore.getInstance().chatService.storePersistentMessage(constructionNotificationMail); NGECore.getInstance().chatService.sendPersistentMessageHeader(actor.getClient(), constructionNotificationMail); + //core.objectService.persistObject(harvester.getObjectID(), harvester, core.getSWGObjectODB()); }