diff --git a/src/resources/common/collidables/CollidableCircle.java b/src/resources/common/collidables/CollidableCircle.java index fef3eacc..2f6cf76c 100644 --- a/src/resources/common/collidables/CollidableCircle.java +++ b/src/resources/common/collidables/CollidableCircle.java @@ -31,6 +31,7 @@ public class CollidableCircle extends AbstractCollidable { private Point3D center; private float radius; + private float radiusSquared; // for bh traps private boolean useYAxis = false; @@ -54,6 +55,7 @@ public class CollidableCircle extends AbstractCollidable { public void setRadius(float radius) { this.radius = radius; + this.radiusSquared = radius * radius; } public boolean isUseYAxis() { @@ -68,18 +70,18 @@ public class CollidableCircle extends AbstractCollidable { public boolean doesCollide(SWGObject obj) { Point3D objectPos = obj.getWorldPosition(); if(useYAxis) { - return center.getDistance(objectPos) <= radius && objectPos.y == center.y; + return (objectPos.x - center.x) * (objectPos.x - center.x) + (objectPos.z - center.z) * (objectPos.z - center.z) <= radiusSquared && objectPos.y <= center.y + 1 && objectPos.y >= center.y - 1; } else { - return center.getDistance(objectPos) <= radius; + return (objectPos.x - center.x) * (objectPos.x - center.x) + (objectPos.z - center.z) * (objectPos.z - center.z) <= radiusSquared; } } @Override public boolean doesCollide(Point3D position) { if(useYAxis) { - return center.getDistance(position) <= radius && position.y == center.y; + return (position.x - center.x) * (position.x - center.x) + (position.z - center.z) * (position.z - center.z) <= radiusSquared && position.y <= center.y + 1 && position.y >= center.y - 1; } else { - return center.getDistance(position) <= radius; + return (position.x - center.x) * (position.x - center.x) + (position.z - center.z) * (position.z - center.z) <= radiusSquared; } } diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index 5964ca6b..ce8bc83e 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -223,8 +223,8 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria return (boolean) otherVariables.get("residency"); } - public void setResidency() { - otherVariables.set("residency", true); + public void setResidency(boolean flag) { + otherVariables.set("residency", flag); } public byte getPrivacy() { diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index ff44df44..1cd56f1f 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -330,6 +330,7 @@ public class HousingService implements INetworkDispatch { if (returnList.get(0).equals(""+confirmCode)){ // handle creation of correct deed in player inventory PlayerObject player = (PlayerObject) houseOwner.getSlottedObject("ghost"); + PlayerCity city = core.playerCityService.getCityObjectIsIn(building); HouseTemplate houseTemplate = housingTemplates.get(houseToDeed.get(building.getTemplate())); TangibleObject deed = (TangibleObject) core.objectService.createObject(houseTemplate.getDeedTemplate(), owner.getPlanet()); @@ -361,6 +362,20 @@ public class HousingService implements INetworkDispatch { player.setLotsRemaining(player.getLotsRemaining() + houseTemplate.getLotCost()); } + if(building.getResidency()) { + owner.setAttachment("residentBuilding", null); + } + + if(city != null) { + city.removeStructure(building.getObjectID()); + if(building.getResidency()) { + city.removeCitizen(owner.getObjectID()); + player.setHome(""); + player.setCitizenship(Citizenship.Homeless); + owner.setAttachment("residentCity", null); + } + } + houseOwner.sendSystemMessage("@player_structure:processing_destruction",(byte)1); houseOwner.sendSystemMessage("@player_structure:deed_reclaimed",(byte)1); @@ -523,7 +538,7 @@ public class HousingService implements INetworkDispatch { ((CreatureObject) owner).sendSystemMessage(OutOfBand.ProsePackage("@player_structure:change_residence_time", "DI", (int) ((long) owner.getAttachment("residencyCooldown") - System.currentTimeMillis()) / 3600000), (byte) 0); return; } - building.setResidency(); + building.setResidency(true); PlayerCity cityActorIsIn = core.playerCityService.getCityObjectIsIn(building); owner.setAttachment("residencyCooldown", System.currentTimeMillis() + 86400000); // 24 hours owner.setAttachment("residentBuilding", building.getObjectID()); diff --git a/src/services/playercities/PlayerCity.java b/src/services/playercities/PlayerCity.java index 7b738232..6f609e38 100644 --- a/src/services/playercities/PlayerCity.java +++ b/src/services/playercities/PlayerCity.java @@ -226,11 +226,12 @@ public class PlayerCity implements Serializable { } - + NGECore core = NGECore.getInstance(); // collect taxes - for (long citizen : citizens){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); - + for (long citizen : citizens) { + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); + if(citizenObject == null) + continue; // ToDo: Handle tax evaders etc. int incomeTax = getIncomeTax(); citizenObject.setBankCredits(citizenObject.getBankCredits()-incomeTax); @@ -301,8 +302,11 @@ public class PlayerCity implements Serializable { Vector founders = getFoundersList(); Vector citizenList = getCitizens(); int founderCitizenCount = 0; + NGECore core = NGECore.getInstance(); for (long founderId : founders){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(founderId); + CreatureObject citizenObject = core.objectService.getObject(founderId) == null ? core.objectService.getCreatureFromDB(founderId) : (CreatureObject) core.objectService.getObject(founderId); + if(citizenObject == null) + continue; if (citizenList.contains(founderId) && (long)citizenObject.getAttachment("residentCity")==this.getCityID()) founderCitizenCount++; } @@ -406,18 +410,19 @@ public class PlayerCity implements Serializable { } public void addCitizen(long citizen) { - synchronized(citizens){ - this.citizens.add(citizen); - } + citizens.add(citizen); CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); sendNewCitizenMailAll(citizenObject); sendNewCitizenMail(citizenObject); } public void removeCitizen(long citizen) { - synchronized(citizens){ - this.citizens.remove(citizen); - } + citizens.remove(citizen); + NGECore core = NGECore.getInstance(); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); + if(citizenObject == null) + return; + sendCitizenLeftMailAll(citizenObject); } public long getNextElectionDate() { @@ -629,10 +634,11 @@ public class PlayerCity implements Serializable { // city_version_update_subject_4 // city_version_update_body_4 Vector citizenList = getCitizens(); + NGECore core = NGECore.getInstance(); for (long citizen : citizenList){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); if(citizenObject == null) - citizenObject = NGECore.getInstance().objectService.getCreatureFromDB(citizen); + continue; Mail actorMail = new Mail(); actorMail.setMailId(NGECore.getInstance().chatService.generateMailId()); actorMail.setRecieverId(citizen); @@ -669,10 +675,11 @@ public class PlayerCity implements Serializable { public void sendNewCitizenMailAll(CreatureObject newCitizen) { Vector citizenList = getCitizens(); + NGECore core = NGECore.getInstance(); for (long citizen : citizenList){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); if(citizenObject == null) - citizenObject = NGECore.getInstance().objectService.getCreatureFromDB(citizen); + continue; Mail actorMail = new Mail(); actorMail.setMailId(NGECore.getInstance().chatService.generateMailId()); actorMail.setRecieverId(citizen); @@ -736,10 +743,11 @@ public class PlayerCity implements Serializable { public void sendCitizenLeftMailAll(CreatureObject newCitizen) { Vector citizenList = getCitizens(); + NGECore core = NGECore.getInstance(); for (long citizen : citizenList){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); if(citizenObject == null) - citizenObject = NGECore.getInstance().objectService.getCreatureFromDB(citizen); + continue; Mail actorMail = new Mail(); actorMail.setMailId(NGECore.getInstance().chatService.generateMailId()); actorMail.setRecieverId(citizen); @@ -773,10 +781,11 @@ public class PlayerCity implements Serializable { public void sendCityExpandMailAll() { Vector citizenList = getCitizens(); + NGECore core = NGECore.getInstance(); for (long citizen : citizenList){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); if(citizenObject == null) - citizenObject = NGECore.getInstance().objectService.getCreatureFromDB(citizen); + continue; Mail actorMail = new Mail(); actorMail.setMailId(NGECore.getInstance().chatService.generateMailId()); actorMail.setRecieverId(citizen); @@ -808,10 +817,11 @@ public class PlayerCity implements Serializable { public void sendCityContractMailAll() { Vector citizenList = getCitizens(); + NGECore core = NGECore.getInstance(); for (long citizen : citizenList){ - CreatureObject citizenObject = (CreatureObject) NGECore.getInstance().objectService.getObject(citizen); + CreatureObject citizenObject = core.objectService.getObject(citizen) == null ? core.objectService.getCreatureFromDB(citizen) : (CreatureObject) core.objectService.getObject(citizen); if(citizenObject == null) - citizenObject = NGECore.getInstance().objectService.getCreatureFromDB(citizen); + continue; Mail actorMail = new Mail(); actorMail.setMailId(NGECore.getInstance().chatService.generateMailId()); actorMail.setRecieverId(citizen); @@ -864,4 +874,9 @@ public class PlayerCity implements Serializable { } } } + + public void removeStructure(long objectID) { + placedStructures.remove(objectID); + } + }