diff --git a/scripts/commands/forage.py b/scripts/commands/forage.py index 3b7c2d66..8d47c825 100644 --- a/scripts/commands/forage.py +++ b/scripts/commands/forage.py @@ -1,12 +1,75 @@ import sys +import engine.resources.scene.Point3D +import resources.common.Forager +import time + def setup(): return def run(core, actor, target, commandString): - actor.sendSystemMessage('@skl_use:sys_forage_start', 1) + #if actor.getSkills('Foraging')==0: + #actor.sendSystemMessage('@skl_use:sys_forage_noskill'),0) + + #if actor.isForaging()==1: + #actor.sendSystemMessage('@skl_use:sys_forage_already',0) + #return + + if actor.getCombatFlag()!=0: + actor.sendSystemMessage('@skl_use:sys_forage_combatfail',0) + return + + if actor.getPosture()!=0: + actor.sendSystemMessage('@skl_use:sys_forage_cant',0) + return + + if core.terrainService.isWater(actor.getPlanet(), actor.getPosition().x, actor.getPosition().z): + actor.sendSystemMessage('You cannot forage while in water.',0) + return + + if actor.getContainer() != None: + actor.sendSystemMessage('@skl_use:sys_forage_inside',0) + return + + if actor.getAction() < 200: + actor.sendSystemMessage('@skl_use:sys_forage_attrib',0) + return + + somepoint = engine.resources.scene.Point3D(0,0,0) + if actor.getAttachment('PostForagePosition')==None: + actor.setAttachment('PostForagePosition', somepoint) + + oldposition = actor.getAttachment('PostForagePosition') + if actor.getPosition().getDistance2D(oldposition)<5: + + System.out.println("actor.getPosition().getDistance2D(oldposition) " + actor.getPosition().getDistance2D(oldposition)); + actor.sendSystemMessage("@skl_use:sys_forage_empty", 0); + return + + + actor.sendSystemMessage('@skl_use:sys_forage_start', 0) + + actor.setAttachment("PreForagePosition", actor.getPosition()) actor.setCurrentAnimation('forage') + time.sleep(1) # does NOT stall other python scripts, tested + # Each command might be its own thread + + actor.setAttachment("PostForagePosition", actor.getPosition()) + + if actor.getCombatFlag()!=0: + actor.sendSystemMessage('@skl_use:sys_forage_combatfail',0) + return + + oldposition = actor.getAttachment("PreForagePosition") + if actor.getPosition().getDistance2D(oldposition)>2: + actor.sendSystemMessage('@skl_use:sys_forage_movefail',0) + return + + + + forager = resources.common.Forager() + forager.handleForageResults(actor) return \ No newline at end of file diff --git a/scripts/commands/suspendtest.py b/scripts/commands/suspendtest.py new file mode 100644 index 00000000..61d95fd7 --- /dev/null +++ b/scripts/commands/suspendtest.py @@ -0,0 +1,30 @@ +import sys +import resources.common.Forager +import time + + +def setup(): + return + +def run(core, actor, target, commandString): + actor.sendSystemMessage('Test1', 1) + time.sleep(1) + actor.sendSystemMessage('Test2', 1) + time.sleep(1) + actor.sendSystemMessage('Test3', 1) + time.sleep(1) + actor.sendSystemMessage('Test4', 1) + time.sleep(1) + actor.sendSystemMessage('Test5', 1) + time.sleep(1) + actor.sendSystemMessage('Test6', 1) + time.sleep(1) + actor.sendSystemMessage('Test7', 1) + time.sleep(1) + actor.sendSystemMessage('Test8', 1) + time.sleep(1) + + + + return + \ No newline at end of file diff --git a/scripts/mobiles/forage/worm.py b/scripts/mobiles/forage/worm.py new file mode 100644 index 00000000..605b5a28 --- /dev/null +++ b/scripts/mobiles/forage/worm.py @@ -0,0 +1,30 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('forage_worm') + mobileTemplate.setLevel(1) + mobileTemplate.setDifficulty(1) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(6) + + templates = Vector() + templates.add('object/mobile/shared_col_forage_aggravated_worm.iff') + templates.add('object/mobile/shared_col_forage_angry_worm.iff') + templates.add('object/mobile/shared_col_forage_brutal_worm.iff') + templates.add('object/mobile/shared_col_forage_carnivorous_worm.iff') + templates.add('object/mobile/shared_col_forage_ferocious_worm.iff') + templates.add('object/mobile/shared_col_forage_fierce_worm.iff') + templates.add('object/mobile/shared_col_forage_hungry_worm.iff') + templates.add('object/mobile/shared_col_forage_oozing_worm.iff') + templates.add('object/mobile/shared_col_forage_savage_worm.iff') + templates.add('object/mobile/shared_col_forage_territorial_worm.iff') + mobileTemplate.setTemplates(templates) + + core.spawnService.addMobileTemplate('forage_worm', mobileTemplate) + \ No newline at end of file diff --git a/src/resources/common/Forager.java b/src/resources/common/Forager.java new file mode 100644 index 00000000..8a4f49fc --- /dev/null +++ b/src/resources/common/Forager.java @@ -0,0 +1,260 @@ +/******************************************************************************* + * Copyright (c) 2013 + * + * This File is part of NGECore2. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + * + * Using NGEngine to work with NGECore2 is making a combined work based on NGEngine. + * Therefore all terms and conditions of the GNU Lesser General Public License cover the combination. + ******************************************************************************/ +package resources.common; + +import java.util.Random; +import engine.resources.objects.SWGObject; +import engine.resources.scene.Point3D; +import main.NGECore; +import resources.objects.creature.CreatureObject; +import resources.objects.tangible.TangibleObject; + +/** + * @author Charon + */ + +public class Forager { + + public static final int LYASE_ENZYME = 0; + public static final int RARE_COMPONENT = 1; + public static final int INSECT_BAIT = 2; + public static final int GRUB_BAIT = 3; + public static final int WORM_BAIT = 4; + public static final int MYSTERIOUS_DATA_DISC = 5; + // consider foraged food food/foraged + + + // tangible/item/treasure_map/shared_relic_buff_s01.iff + + public Forager(){ + + } + + public boolean handleForageResults(CreatureObject forager){ + // determine foraged object + SWGObject foragerInventory = forager.getSlottedObject("inventory"); + + + // you can use Kommerken Steak food which increases your + // foraging chance by 12% and gives you a + // 5% bonus chance of finding a treasure map. + + int randomForageRoll = new Random().nextInt(100); + int randomForageObjectRoll = new Random().nextInt(100); + int remainder = 0; + int forageResultChance = 50; + int kommerkenBonus = 0; + + int[] forageChances = new int[]{10,10,25,25,25,5}; + int[] forageChances2 = new int[]{12,10,21,23,24,10}; // Kommerken Steak + int[] forageChances3 = new int[]{20,9,22,22,22,5}; // if you got the pig + + + int chosenObject = 0; + +// if (forager.hasChuckedIn(KommerkenSteak)){ +// kommerkenBonus = 12; +// forageChances = forageChances2; +// } + +// if (forager.gotThePig(pig)){ +// forageChances = forageChances3; +//} + forager.sendSystemMessage("randomForageRoll " + randomForageRoll,(byte) 0); + if (randomForageRoll=80){ + chosenObject = 6; + forager.sendSystemMessage("@skl_use:sys_forage_noroom",(byte) 0); + } + + forager.sendSystemMessage("chosenObject " + chosenObject,(byte) 0); + switch (chosenObject) { + + case LYASE_ENZYME: String template = "object/tangible/loot/beast/shared_enzyme_2.iff"; + TangibleObject foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + // determine color here + foragedObject.setCustomizationVariable("/private/index_color_1", (byte) new Random().nextInt(10)); // edb_vial.pal + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + case RARE_COMPONENT: template = "object/tangible/loot/beast/shared_enzyme_1.iff"; // for now, must find temp + foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + case INSECT_BAIT: template = "object/tangible/fishing/bait/shared_bait_insect.iff"; + foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + case GRUB_BAIT: template = "object/tangible/fishing/bait/shared_bait_grub.iff"; + foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + case WORM_BAIT: template = "object/tangible/fishing/bait/shared_bait_worm.iff"; + foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + case MYSTERIOUS_DATA_DISC: template = "object/tangible/loot/generic_usable/shared_datadisk_generic.iff"; + foragedObject = (TangibleObject) NGECore.getInstance().objectService.createObject(template, forager.getPlanet()); + foragedObject.setCustomName(getLevelDependentMapName(forager.getLevel())); + foragedObject.setAttachment("MapLevel", forager.getLevel()); + foragerInventory.add(foragedObject); + forager.sendSystemMessage("",(byte) 0); + break; + + default: break; + + } + + if (chosenObject<6) + forager.sendSystemMessage("@skl_use:sys_forage_success",(byte) 0); + + // spawn adversaries + int adversaryRoll = new Random().nextInt(100); + // A new buff is imaginable that would decrease the chance of running into adversaries here, just an idea + + if (chosenObject>6) + adversaryRoll=999; + + if (adversaryRoll<100) { + int adversaryTypeRoll = new Random().nextInt(100); + if (adversaryTypeRoll<100){ + // wormie + spawnWormie(forager); + } else { + // goon + spawnGoon(forager); + } + } + + } else { + forager.sendSystemMessage("@skl_use:sys_forage_fail",(byte) 0); + + } + + return true; + } + + private String getLevelDependentMapName(int level){ + if (level>=1 && level<=10) + return "Mysterious Data Disk (Adventurer's Treasure)"; + if (level>=11 && level<=20) + return "Mysterious Data Disk (Villager's Hidden Savings)"; + if (level>=21 && level<=30) + return "A map to a Trader's Hidden Treasure"; + if (level>=31 && level<=40) + return "A map to a Bounty Hunter's Hidden Stash"; + if (level>=41 && level<=50) + return "A droid's data disk with map coordinates"; + if (level>=51 && level<=60) + return "A map to a Jedi Knight's body"; + if (level>=61 && level<=70) + return "A map to Jedi Artifacts"; + if (level>=71 && level<=80) + return "A map to a cursed item"; + if (level>=81 && level<=90) + return "Mysterious Data Disk (Mysterious Container) "; + return ""; + } + + + + + public void spawnWormie(CreatureObject forager){ + int level = forager.getLevel(); + String name = ""; + Point3D wormiePosition = SpawnPoint.getRandomPosition(forager.getPosition(), 1, 6, forager.getPlanetId()); + CreatureObject wormie = NGECore.getInstance().spawnService.spawnCreature("forage_worm", forager.getPlanet().getName(), 0L, wormiePosition.x, wormiePosition.y, wormiePosition.z, (short)level); + + switch (wormie.getTemplate()) { + + case "object/mobile/shared_col_forage_aggravated_worm.iff": + name = "An Aggravated Worm"; + break; + + case "object/mobile/shared_col_forage_angry_worm.iff": + name = "An Angry Worm"; + break; + + case "object/mobile/shared_col_forage_brutal_worm.iff": + name = "A Brutal Worm"; + break; + + case "object/mobile/shared_col_forage_carnivorous_worm.iff": + name = "A Carnivorous Worm"; + break; + + case "object/mobile/shared_col_forage_ferocious_worm.iff": + name = "A Ferocious Worm"; + break; + + case "object/mobile/shared_col_forage_fierce_worm.iff": + name = "A Fierce Worm"; + break; + + case "object/mobile/shared_col_forage_hungry_worm.iff": + name = "A Hungry Worm"; + break; + + case "object/mobile/shared_col_forage_oozing_worm.iff": + name = "An Oozing Worm"; + break; + + case "object/mobile/shared_col_forage_savage_worm.iff": + name = "A Savage Worm"; + break; + + case "object/mobile/shared_col_forage_territorial_worm.iff": + name = "A Territorial Worm"; + break; + } + wormie.setCustomName(name); + wormie.setCustomName2(name); + wormie.setLevel(forager.getLevel()); + } + + public void spawnGoon(CreatureObject forager){ + int level = forager.getLevel(); + String name = ""; + Point3D wormiePosition = SpawnPoint.getRandomPosition(forager.getPosition(), 1, 6, forager.getPlanetId()); + CreatureObject goon = NGECore.getInstance().spawnService.spawnCreature("forage_goon", forager.getPlanet().getName(), 0L, wormiePosition.x, wormiePosition.y, wormiePosition.z, (short)level); + + } + +}