From 531acac7c69c46d19ecdff9fc162837d464db0a6 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Wed, 2 Apr 2014 23:28:08 +0200 Subject: [PATCH] More quality assurance work - Resource container split/join - Surveying test runs - Balancing --- scripts/commands/resourcecontainersplit.py | 8 + scripts/commands/resourcecontainertransfer.py | 8 + scripts/radial/resourceContainer.py | 15 ++ .../resource/ResourceContainerObject.java | 110 ++++++++++++++ src/resources/objects/tool/SurveyTool.java | 2 +- src/services/SurveyService.java | 140 +++++++++++------- src/services/command/CommandService.java | 2 +- src/services/object/ObjectService.java | 1 + src/services/resources/ResourceService.java | 45 +++++- 9 files changed, 276 insertions(+), 55 deletions(-) create mode 100644 scripts/commands/resourcecontainersplit.py create mode 100644 scripts/commands/resourcecontainertransfer.py create mode 100644 scripts/radial/resourceContainer.py diff --git a/scripts/commands/resourcecontainersplit.py b/scripts/commands/resourcecontainersplit.py new file mode 100644 index 00000000..ae3869c5 --- /dev/null +++ b/scripts/commands/resourcecontainersplit.py @@ -0,0 +1,8 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + target.splitContainer(actor,target,commandString) + return \ No newline at end of file diff --git a/scripts/commands/resourcecontainertransfer.py b/scripts/commands/resourcecontainertransfer.py new file mode 100644 index 00000000..8a369843 --- /dev/null +++ b/scripts/commands/resourcecontainertransfer.py @@ -0,0 +1,8 @@ +import sys + +def setup(): + return + +def run(core, actor, target, commandString): + target.transferContainer(actor,target,commandString) + return \ No newline at end of file diff --git a/scripts/radial/resourceContainer.py b/scripts/radial/resourceContainer.py new file mode 100644 index 00000000..4994f1cb --- /dev/null +++ b/scripts/radial/resourceContainer.py @@ -0,0 +1,15 @@ +from resources.common import RadialOptions +import sys + +def createRadial(core, owner, target, radials): + #radials.add(RadialOptions(0, 21, 1, '')) + #radials.add(RadialOptions(0, 7, 1, '')) + radials.add(RadialOptions(0, 15, 1, '')) + return + +def handleSelection(core, owner, target, option): + #if option == 21 and target: + #core.objectService.useObject(owner, target) + if option == 15 and target: + core.objectService.destroyObject(target) + return \ No newline at end of file diff --git a/src/resources/objects/resource/ResourceContainerObject.java b/src/resources/objects/resource/ResourceContainerObject.java index 26862e75..b2f4a47b 100644 --- a/src/resources/objects/resource/ResourceContainerObject.java +++ b/src/resources/objects/resource/ResourceContainerObject.java @@ -22,9 +22,13 @@ package resources.objects.resource; +import main.NGECore; + import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; + import engine.clients.Client; +import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -137,6 +141,7 @@ public class ResourceContainerObject extends TangibleObject { public ResourceContainerObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ super(objectID, planet, template, position, orientation); messageBuilder = new ResourceContainerMessageBuilder(this); + this.setAttachment("radial_filename", "resourceContainer"); } public void initializeStats(GalacticResource resource){ @@ -223,6 +228,78 @@ public class ResourceContainerObject extends TangibleObject { } } + public void cloneStats(ResourceContainerObject original){ + this.setResourceName(original.getResourceName()); + this.setResourceClass(original.getResourceClass()); + this.setColdResistance(original.getColdResistance()); + this.setConductivity(original.getConductivity()); + this.setDecayResistance(original.getDecayResistance()); + this.setHeatResistance(original.getHeatResistance()); + this.setMalleability(original.getMalleability()); + this.setShockResistance(original.getShockResistance()); + this.setUnitToughness(original.getUnitToughness()); + this.setEntangleResistance(original.getEntangleResistance()); + this.setPotentialEnergy(original.getPotentialEnergy()); + this.setOverallQuality(original.getOverallQuality()); + this.setFlavor(original.getFlavor()); + this.setResourceType(original.getResourceType()); + this.setGeneralType(original.getGeneralType()); + this.setReferenceID(original.getReferenceID()); + this.setResourceFileName(original.getResourceFileName()); + + // set attributes + this.getAttributes().put("@obj_attr_n:condition", "100/100"); + this.getAttributes().put("@obj_attr_n:volume", "1"); + this.getAttributes().put("@obj_attr_n:resource_contents", this.getStackCount()+"/"+maximalStackCapacity); + this.getAttributes().put("@obj_attr_n:resource_name", this.getResourceName()); + this.getAttributes().put("@obj_attr_n:resource_class", "@resource/resource_names:" + this.getResourceFileName()); + + if (this.getColdResistance()>0){ + this.getAttributes().put("res_cold_resist", ""+this.getColdResistance()); + } + + if (this.getConductivity()>0){ + this.getAttributes().put("res_conductivity", ""+this.getConductivity()); + } + + if (this.getDecayResistance()>0){ + this.getAttributes().put("res_decay_resist", ""+this.getDecayResistance()); + } + + if (this.getHeatResistance()>0){ + this.getAttributes().put("res_heat_resist", ""+this.getHeatResistance()); + } + + if (this.getMalleability()>0){ + this.getAttributes().put("res_malleability", ""+this.getMalleability()); + } + + if (this.getOverallQuality()>0){ + this.getAttributes().put("res_quality", ""+this.getOverallQuality()); + } + + if (this.getShockResistance()>0){ + this.getAttributes().put("res_shock_resistance", ""+this.getShockResistance()); + } + + if (this.getUnitToughness()>0){ + this.getAttributes().put("res_toughness", ""+this.getUnitToughness()); + } + + if (this.getFlavor()>0){ + this.getAttributes().put("res_flavor", ""+this.getFlavor()); + } + + if (this.getEntangleResistance()>0){ + this.getAttributes().put("entangle_resistance", ""+this.getEntangleResistance()); + } + + if (this.getPotentialEnergy()>0){ + this.getAttributes().put("res_potential_energy", ""+this.getPotentialEnergy()); + } + + } + public long getContainerID() { return containerID; } @@ -396,6 +473,7 @@ public class ResourceContainerObject extends TangibleObject { public void setStackCount(int stackCount) { this.stackCount = stackCount; this.getAttributes().put("@obj_attr_n:resource_contents", this.getStackCount()+"/"+maximalStackCapacity); + this.sendDelta3(this.getProprietor().getClient()); } public byte getContainerType() { @@ -410,6 +488,38 @@ public class ResourceContainerObject extends TangibleObject { destination.getSession().write(messageBuilder.serialized_buildAttributeListMessage()); } + public void splitContainer(CreatureObject owner,ResourceContainerObject originalObject,String commandString){ + String[] splitArray = commandString.split(" "); + if (splitArray.length<3) + return; + int cloneStackQuantity= Integer.parseInt(splitArray[0]); + int parentcontainerID= Integer.parseInt(splitArray[1]); + SWGObject objectParentContainer = (SWGObject) NGECore.getInstance().objectService.getObject(parentcontainerID); + if (objectParentContainer==null || originalObject==null) + return; + CreatureObject proprietor = originalObject.getProprietor(); + ResourceContainerObject containerObject = (ResourceContainerObject) NGECore.getInstance().objectService.createObject(originalObject.getTemplate(), proprietor.getPlanet()); + containerObject.cloneStats(originalObject); + containerObject.setProprietor(originalObject.getProprietor()); + containerObject.setStackCount(cloneStackQuantity); + originalObject.setStackCount(originalObject.getStackCount()-cloneStackQuantity); + objectParentContainer.add(containerObject); + } + + public void transferContainer(CreatureObject owner,ResourceContainerObject disposableObject,String commandString){ + String[] splitArray = commandString.split(" "); + if (splitArray.length<2) + return; + int parentcontainerID= Integer.parseInt(splitArray[0]); + int cloneStackQuantity= Integer.parseInt(splitArray[1]); + ResourceContainerObject resourceContainer = (ResourceContainerObject) NGECore.getInstance().objectService.getObject(parentcontainerID); + if (resourceContainer==null) + return; + resourceContainer.setStackCount(resourceContainer.getStackCount()+cloneStackQuantity); + SWGObject objectParentContainer = (SWGObject) NGECore.getInstance().objectService.getObject(resourceContainer.getParentId()); + objectParentContainer.remove(disposableObject); + } + @Override public void sendBaselines(Client destination) { diff --git a/src/resources/objects/tool/SurveyTool.java b/src/resources/objects/tool/SurveyTool.java index 9de3868f..7010fd4b 100644 --- a/src/resources/objects/tool/SurveyTool.java +++ b/src/resources/objects/tool/SurveyTool.java @@ -285,7 +285,7 @@ public class SurveyTool extends TangibleObject{ } public void setRecoveryMode(boolean recoveryMode) { - recoveryMode = recoveryMode; + this.recoveryMode = recoveryMode; } public byte getSurveyRangeSetting() { diff --git a/src/services/SurveyService.java b/src/services/SurveyService.java index 2ac9cdf4..c1938286 100644 --- a/src/services/SurveyService.java +++ b/src/services/SurveyService.java @@ -126,20 +126,25 @@ public class SurveyService implements INetworkDispatch { } public void handleSamplingStages(SurveyTool surveyTool){ - CreatureObject crafter = surveyTool.getUser(); - + + if (surveyTool.isExceptionalState()) + return; + CreatureObject crafter = surveyTool.getUser(); PlayerObject player = (PlayerObject) crafter.getSlottedObject("ghost"); GalacticResource sampleResource = surveyTool.getSurveyResource(); int stackCount = 0; + boolean gamblingwon = false; ResourceContainerObject container = player.getRecentContainer(); if (! surveyTool.isRecoveryMode()) stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource); else { // handle particularly rich case stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource); int recoveryChance = new Random().nextInt(100); - if (recoveryChance<60){ + if (recoveryChance<99){ + gamblingwon = true; stackCount *= 3; } + surveyTool.setRecoveryMode(false); } if (container!=null) { @@ -152,53 +157,70 @@ public class SurveyService implements INetworkDispatch { core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); //exp_n:resource_harvesting_inorganic - container.sendDelta3(crafter.getClient()); - container.buildAttributeListMessage(crafter.getClient()); + //container.sendDelta3(crafter.getClient()); + //container.buildAttributeListMessage(crafter.getClient()); } else { // new container - - String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; + if ((stackCount > 0) && (!surveyTool.isRecoveryMode())) { + String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; + ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet()); + containerObject.initializeStats(sampleResource); + containerObject.setProprietor(crafter); + SWGObject crafterInventory = crafter.getSlottedObject("inventory"); + container.setStackCount(stackCount); + crafterInventory.add(containerObject); + player.setRecentContainer(containerObject); + } + + } + } else { // Mismatch -> new container + String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; + if ((stackCount > 0) && (!surveyTool.isRecoveryMode())) { ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet()); containerObject.initializeStats(sampleResource); containerObject.setProprietor(crafter); SWGObject crafterInventory = crafter.getSlottedObject("inventory"); crafterInventory.add(containerObject); player.setRecentContainer(containerObject); - } - } else { // Mismatch -> new container - String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; - - ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet()); - containerObject.initializeStats(sampleResource); - containerObject.setProprietor(crafter); - SWGObject crafterInventory = crafter.getSlottedObject("inventory"); - crafterInventory.add(containerObject); - player.setRecentContainer(containerObject); } } else { // create new container, first sample - String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; - ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet()); - containerObject.initializeStats(sampleResource); - containerObject.setProprietor(crafter); - stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource); - containerObject.setStackCount(stackCount,false); - SWGObject crafterInventory = crafter.getSlottedObject("inventory"); - crafterInventory.add(containerObject); - player.setRecentContainer(containerObject); + if ((stackCount > 0) && (!surveyTool.isRecoveryMode())) { + String resourceContainerIFF = ResourceRoot.CONTAINER_TYPE_IFF_SIGNIFIER[sampleResource.getResourceRoot().getContainerType()]; + ResourceContainerObject containerObject = (ResourceContainerObject) core.objectService.createObject(resourceContainerIFF, crafter.getPlanet()); + containerObject.initializeStats(sampleResource); + containerObject.setProprietor(crafter); + stackCount = core.resourceService.getResourceSampleQuantity(crafter, sampleResource); + containerObject.setStackCount(stackCount,false); + SWGObject crafterInventory = crafter.getSlottedObject("inventory"); + crafterInventory.add(containerObject); + player.setRecentContainer(containerObject); + } } + if (gamblingwon) { + crafter.sendSystemMessage("@survey:critical_success", (byte) 0); + core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); + surveyTool.setExceptionalState(false); + return; + } if ((stackCount > 0) && (!surveyTool.isRecoveryMode())) { // @survey:sample_located crafter.sendSystemMessage("You successfully locate a " + stackCount + " unit sample of " + sampleResource.getName() + "." , (byte) 0); - core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); // resource_harvesting_inorganic + core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); } if ((stackCount > 0) && (surveyTool.isRecoveryMode())) { crafter.sendSystemMessage("@survey:node_recovery", (byte) 0); - core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); // resource_harvesting_inorganic + core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); } + if ((stackCount == 0) && (!surveyTool.isRecoveryMode())) { + crafter.sendSystemMessage("@survey:sample_failed", (byte) 0); + core.playerService.giveExperience(crafter,(int)(2.5F*stackCount)); + //surveyTool.setRecoveryMode(true); + //surveyTool.setRecoveryTime(System.currentTimeMillis()); + } } public void requestSurvey(CreatureObject crafter, SWGObject target, SurveyCommand command, int actionCounter, String commandArgs){ @@ -328,13 +350,19 @@ public class SurveyService implements INetworkDispatch { int remaining = 0; // calculate remaining time crafter.sendSystemMessage("You will be able to sample again in " + remaining + " seconds.", (byte) 0); // "@survey:tool_recharge_time" } else { + + // ToDo: + if (sampleResource.getResourceRoot().getResourceClass().equals("Radioactive")){ //resourceRoot.getResourceClass("Radioactive"); + createRadioactivityWarningSUIWindow(crafter, surveyTool); + return; + } + crafter.setPosture((byte) 1); crafter.sendSystemMessage("You kneel", (byte) 0); - // ToDo: - //if (.equals("radioactive")) - - int samplingCost=125-(int)crafter.getSkillMod("surveying").getModifier(); + + //int samplingCost=125-(int)crafter.getSkillMod("surveying").getModifier(); + int samplingCost=125; if (crafter.getAction()-samplingCost<0){ // Check HAM crafter.sendSystemMessage("@survey:gamble_no_action", (byte) 0); crafter.setPosture((byte) 0); @@ -360,6 +388,8 @@ public class SurveyService implements INetworkDispatch { } } else { crafter.sendSystemMessage("There are only trace amounts of " + commandArgs + " here. Find a higher concentration of the resource, and try sampling again.", (byte) 0); // "@survey:trace_amount:" + surveyTool.setCurrentlySampling(true); + surveyTool.setLastSampleTime(System.currentTimeMillis()); } } else { crafter.sendSystemMessage("You must survey for " + commandArgs + " before you can sample for it.", (byte) 0); @@ -397,8 +427,9 @@ public class SurveyService implements INetworkDispatch { // ToDo: overfilling resource container with continuesampling - int samplingCost=125-(int)crafter.getSkillMod("surveying").getModifier(); - if (crafter.getAction()-samplingCost<0){ + //int samplingCost=125-(int)crafter.getSkillMod("surveying").getModifier(); + int samplingCost=125; + if (crafter.getAction()-samplingCost<0 && ! surveyTool.isExceptionalState()){ crafter.sendSystemMessage("@survey:gamble_no_action", (byte) 0); crafter.setPosture((byte) 0); surveyTool.setCurrentlySampling(false); @@ -408,9 +439,8 @@ public class SurveyService implements INetworkDispatch { } if (! surveyTool.isRecoveryMode()){ - - int exceptionalChance = new Random().nextInt(100); - if (exceptionalChance<7 && ! surveyTool.isExceptionalState()){ + int exceptionalChance = new Random().nextInt(100); // 7 was good + if (exceptionalChance<20 && ! surveyTool.isExceptionalState()){ crafter.sendSystemMessage("@survey:gnode_d", (byte) 0); surveyTool.setExceptionalState(true); @@ -441,6 +471,7 @@ public class SurveyService implements INetworkDispatch { surveyTool.setExceptionalState(false); core.suiService.closeSUIWindow(owner, 0); continueSampling(surveyTool); + return; } } } else { @@ -453,6 +484,7 @@ public class SurveyService implements INetworkDispatch { surveyTool.setExceptionalState(false); core.suiService.closeSUIWindow(owner, 0); continueSampling(surveyTool); + return; } } } @@ -473,7 +505,7 @@ public class SurveyService implements INetworkDispatch { } else { // sampling cost for recovery - surveyTool.setRecoveryMode(false); + //surveyTool.setRecoveryMode(false); samplingCost = 200; if (crafter.getAction()-samplingCost<0){ crafter.sendSystemMessage("@survey:gamble_no_action", (byte) 0); @@ -506,6 +538,8 @@ public class SurveyService implements INetworkDispatch { } else { crafter.sendSystemMessage("There are only trace amounts of " + sampleResource.getName() + " here. Find a higher concentration of the resource, and try sampling again.", (byte) 0); // "@survey:trace_amount:" + surveyTool.setCurrentlySampling(true); + surveyTool.setLastSampleTime(System.currentTimeMillis()); } } @@ -544,9 +578,15 @@ public class SurveyService implements INetworkDispatch { public SUICallback handleExceptionalInput(SWGObject crafter,SUIWindow suiWindow){ SUICallback callback = suiWindow.getCallbackByEventId(1); - if (callback!=null) - System.out.println("handleExceptionalInput " + callback.toString()); - core.suiService.closeSUIWindow(crafter, 0); +// if (callback!=null) +// System.out.println("handleExceptionalInput " + callback.toString()); +// if (callback.toString().equals("1")){ +// System.out.println("1"); +// PlayerObject player = (PlayerObject) crafter.getSlottedObject("ghost"); +// SurveyTool surveyTool = player.getLastUsedSurveyTool(); +// surveyTool.setExceptionalState(false); +// core.suiService.closeSUIWindow(crafter, 0); +// } return callback; } @@ -618,18 +658,16 @@ public class SurveyService implements INetworkDispatch { @SuppressWarnings("unchecked") @Override public void process(SWGObject owner, int eventType, Vector returnList) { - CreatureObject crafter = (CreatureObject)owner; - if (crafter!=null) { - if (outerSurveyTool!=null){ - int index = Integer.parseInt(returnList.get(0)); - if (index==0){ - outerSurveyTool.setSurveyRangeSetting((byte)0); - } - - } - } + ((CreatureObject)owner).sendSystemMessage("Rad confirmed", (byte) 0); } }); + window.addHandler(1, "", Trigger.TRIGGER_CANCEL, returnList, new SUICallback() { + @SuppressWarnings("unchecked") + @Override + public void process(SWGObject owner, int eventType, Vector returnList) { + ((CreatureObject)owner).sendSystemMessage("Rad declined", (byte) 0); + } + }); core.suiService.openSUIWindow(window); } diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index b4dca2c8..b0be29bc 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -82,7 +82,7 @@ public class CommandService implements INetworkDispatch { BaseSWGCommand command = getCommandByCRC(commandEnqueue.getCommandCRC()); if(command == null) { - //System.out.println("Unknown Command CRC: " + commandEnqueue.getCommandCRC()); + //System.out.println("Unknown Command CRC: " + Integer.toHexString(commandEnqueue.getCommandCRC())); return; } diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index ba493d84..fa2da302 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -152,6 +152,7 @@ public class ObjectService implements INetworkDispatch { } catch (SQLException e) { e.printStackTrace(); } + } public void loadBuildings() { diff --git a/src/services/resources/ResourceService.java b/src/services/resources/ResourceService.java index df92c130..1b598115 100644 --- a/src/services/resources/ResourceService.java +++ b/src/services/resources/ResourceService.java @@ -41,6 +41,7 @@ import protocol.swg.UpdateContainmentMessage; import main.NGECore; import engine.resources.common.CRC; import engine.resources.objects.SWGObject; +import engine.resources.scene.Planet; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import resources.objects.creature.CreatureObject; @@ -125,6 +126,10 @@ public class ResourceService implements INetworkDispatch { createCollections3(); } // } + + core.commandService.registerCommand("resourcecontainersplit"); + core.commandService.registerCommand("resourcecontainertransfer"); + core.commandService.registerCommand("factorycratesplit"); start(); } @@ -11290,8 +11295,44 @@ public class ResourceService implements INetworkDispatch { return resource; } - - + public GalacticResource grabResourceByFileName(String searchName){ + GalacticResource resource = null; + Vector allResources = core.resourceService.getAllSpawnedResources(); + for (GalacticResource res : allResources){ + if (res.getResourceRoot().getResourceFileName().equals(searchName)){ + resource = res; // resourceFileName= "meat_insect_mustafar" i.e. + } + } + return resource; + } + + public GalacticResource grabResourceByClass(String searchName,int planetId){ + GalacticResource resource = null; + Vector allResources = core.resourceService.getAllSpawnedResources(); + for (GalacticResource res : allResources){ + Vector spawnedPlanets = res.getAllSpawnedPlanetIds(); + if (spawnedPlanets.contains(planetId) && res.getResourceRoot().getResourceClass().equals(searchName)){ + resource = res; // resourceClass= "Insect Meat" i.e. + } + } + return resource; + } + + // ToDo: Improve + public GalacticResource grabMeatForCreature(CreatureObject corpse){ + GalacticResource resource = null; + int planetId = corpse.getPlanetId(); + String meatName = corpse.getStfName(); // placeholder + Vector allResources = core.resourceService.getAllSpawnedResources(); + for (GalacticResource res : allResources){ + Vector spawnedPlanets = res.getAllSpawnedPlanetIds(); + if (spawnedPlanets.contains(planetId) && res.getResourceRoot().getResourceClass().equals(meatName)){ + resource = res; + } + } + return resource; + } + // Utility method to quickly spawn resource containers into the inventory public ResourceContainerObject spawnSpecificResourceContainer(String spawnType, CreatureObject crafter,int stackCount){ ResourceContainerObject containerObject = null;