diff --git a/options.cfg b/options.cfg index cb743c88..9a9489b6 100644 --- a/options.cfg +++ b/options.cfg @@ -1,3 +1,3 @@ LOAD.SNAPSHOT_OBJECTS=0 LOAD.BUILDOUT_OBJECTS=0 -LOAD.RESOURCE.SYSTEM=1 \ No newline at end of file +LOAD.RESOURCE.SYSTEM=0 \ No newline at end of file diff --git a/scripts/lootPools/colorcrystals.py b/scripts/lootPools/colorcrystals.py index e69de29b..f5e4e85a 100644 --- a/scripts/lootPools/colorcrystals.py +++ b/scripts/lootPools/colorcrystals.py @@ -0,0 +1,9 @@ + + +def itemTemplates(): + + templates=['object/tangible/loot/npc_loot/shared_generic_crystal.iff'] + return templates + +def itemChances(): + return [70] \ No newline at end of file diff --git a/scripts/lootPools/junk.py b/scripts/lootPools/junk.py index 3a139e37..65deb632 100644 --- a/scripts/lootPools/junk.py +++ b/scripts/lootPools/junk.py @@ -1,8 +1,8 @@ def itemTemplates(): - templates=['1','2','3'] + templates=['object/tangible/loot/misc/shared_damaged_datapad.iff','object/tangible/loot/npc_loot/shared_red_wiring_generic.iff','object/tangible/loot/npc_loot/shared_worklight_generic.iff'] return templates def itemChances(): - return [1,2,3] \ No newline at end of file + return [70,50,40] \ No newline at end of file diff --git a/scripts/lootPools/rareloot.py b/scripts/lootPools/rareloot.py index e69de29b..19ffe37f 100644 --- a/scripts/lootPools/rareloot.py +++ b/scripts/lootPools/rareloot.py @@ -0,0 +1,9 @@ + + +def itemTemplates(): + + templates=['object/tangible/item/shared_rare_loot_chest_3.iff'] + return templates + +def itemChances(): + return [1] \ No newline at end of file diff --git a/scripts/lootPools/rifles.py b/scripts/lootPools/rifles.py index e69de29b..c3402805 100644 --- a/scripts/lootPools/rifles.py +++ b/scripts/lootPools/rifles.py @@ -0,0 +1,9 @@ + + +def itemTemplates(): + + templates=['object/weapon/ranged/rifle/shared_rifle_cdef.iff'] + return templates + +def itemChances(): + return [70] \ No newline at end of file diff --git a/scripts/object/mobile/tusken_raider.py b/scripts/object/mobile/tusken_raider.py index 3a133a38..d4aa322f 100644 --- a/scripts/object/mobile/tusken_raider.py +++ b/scripts/object/mobile/tusken_raider.py @@ -1,24 +1,20 @@ import sys -from java.util import TreeSet -from java.util import TreeMap def setup(core, object): - lootSpecification = TreeSet() - #lootSpecification = [[['Junk',90],['Rifles',70],['ParentProbability',60]],[['Colorcrystal',100],['ParentProbability',50]]] - #object.setLootSpecification(lootSpecification) - lootPoolNames_1 = ['Junk','Rifles'] lootPoolChances_1 = [90,70] lootGroupChance_1 = 80 - #core.lootService.saveLootData(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) - lootPoolNames2 = ['Colorcrystal'] - lootPoolChances2 = [50] - lootGroupChance2 = 60 - #core.lootService.saveLootData(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + lootPoolNames_2 = ['Colorcrystals'] + lootPoolChances_2 = [50] + lootGroupChance_2 = 60 object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) - #core.lootService.test3(allLootPoolNames) + lootPoolNames_3 = ['Rareloot'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 1 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + return \ No newline at end of file diff --git a/src/resources/objects/loot/LootDrop.java b/src/resources/objects/loot/LootDrop.java index 08e01fbf..371c1727 100644 --- a/src/resources/objects/loot/LootDrop.java +++ b/src/resources/objects/loot/LootDrop.java @@ -27,6 +27,7 @@ import java.util.List; public class LootDrop { private List elements = new ArrayList(); + private String droppedItemTemplate; public LootDrop(){ @@ -39,4 +40,12 @@ public class LootDrop { public List getElements(){ return elements; } + + public String getDroppedItemTemplate() { + return droppedItemTemplate; + } + + public void setDroppedItemTemplate(String droppedItemTemplate) { + this.droppedItemTemplate = droppedItemTemplate; + } } diff --git a/src/resources/objects/loot/LootGroup.java b/src/resources/objects/loot/LootGroup.java index efedc799..e349eaac 100644 --- a/src/resources/objects/loot/LootGroup.java +++ b/src/resources/objects/loot/LootGroup.java @@ -21,10 +21,13 @@ ******************************************************************************/ package resources.objects.loot; +import com.sleepycat.persist.model.Persistent; + /** * @author Charon */ +@Persistent(version=0) public class LootGroup { private String[] lootPoolNames; @@ -35,7 +38,7 @@ public class LootGroup { } - public LootGroup(String[] lootPoolName, int[] lootPoolChance, int lootGroupChance){ + public LootGroup(String[] lootPoolNames, int[] lootPoolChances, int lootGroupChance){ this.lootPoolNames = lootPoolNames; this.lootPoolChances = lootPoolChances; this.lootGroupChance = lootGroupChance; diff --git a/src/resources/objects/loot/LootRollSession.java b/src/resources/objects/loot/LootRollSession.java index d2416102..5d1937b6 100644 --- a/src/resources/objects/loot/LootRollSession.java +++ b/src/resources/objects/loot/LootRollSession.java @@ -21,13 +21,54 @@ ******************************************************************************/ package resources.objects.loot; +import java.util.ArrayList; +import java.util.List; + +import main.NGECore; +import resources.objects.creature.CreatureObject; +import resources.objects.group.GroupObject; + /** * @author Charon */ public class LootRollSession { - public LootRollSession(){ - + private String SessionID; // leaderName-SystemTime + private GroupObject playerGroup; + private List droppedItemTemplates; + + public LootRollSession(){ + } + + public LootRollSession(CreatureObject requester){ + long requesterGroupId = requester.getGroupId(); + if (requesterGroupId>0){ + this.playerGroup = (GroupObject) NGECore.getInstance().objectService.getObject(requesterGroupId); + this.SessionID = playerGroup.getGroupLeader().getCustomName()+"-"+System.currentTimeMillis(); + } else { + this.SessionID = requester.getCustomName()+"-"+System.currentTimeMillis(); + } + droppedItemTemplates = new ArrayList(); + } + + public List getDroppedItemTemplates() { + return droppedItemTemplates; + } + + public void addDroppedItemTemplate(String droppedItemTemplate) { + this.droppedItemTemplates.add(droppedItemTemplate); + } + + public String getSessionID() { + return SessionID; + } + + public void setSessionID(String sessionID) { + SessionID = sessionID; + } + + public void generateSessionID(String sessionID) { + SessionID = sessionID; } } diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index be7d869e..7ac2c6ea 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -457,8 +457,9 @@ public class TangibleObject extends SWGObject { return lootGroups; } - public void addToLootGroups(String[] lootPoolName, int[] lootPoolChance, int lootGroupChance) { - LootGroup lootGroup = new LootGroup(lootPoolName, lootPoolChance, lootGroupChance); + public void addToLootGroups(String[] lootPoolNames, int[] lootPoolChances, int lootGroupChance) { + System.out.println("lootPoolNames[0] " + lootPoolNames[0]); + LootGroup lootGroup = new LootGroup(lootPoolNames, lootPoolChances, lootGroupChance); this.lootGroups.add(lootGroup); } diff --git a/src/services/DevService.java b/src/services/DevService.java index 306958f1..ca387de1 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -997,7 +997,9 @@ public class DevService implements INetworkDispatch { break; case 111: - core.staticService.spawnObject("object/mobile/shared_tusken_raider.iff", "tatooine", 0L, 3522F, 4F, -4801F, 0.70F, 0.71F); + SWGObject spawned = core.staticService.spawnObject("object/mobile/shared_tusken_raider.iff", "tatooine", 0L, 3522F, 4F, -4801F, 0.70F, 0.71F); + + core.lootService.handleLootRequest(player,(TangibleObject)spawned); break; } } diff --git a/src/services/LootService.java b/src/services/LootService.java index 04d44feb..7ad8fdb8 100644 --- a/src/services/LootService.java +++ b/src/services/LootService.java @@ -31,12 +31,14 @@ import java.util.Map.Entry; import java.util.Random; import java.util.TreeMap; import java.util.TreeSet; +import java.util.Vector; import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import resources.objects.loot.LootDrop; import resources.objects.loot.LootGroup; import resources.objects.loot.LootPool; +import resources.objects.loot.LootRollSession; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.objects.tool.SurveyTool; @@ -70,6 +72,7 @@ public class LootService implements INetworkDispatch { public void handleLootRequest(CreatureObject requester, TangibleObject lootedObject) { + LootRollSession lootRollSession = new LootRollSession(requester); String lootedObjectType = "Tangible"; if (lootedObject instanceof CreatureObject) lootedObjectType = "Creature"; @@ -80,9 +83,12 @@ public class LootService implements INetworkDispatch { if (lootedObjectType.equals("Creature")){ CreatureObject lootedCreature = (CreatureObject) lootedObject; int creatureCL = lootedCreature.getLevel(); + creatureCL = 90; int minimalCredits = 40 * creatureCL; // Predetermined factor of 40 per CL int spanOfCredits = 15 * creatureCL; // Predetermined factor of 15 per CL + System.out.println("spanOfCredits " + spanOfCredits); lootedCredits = minimalCredits + new Random().nextInt(spanOfCredits); + requester.sendSystemMessage("You looted " + lootedCredits + " credits.", (byte)1); } if (lootedObjectType.equals("Tangible")){ @@ -93,11 +99,9 @@ public class LootService implements INetworkDispatch { CreatureObject lootedCreature = (CreatureObject) lootedObject; - List lootDrops = new ArrayList(); - List lootElements = new ArrayList(); - //TreeSet> lootSpec = lootedObject.getLootSpecification(); List lootGroups = lootedCreature.getLootGroups(); + System.out.println("lootGroups size " + lootGroups.size()); Iterator iterator = lootGroups.iterator(); while (iterator.hasNext()){ @@ -105,75 +109,72 @@ public class LootService implements INetworkDispatch { int groupChance = lootGroup.getLootGroupChance(); int lootGroupRoll = new Random().nextInt(100); if (lootGroupRoll <= groupChance){ - handleLootGroup(lootGroup); //this lootGroup will drop something + System.out.println("this lootGroup will drop something"); + handleLootGroup(lootGroup,lootRollSession); //this lootGroup will drop something } } + + for (String s : lootRollSession.getDroppedItemTemplates()){ + System.out.println("lootRollSession template: " + s); + } + // ********** Phase 1 complete, loot items determined ********** + // stored in the lootSession // Distribute the loot drops according to group loot rules // For now just spawn items into requester's inventory - for (LootDrop dropElem : lootDrops){ - PlayerObject requesterObj = (PlayerObject) requester.getSlottedObject("ghost"); - SWGObject requesterInventory = requesterObj.getSlottedObject("inventory"); - List elementList = dropElem.getElements(); - for (String template : elementList){ - TangibleObject droppedItem = (TangibleObject) core.objectService.createObject(template, requester.getPlanet()); - requesterInventory.add(droppedItem); - } - } - - // ToDo: Group loot settings etc. + SWGObject requesterInventory = requester.getSlottedObject("inventory"); + System.out.println("requesterInventory " + requesterInventory); + for (String template : lootRollSession.getDroppedItemTemplates()){ + TangibleObject droppedItem = (TangibleObject) core.objectService.createObject(template, requester.getPlanet()); + System.out.println("droppedItem " + droppedItem); + requesterInventory.add(droppedItem); + } + + // ToDo: Group loot settings etc. actual loot chance was lootgroupchance*lootchance } - private List handleLootGroup(LootGroup lootGroup){ - List lootElements = new ArrayList(); + private void handleLootGroup(LootGroup lootGroup,LootRollSession lootRollSession){ + int[] lootPoolChances = lootGroup.getLootPoolChances(); String[] lootPoolNames = lootGroup.getLootPoolNames(); + if (lootPoolChances==null || lootPoolNames==null){ + System.err.println("Lootpools are null!"); + return; + } + if (lootPoolChances.length==0 || lootPoolNames.length==0){ + System.err.println("No Lootpools in Lootgroup!"); + return; + } for(int i=0;i handleLootPool(String poolName){ - List lootDropList = new ArrayList(); - LootDrop lootDrop = new LootDrop(); - // Fetch the loot pool data from the poolName.py script - - String path = "scripts/lootPools/"+poolName; // + ".py"; - //Vector quantityList = (Vector)core.scriptService.fetchStringVector(path,"resourceQuantities"); - -// for (String s : quantityList){ -// System.out.println("OOO: " + s); -// } - - //LootPool lootPool = loadfrompyreturn(); - - return lootDropList; - } + private void handleLootPool(String poolName,LootRollSession lootRollSession){ - public void saveLootData(String[] lootPoolName, int[] lootPoolChance, int lootGroupChance){ - for (String ui : lootPoolName){ - System.out.println(ui); - } - for (int ui : lootPoolChance){ - System.out.println(ui); + // Fetch the loot pool data from the poolName.py script + String path = "scripts/lootPools/"+poolName.toLowerCase(); + Vector itemTemplates = (Vector)core.scriptService.fetchStringVector(path,"itemTemplates"); + + for (String s : itemTemplates){ + System.out.println("template: " + s); } - System.out.println(lootGroupChance); + Vector itemChances = (Vector)core.scriptService.fetchIntegerVector(path,"itemChances"); + // Now here maybe all items in pool have an equal chance to spawn + // or they have percentages assigned to them as well + + int randomItemFromPool = new Random().nextInt(100); + int itemIndex = (int)Math.floor(randomItemFromPool/100*itemTemplates.size()); // 5 Elements,rnd is 83 -> 0.83*5= + + lootRollSession.addDroppedItemTemplate(itemTemplates.get(itemIndex)); } -} - -////[20:35] <@_Light> your actual loot chance was lootgroupchance*lootchance -// long leaderGroupId = requester.getGroupId(); -// GroupObject group = (GroupObject) core.objectService.getObject(leaderGroupId); -// if(group.getMemberList().size() == 1) { -// // looter is alone -// } +} diff --git a/src/services/ScriptService.java b/src/services/ScriptService.java index 9ea1c999..ba1ea259 100644 --- a/src/services/ScriptService.java +++ b/src/services/ScriptService.java @@ -21,6 +21,9 @@ ******************************************************************************/ package services; +import java.util.Iterator; +import java.util.Vector; + import org.python.core.Py; import org.python.core.PyObject; import org.python.util.PythonInterpreter; @@ -107,4 +110,24 @@ public class ScriptService { return func; } + public Vector fetchStringVector(String path, String method) { + Vector vector = new Vector(); + PyObject result = core.scriptService.callScript(path, "", method); + Iterable comp = (Iterable)result.asIterable(); + for (Iterator temp = comp.iterator(); temp.hasNext();){ + vector.add(temp.next().asString()); + } + return vector; + } + + public Vector fetchIntegerVector(String path, String method) { + Vector vector = new Vector(); + PyObject result = core.scriptService.callScript(path, "", method); + Iterable comp = (Iterable)result.asIterable(); + for (Iterator temp = comp.iterator(); temp.hasNext();){ + vector.add(temp.next().asInt()); + } + return vector; + } + }