void InstallationObjectImplementation::updateResourceContainerQuantity(ResourceContainer* container, int newQuantity, bool notifyClient) { Time timeToWorkTill; container->setQuantity(newQuantity, false, true); for (int i = 0; i < resourceHopper.size(); ++i) { ResourceContainer* cont = resourceHopper.get(i); if (cont == container) { InstallationObjectDeltaMessage7* inso7 = new InstallationObjectDeltaMessage7( _this.get()); inso7->updateHopper(); inso7->startUpdate(0x0D); if(container->getQuantity() == 0 && (!isOperating() || (isOperating() && i != 0))) resourceHopper.remove(i, inso7, 1); else resourceHopper.set(i, container, inso7, 1); inso7->updateHopperSize(getHopperSize()); inso7->updateExtractionRate(getActualRate()); inso7->close(); if (notifyClient) broadcastToOperators(inso7); else delete inso7; } } if(resourceHopper.size() == 0) setOperating(false); //broadcastToOperators(new InstallationObjectDeltaMessage7(_this.get())); }
void InstallationObjectImplementation::clearResourceHopper() { Time timeToWorkTill; if (resourceHopper.size() == 0) return; setOperating(false); //lets delete the containers from db for (int i = 0; i < resourceHopper.size(); ++i) { ResourceContainer* container = resourceHopper.get(i); if (container != NULL) { Locker locker(container); container->destroyObjectFromDatabase(true); } } InstallationObjectDeltaMessage7* inso7 = new InstallationObjectDeltaMessage7( _this.get()); inso7->updateHopper(); inso7->startUpdate(0x0D); resourceHopper.removeAll(inso7); inso7->updateActiveResourceSpawn(getActiveResourceSpawnID()); inso7->updateHopperSize(getHopperSize()); inso7->updateExtractionRate(getActualRate()); inso7->close(); broadcastToOperators(inso7); }
String HarvesterObjectImplementation::getRedeedMessage() { if(operating) return "destroy_deactivate_first"; if(getHopperSize() > 0) return "destroy_empty_hopper"; return ""; }
void InstallationObjectImplementation::setActiveResource(ResourceContainer* container) { Time timeToWorkTill; if (resourceHopper.size() == 0) { addResourceToHopper(container); currentSpawn = container->getSpawnObject(); spawnDensity = currentSpawn->getDensityAt(getZone()->getZoneName(), getPositionX(), getPositionY()); return; } updateInstallationWork(); int i = 0; for (; i < resourceHopper.size(); ++i) { ResourceContainer* entry = resourceHopper.get(i); if (entry == container) { if (i == 0) return; ManagedReference<ResourceContainer*> oldEntry = resourceHopper.get(0); InstallationObjectDeltaMessage7* inso7 = new InstallationObjectDeltaMessage7( _this.get()); inso7->updateHopper(); inso7->startUpdate(0x0D); resourceHopper.set(0, container, inso7, 2); if(oldEntry->getQuantity() > 0) resourceHopper.set(i, oldEntry, inso7, 0); else resourceHopper.remove(i, inso7, 0); currentSpawn = container->getSpawnObject(); spawnDensity = currentSpawn->getDensityAt(getZone()->getZoneName(), getPositionX(), getPositionY()); inso7->updateHopperSize(getHopperSize()); inso7->updateExtractionRate(getActualRate()); inso7->close(); broadcastToOperators(inso7); } } }
void InstallationObjectImplementation::updateHopper(Time& workingTime, bool shutdownAfterUpdate) { Locker locker(_this.get()); if (getZone() == NULL) return; Time timeToWorkTill; if (!isOperating()) { if(lastStopTime.compareTo(resourceHopperTimestamp) != -1) return; } if (resourceHopper.size() == 0) { // no active spawn if(currentSpawn == NULL) return; Locker locker(currentSpawn); addResourceToHopper(currentSpawn->createResource(0)); } ManagedReference<ResourceContainer*> container = resourceHopper.get(0); if(currentSpawn == NULL) currentSpawn = container->getSpawnObject(); Time currentTime = workingTime; Time spawnExpireTimestamp(currentSpawn->getDespawned()); // if (t1 < t2) return 1 - if spawnTime is sooner currentTime, use spawnTime, else use spawn time uint32 harvestUntil = (spawnExpireTimestamp.compareTo(currentTime) > 0) ? spawnExpireTimestamp.getTime() : currentTime.getTime(); uint32 lastHopperUpdate = resourceHopperTimestamp.getTime(); int elapsedTime = (harvestUntil - lastHopperUpdate); float harvestAmount = (elapsedTime / 60.0) * (spawnDensity * getExtractionRate()); int availableCapacity = (int)(getHopperSizeMax() - getHopperSize()); harvestAmount = harvestAmount > availableCapacity ? availableCapacity : harvestAmount; if(harvestAmount < 0) harvestAmount = 0; harvestAmount += extractionRemainder; extractionRemainder = harvestAmount - (int) harvestAmount; harvestAmount = (int) harvestAmount; float currentQuantity = container->getQuantity(); if(harvestAmount > 0 || !isOperating()) { Locker spawnLocker(currentSpawn); currentSpawn->extractResource(getZone()->getZoneName(), harvestAmount); spawnLocker.release(); updateResourceContainerQuantity(container, (currentQuantity + harvestAmount), true); } // Update Timestamp resourceHopperTimestamp.updateToCurrentTime(); if((int)getHopperSize() >= (int)getHopperSizeMax()) shutdownAfterUpdate = true; if(spawnExpireTimestamp.compareTo(currentTime) > 0) { shutdownAfterUpdate = true; } if (shutdownAfterUpdate) setOperating(false); /*InstallationObjectDeltaMessage7* inso7 = new InstallationObjectDeltaMessage7( _this.get()); inso7->startUpdate(0x0D); resourceHopper.set(0, container, inso7, 1); inso7->updateHopperSize(getHopperSize()); inso7->close(); broadcastToOperators(inso7);*/ }