mirror of
https://github.com/ProjectSWGCore/NGECore2.git
synced 2026-08-03 04:16:19 -04:00
Added harvesting and milking of creatures, fixed odb save bug
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user