Added harvesting and milking of creatures, fixed odb save bug

This commit is contained in:
Light2
2014-05-04 17:37:58 +02:00
parent 44678d8c18
commit e78f1ec8fa
11 changed files with 403 additions and 44 deletions
+226 -32
View File
@@ -28,6 +28,7 @@ import java.util.Random;
import java.util.Vector;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import com.sleepycat.persist.EntityCursor;
@@ -40,11 +41,15 @@ import engine.resources.scene.Point3D;
import engine.resources.scene.Quaternion;
import engine.resources.service.INetworkDispatch;
import engine.resources.service.INetworkRemoteEvent;
import resources.common.OutOfBand;
import resources.common.ProsePackage;
import resources.datatables.MilkState;
import resources.objects.creature.CreatureObject;
import resources.objects.harvester.HarvesterObject;
import resources.objects.resource.GalacticResource;
import resources.objects.resource.ResourceContainerObject;
import resources.objects.resource.ResourceRoot;
import services.ai.AIActor;
/**
* @author Charon
@@ -122,7 +127,8 @@ public class ResourceService implements INetworkDispatch {
createCollections3();
}
// }
core.commandService.registerCommand("harvestcorpse");
core.commandService.registerCommand("milkcreature");
core.commandService.registerCommand("resourcecontainersplit");
core.commandService.registerCommand("resourcecontainertransfer");
core.commandService.registerCommand("factorycratesplit");
@@ -7244,7 +7250,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_corellia");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Corellian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7260,7 +7266,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_dantooine");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Dantooine");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7275,7 +7281,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_dathomir");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Dathomirian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7290,7 +7296,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_endor");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Endorian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7305,7 +7311,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_lok");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Lokian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7320,7 +7326,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_naboo");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Nabooian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7335,7 +7341,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_rori");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Rori");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7350,7 +7356,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_talus");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Talusian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7365,7 +7371,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_tatooine");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Tatooinian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -7380,7 +7386,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_yavin4");
resourceRoot.setResourceClass("Canivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Yavinian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -9324,7 +9330,7 @@ public class ResourceService implements INetworkDispatch {
resourceRoot = new ResourceRoot();
resourceRoot.setResourceFileName("meat_carnivore_kashyyyk");
resourceRoot.setResourceClass("Herbivore Meat");
resourceRoot.setResourceClass("Carnivore Meat");
resourceRoot.setResourceType("Kashyyykian");
resourceRoot.setgeneralType((byte) GalacticResource.GENERAL_MEAT);
resourceRoot.setContainerType((byte) ResourceRoot.CONTAINER_TYPE_ORGANIC_FOOD);
@@ -11429,28 +11435,216 @@ public class ResourceService implements INetworkDispatch {
}
// Utility method to quickly spawn resource containers into the inventory
public ResourceContainerObject spawnSpecificResourceContainer(String spawnType, CreatureObject crafter,int stackCount){
ResourceContainerObject containerObject = null;
for (GalacticResource sampleResource : allSpawnedResources){
if (sampleResource.getResourceRoot().getResourceClass().contains(spawnType)){
String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()];
containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet());
containerObject.setProprietor(crafter);
containerObject.setStackCount(stackCount,false);
//int stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource);
containerObject.initializeStats(sampleResource);
int resCRC = CRC.StringtoCRC(resourceContainerIFF);
containerObject.setIffFileName(resourceContainerIFF);
long objectId = containerObject.getObjectID();
SWGObject crafterInventory = crafter.getSlottedObject("inventory");
crafterInventory.add(containerObject);
return containerObject;
}
public ResourceContainerObject spawnSpecificResourceContainer(String spawnType, CreatureObject crafter,int stackCount){
ResourceContainerObject containerObject = null;
for (GalacticResource sampleResource : allSpawnedResources){
if (sampleResource.getResourceRoot().getResourceClass().contains(spawnType)){
String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()];
containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet());
containerObject.setProprietor(crafter);
containerObject.setStackCount(stackCount,false);
//int stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource);
containerObject.initializeStats(sampleResource);
int resCRC = CRC.StringtoCRC(resourceContainerIFF);
containerObject.setIffFileName(resourceContainerIFF);
long objectId = containerObject.getObjectID();
SWGObject crafterInventory = crafter.getSlottedObject("inventory");
crafterInventory.add(containerObject);
return containerObject;
}
return containerObject;
}
return containerObject;
}
public void giveResource(CreatureObject actor, GalacticResource res, int amount) {
ResourceContainerObject foundContainer = core.surveyService.findResourceContainerInInventory(actor, res);
if(foundContainer != null && amount < ResourceContainerObject.maximalStackCapacity - foundContainer.getStackCount()) {
foundContainer.setStackCount(foundContainer.getStackCount() + amount, actor);
} else {
SWGObject inventory = actor.getSlottedObject("inventory");
String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[res.getResourceRoot().getContainerType()];
ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, actor.getPlanet());
containerObject.initializeStats(res);
containerObject.setProprietor(actor);
containerObject.setStackCount(amount, actor);
inventory.add(containerObject);
}
public Vector<String> getCompleteResourceNameHistory() {
return completeResourceNameHistory;
}
public boolean canMilk(CreatureObject actor, CreatureObject target) {
if(target.getPosture() == 14 || !actor.inRange(target.getWorldPosition(), 5) || actor.getCombatFlag() == 1 || target.getCombatFlag() == 1)
return false;
AIActor ai = (AIActor) target.getAttachment("AI");
if(ai.getMobileTemplate().getMilkAmount() <= 0 || ai.getMobileTemplate().getMilkType() == null || ai.getMilkState() == MilkState.MILKED || ai.getMilkState() == MilkState.MILKINGINPROGRESS)
return false;
return true;
}
public boolean canHarvest(CreatureObject actor, CreatureObject target) {
if(target.getPosture() != 14)
return false;
AIActor ai = (AIActor) target.getAttachment("AI");
if(ai.getMobileTemplate().getMeatAmount() <= 0 && ai.getMobileTemplate().getBoneAmount() <= 0 && ai.getMobileTemplate().getHideAmount() <= 0)
return false;
if(target.getKiller() != actor && !(actor.getGroupId() == target.getGroupId() && actor.getGroupId() != 0))
return false;
return true;
}
public void doHarvest(CreatureObject actor, CreatureObject target, String type) {
AIActor ai = (AIActor) target.getAttachment("AI");
if(!actor.inRange(target.getWorldPosition(), 7)) {
actor.sendSystemMessage("You are too far away to harvest the creature.", (byte) 0);
return;
}
if(ai.hasBeenHarvested()) {
actor.sendSystemMessage("@skl_use:nothing_to_harvest", (byte) 0);
return;
}
ai.setHasBeenHarvested(true);
String resType = "";
int resAmount = 0;
switch(type) {
case "hide":
resType = ai.getMobileTemplate().getHideType();
resAmount = ai.getMobileTemplate().getHideAmount();
break;
case "meat":
resType = ai.getMobileTemplate().getMeatType();
resAmount = ai.getMobileTemplate().getMeatAmount();
break;
case "bone":
resType = ai.getMobileTemplate().getBoneType();
resAmount = ai.getMobileTemplate().getBoneAmount();
break;
}
resAmount += (resAmount * (actor.getSkillModBase("creature_harvesting") / 100));
GalacticResource res = grabResourceByClass(resType, target.getPlanetId());
if(res == null) {
actor.sendSystemMessage("@skl_use:nothing_to_harvest", (byte) 0);
ai.setHasBeenHarvested(false);
return;
}
float density = res.deliverConcentrationForSurvey(target.getPlanetId(), target.getWorldPosition().x, target.getWorldPosition().z);
if(density >= 0.8f) {
resAmount *= 1.25f;
} else if(density >= 0.6f) {
resAmount *= 1.f;
} else if(density >= 0.4f) {
resAmount *= 0.75f;
} else {
resAmount *= 0.5f;
}
giveResource(actor, res, resAmount);
actor.sendSystemMessage("@skl_use:corpse_harvest_success", (byte) 0);
}
public void doMilk(CreatureObject actor, CreatureObject target) {
AIActor ai = (AIActor) target.getAttachment("AI");
ai.setMilkState(MilkState.MILKINGINPROGRESS);
actor.sendSystemMessage("@skl_use:milk_begin", (byte) 0);
scheduler.schedule(() -> {
if(actor.getInventoryItemCount() >= 80) {
actor.sendSystemMessage("@skl_use:milk_inventory_full", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
return;
}
if(target.getPosture() == 14) {
actor.sendSystemMessage("@skl_use:milk_cant_milk_the_dead", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
return;
}
if(!actor.inRange(target.getWorldPosition(), 5)) {
actor.sendSystemMessage("@skl_use:milk_too_far", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
return;
}
if(actor.getCombatFlag() == 1) {
actor.sendSystemMessage("@skl_use:milk_combat", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
return;
}
if(new Random().nextFloat() <= 0.05f) {
actor.sendSystemMessage("@skl_use:milk_not_hidden", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
ai.addDefender(actor);
return;
}
giveMilk(actor, target);
}, 10000, TimeUnit.MILLISECONDS);
}
public void giveMilk(CreatureObject actor, CreatureObject target) {
AIActor ai = (AIActor) target.getAttachment("AI");
String milkType = ai.getMobileTemplate().getMilkType();
int milkAmount = ai.getMobileTemplate().getMilkAmount();
GalacticResource res = grabResourceByClass(milkType, target.getPlanetId());
if(res == null) {
actor.sendSystemMessage("Can't find milk resource.", (byte) 0);
ai.setMilkState(MilkState.NOTYETMILKED);
return;
}
float density = res.deliverConcentrationForSurvey(target.getPlanetId(), target.getWorldPosition().x, target.getWorldPosition().z);
if(density >= 0.8f) {
milkAmount *= 1.25f;
} else if(density >= 0.6f) {
milkAmount *= 1.f;
} else if(density >= 0.4f) {
milkAmount *= 0.75f;
} else {
milkAmount *= 0.5f;
}
giveResource(actor, res, milkAmount);
ai.setMilkState(MilkState.MILKED);
actor.sendSystemMessage("@skl_use:milk_success", (byte) 0);
}
public Vector<String> getCompleteResourceNameHistory() {
return completeResourceNameHistory;
}
}