From 52c783a5ec751b4586d294456f6364d000891e73 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Mon, 25 Aug 2014 17:42:10 +0200 Subject: [PATCH] Fixed some corpses not despawning - For test purposes, NPC respawn has been activated now - Fixed double respawn issue --- scripts/commands/forage.py | 3 ++ scripts/commands/gmforcecommand.py | 22 ++++++++++- scripts/loot/lootPools/junk.py | 14 +++---- scripts/loot/lootPools/junk_organic.py | 10 +++++ scripts/mobiles/tatooine/tusken_raider.py | 20 ++++++++++ .../mobiles/tatooine/tusken_raider_soldier.py | 20 ++++++++++ scripts/mobiles/tatooine/tusken_zealot.py | 20 ++++++++++ scripts/radial/item/gcwbanner.py | 6 +-- .../tatooine/mos_eisley_police_officer.py | 1 + src/services/SimulationService.java | 33 ++++++++++++++++ src/services/ai/AIActor.java | 6 +-- src/services/ai/AIService.java | 18 +++++++++ src/services/ai/states/AIState.java | 5 ++- src/services/ai/states/DeathState.java | 2 +- src/services/ai/states/PatrolState.java | 13 +++++-- src/services/combat/CombatService.java | 38 +------------------ src/services/object/ObjectService.java | 25 ++++++------ 17 files changed, 187 insertions(+), 69 deletions(-) create mode 100644 scripts/loot/lootPools/junk_organic.py diff --git a/scripts/commands/forage.py b/scripts/commands/forage.py index 9fbf9c31..c752113c 100644 --- a/scripts/commands/forage.py +++ b/scripts/commands/forage.py @@ -9,6 +9,9 @@ def setup(): def run(core, actor, target, commandString): + actor.sendSystemMessage('Function suspended until working as intended'),0) + return + #if actor.getSkills('Foraging')==0: #actor.sendSystemMessage('@skl_use:sys_forage_noskill'),0) diff --git a/scripts/commands/gmforcecommand.py b/scripts/commands/gmforcecommand.py index d04fe80a..21e21a56 100644 --- a/scripts/commands/gmforcecommand.py +++ b/scripts/commands/gmforcecommand.py @@ -145,7 +145,14 @@ def run(core, actor, target, commandString): clipboard = toolkit.getSystemClipboard() clipboard.setContents(StringSelection(str), None) actor.sendSystemMessage('Patrolpoint copied to clipboard', 0) - + + elif command == 'jesus': + actor.setHealth(actor.getMaxHealth()) + actor.setAction(actor.getMaxAction()) + actor.setPosture(0) + actor.setSpeedMultiplierBase(1) + actor.setTurnRadius(1) + elif command == 'checkai': latargetID = long(actor.getIntendedTarget()) latarget = core.objectService.getObject(latargetID) @@ -189,7 +196,18 @@ def run(core, actor, target, commandString): latargetID = long(actor.getIntendedTarget()) latarget = core.objectService.getObject(latargetID) actor.sendSystemMessage('Optionsbitmask for unit ' + latarget.getCustomName() + ' is %s' % latarget.getOptionsBitmask(), 0) - + + elif command == 'isinquad': + latargetID = long(actor.getIntendedTarget()) + latarget = core.objectService.getObject(latargetID) + actor.sendSystemMessage('latarget %s' % latargetID, 0) + if latarget: + actor.sendSystemMessage('Is in quad %s' % latarget.isInQuadtree(), 0) + + elif command == 'killcorpse': + + core.aiService.explicitDestroy(actor) + elif command == 'spawninst': #String campTemplate = "object/building/poi/shared_gcw_rebel_clone_tent_small.iff"; // LOL why doesn't this spawn?!?!?! diff --git a/scripts/loot/lootPools/junk.py b/scripts/loot/lootPools/junk.py index cb0b44c6..d7f47490 100644 --- a/scripts/loot/lootPools/junk.py +++ b/scripts/loot/lootPools/junk.py @@ -1,15 +1,15 @@ def itemNames(): - templates=['damaged_datapad','red_wiring','worklight_generic','antenna','brain','eye','gland','heart','stomach','armor_repair_device'] #10 - templates=templates+['brain','chassis_blueprints','comlink','explosive_dud','hyperdrive_unit','id_chip','impulse_detector','laser_trap'] #8 + templates=['damaged_datapad','red_wiring','worklight_generic','armor_repair_device'] #4 + templates=templates+['chassis_blueprints','comlink','explosive_dud','hyperdrive_unit','id_chip','impulse_detector','laser_trap'] #7 templates=templates+['launcher_tube','ledger','magseal_detector','medical_console','medical_device','motor','power_output_analyzer','shield_module'] #8 templates=templates+['software_module','survival_gear','underpowered_survey_pad','unidentified_serum_vial','used_notebook','weak_droid_battery'] #6 return templates def itemChances(): - chances=[3.125,3.125,3.125,3.125,3.125,3.125,3.125,3.125] - chances=chances+[3.125,3.125,3.125,3.125,3.125,3.125,3.125,3.125] - chances=chances+[3.125,3.125,3.125,3.125,3.125,3.125,3.125,3.125] - chances=chances+[3.125,3.125,3.125,3.125,3.125,3.125,3.125,3.125] - return chances #32 \ No newline at end of file + chances=[4,4,4,4] + chances=chances+[4,4,4,4,4,4,4] + chances=chances+[4,4,4,4,4,4,4,4] + chances=chances+[4,4,4,4,4,4] + return chances \ No newline at end of file diff --git a/scripts/loot/lootPools/junk_organic.py b/scripts/loot/lootPools/junk_organic.py new file mode 100644 index 00000000..ee2e7073 --- /dev/null +++ b/scripts/loot/lootPools/junk_organic.py @@ -0,0 +1,10 @@ + +def itemNames(): + + templates=['antenna','brain','eye','gland','heart','stomach'] leg, Nerve Complex, organ missing + + return templates + +def itemChances(): + chances=[16.66,16.66,16.66,16.66,16.66,16.66] + return chances \ No newline at end of file diff --git a/scripts/mobiles/tatooine/tusken_raider.py b/scripts/mobiles/tatooine/tusken_raider.py index 3d400f25..2b6d1a3f 100644 --- a/scripts/mobiles/tatooine/tusken_raider.py +++ b/scripts/mobiles/tatooine/tusken_raider.py @@ -36,5 +36,25 @@ def addTemplate(core): mobileTemplate.setDefaultAttack('rangedShotrifle') mobileTemplate.setAttacks(attacks) + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + mobileTemplate.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['batons','random_loot_rifles'] + lootPoolChances_2 = [60,40] + lootGroupChance_2 = 20 + mobileTemplate.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['tusken_raider_clothing'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 10 + mobileTemplate.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['Colorcrystals'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 6 + mobileTemplate.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + core.spawnService.addMobileTemplate('tusken_raider', mobileTemplate) return \ No newline at end of file diff --git a/scripts/mobiles/tatooine/tusken_raider_soldier.py b/scripts/mobiles/tatooine/tusken_raider_soldier.py index 2fcf2dfe..fb81c3a2 100644 --- a/scripts/mobiles/tatooine/tusken_raider_soldier.py +++ b/scripts/mobiles/tatooine/tusken_raider_soldier.py @@ -36,5 +36,25 @@ def addTemplate(core): mobileTemplate.setDefaultAttack('rangedShotrifle') mobileTemplate.setAttacks(attacks) + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + mobileTemplate.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['batons','random_loot_rifles'] + lootPoolChances_2 = [60,40] + lootGroupChance_2 = 20 + mobileTemplate.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['tusken_raider_clothing'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 10 + mobileTemplate.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['Colorcrystals'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 6 + mobileTemplate.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + core.spawnService.addMobileTemplate('tusken_soldier', mobileTemplate) return \ No newline at end of file diff --git a/scripts/mobiles/tatooine/tusken_zealot.py b/scripts/mobiles/tatooine/tusken_zealot.py index 77b4fa82..1b049466 100644 --- a/scripts/mobiles/tatooine/tusken_zealot.py +++ b/scripts/mobiles/tatooine/tusken_zealot.py @@ -36,5 +36,25 @@ def addTemplate(core): mobileTemplate.setDefaultAttack('rangedShotrifle') mobileTemplate.setAttacks(attacks) + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + mobileTemplate.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['batons','random_loot_rifles'] + lootPoolChances_2 = [60,40] + lootGroupChance_2 = 20 + mobileTemplate.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['tusken_raider_clothing'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 10 + mobileTemplate.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['Colorcrystals'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 6 + mobileTemplate.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + core.spawnService.addMobileTemplate('tusken_zealot', mobileTemplate) return \ No newline at end of file diff --git a/scripts/radial/item/gcwbanner.py b/scripts/radial/item/gcwbanner.py index abcee8c7..330158af 100644 --- a/scripts/radial/item/gcwbanner.py +++ b/scripts/radial/item/gcwbanner.py @@ -25,9 +25,9 @@ def handleBanner(core, owner, bannerinventoryobject, option): return # check if banner object is not already spawned - #if bannerinventoryobject.getAttachment('BannerSpawned'): - #owner.sendSystemMessage('Banner already spawned' , 0) - #return + if bannerinventoryobject.getAttachment('BannerSpawned'): + owner.sendSystemMessage('Banner already spawned' , 0) + return # spawn banner object stcSvc = core.staticService diff --git a/scripts/static_spawns/tatooine/mos_eisley_police_officer.py b/scripts/static_spawns/tatooine/mos_eisley_police_officer.py index f2f5d7e2..66531504 100644 --- a/scripts/static_spawns/tatooine/mos_eisley_police_officer.py +++ b/scripts/static_spawns/tatooine/mos_eisley_police_officer.py @@ -25,6 +25,7 @@ def addPlanetSpawns(core, planet): patrolpoints = Vector() patrolpoints.add(Point3D(float(3531), float(4), float(-4803.1))) patrolpoints.add(Point3D(float(3529.7), float(4.8), float(-4813.3))) + patrolpoints.add(Point3D(float(3529.7), float(4.8), float(-4824.3))) patrolpoints.add(Point3D(float(3545.3), float(5), float(-4838.6))) patrolpoints.add(Point3D(float(3527.5), float(4.8), float(-4863.4))) patrolpoints.add(Point3D(float(3519.5), float(5), float(-4874.7))) diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 9b23cec5..8f4aa0e7 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -251,6 +251,9 @@ public class SimulationService implements INetworkDispatch { object.makeAware(obj); if(obj.getClient() != null) obj.makeAware(object); + +// if (object.getTemplate().contains("dressed_eisley_officer")) +// System.out.println("ME quadtree add!"); } } } @@ -496,6 +499,26 @@ public class SimulationService implements INetworkDispatch { Client observerClient = it.next(); if(observerClient.getParent() != null) { observerClient.getParent().makeUnaware(object); + + // Experimental until engine fixed + if (observerClient.getParent().getAwareObjects().contains(object)){ + + object.viewChildren(observerClient.getParent(), false, false, new Traverser() { + @Override + public void process(SWGObject object) { + if(object == null) + return; + if(object.getClient() != null) + object.makeUnaware(observerClient.getParent()); + observerClient.getParent().makeUnaware(object); + } + }); + if(!object.isInSnapshot()) + object.sendDestroy(observerClient); + object.removeObserver(observerClient.getParent()); + observerClient.getParent().getAwareObjects().remove(object); + } + // Experimental until engine fixed } } } @@ -528,6 +551,8 @@ public class SimulationService implements INetworkDispatch { } CreatureObject creature = (CreatureObject) client.getParent(); + if (creature.getPosture()==Posture.Dead || creature.getPosture()==Posture.Incapacitated) + return; CreatureObject object = creature; @@ -695,6 +720,8 @@ public class SimulationService implements INetworkDispatch { } CreatureObject object = (CreatureObject) client.getParent(); + if (object.getPosture()==Posture.Dead || object.getPosture()==Posture.Incapacitated) + return; if (core.mountService.isMounted(object)) { object.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount"), DisplayType.Broadcast); @@ -854,6 +881,12 @@ public class SimulationService implements INetworkDispatch { if(Float.isNaN(newPosition.x) || Float.isNaN(newPosition.y) || Float.isNaN(newPosition.z)) return; + + if (object instanceof CreatureObject){ + CreatureObject cre = (CreatureObject) object; + if (cre.getPosture()==Posture.Dead || cre.getPosture()==Posture.Incapacitated) + return; + } if(cell == null) { diff --git a/src/services/ai/AIActor.java b/src/services/ai/AIActor.java index ebda2782..7a6fbc6c 100644 --- a/src/services/ai/AIActor.java +++ b/src/services/ai/AIActor.java @@ -515,14 +515,14 @@ public class AIActor { damageMap.clear(); followObject = null; NGECore.getInstance().objectService.destroyObject(creature); - destroyActor(); + //destroyActor(); } catch (Exception e) { System.err.println("Exception3 in scheduleDespawn"); e.printStackTrace(); } } - //}, 2, TimeUnit.MINUTES); - }, 15, TimeUnit.SECONDS); + }, 2, TimeUnit.MINUTES); + //}, 30, TimeUnit.SECONDS); } public void destroyActor(){ diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java index 6371202b..94c6756b 100644 --- a/src/services/ai/AIService.java +++ b/src/services/ai/AIService.java @@ -52,6 +52,8 @@ import main.NGECore; public class AIService { + CreatureObject corpse = null; + @SuppressWarnings("unused") private Vector aiActors = new Vector(); private NGECore core; private TangibleObject checkerAI = null; @@ -328,6 +330,13 @@ public class AIService { }, 10, 2000, TimeUnit.MILLISECONDS); } + // Test method + public void explicitDestroy(CreatureObject actor){ + System.out.println("SEND DESTROY SENDING for " + corpse.getTemplate()); + corpse.sendDestroy(actor.getClient()); + System.out.println("SEND DESTROY SENT "); + } + public void logAI(String logMsg){ if (checkDeveloperIdentity()){ System.err.println("AI-LOG: " + logMsg); @@ -339,4 +348,13 @@ public class AIService { return true; return false; } + + public CreatureObject getCorpse() { + return corpse; + } + + public void setCorpse(CreatureObject corpse) { + System.out.println("SET CORPSE " + corpse.getTemplate()); + this.corpse = corpse; + } } diff --git a/src/services/ai/states/AIState.java b/src/services/ai/states/AIState.java index 021cdbb9..6663100a 100644 --- a/src/services/ai/states/AIState.java +++ b/src/services/ai/states/AIState.java @@ -945,8 +945,9 @@ public abstract class AIState { if (actor!=null) actor.destroyActor(); if (creature!=null){ - core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure - core.objectService.destroyObject(creature.getObjectID()); + // taken out due to double respawn, check invasions +// core.simulationService.remove(creature, creature.getWorldPosition().x, creature.getWorldPosition().z, true); // Make sure +// core.objectService.destroyObject(creature.getObjectID()); } return; // First Patrol point reached } diff --git a/src/services/ai/states/DeathState.java b/src/services/ai/states/DeathState.java index 26d33247..78a29a13 100644 --- a/src/services/ai/states/DeathState.java +++ b/src/services/ai/states/DeathState.java @@ -41,7 +41,7 @@ public class DeathState extends AIState { actor.getCreature().setAttachment("radial_filename", "npc/corpse"); //NGECore.getInstance().scriptService.callScript("scripts/radial/npc/corpse", "", "createRadial", NGECore.getInstance(), actor.getCreature().getKiller(), actor.getCreature(), new Vector()); actor.scheduleDespawn(); - + if (actor.getCreature().getKiller() instanceof CreatureObject){ CreatureObject killer = (CreatureObject)actor.getCreature().getKiller(); if (killer==null) diff --git a/src/services/ai/states/PatrolState.java b/src/services/ai/states/PatrolState.java index 72cb9b27..efb6ce44 100644 --- a/src/services/ai/states/PatrolState.java +++ b/src/services/ai/states/PatrolState.java @@ -23,6 +23,7 @@ package services.ai.states; import resources.objects.creature.CreatureObject; import services.ai.AIActor; +import services.ai.states.AIState.StateResult; import tools.DevLog; public class PatrolState extends AIState { @@ -47,8 +48,10 @@ public class PatrolState extends AIState { @Override public byte onExit(AIActor actor) { - DevLog.debugoutai(actor, "Charon", "AI PatrolState", "EXITING PATROL STATE!"); - actor.setLastPositionBeforeStateChange(actor.getCreature().getWorldPosition()); + DevLog.debugoutai(actor, "Charon", "AI PatrolState", "EXITING PATROL STATE!"); + CreatureObject creature = actor.getCreature(); + if(creature.getPosture() == 14) + actor.setLastPositionBeforeStateChange(actor.getCreature().getWorldPosition()); locked = true; return StateResult.FINISHED; } @@ -56,11 +59,15 @@ public class PatrolState extends AIState { @Override public byte move(AIActor actor) { DevLog.debugoutai(actor, "Charon", "AI PatrolState", "PATROL MOVE!"); + CreatureObject creature = actor.getCreature(); + if(creature.getPosture() == 14) + return StateResult.DEAD; + if (locked){ System.out.println("PatrolState locked!"); return StateResult.FINISHED; } - CreatureObject creature = actor.getCreature(); + if(creature.isInCombat()){ //System.out.println("PatrolState locking!"); locked = true; diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index f979170d..f251144f 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -213,24 +213,6 @@ public class CombatService implements INetworkDispatch { creature.removeDefender(defender); } - if(((CreatureObject) target).getPlayerObject() == null) - { - target.setKiller(attacker); - - scheduler.schedule(new Runnable() - { - @Override - public void run() - { - try { - core.objectService.destroyObject(target); - } catch (Exception e) { - e.printStackTrace(); - } - } - - }, 2, TimeUnit.MINUTES); - } } } else if(target instanceof TangibleObject) @@ -354,25 +336,7 @@ public class CombatService implements INetworkDispatch { defender.removeDefender(creature); creature.removeDefender(defender); } - - if(((CreatureObject) target).getPlayerObject() == null) - { - target.setKiller(attacker); - - scheduler.schedule(new Runnable() - { - @Override - public void run() - { - try { - core.objectService.destroyObject(target); - } catch (Exception e) { - e.printStackTrace(); - } - } - - }, 2, TimeUnit.MINUTES); - } + } } else if(target instanceof TangibleObject) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index b608fbb3..02a25339 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -585,6 +585,7 @@ public class ObjectService implements INetworkDispatch { } public void destroyObject(SWGObject object) { + if (object == null) { return; } @@ -604,19 +605,21 @@ public class ObjectService implements INetworkDispatch { @Override public void run() { -// try { -// // Commented for now until found where the respawn is always set to 60 for any NPC -// CreatureObject newObject = NGECore.getInstance().spawnService.spawnCreature(Template, 0, planet.getName(), cellId, spawnPosition.x, spawnPosition.y, spawnPosition.z, orientation.w, orientation.x, orientation.y, orientation.z, level); -// AIActor newAIActor = (AIActor)newObject.getAttachment("AI"); -// newAIActor.cloneActor(((AIActor) object.getAttachment("AI"))); -// //object.setAttachment("AI", null); -// } catch (Exception e) { -// e.printStackTrace(); -// } + try { + + // Commented for now until found where the respawn is always set to 60 for any NPC + CreatureObject newObject = NGECore.getInstance().spawnService.spawnCreature(Template, 0, planet.getName(), cellId, spawnPosition.x, spawnPosition.y, spawnPosition.z, orientation.w, orientation.x, orientation.y, orientation.z, level); + AIActor newAIActor = (AIActor)newObject.getAttachment("AI"); + newAIActor.cloneActor(((AIActor) object.getAttachment("AI"))); + ((AIActor) object.getAttachment("AI")).destroyActor(); + //object.setAttachment("AI", null); + } catch (Exception e) { + e.printStackTrace(); + } } - //}, ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime(), TimeUnit.SECONDS); - }, 20, TimeUnit.SECONDS); + }, ((AIActor) object.getAttachment("AI")).getMobileTemplate().getRespawnTime(), TimeUnit.SECONDS); + //}, 30, TimeUnit.SECONDS); } String filePath = "scripts/" + object.getTemplate().split("shared_" , 2)[0].replace("shared_", "") + object.getTemplate().split("shared_" , 2)[1].replace(".iff", "") + ".py";