From e111724115b8f61837cd198575d639c7a0640fb1 Mon Sep 17 00:00:00 2001 From: tacef Date: Thu, 1 May 2014 18:25:39 +0200 Subject: [PATCH 01/27] Added NPC scripts( No conversations yet) --- scripts/object/mobile/dressed_gendra.py | 8 +++++++- .../object/mobile/dressed_mayor_mikdanyell_guhrantt.py | 8 +++++++- scripts/object/mobile/dressed_tatooine_opening_byxle.py | 8 +++++++- scripts/object/mobile/dressed_tatooine_opening_dunir.py | 8 +++++++- scripts/object/mobile/dressed_tatooine_opening_niko.py | 8 +++++++- scripts/object/mobile/dressed_tatooine_opening_reimos.py | 8 +++++++- scripts/object/mobile/dressed_tatooine_opening_toggi.py | 8 +++++++- scripts/object/mobile/space_privateer_tier1_tatooine.py | 7 ++++++- scripts/object/mobile/space_privateer_tier2_shamdon.py | 7 ++++++- 9 files changed, 61 insertions(+), 9 deletions(-) diff --git a/scripts/object/mobile/dressed_gendra.py b/scripts/object/mobile/dressed_gendra.py index ccad8904..bf2970d3 100644 --- a/scripts/object/mobile/dressed_gendra.py +++ b/scripts/object/mobile/dressed_gendra.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('newbie_gendra') + return diff --git a/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py b/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py index ccad8904..69749f16 100644 --- a/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py +++ b/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('mos_eisley_mayor') + return diff --git a/scripts/object/mobile/dressed_tatooine_opening_byxle.py b/scripts/object/mobile/dressed_tatooine_opening_byxle.py index ccad8904..5311a1f4 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_byxle.py +++ b/scripts/object/mobile/dressed_tatooine_opening_byxle.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('tatooine_opening_byxle') + return diff --git a/scripts/object/mobile/dressed_tatooine_opening_dunir.py b/scripts/object/mobile/dressed_tatooine_opening_dunir.py index ccad8904..4e7950a2 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_dunir.py +++ b/scripts/object/mobile/dressed_tatooine_opening_dunir.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('tatooine_opening_dunir') + return diff --git a/scripts/object/mobile/dressed_tatooine_opening_niko.py b/scripts/object/mobile/dressed_tatooine_opening_niko.py index ccad8904..7d81abd8 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_niko.py +++ b/scripts/object/mobile/dressed_tatooine_opening_niko.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('tatooine_opening_niko') + return diff --git a/scripts/object/mobile/dressed_tatooine_opening_reimos.py b/scripts/object/mobile/dressed_tatooine_opening_reimos.py index ccad8904..337bb4ad 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_reimos.py +++ b/scripts/object/mobile/dressed_tatooine_opening_reimos.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('tatooine_opening_reimos') + return diff --git a/scripts/object/mobile/dressed_tatooine_opening_toggi.py b/scripts/object/mobile/dressed_tatooine_opening_toggi.py index ccad8904..20f5a1c1 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_toggi.py +++ b/scripts/object/mobile/dressed_tatooine_opening_toggi.py @@ -1,4 +1,10 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setStfFilename('mob/creature_names') + object.setStfName('tatooine_opening_toggi') + return diff --git a/scripts/object/mobile/space_privateer_tier1_tatooine.py b/scripts/object/mobile/space_privateer_tier1_tatooine.py index ccad8904..b0f81354 100644 --- a/scripts/object/mobile/space_privateer_tier1_tatooine.py +++ b/scripts/object/mobile/space_privateer_tier1_tatooine.py @@ -1,4 +1,9 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setCustomName('Dravis') + return diff --git a/scripts/object/mobile/space_privateer_tier2_shamdon.py b/scripts/object/mobile/space_privateer_tier2_shamdon.py index ccad8904..f30504b0 100644 --- a/scripts/object/mobile/space_privateer_tier2_shamdon.py +++ b/scripts/object/mobile/space_privateer_tier2_shamdon.py @@ -1,4 +1,9 @@ import sys +from resources.datatables import Options def setup(core, object): - return \ No newline at end of file + #object.setAttachment('radial_filename', 'object/conversation'); + #object.setAttachment('conversationFile','imp_recruiter') + object.setOptionsBitmask(Options.INVULNERABLE) + object.setCustomName('Shamdon Kree ') + return From 7043f6a15968714e2e27df07e0af1c75289910fa Mon Sep 17 00:00:00 2001 From: tacef Date: Thu, 1 May 2014 19:38:12 +0200 Subject: [PATCH 02/27] Updated NPC Scripts with conversations --- scripts/conversation/byxle.py | 15 +++++++++++++++ scripts/conversation/dunir.py | 15 +++++++++++++++ scripts/conversation/gendra.py | 15 +++++++++++++++ scripts/conversation/mayor_mikdanyel_guhrantt.py | 15 +++++++++++++++ scripts/conversation/niko.py | 15 +++++++++++++++ scripts/conversation/reimos.py | 15 +++++++++++++++ scripts/conversation/toggi.py | 15 +++++++++++++++ scripts/object/mobile/dressed_gendra.py | 6 +++--- .../mobile/dressed_mayor_mikdanyell_guhrantt.py | 6 +++--- .../mobile/dressed_tatooine_opening_byxle.py | 6 +++--- .../mobile/dressed_tatooine_opening_dunir.py | 6 +++--- .../mobile/dressed_tatooine_opening_niko.py | 6 +++--- .../mobile/dressed_tatooine_opening_reimos.py | 6 +++--- .../mobile/dressed_tatooine_opening_toggi.py | 6 +++--- 14 files changed, 126 insertions(+), 21 deletions(-) create mode 100644 scripts/conversation/byxle.py create mode 100644 scripts/conversation/dunir.py create mode 100644 scripts/conversation/gendra.py create mode 100644 scripts/conversation/mayor_mikdanyel_guhrantt.py create mode 100644 scripts/conversation/niko.py create mode 100644 scripts/conversation/reimos.py create mode 100644 scripts/conversation/toggi.py diff --git a/scripts/conversation/byxle.py b/scripts/conversation/byxle.py new file mode 100644 index 00000000..71c08205 --- /dev/null +++ b/scripts/conversation/byxle.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_48') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_byxle', 's_48') + return \ No newline at end of file diff --git a/scripts/conversation/dunir.py b/scripts/conversation/dunir.py new file mode 100644 index 00000000..189e1748 --- /dev/null +++ b/scripts/conversation/dunir.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_dunir', 's_37') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_dunir', 's_37') + return \ No newline at end of file diff --git a/scripts/conversation/gendra.py b/scripts/conversation/gendra.py new file mode 100644 index 00000000..25277b59 --- /dev/null +++ b/scripts/conversation/gendra.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_gendra', 's_99') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_gendra', 's_99') + return \ No newline at end of file diff --git a/scripts/conversation/mayor_mikdanyel_guhrantt.py b/scripts/conversation/mayor_mikdanyel_guhrantt.py new file mode 100644 index 00000000..32d86b84 --- /dev/null +++ b/scripts/conversation/mayor_mikdanyel_guhrantt.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/mos_eisley_mayor', 's_117') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/mos_eisley_mayor', 's_117') + return \ No newline at end of file diff --git a/scripts/conversation/niko.py b/scripts/conversation/niko.py new file mode 100644 index 00000000..87e9d576 --- /dev/null +++ b/scripts/conversation/niko.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_niko', 's_71') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_niko', 's_71') + return \ No newline at end of file diff --git a/scripts/conversation/reimos.py b/scripts/conversation/reimos.py new file mode 100644 index 00000000..a907b2f2 --- /dev/null +++ b/scripts/conversation/reimos.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos', 's_36') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos', 's_36') + return \ No newline at end of file diff --git a/scripts/conversation/toggi.py b/scripts/conversation/toggi.py new file mode 100644 index 00000000..0654f9c3 --- /dev/null +++ b/scripts/conversation/toggi.py @@ -0,0 +1,15 @@ +from resources.common import ConversationOption +from resources.common import OutOfBand +from resources.common import ProsePackage +from java.util import Vector +import sys + +def startConversation(core, actor, npc): + convSvc = core.conversationService + + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_toggi', 's_4') + return + +def endConversation(core, actor, npc): + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_toggi', 's_4') + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_gendra.py b/scripts/object/mobile/dressed_gendra.py index bf2970d3..ceee905c 100644 --- a/scripts/object/mobile/dressed_gendra.py +++ b/scripts/object/mobile/dressed_gendra.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','gendra') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('newbie_gendra') return diff --git a/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py b/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py index 69749f16..e8e3da38 100644 --- a/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py +++ b/scripts/object/mobile/dressed_mayor_mikdanyell_guhrantt.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','mayor_mikdanyel_guhrantt') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('mos_eisley_mayor') return diff --git a/scripts/object/mobile/dressed_tatooine_opening_byxle.py b/scripts/object/mobile/dressed_tatooine_opening_byxle.py index 5311a1f4..a9115a52 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_byxle.py +++ b/scripts/object/mobile/dressed_tatooine_opening_byxle.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','byxle') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('tatooine_opening_byxle') return diff --git a/scripts/object/mobile/dressed_tatooine_opening_dunir.py b/scripts/object/mobile/dressed_tatooine_opening_dunir.py index 4e7950a2..f9d28082 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_dunir.py +++ b/scripts/object/mobile/dressed_tatooine_opening_dunir.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','durni') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('tatooine_opening_dunir') return diff --git a/scripts/object/mobile/dressed_tatooine_opening_niko.py b/scripts/object/mobile/dressed_tatooine_opening_niko.py index 7d81abd8..bb8c0ab4 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_niko.py +++ b/scripts/object/mobile/dressed_tatooine_opening_niko.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','niko') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('tatooine_opening_niko') return diff --git a/scripts/object/mobile/dressed_tatooine_opening_reimos.py b/scripts/object/mobile/dressed_tatooine_opening_reimos.py index 337bb4ad..2b2075d4 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_reimos.py +++ b/scripts/object/mobile/dressed_tatooine_opening_reimos.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','reimos') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('tatooine_opening_reimos') return diff --git a/scripts/object/mobile/dressed_tatooine_opening_toggi.py b/scripts/object/mobile/dressed_tatooine_opening_toggi.py index 20f5a1c1..ee3d1ccf 100644 --- a/scripts/object/mobile/dressed_tatooine_opening_toggi.py +++ b/scripts/object/mobile/dressed_tatooine_opening_toggi.py @@ -2,9 +2,9 @@ import sys from resources.datatables import Options def setup(core, object): - #object.setAttachment('radial_filename', 'object/conversation'); - #object.setAttachment('conversationFile','imp_recruiter') - object.setOptionsBitmask(Options.INVULNERABLE) + object.setAttachment('radial_filename', 'object/conversation'); + object.setAttachment('conversationFile','toggi') + object.setOptionsBitmask(Options.CONVERSABLE | Options.INVULNERABLE) object.setStfFilename('mob/creature_names') object.setStfName('tatooine_opening_toggi') return From 3b3c9bd6ef1c93964a1d180fbef60a9d292b652b Mon Sep 17 00:00:00 2001 From: tacef Date: Thu, 1 May 2014 19:50:03 +0200 Subject: [PATCH 03/27] Fixed Typo in Reimos conversation script --- scripts/conversation/reimos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/conversation/reimos.py b/scripts/conversation/reimos.py index a907b2f2..dcc7a6e1 100644 --- a/scripts/conversation/reimos.py +++ b/scripts/conversation/reimos.py @@ -7,9 +7,9 @@ import sys def startConversation(core, actor, npc): convSvc = core.conversationService - core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos', 's_36') + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos_v2', 's_36') return def endConversation(core, actor, npc): - core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos', 's_36') + core.conversationService.sendStopConversation(actor, npc, 'conversation/tatooine_eisley_reimos_v2', 's_36') return \ No newline at end of file From 45dd5bc9e5f075f438b7189fadcbf6f89d40fb64 Mon Sep 17 00:00:00 2001 From: tacef Date: Thu, 1 May 2014 20:54:53 +0200 Subject: [PATCH 04/27] Fixed little error in Rebel Recruiter conversation --- scripts/conversation/reb_recruiter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/conversation/reb_recruiter.py b/scripts/conversation/reb_recruiter.py index 9c8b803d..0ec3ecd7 100644 --- a/scripts/conversation/reb_recruiter.py +++ b/scripts/conversation/reb_recruiter.py @@ -315,7 +315,7 @@ def handleSecondScreen(core, actor, npc, selection): if actor.getFaction() != 'rebel' and actor.getFaction() != 'imperial': if selection == 0: - actor.setFaction('imperial') + actor.setFaction('rebel') actor.setFactionStatus(FactionStatus.OnLeave) prose = ProsePackage('conversation/faction_recruiter_rebel', 's_99') From 8abc9879f5d234f6333550294b0e66146dcb2819 Mon Sep 17 00:00:00 2001 From: Treeku Date: Wed, 30 Apr 2014 23:49:55 +0100 Subject: [PATCH 05/27] Vehicles now have ranged gb buffs --- scripts/object/mobile/vehicle/barc_speeder_imperial.py | 1 + scripts/object/mobile/vehicle/barc_speeder_rebel.py | 1 + scripts/object/mobile/vehicle/walker_at_rt_camo.py | 1 + scripts/object/mobile/vehicle/walker_at_rt_reg.py | 1 + src/services/pet/MountService.java | 5 ++++- 5 files changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/object/mobile/vehicle/barc_speeder_imperial.py b/scripts/object/mobile/vehicle/barc_speeder_imperial.py index ccad8904..a923f966 100644 --- a/scripts/object/mobile/vehicle/barc_speeder_imperial.py +++ b/scripts/object/mobile/vehicle/barc_speeder_imperial.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + core.buffService.addBuffToCreature(object, 'vehicle_pvp_barc_imperial', object) return \ No newline at end of file diff --git a/scripts/object/mobile/vehicle/barc_speeder_rebel.py b/scripts/object/mobile/vehicle/barc_speeder_rebel.py index ccad8904..a4d57462 100644 --- a/scripts/object/mobile/vehicle/barc_speeder_rebel.py +++ b/scripts/object/mobile/vehicle/barc_speeder_rebel.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + core.buffService.addBuffToCreature(object, 'vehicle_pvp_barc_rebel', object) return \ No newline at end of file diff --git a/scripts/object/mobile/vehicle/walker_at_rt_camo.py b/scripts/object/mobile/vehicle/walker_at_rt_camo.py index ccad8904..e552a13a 100644 --- a/scripts/object/mobile/vehicle/walker_at_rt_camo.py +++ b/scripts/object/mobile/vehicle/walker_at_rt_camo.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + core.buffService.addBuffToCreature(object, 'vehicle_at_rt', object) return \ No newline at end of file diff --git a/scripts/object/mobile/vehicle/walker_at_rt_reg.py b/scripts/object/mobile/vehicle/walker_at_rt_reg.py index ccad8904..e552a13a 100644 --- a/scripts/object/mobile/vehicle/walker_at_rt_reg.py +++ b/scripts/object/mobile/vehicle/walker_at_rt_reg.py @@ -1,4 +1,5 @@ import sys def setup(core, object): + core.buffService.addBuffToCreature(object, 'vehicle_at_rt', object) return \ No newline at end of file diff --git a/src/services/pet/MountService.java b/src/services/pet/MountService.java index a8094945..ea82c37e 100644 --- a/src/services/pet/MountService.java +++ b/src/services/pet/MountService.java @@ -33,7 +33,6 @@ import resources.datatables.DisplayType; import resources.datatables.Options; import resources.datatables.Posture; import resources.datatables.State; -import resources.datatables.StateStatus; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; @@ -437,6 +436,8 @@ public class MountService implements INetworkDispatch { // Notify observers and update quadtree mount.notifyObservers(new UpdateContainmentMessage(rider.getObjectID(), mount.getObjectID(), 4), true); core.simulationService.remove(rider, rider.getWorldPosition().x, rider.getWorldPosition().z, false); + + core.buffService.addBuffToCreature(rider, "vehicle_passenger", mount); } public CreatureObject getMount(SWGObject pcd) { @@ -637,6 +638,8 @@ public class MountService implements INetworkDispatch { core.simulationService.teleport(rider, mount.getWorldPosition(), mount.getOrientation(), 0); core.simulationService.add(rider, mount.getWorldPosition().x, mount.getWorldPosition().z, false); + core.buffService.removeBuffFromCreature(rider, rider.getBuffByName("vehicle_passenger")); + // Store mount if it's a creature if (!mount.getTemplate().contains("vehicle") && rider.getObjectID() == mount.getOwnerId()) { store(rider, mount); From e9a47848e859d388d83555a0504b3b79b79fc264 Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 1 May 2014 12:33:34 +0100 Subject: [PATCH 06/27] Added TEFs --- src/services/combat/CombatService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index 301bf037..cfebc8c5 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -292,6 +292,8 @@ public class CombatService implements INetworkDispatch { event.attacker = attacker; event.damage = damage; target.getEventBus().publish(event); + + attacker.setTefTime(300000); } private void doAreaCombat(CreatureObject attacker, CreatureObject target, WeaponObject weapon, CombatCommand command, int actionCounter) { From 207c6388d22135ab51b1ea3bd4bba295a1d5681f Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 1 May 2014 12:42:57 +0100 Subject: [PATCH 07/27] Reduced initial time delay The sky always takes 45 seconds to sync after logging in, after which you visibly see the sky change from light to dark and vice versa. --- src/services/PlayerService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 4a50e774..152793c1 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -124,7 +124,7 @@ public class PlayerService implements INetworkDispatch { ServerTimeMessage time = new ServerTimeMessage(core.getGalacticTime() / 1000); IoBuffer packet = time.serialize(); creature.getClient().getSession().write(packet); - }, 45, 45, TimeUnit.SECONDS)); + }, 5, 45, TimeUnit.SECONDS)); scheduleList.add(scheduler.scheduleAtFixedRate(() -> { PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost"); From cfde26986313f51213c455d2af474966241f9c21 Mon Sep 17 00:00:00 2001 From: Treeku Date: Thu, 1 May 2014 14:45:48 +0100 Subject: [PATCH 08/27] Added stealth detection/camo consideration --- src/services/PlayerService.java | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/services/PlayerService.java b/src/services/PlayerService.java index 152793c1..8cc06788 100644 --- a/src/services/PlayerService.java +++ b/src/services/PlayerService.java @@ -69,6 +69,7 @@ import resources.common.RGB; import resources.common.SpawnPoint; import resources.common.StringUtilities; import resources.datatables.DisplayType; +import resources.datatables.Options; import resources.datatables.PlayerFlags; import resources.datatables.Professions; import resources.guild.Guild; @@ -116,16 +117,42 @@ public class PlayerService implements INetworkDispatch { } public void postZoneIn(final CreatureObject creature) { - if(schedulers.get(creature.getObjectID()) != null) return; + List> scheduleList = new ArrayList>(); + scheduleList.add(scheduler.scheduleAtFixedRate(() -> { ServerTimeMessage time = new ServerTimeMessage(core.getGalacticTime() / 1000); IoBuffer packet = time.serialize(); creature.getClient().getSession().write(packet); }, 5, 45, TimeUnit.SECONDS)); + scheduleList.add(scheduler.scheduleAtFixedRate(() -> { + if (creature.isInStealth() && !creature.getOption(Options.INVULNERABLE) && ((PlayerObject) creature.getSlottedObject("ghost")).getGodLevel() == 0) { + List objects = core.simulationService.get(creature.getPlanet(), creature.getPosition().x, creature.getPosition().z, 64); + + for (SWGObject object : objects) { + if (object == null) { + continue; + } + + if (!(object instanceof CreatureObject)) { + continue; + } + + CreatureObject observer = (CreatureObject) object; + + int camoflauge = creature.getSkillModBase("camoflauge") - observer.getSkillModBase("detectcamo"); + camoflauge -= (64 - creature.getPosition().getDistance(observer.getPosition())); + + if (new Random(camoflauge).nextInt() == camoflauge) { + creature.setInStealth(false); + } + } + } + }, 15, 15, TimeUnit.SECONDS)); + scheduleList.add(scheduler.scheduleAtFixedRate(() -> { PlayerObject player = (PlayerObject) creature.getSlottedObject("ghost"); player.setTotalPlayTime((int) (player.getTotalPlayTime() + ((System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000))); @@ -147,6 +174,7 @@ public class PlayerService implements INetworkDispatch { creature.setHealth(creature.getHealth() + (36 + creature.getLevel() * 4)); }, 0, 1000, TimeUnit.MILLISECONDS)); schedulers.put(creature.getObjectID(), scheduleList); + /*final PlayerObject ghost = (PlayerObject) creature.getSlottedObject("ghost"); scheduler.schedule(new Runnable() { @@ -159,7 +187,6 @@ public class PlayerService implements INetworkDispatch { } }, 1, TimeUnit.SECONDS);*/ - } @Override From 35b978afdb070a241f2bc3e733f5c1d83ab5496c Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 16:30:30 +0100 Subject: [PATCH 09/27] Characters faction no longer "neutral" --- src/services/CharacterService.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index ea054582..55fd1de3 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -314,14 +314,9 @@ public class CharacterService implements INetworkDispatch { } // TODO: Race abilities - if (client.isGM()) - object.addAbility("admin"); - object.addAbility("startDance"); object.addAbility("startDance+Basic"); - object.setFaction("neutral"); - object.addObjectToEquipList(datapad); object.addObjectToEquipList(inventory); object.addObjectToEquipList(bank); From b4cb399bc1b13d8d554c1fe91546b766468d70bd Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 18:19:39 +0100 Subject: [PATCH 10/27] Temp patchfix for creating chars issue Will fix it properly soon, atm everyone needs to be able to create chars. --- src/resources/objects/IDelta.java | 4 +- .../objects/ObjectMessageBuilder.java | 2 +- src/resources/objects/SWGList.java | 43 +++++++++++++---- src/resources/objects/SWGMap.java | 41 ++++++++++++++--- src/resources/objects/SWGMultiMap.java | 41 ++++++++++++++--- .../objects/building/BuildingObject.java | 6 ++- src/resources/objects/cell/CellObject.java | 8 +++- .../objects/craft/DraftSchematic.java | 7 ++- .../objects/creature/CreatureObject.java | 28 +++++------ .../factorycrate/FactoryCrateObject.java | 8 +++- src/resources/objects/group/GroupObject.java | 9 +++- src/resources/objects/guild/GuildObject.java | 22 ++++----- .../objects/harvester/HarvesterObject.java | 11 +++-- .../installation/InstallationObject.java | 13 ++++-- .../intangible/IntangibleMessageBuilder.java | 22 ++++++++- .../objects/intangible/IntangibleObject.java | 13 ++++-- .../ManufactureSchematicMessageBuilder.java | 46 +++++++++++++++++++ .../ManufactureSchematicObject.java | 15 +++--- .../objects/mission/MissionObject.java | 12 ++--- .../objects/player/PlayerObject.java | 6 ++- .../objects/resource/GalacticResource.java | 4 -- .../resource/ResourceContainerObject.java | 8 +++- src/resources/objects/ship/ShipObject.java | 9 +++- .../objects/staticobject/StaticObject.java | 8 +++- .../objects/tangible/TangibleObject.java | 7 ++- src/resources/objects/tool/SurveyTool.java | 1 - .../objects/universe/UniverseObject.java | 9 +++- .../objects/waypoint/WaypointObject.java | 3 +- .../objects/weapon/WeaponObject.java | 3 +- 29 files changed, 309 insertions(+), 100 deletions(-) create mode 100644 src/resources/objects/manufacture/ManufactureSchematicMessageBuilder.java diff --git a/src/resources/objects/IDelta.java b/src/resources/objects/IDelta.java index 874715b0..cf1d8802 100644 --- a/src/resources/objects/IDelta.java +++ b/src/resources/objects/IDelta.java @@ -21,12 +21,10 @@ ******************************************************************************/ package resources.objects; -import java.io.Serializable; - import com.sleepycat.persist.model.Persistent; @Persistent -public interface IDelta { +public interface IDelta { public byte[] getBytes(); diff --git a/src/resources/objects/ObjectMessageBuilder.java b/src/resources/objects/ObjectMessageBuilder.java index 4ae29461..073e7c6e 100644 --- a/src/resources/objects/ObjectMessageBuilder.java +++ b/src/resources/objects/ObjectMessageBuilder.java @@ -42,7 +42,7 @@ public abstract class ObjectMessageBuilder { public SWGObject object; @NotPersistent public SimpleBufferAllocator bufferPool = new SimpleBufferAllocator(); - + public IoBuffer createBaseline(String objectType, byte viewType, IoBuffer data, int size) { IoBuffer buffer = bufferPool.allocate(23 + size, false).order(ByteOrder.LITTLE_ENDIAN); diff --git a/src/resources/objects/SWGList.java b/src/resources/objects/SWGList.java index d7d63f68..13e1854d 100644 --- a/src/resources/objects/SWGList.java +++ b/src/resources/objects/SWGList.java @@ -22,7 +22,7 @@ package resources.objects; import java.io.Serializable; -import java.nio.ByteOrder; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -35,12 +35,16 @@ import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Stream; +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import org.python.google.common.collect.Lists; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; +import engine.resources.objects.SWGObject; + /* A SWGList element MUST implement IDelta, or it will refuse to work with it */ @Persistent @@ -50,7 +54,8 @@ public class SWGList implements List, Serializable { private List list = new ArrayList(); @NotPersistent private transient int updateCounter = 1; - private ObjectMessageBuilder messageBuilder; + private long objectId; + private transient ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent @@ -58,8 +63,8 @@ public class SWGList implements List, Serializable { public SWGList() { } - public SWGList(ObjectMessageBuilder messageBuilder, int viewType, int updateType) { - this.messageBuilder = messageBuilder; + public SWGList(long objectId, int viewType, int updateType) { + this.objectId = objectId; this.viewType = (byte) viewType; this.updateType = (short) updateType; } @@ -296,7 +301,7 @@ public class SWGList implements List, Serializable { if (!list.isEmpty()) { for (E element : list) { if (element instanceof IDelta) { - IoBuffer buffer = messageBuilder.bufferPool.allocate((newListData.length + ((IDelta) element).getBytes().length), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = Delta.createBuffer((newListData.length + ((IDelta) element).getBytes().length)); buffer.put(newListData); buffer.put(((IDelta) element).getBytes()); newListData = buffer.array(); @@ -361,7 +366,7 @@ public class SWGList implements List, Serializable { return new byte[] { }; } - IoBuffer buffer = messageBuilder.bufferPool.allocate((size), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = Delta.createBuffer(size); buffer.put((byte) type); if (useIndex) buffer.putShort((short) index); if (useData) buffer.put(data); @@ -372,7 +377,18 @@ public class SWGList implements List, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = messageBuilder.bufferPool.allocate((data.length + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((data.length + 8)); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -386,7 +402,18 @@ public class SWGList implements List, Serializable { size += queued.length; } - IoBuffer buffer = messageBuilder.bufferPool.allocate((size + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/SWGMap.java b/src/resources/objects/SWGMap.java index 5e4a28a9..ffd380af 100644 --- a/src/resources/objects/SWGMap.java +++ b/src/resources/objects/SWGMap.java @@ -22,6 +22,7 @@ package resources.objects; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; @@ -34,6 +35,8 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Function; +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import resources.common.StringUtilities; @@ -41,6 +44,8 @@ import resources.common.StringUtilities; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; +import engine.resources.objects.SWGObject; + @SuppressWarnings("unused") @Persistent @@ -50,7 +55,8 @@ public class SWGMap implements Map, Serializable { private Map map = new TreeMap(); @NotPersistent private transient int updateCounter = 0; - private ObjectMessageBuilder messageBuilder; + long objectId; + private transient ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent @@ -58,14 +64,15 @@ public class SWGMap implements Map, Serializable { public SWGMap() { } - public SWGMap(ObjectMessageBuilder messageBuilder, int viewType, int updateType) { - this.messageBuilder = messageBuilder; + public SWGMap(long objectId, int viewType, int updateType) { + this.objectId = objectId; this.viewType = (byte) viewType; this.updateType = (short) updateType; } public SWGMap(Map m) { if (m instanceof SWGMap) { + this.objectId = ((SWGMap) m).objectId; this.messageBuilder = ((SWGMap) m).messageBuilder; this.viewType = ((SWGMap) m).viewType; this.updateType = ((SWGMap) m).updateType; @@ -216,7 +223,7 @@ public class SWGMap implements Map, Serializable { int size = 1 + ((useIndex) ? (2 + index.toString().getBytes().length) : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = messageBuilder.bufferPool.allocate((size), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = Delta.createBuffer((size)); buffer.put((byte) type); if (useIndex) { if (index instanceof String) { @@ -244,7 +251,18 @@ public class SWGMap implements Map, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = messageBuilder.bufferPool.allocate((data.length + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((data.length + 8)); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -259,7 +277,18 @@ public class SWGMap implements Map, Serializable { size += queued.length; } - IoBuffer buffer = messageBuilder.bufferPool.allocate((size + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/SWGMultiMap.java b/src/resources/objects/SWGMultiMap.java index a632c20c..22659c1b 100644 --- a/src/resources/objects/SWGMultiMap.java +++ b/src/resources/objects/SWGMultiMap.java @@ -22,6 +22,7 @@ package resources.objects; import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collection; @@ -32,6 +33,8 @@ import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; +import main.NGECore; + import org.apache.mina.core.buffer.IoBuffer; import org.python.google.common.collect.ArrayListMultimap; import org.python.google.common.collect.Multimap; @@ -44,6 +47,8 @@ import resources.common.StringUtilities; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; +import engine.resources.objects.SWGObject; + @SuppressWarnings("unused") @Persistent @@ -53,7 +58,8 @@ public class SWGMultiMap implements Multimap, Serializable { private Multimap map = ArrayListMultimap.create(); @NotPersistent private transient int updateCounter = 0; - private ObjectMessageBuilder messageBuilder; + private long objectId; + private transient ObjectMessageBuilder messageBuilder; private byte viewType; private short updateType; @NotPersistent @@ -61,14 +67,15 @@ public class SWGMultiMap implements Multimap, Serializable { public SWGMultiMap() { } - public SWGMultiMap(ObjectMessageBuilder messageBuilder, int viewType, int updateType) { - this.messageBuilder = messageBuilder; + public SWGMultiMap(long objectId, int viewType, int updateType) { + this.objectId = objectId; this.viewType = (byte) viewType; this.updateType = (short) updateType; } public SWGMultiMap(Multimap m) { if (m instanceof SWGMultiMap) { + this.objectId = ((SWGMultiMap) m).objectId; this.messageBuilder = ((SWGMultiMap) m).messageBuilder; this.viewType = ((SWGMultiMap) m).viewType; this.updateType = ((SWGMultiMap) m).updateType; @@ -298,7 +305,7 @@ public class SWGMultiMap implements Multimap, Serializable { int size = 1 + ((useIndex) ? (2 + index.toString().getBytes().length) : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = messageBuilder.bufferPool.allocate((size), false).order(ByteOrder.LITTLE_ENDIAN); + IoBuffer buffer = Delta.createBuffer(size); buffer.put((byte) type); if (useIndex) { if (index instanceof String) { @@ -325,7 +332,18 @@ public class SWGMultiMap implements Multimap, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = messageBuilder.bufferPool.allocate((data.length + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((data.length + 8)); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -339,7 +357,18 @@ public class SWGMultiMap implements Multimap, Serializable { size += queued.length; } - IoBuffer buffer = messageBuilder.bufferPool.allocate((size + 8), false).order(ByteOrder.LITTLE_ENDIAN); + if (messageBuilder == null) { + try { + SWGObject object = NGECore.getInstance().objectService.getObject(objectId); + this.messageBuilder = (ObjectMessageBuilder) object.getClass().getMethod("getMessageBuilder", new Class[] {}).invoke(object, new Object[] { }); + } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + IoBuffer buffer = Delta.createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/building/BuildingObject.java b/src/resources/objects/building/BuildingObject.java index 0b8f208b..43228195 100644 --- a/src/resources/objects/building/BuildingObject.java +++ b/src/resources/objects/building/BuildingObject.java @@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import main.NGECore; -import resources.objects.cell.CellMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; @@ -271,4 +271,8 @@ public class BuildingObject extends TangibleObject implements IPersistent, Seria messageBuilder = new BuildingMessageBuilder(this); } + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/cell/CellObject.java b/src/resources/objects/cell/CellObject.java index 1c787a13..cd95919f 100644 --- a/src/resources/objects/cell/CellObject.java +++ b/src/resources/objects/cell/CellObject.java @@ -24,6 +24,7 @@ package resources.objects.cell; import java.io.Serializable; import protocol.swg.UpdateCellPermissionMessage; +import resources.objects.ObjectMessageBuilder; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; @@ -89,6 +90,9 @@ public class CellObject extends SWGObject implements Serializable { super.init(); messageBuilder = new CellMessageBuilder(this); } - - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/craft/DraftSchematic.java b/src/resources/objects/craft/DraftSchematic.java index dfebddf8..54d203a5 100644 --- a/src/resources/objects/craft/DraftSchematic.java +++ b/src/resources/objects/craft/DraftSchematic.java @@ -23,7 +23,7 @@ package resources.objects.craft; import java.io.Serializable; -import resources.objects.building.BuildingMessageBuilder; +import resources.objects.ObjectMessageBuilder; import com.sleepycat.persist.model.Persistent; @@ -37,6 +37,7 @@ import engine.resources.scene.Quaternion; public class DraftSchematic extends SWGObject implements Serializable { private static final long serialVersionUID = 1L; + private transient ObjectMessageBuilder messageBuilder = null; public DraftSchematic(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ super(objectID, planet, position, orientation, template); @@ -52,7 +53,9 @@ public class DraftSchematic extends SWGObject implements Serializable { public void initAfterDBLoad() { super.init(); } - + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } } diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 8d8f7749..10795671 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -43,8 +43,6 @@ import protocol.swg.objectControllerObjects.Animation; import protocol.swg.objectControllerObjects.Posture; import protocol.swg.objectControllerObjects.StartTask; -import com.sleepycat.je.Environment; -import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; @@ -54,16 +52,15 @@ import resources.buffs.Buff; import resources.buffs.DamageOverTime; import resources.common.Cooldown; import resources.common.OutOfBand; +import resources.objects.ObjectMessageBuilder; import resources.objects.SWGList; import resources.objects.SWGMap; import engine.resources.common.CRC; -import engine.resources.objects.IPersistent; import engine.resources.objects.MissionCriticalObject; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -import resources.objects.building.BuildingMessageBuilder; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; import resources.skills.SkillMod; @@ -80,7 +77,7 @@ public class CreatureObject extends TangibleObject implements Serializable { private List skills; @NotPersistent private transient int skillsUpdateCounter = 0; - + // CREO 3 private byte posture = 0; private float height; @@ -103,12 +100,11 @@ public class CreatureObject extends TangibleObject implements Serializable { private SWGList abilities; private int abilitiesUpdateCounter = 0; private int xpBarValue = 0; - + private SWGList missionCriticalObjects; @NotPersistent private transient int missionCriticalObjectsUpdateCounter = 0; - - + // CREO6 private byte combatFlag = 0; private short level = -1; @@ -198,12 +194,12 @@ public class CreatureObject extends TangibleObject implements Serializable { messageBuilder = new CreatureMessageBuilder(this); loadTemplateData(); skills = new ArrayList(); - skillMods = new SWGMap(messageBuilder, 4, 3); - abilities = new SWGList(messageBuilder, 4, 14); - missionCriticalObjects = new SWGList(messageBuilder, 4, 13); - equipmentList = new SWGList(messageBuilder, 6, 0x17); - buffList = new SWGList(messageBuilder, 6, 0x1A); - appearanceEquipmentList = new SWGList(messageBuilder, 6, 0x1F); + skillMods = new SWGMap(getObjectID(), 4, 3); + abilities = new SWGList(getObjectID(), 4, 14); + missionCriticalObjects = new SWGList(getObjectID(), 4, 13); + equipmentList = new SWGList(getObjectID(), 6, 0x17); + buffList = new SWGList(getObjectID(), 6, 0x1A); + appearanceEquipmentList = new SWGList(getObjectID(), 6, 0x1F); } public CreatureObject() { @@ -1851,4 +1847,8 @@ public class CreatureObject extends TangibleObject implements Serializable { //return ((float) getCooldown(cooldownGroup) / (float) 1000); //} + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/factorycrate/FactoryCrateObject.java b/src/resources/objects/factorycrate/FactoryCrateObject.java index a2cf5f4d..69f4d537 100644 --- a/src/resources/objects/factorycrate/FactoryCrateObject.java +++ b/src/resources/objects/factorycrate/FactoryCrateObject.java @@ -30,7 +30,6 @@ import protocol.swg.SceneCreateObjectByCrc; import protocol.swg.SceneDestroyObject; import protocol.swg.SceneEndBaselines; import protocol.swg.UpdateContainmentMessage; -import protocol.swg.UpdatePVPStatusMessage; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; @@ -41,7 +40,7 @@ import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -import resources.objects.creature.CreatureMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; @@ -276,4 +275,9 @@ public class FactoryCrateObject extends TangibleObject implements Serializable { this.getAttributes().put("@obj_attr_n:factory_count", ""+this.getQuantity()); //services.CharonPacketUtils.printAnalysis(messageBuilder.buildDelta3(),"FCYT3 Delta"); } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } \ No newline at end of file diff --git a/src/resources/objects/group/GroupObject.java b/src/resources/objects/group/GroupObject.java index 561bf7e7..92986e39 100644 --- a/src/resources/objects/group/GroupObject.java +++ b/src/resources/objects/group/GroupObject.java @@ -21,9 +21,9 @@ ******************************************************************************/ package resources.objects.group; -import java.io.Serializable; import java.util.Vector; +import resources.objects.ObjectMessageBuilder; import resources.objects.universe.UniverseObject; import engine.clients.Client; import engine.resources.objects.SWGObject; @@ -38,7 +38,7 @@ public class GroupObject extends UniverseObject { private SWGObject lootMaster; private short groupLevel; private int lootMode; - private GroupMessageBuilder messageBuilder; + private transient GroupMessageBuilder messageBuilder; private int chatRoomId; public static int FREE_FOR_ALL = 0; @@ -165,4 +165,9 @@ public class GroupObject extends UniverseObject { destination.getSession().write(messageBuilder.buildBaseline6()); } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/guild/GuildObject.java b/src/resources/objects/guild/GuildObject.java index 7306cf99..fe01d97a 100644 --- a/src/resources/objects/guild/GuildObject.java +++ b/src/resources/objects/guild/GuildObject.java @@ -33,20 +33,17 @@ import resources.gcw.CurrentServerGCWZoneHistory; import resources.gcw.CurrentServerGCWZonePercent; import resources.gcw.OtherServerGCWZonePercent; import resources.guild.Guild; +import resources.objects.ObjectMessageBuilder; import resources.objects.SWGList; import resources.objects.SWGMap; import resources.objects.SWGMultiMap; -import resources.objects.cell.CellMessageBuilder; import resources.objects.universe.UniverseObject; import services.collections.ServerFirst; -import com.sleepycat.je.Environment; -import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; import engine.clients.Client; -import engine.resources.objects.IPersistent; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -71,19 +68,19 @@ public class GuildObject extends UniverseObject implements Serializable { private String STFName = ""; private String customName = ""; private int volume = 0; - private SWGList guildList = new SWGList(messageBuilder, 3, 4); + private SWGList guildList = new SWGList(getObjectID(), 3, 4); // GILD 6 private int serverId = 0x43; //private String STFName = "string_id_table"; private int unknown1 = 0; private short unknown2 = 0; - private SWGMap currentServerGCWZonePercentMap = new SWGMap(messageBuilder, 6, 2); - private SWGMap currentServerGCWTotalPercentMap = new SWGMap(messageBuilder, 6, 3); - private SWGMultiMap currentServerGCWZoneHistoryMap = new SWGMultiMap(messageBuilder, 6, 4); - private SWGMultiMap currentServerGCWTotalHistoryMap = new SWGMultiMap(messageBuilder, 6, 5); - private SWGMultiMap otherServerGCWZonePercentMap = new SWGMultiMap(messageBuilder, 6, 6); - private SWGMultiMap otherServerGCWTotalPercentMap = new SWGMultiMap(messageBuilder, 6, 7); + private SWGMap currentServerGCWZonePercentMap = new SWGMap(getObjectID(), 6, 2); + private SWGMap currentServerGCWTotalPercentMap = new SWGMap(getObjectID(), 6, 3); + private SWGMultiMap currentServerGCWZoneHistoryMap = new SWGMultiMap(getObjectID(), 6, 4); + private SWGMultiMap currentServerGCWTotalHistoryMap = new SWGMultiMap(getObjectID(), 6, 5); + private SWGMultiMap otherServerGCWZonePercentMap = new SWGMultiMap(getObjectID(), 6, 6); + private SWGMultiMap otherServerGCWTotalPercentMap = new SWGMultiMap(getObjectID(), 6, 7); private int unknown3 = 5; public GuildObject(NGECore core, long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { @@ -309,5 +306,8 @@ public class GuildObject extends UniverseObject implements Serializable { } } + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } } diff --git a/src/resources/objects/harvester/HarvesterObject.java b/src/resources/objects/harvester/HarvesterObject.java index 93da82cf..87cc8ea1 100644 --- a/src/resources/objects/harvester/HarvesterObject.java +++ b/src/resources/objects/harvester/HarvesterObject.java @@ -32,8 +32,8 @@ import engine.clients.Client; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; +import resources.objects.ObjectMessageBuilder; import resources.objects.creature.CreatureObject; -import resources.objects.guild.GuildMessageBuilder; import resources.objects.installation.InstallationMessageBuilder; import resources.objects.installation.InstallationObject; import resources.objects.resource.GalacticResource; @@ -48,8 +48,8 @@ public class HarvesterObject extends InstallationObject implements Serializable private static final long serialVersionUID = 1L; - private HarvesterMessageBuilder messageBuilder; - private InstallationMessageBuilder installationMessageBuilder; + private transient HarvesterMessageBuilder messageBuilder; + private transient InstallationMessageBuilder installationMessageBuilder; public final static byte HARVESTER_TYPE_MINERAL = 0; public final static byte HARVESTER_TYPE_CHEMICAL = 1; @@ -419,4 +419,9 @@ public class HarvesterObject extends InstallationObject implements Serializable //destination.getSession().write(installationMessageBuilder.buildBaseline9()); } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/installation/InstallationObject.java b/src/resources/objects/installation/InstallationObject.java index 090b985b..a31fc02e 100644 --- a/src/resources/objects/installation/InstallationObject.java +++ b/src/resources/objects/installation/InstallationObject.java @@ -29,16 +29,18 @@ import engine.clients.Client; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; -import resources.objects.cell.CellMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.tangible.TangibleObject; @Entity(version=0) public class InstallationObject extends TangibleObject implements Serializable { private static final long serialVersionUID = 1L; + private transient InstallationMessageBuilder messageBuilder; public InstallationObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation){ - super(objectID, planet, template, position, orientation); + super(objectID, planet, template, position, orientation); + messageBuilder = new InstallationMessageBuilder(this); } @Override @@ -49,6 +51,11 @@ public class InstallationObject extends TangibleObject implements Serializable { @Override public void initAfterDBLoad() { super.init(); + messageBuilder = new InstallationMessageBuilder(this); } - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } \ No newline at end of file diff --git a/src/resources/objects/intangible/IntangibleMessageBuilder.java b/src/resources/objects/intangible/IntangibleMessageBuilder.java index 1dd0af60..c71177be 100644 --- a/src/resources/objects/intangible/IntangibleMessageBuilder.java +++ b/src/resources/objects/intangible/IntangibleMessageBuilder.java @@ -21,6 +21,26 @@ ******************************************************************************/ package resources.objects.intangible; -public class IntangibleMessageBuilder { +import org.apache.mina.core.buffer.IoBuffer; + +import resources.objects.ObjectMessageBuilder; + +public class IntangibleMessageBuilder extends ObjectMessageBuilder { + + public IntangibleMessageBuilder(IntangibleObject intangibleObject) { + setObject(intangibleObject); + } + + @Override + public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { + // TODO Auto-generated method stub + + } + + @Override + public void sendBaselines() { + // TODO Auto-generated method stub + + } } diff --git a/src/resources/objects/intangible/IntangibleObject.java b/src/resources/objects/intangible/IntangibleObject.java index a0f4444d..6bb64e6f 100644 --- a/src/resources/objects/intangible/IntangibleObject.java +++ b/src/resources/objects/intangible/IntangibleObject.java @@ -23,7 +23,7 @@ package resources.objects.intangible; import java.io.Serializable; -import resources.objects.cell.CellMessageBuilder; +import resources.objects.ObjectMessageBuilder; import com.sleepycat.persist.model.Persistent; @@ -37,20 +37,23 @@ import engine.resources.scene.Quaternion; public class IntangibleObject extends SWGObject implements Serializable { private static final long serialVersionUID = 1L; - + private transient IntangibleMessageBuilder messageBuilder; private int genericInt; public IntangibleObject() { super(); + messageBuilder = new IntangibleMessageBuilder(this); } public IntangibleObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, position, orientation, Template); + messageBuilder = new IntangibleMessageBuilder(this); } @Override public void initAfterDBLoad() { super.init(); + messageBuilder = new IntangibleMessageBuilder(this); } public int getGenericInt() { @@ -70,5 +73,9 @@ public class IntangibleObject extends SWGObject implements Serializable { // TODO Auto-generated method stub } - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/manufacture/ManufactureSchematicMessageBuilder.java b/src/resources/objects/manufacture/ManufactureSchematicMessageBuilder.java new file mode 100644 index 00000000..30c04def --- /dev/null +++ b/src/resources/objects/manufacture/ManufactureSchematicMessageBuilder.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * 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.objects.manufacture; + +import org.apache.mina.core.buffer.IoBuffer; + +import resources.objects.ObjectMessageBuilder; + +public class ManufactureSchematicMessageBuilder extends ObjectMessageBuilder { + + public ManufactureSchematicMessageBuilder(ManufactureSchematicObject object) { + setObject(object); + } + + @Override + public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { + // TODO Auto-generated method stub + + } + + @Override + public void sendBaselines() { + // TODO Auto-generated method stub + + } + +} diff --git a/src/resources/objects/manufacture/ManufactureSchematicObject.java b/src/resources/objects/manufacture/ManufactureSchematicObject.java index 38d77857..b8532f00 100644 --- a/src/resources/objects/manufacture/ManufactureSchematicObject.java +++ b/src/resources/objects/manufacture/ManufactureSchematicObject.java @@ -21,10 +21,9 @@ ******************************************************************************/ package resources.objects.manufacture; - import java.io.Serializable; -import resources.objects.cell.CellMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.intangible.IntangibleObject; import com.sleepycat.persist.model.Persistent; @@ -42,19 +41,21 @@ import engine.resources.scene.Quaternion; public class ManufactureSchematicObject extends IntangibleObject implements Serializable { private static final long serialVersionUID = 1L; - //@NotPersistent - //private ManufactureSchematicMessageBuilder messageBuilder; + private transient ManufactureSchematicMessageBuilder messageBuilder; public ManufactureSchematicObject(long objectID, Planet planet, String template, Point3D position, Quaternion orientation) { super(objectID, planet, position, orientation, template); - //messageBuilder = new ManufactureSchematicMessageBuilder(this); + messageBuilder = new ManufactureSchematicMessageBuilder(this); } @Override public void initAfterDBLoad() { super.init(); - //messageBuilder = new ManufactureSchematicMessageBuilder(this); + messageBuilder = new ManufactureSchematicMessageBuilder(this); + } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; } - } diff --git a/src/resources/objects/mission/MissionObject.java b/src/resources/objects/mission/MissionObject.java index 67d9cee4..a5e4d195 100644 --- a/src/resources/objects/mission/MissionObject.java +++ b/src/resources/objects/mission/MissionObject.java @@ -23,18 +23,14 @@ package resources.objects.mission; import java.io.Serializable; -import com.sleepycat.je.Environment; -import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; -import resources.common.BountyListItem; -import resources.objects.cell.CellMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.intangible.IntangibleObject; import resources.objects.waypoint.WaypointObject; import services.mission.MissionObjective; import engine.clients.Client; -import engine.resources.objects.IPersistent; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; @@ -326,5 +322,9 @@ public class MissionObject extends IntangibleObject implements Serializable { destination.getSession().write(messageBuilder.buildBaseline8()); destination.getSession().write(messageBuilder.buildBaseline9()); } - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index cc1d4cd9..02fe6db7 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -29,11 +29,11 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import resources.objects.ObjectMessageBuilder; import resources.objects.intangible.IntangibleObject; import resources.objects.resource.ResourceContainerObject; import resources.objects.tool.SurveyTool; import resources.objects.waypoint.WaypointObject; -import resources.objects.cell.CellMessageBuilder; import resources.objects.creature.CreatureObject; import com.sleepycat.persist.model.NotPersistent; @@ -908,4 +908,8 @@ public class PlayerObject extends IntangibleObject implements Serializable { this.callingCompanion = callingCompanion; } + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/resource/GalacticResource.java b/src/resources/objects/resource/GalacticResource.java index 01f0ef81..22aa0647 100644 --- a/src/resources/objects/resource/GalacticResource.java +++ b/src/resources/objects/resource/GalacticResource.java @@ -29,17 +29,13 @@ import java.util.Vector; import main.NGECore; import protocol.swg.SurveyMapUpdateMessage; import resources.objects.creature.CreatureObject; -import resources.objects.player.PlayerMessageBuilder; import resources.objects.player.PlayerObject; import resources.objects.waypoint.WaypointObject; -import com.sleepycat.je.Environment; -import com.sleepycat.je.Transaction; import com.sleepycat.persist.model.Entity; import com.sleepycat.persist.model.NotPersistent; import engine.clients.Client; -import engine.resources.objects.IPersistent; import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; diff --git a/src/resources/objects/resource/ResourceContainerObject.java b/src/resources/objects/resource/ResourceContainerObject.java index 55642224..66ac4a80 100644 --- a/src/resources/objects/resource/ResourceContainerObject.java +++ b/src/resources/objects/resource/ResourceContainerObject.java @@ -21,7 +21,6 @@ ******************************************************************************/ package resources.objects.resource; - import java.io.Serializable; import main.NGECore; @@ -34,8 +33,8 @@ import engine.resources.objects.SWGObject; import engine.resources.scene.Planet; import engine.resources.scene.Point3D; import engine.resources.scene.Quaternion; +import resources.objects.ObjectMessageBuilder; import resources.objects.creature.CreatureObject; -import resources.objects.player.PlayerMessageBuilder; import resources.objects.tangible.TangibleObject; /** @@ -559,4 +558,9 @@ public class ResourceContainerObject extends TangibleObject implements Serializa destination.getSession().write(messageBuilder.buildDelta3()); } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/ship/ShipObject.java b/src/resources/objects/ship/ShipObject.java index 9bb96682..67d27246 100644 --- a/src/resources/objects/ship/ShipObject.java +++ b/src/resources/objects/ship/ShipObject.java @@ -25,17 +25,22 @@ import java.io.Serializable; import com.sleepycat.persist.model.Persistent; -import resources.objects.resource.ResourceContainerMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.tangible.TangibleObject; @Persistent(version=0) public class ShipObject extends TangibleObject implements Serializable { private static final long serialVersionUID = 1L; + private transient ObjectMessageBuilder messageBuilder = null; @Override public void initAfterDBLoad() { super.init(); } - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/staticobject/StaticObject.java b/src/resources/objects/staticobject/StaticObject.java index ff662fdc..a0c2de5c 100644 --- a/src/resources/objects/staticobject/StaticObject.java +++ b/src/resources/objects/staticobject/StaticObject.java @@ -23,7 +23,7 @@ package resources.objects.staticobject; import java.io.Serializable; -import resources.objects.resource.ResourceContainerMessageBuilder; +import resources.objects.ObjectMessageBuilder; import com.sleepycat.persist.model.NotPersistent; import com.sleepycat.persist.model.Persistent; @@ -71,5 +71,9 @@ public class StaticObject extends SWGObject implements Serializable { super.init(); messageBuilder = new StaticMessageBuilder(this); } - + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/tangible/TangibleObject.java b/src/resources/objects/tangible/TangibleObject.java index 53fa78e7..fb8fc9ef 100644 --- a/src/resources/objects/tangible/TangibleObject.java +++ b/src/resources/objects/tangible/TangibleObject.java @@ -42,8 +42,8 @@ import resources.common.OutOfBand; import resources.common.RGB; import resources.datatables.Options; import resources.loot.LootGroup; +import resources.objects.ObjectMessageBuilder; import resources.objects.creature.CreatureObject; -import resources.objects.staticobject.StaticMessageBuilder; import resources.visitors.IDManagerVisitor; import com.sleepycat.persist.model.NotPersistent; @@ -631,4 +631,9 @@ public class TangibleObject extends SWGObject implements Serializable { } + + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/tool/SurveyTool.java b/src/resources/objects/tool/SurveyTool.java index ab557446..a8fde661 100644 --- a/src/resources/objects/tool/SurveyTool.java +++ b/src/resources/objects/tool/SurveyTool.java @@ -35,7 +35,6 @@ import engine.resources.scene.Quaternion; import resources.objects.creature.CreatureObject; import resources.objects.resource.GalacticResource; import resources.objects.resource.ResourceConcentration; -import resources.objects.tangible.TangibleMessageBuilder; import resources.objects.tangible.TangibleObject; /** diff --git a/src/resources/objects/universe/UniverseObject.java b/src/resources/objects/universe/UniverseObject.java index 7502266a..841e300a 100644 --- a/src/resources/objects/universe/UniverseObject.java +++ b/src/resources/objects/universe/UniverseObject.java @@ -23,7 +23,7 @@ package resources.objects.universe; import java.io.Serializable; -import resources.objects.tangible.TangibleMessageBuilder; +import resources.objects.ObjectMessageBuilder; import com.sleepycat.persist.model.Persistent; @@ -37,7 +37,8 @@ import engine.resources.scene.Quaternion; public class UniverseObject extends SWGObject implements Serializable { private static final long serialVersionUID = 1L; - + private transient ObjectMessageBuilder messageBuilder = null; + public UniverseObject(long objectID, Planet planet, Point3D position, Quaternion orientation, String Template) { super(objectID, planet, position, orientation, Template); } @@ -57,4 +58,8 @@ public class UniverseObject extends SWGObject implements Serializable { } + public ObjectMessageBuilder getMessageBuilder() { + return messageBuilder; + } + } diff --git a/src/resources/objects/waypoint/WaypointObject.java b/src/resources/objects/waypoint/WaypointObject.java index 15f2f00e..6cd72dca 100644 --- a/src/resources/objects/waypoint/WaypointObject.java +++ b/src/resources/objects/waypoint/WaypointObject.java @@ -24,7 +24,6 @@ package resources.objects.waypoint; import java.io.Serializable; import resources.objects.intangible.IntangibleObject; -import resources.objects.tangible.TangibleMessageBuilder; import com.sleepycat.persist.model.Persistent; @@ -37,7 +36,7 @@ import engine.resources.scene.Quaternion; public class WaypointObject extends IntangibleObject implements Serializable { private static final long serialVersionUID = 1L; - + private int cellId; // ??? private long locationNetworkId; private int planetCRC; diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index 98acf7ea..26115f42 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -24,7 +24,7 @@ package resources.objects.weapon; import java.io.Serializable; import resources.datatables.WeaponType; -import resources.objects.tangible.TangibleMessageBuilder; +import resources.objects.ObjectMessageBuilder; import resources.objects.tangible.TangibleObject; import com.sleepycat.persist.model.NotPersistent; @@ -224,5 +224,4 @@ public class WeaponObject extends TangibleObject implements Serializable { return false; } - } From c7eb10b5f22f55ea15e05a99e9a1472cf44e5901 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Fri, 2 May 2014 21:05:32 +0200 Subject: [PATCH 11/27] city zoning fix --- src/services/housing/HousingService.java | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/services/housing/HousingService.java b/src/services/housing/HousingService.java index 34bdb205..2b092b6f 100644 --- a/src/services/housing/HousingService.java +++ b/src/services/housing/HousingService.java @@ -154,15 +154,17 @@ public class HousingService implements INetworkDispatch { // Check for city founders joining a new city PlayerCity cityActorIsIn = core.playerCityService.getCityObjectIsIn(actor); - actor.setAttachment("Has24HZoningFor",cityActorIsIn.getCityID()); // for testing - - int cityActorHasZoning = (int)actor.getAttachment("Has24HZoningFor"); - if (cityActorIsIn!=null && cityActorHasZoning==cityActorIsIn.getCityID()){ - if (! cityActorIsIn.getCitizens().contains(actor.getObjectID())){ - building.setAttachment("structureCity", cityActorIsIn.getCityID()); - // actor.setAttachment("residentCity", cityActorIsIn.getCityID()); He must do it manually - cityActorIsIn.addCitizen(actor.getObjectID()); - cityActorIsIn.addNewStructure(building.getObjectID()); + if (cityActorIsIn!=null){ + actor.setAttachment("Has24HZoningFor",cityActorIsIn.getCityID()); // for testing + + int cityActorHasZoning = (int)actor.getAttachment("Has24HZoningFor"); + if (cityActorIsIn!=null && cityActorHasZoning==cityActorIsIn.getCityID()){ + if (! cityActorIsIn.getCitizens().contains(actor.getObjectID())){ + building.setAttachment("structureCity", cityActorIsIn.getCityID()); + // actor.setAttachment("residentCity", cityActorIsIn.getCityID()); He must do it manually + cityActorIsIn.addCitizen(actor.getObjectID()); + cityActorIsIn.addNewStructure(building.getObjectID()); + } } } From f7fc2dbb2eca2513481c81f54ee90151b4cfb4a8 Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 21:04:52 +0100 Subject: [PATCH 12/27] Add gmflag bypass, fix char delete on wiped odb Put in nge.cfg: ADMIN=1 --- src/services/LoginService.java | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 5f72c715..bad84964 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -26,6 +26,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Map; +import java.util.Properties; import java.util.Random; import java.util.concurrent.ScheduledExecutorService; @@ -42,7 +43,6 @@ import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import engine.resources.service.LocalDbLoginProvider; import engine.resources.service.VBLoginProvider; - import protocol.swg.CharacterCreationDisabled; import protocol.swg.ClientUIErrorMessage; import protocol.swg.DeleteCharacterMessage; @@ -56,7 +56,6 @@ import protocol.swg.ServerNowEpochTime; import protocol.swg.StationIdHasJediSlot; import resources.common.*; import resources.datatables.PlayerFlags; - import resources.objects.creature.CreatureObject; @SuppressWarnings("unused") @@ -206,7 +205,12 @@ public class LoginService implements INetworkDispatch{ core.objectService.destroyObject(object); } - core.getSWGObjectODB().remove(object.getObjectID()); + try { + core.getSWGObjectODB().remove(object.getObjectID()); + } catch (Exception e) { + + } + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(0); session.write(reply.serialize()); } @@ -224,7 +228,16 @@ public class LoginService implements INetworkDispatch{ } public boolean checkForGmPermission(int id) { + try { + if (core.getConfig().getInt("ADMIN") > 0) { + return true; + } + } catch (Exception e) { + + } + PreparedStatement preparedStatement; + try { preparedStatement = databaseConnection1.preparedStatement("SELECT * FROM accounts WHERE id=" + id + ""); ResultSet resultSet = preparedStatement.executeQuery(); @@ -233,6 +246,7 @@ public class LoginService implements INetworkDispatch{ } catch (SQLException e) { e.printStackTrace(); } + return false; } From 5e522cf03b085c4878cb3c6fd09cc4393c0a860b Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 21:12:45 +0100 Subject: [PATCH 13/27] Added getObjectByFirstName null checks --- src/services/object/ObjectService.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index a08928db..ab296ffd 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -548,9 +548,7 @@ public class ObjectService implements INetworkDispatch { } public SWGObject getObjectByFirstName(String customName) { - synchronized(objectList) { - for(SWGObject obj : objectList.values()) { if(obj.getCustomName() == null) continue; @@ -562,13 +560,15 @@ public class ObjectService implements INetworkDispatch { ODBCursor cursor = core.getSWGObjectODB().getCursor(); - while(cursor.hasNext()) { - if(((SWGObject) cursor.next()).getCustomName().startsWith(customName)) - return (SWGObject) cursor.next(); + while (cursor.hasNext()) { + SWGObject object = (SWGObject) cursor.next(); + + if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { + return object; + } } - + return null; - } public CreatureObject getCreatureFromDB(long objectId) { From cdbf244b27b7d6cdf1f6810bb108bccb9e84d9ee Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 21:14:49 +0100 Subject: [PATCH 14/27] Reset pvp bitmask on disconnect --- src/services/SimulationService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index ee8bfa50..a801a166 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -762,6 +762,8 @@ public class SimulationService implements INetworkDispatch { if(object.getAttachment("proposer") != null) object.setAttachment("proposer", null); + object.setPvPBitmask(0); + //session.suspendWrite(); final long objectId = object.getObjectID(); From 081a30b7da03a2db0b02c33984d8778608230f49 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Fri, 2 May 2014 22:19:30 +0200 Subject: [PATCH 15/27] dynamic spawn scripts added Commit frequency caused by ongoing odb refactoring --- scripts/mobiles/dynamicgroups/tuskens_wild_1.py | 15 +++++++++++++++ scripts/mobiles/spawnareas/tuskens_dynamic_1.py | 5 +++++ src/services/spawn/DynamicSpawnArea.java | 2 +- src/services/spawn/SpawnService.java | 3 ++- 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 scripts/mobiles/dynamicgroups/tuskens_wild_1.py create mode 100644 scripts/mobiles/spawnareas/tuskens_dynamic_1.py diff --git a/scripts/mobiles/dynamicgroups/tuskens_wild_1.py b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py new file mode 100644 index 00000000..4311c189 --- /dev/null +++ b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py @@ -0,0 +1,15 @@ +import sys +from services.spawn import DynamicSpawnGroup +from services.spawn import MobileTemplate +from java.util import Vector + +def addDynamicGroup(core): + dynamicGroup = DynamicSpawnGroup() + mobileTemplates = Vector() + mobileTemplates.add('tusken_raider') + dynamicGroup.setMobiles(mobileTemplates) + dynamicGroup.setName('tuskens_wild_1') + dynamicGroup.setMaxSpawns(20) + dynamicGroup.setMinSpawnDistance(2) + core.spawnService.addDynamicGroup('tuskens_wild_1', dynamicGroup) + return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py new file mode 100644 index 00000000..3ef2829a --- /dev/null +++ b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py @@ -0,0 +1,5 @@ +import sys + +def addSpawnArea(core): + core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 3860, -4784, 2048, 'tatooine') + return \ No newline at end of file diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index b47c9a65..210c8183 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -52,7 +52,7 @@ public class DynamicSpawnArea extends SpawnArea { @Override @Handler public void onEnter(EnterEvent event) { - + System.err.println("We got a spawn!!!!!!!!!!!!!"); SWGObject object = event.object; if(object == null || !(object instanceof CreatureObject)) diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index b388cd47..07564577 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -252,7 +252,8 @@ public class SpawnService { FileVisitor fv = new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - if(!file.toString().contains("lairs") && !file.toString().contains("spawnareas") && !file.toString().contains("lairgroups")) + if(!file.toString().contains("lairs") && !file.toString().contains("spawnareas") + && !file.toString().contains("lairgroups") && !file.toString().contains("dynamicgroups")) core.scriptService.callScript(file.toString().replace(file.getFileName().toString(), ""), file.getFileName().toString().replace(".py", ""), "addTemplate", core); return FileVisitResult.CONTINUE; } From 57dcb72718c486bab5665ab0f76c7632905d1e4b Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 21:24:37 +0100 Subject: [PATCH 16/27] Additional null checks --- src/services/object/ObjectService.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 6f527e4f..93048051 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -524,6 +524,9 @@ public class ObjectService implements INetworkDispatch { } public SWGObject getObjectByCustomName(String customName) { + if (customName == null) { + return null; + } synchronized(objectList) { @@ -538,16 +541,22 @@ public class ObjectService implements INetworkDispatch { ODBCursor cursor = core.getSWGObjectODB().getCursor(); - while(cursor.hasNext()) { - if(((SWGObject) cursor.next()).getCustomName().equals(customName)) - return (SWGObject) cursor.next(); + while (cursor.hasNext()) { + SWGObject object = (SWGObject) cursor.next(); + + if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().equals(customName)) { + return object; + } } - + return null; - } public SWGObject getObjectByFirstName(String customName) { + if (customName == null) { + return null; + } + synchronized(objectList) { for(SWGObject obj : objectList.values()) { if(obj.getCustomName() == null) From 47da295c0083545d6a2e77b236676a80e409839c Mon Sep 17 00:00:00 2001 From: tacef Date: Fri, 2 May 2014 22:27:40 +0200 Subject: [PATCH 17/27] Altered recruiters to fit faction changes --- scripts/conversation/imp_recruiter.py | 2 +- scripts/conversation/reb_recruiter.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/conversation/imp_recruiter.py b/scripts/conversation/imp_recruiter.py index 399294b1..7659eb4b 100644 --- a/scripts/conversation/imp_recruiter.py +++ b/scripts/conversation/imp_recruiter.py @@ -546,7 +546,7 @@ def handleSecondScreen(core, actor, npc, selection): def handleThirdScreen(core, actor, npc, selection): if selection == 0: core.conversationService.sendStopConversation(actor, npc, 'conversation/faction_recruiter_imperial', 's_94') - actor.setFaction('neutral') + actor.setFaction('') return if selection == 1: diff --git a/scripts/conversation/reb_recruiter.py b/scripts/conversation/reb_recruiter.py index 0ec3ecd7..6cc16459 100644 --- a/scripts/conversation/reb_recruiter.py +++ b/scripts/conversation/reb_recruiter.py @@ -546,7 +546,7 @@ def handleSecondScreen(core, actor, npc, selection): def handleThirdScreen(core, actor, npc, selection): if selection == 0: core.conversationService.sendStopConversation(actor, npc, 'conversation/faction_recruiter_rebel', 's_58') - actor.setFaction('neutral') + actor.setFaction('') return if selection == 1: From 8b1f20cdce520ea900778d6f50c1987682c19f7f Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Fri, 2 May 2014 16:50:09 -0400 Subject: [PATCH 18/27] Removed Reset Expertise From Frog This is no longer needed now that you can respec expertise properly from NPC. --- src/services/DevService.java | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/services/DevService.java b/src/services/DevService.java index 270587d7..01d3d532 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -31,7 +31,6 @@ import java.util.Vector; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; -import protocol.swg.ExpertiseRequestMessage; import resources.common.Console; import resources.common.FileUtilities; import resources.common.Opcodes; @@ -79,7 +78,6 @@ public class DevService implements INetworkDispatch { case 1: // Character suiOptions.put((long) 10, "Set combat level to 90"); suiOptions.put((long) 11, "Give 100,000 credits"); - suiOptions.put((long) 12, "Reset expertise"); break; case 2: // Items suiOptions.put((long) 20, "Armor"); @@ -171,18 +169,7 @@ public class DevService implements INetworkDispatch { case 11: // Give 100,000 credits player.setCashCredits(player.getCashCredits() + 100000); return; - case 12: // Reset expertise - // Seefo->Light: I commented out the below line because it gave us an error and didn't properly remove the skill, could you try the method SWGList.reverseGet that I added? - //player.getSkills().get().stream().filter(s -> s.contains("expertise")).forEach(s -> core.skillService.removeSkill(creature, s)); - - // Using this for now - for(int i = creature.getSkills().size() - 1; i >= 0; i-- ) - { - String skill = creature.getSkills().get(i); - if(skill.contains("expertise")) core.skillService.removeSkill(player, skill); - } - return; - + // Items case 20: // Armor sendCharacterBuilderSUI(player, 5); From ff827a290207cf1f5886db19ba3c7733bb2413f2 Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 22:08:13 +0100 Subject: [PATCH 19/27] Fixed null error --- src/services/object/ObjectService.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 93048051..5d10d7fe 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -544,7 +544,11 @@ public class ObjectService implements INetworkDispatch { while (cursor.hasNext()) { SWGObject object = (SWGObject) cursor.next(); - if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().equals(customName)) { + if (object == null) { + continue; + } + + if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().equals(customName)) { return object; } } @@ -572,7 +576,11 @@ public class ObjectService implements INetworkDispatch { while (cursor.hasNext()) { SWGObject object = (SWGObject) cursor.next(); - if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { + if (object == null) { + continue; + } + + if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { return object; } } From 9cb7b38aac4fd0589fce24dea24d64e0009de40f Mon Sep 17 00:00:00 2001 From: Treeku Date: Fri, 2 May 2014 22:52:19 +0100 Subject: [PATCH 20/27] Fixed strength_modified.py --- scripts/skillMods/strength_modified.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/skillMods/strength_modified.py b/scripts/skillMods/strength_modified.py index 45ac9940..469cc568 100644 --- a/scripts/skillMods/strength_modified.py +++ b/scripts/skillMods/strength_modified.py @@ -4,7 +4,7 @@ def add(core, actor, skillMod, divisor): core.skillModService.addSkillMod(actor, 'display_only_block', skillMod.getBase() / 2) return -def deduct(core, actor, name, base): +def deduct(core, actor, skillMod, divisor): core.skillModService.deductSkillMod(actor, 'display_only_block', skillMod.getBase() / 2) return \ No newline at end of file From 1833f821fa015cd316544812c83c96e38a570618 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 3 May 2014 00:42:25 +0200 Subject: [PATCH 21/27] Taking into account fixed member groups --- .../dynamicgroups/force_sensitives_wild_1.py | 24 ++++++ .../spawnareas/force_sensitives_dynamic_1.py | 5 ++ src/services/object/ObjectService.java | 11 ++- src/services/spawn/DynamicSpawnArea.java | 83 ++++++++++++++++--- src/services/spawn/DynamicSpawnGroup.java | 27 ++++++ 5 files changed, 137 insertions(+), 13 deletions(-) create mode 100644 scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py create mode 100644 scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py diff --git a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py new file mode 100644 index 00000000..6a10889e --- /dev/null +++ b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py @@ -0,0 +1,24 @@ +import sys +from services.spawn import DynamicSpawnGroup +from services.spawn import MobileTemplate +from java.util import Vector + +def addDynamicGroup(core): + dynamicGroup = DynamicSpawnGroup() + mobileTemplates = Vector() + mobileTemplates.add('tusken_raider') + mobileTemplates.add('tusken_raider') + mobileTemplates.add('tusken_raider') + dynamicGroup.setMobiles(mobileTemplates) + memberCLs = Vector() + memberCLs.add(72) + memberCLs.add(90) + memberCLs.add(90) + dynamicGroup.setmemberCLs(memberCLs) + dynamicGroup.setGroupMemberNumber(3) + dynamicGroup.setName('force_sensitives_wild_1') + dynamicGroup.setMaxSpawns(20) + dynamicGroup.setMinSpawnDistance(2) + dynamicGroup.setMaxSpawnDistance(4) + core.spawnService.addDynamicGroup('force_sensitives_wild_1', dynamicGroup) + return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py new file mode 100644 index 00000000..608e901c --- /dev/null +++ b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py @@ -0,0 +1,5 @@ +import sys + +def addSpawnArea(core): + core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 3860, -4784, 2048, 'tatooine') + return \ No newline at end of file diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 93048051..6fcebc55 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -23,6 +23,7 @@ package services.object; import java.io.FileNotFoundException; import java.io.IOException; +import java.lang.reflect.Method; import java.nio.ByteOrder; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -571,9 +572,13 @@ public class ObjectService implements INetworkDispatch { while (cursor.hasNext()) { SWGObject object = (SWGObject) cursor.next(); - - if (object != null && object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { - return object; + + if (object == null) { + continue; + } + + if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { + return object; } } diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index 210c8183..0f2499aa 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -52,7 +52,7 @@ public class DynamicSpawnArea extends SpawnArea { @Override @Handler public void onEnter(EnterEvent event) { - System.err.println("We got a spawn!!!!!!!!!!!!!"); + SWGObject object = event.object; if(object == null || !(object instanceof CreatureObject)) @@ -65,8 +65,13 @@ public class DynamicSpawnArea extends SpawnArea { creature.getEventBus().subscribe(this); // spawn some creatures - for(int i = 0; i < 5; i++) - spawnCreature(creature); + if (spawnGroup.getGroupMemberNumber()==-1){ + for(int i = 0; i < 5; i++) + spawnCreature(creature); + } else { + for(int i = 0; i < spawnGroup.getGroupMemberNumber(); i++) // A group with a specified number of members + spawnCreatureMember(creature, i); + } } @@ -108,7 +113,7 @@ public class DynamicSpawnArea extends SpawnArea { private void spawnCreature(CreatureObject creature) { - + NGECore core = NGECore.getInstance(); Iterator it = mobiles.iterator(); @@ -119,7 +124,7 @@ public class DynamicSpawnArea extends SpawnArea { if(mobiles.size() >= spawnGroup.getMaxSpawns()) return; - + boolean foundPos = false; int tries = 0; Point3D randomPosition = null; @@ -136,10 +141,12 @@ public class DynamicSpawnArea extends SpawnArea { float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); randomPosition.y = height; - for(CreatureObject mobile : mobiles) { - if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) - foundPos = true; - } + if (mobiles.size()>0){ // Fix, mobiles must be filled first, before doing this check + for(CreatureObject mobile : mobiles) { + if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) + foundPos = true; + } + } else {foundPos = true;} if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) foundPos = false; @@ -153,8 +160,64 @@ public class DynamicSpawnArea extends SpawnArea { String mobileTemplate = spawnGroup.getMobiles().get(random.nextInt(spawnGroup.getMobiles().size())); CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); - if(spawnedCreature != null) + if(spawnedCreature != null){ mobiles.add(spawnedCreature); + } + + } + + + private void spawnCreatureMember(CreatureObject creature, int spawnIndex) { + + NGECore core = NGECore.getInstance(); + + Iterator it = mobiles.iterator(); + it.forEachRemaining(mobile -> { + if(mobile.getPosture() == Posture.Dead) + it.remove(); + }); + + if(mobiles.size() >= spawnGroup.getMaxSpawns()) + return; + + short memberCL = (spawnGroup.getMembersCL().get(spawnIndex)).shortValue(); + + boolean foundPos = false; + int tries = 0; + Point3D randomPosition = null; + + while(!foundPos && ++tries < 10) { + + randomPosition = getRandomPosition(creature.getWorldPosition(), spawnGroup.getMinSpawnDistance(), spawnGroup.getMaxSpawnDistance()); + + if(randomPosition == null) + return; + + TerrainService terrainSvc = core.terrainService; + + float height = terrainSvc.getHeight(getPlanet().getID(), randomPosition.x, randomPosition.z); + randomPosition.y = height; + + if (mobiles.size()>0){ // Fix, mobiles must be filled first, before doing this check + for(CreatureObject mobile : mobiles) { + if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) + foundPos = true; + } + } else {foundPos = true;} + + if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) + foundPos = false; + + } + + if(!foundPos) + return; + + String mobileTemplate = spawnGroup.getMobiles().get(spawnIndex); + CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z, memberCL); + if(spawnedCreature != null){ + mobiles.add(spawnedCreature); + } } diff --git a/src/services/spawn/DynamicSpawnGroup.java b/src/services/spawn/DynamicSpawnGroup.java index a29f6ae2..db5acc5d 100644 --- a/src/services/spawn/DynamicSpawnGroup.java +++ b/src/services/spawn/DynamicSpawnGroup.java @@ -29,6 +29,9 @@ public class DynamicSpawnGroup { private String name; private int maxSpawns; private int minSpawnDistance; + private int maxSpawnDistance; + private int groupMemberNumber = -1; + private Vector membersCL; public Vector getMobiles() { return mobiles; @@ -61,5 +64,29 @@ public class DynamicSpawnGroup { public void setMinSpawnDistance(int minSpawnDistance) { this.minSpawnDistance = minSpawnDistance; } + + public int getGroupMemberNumber() { + return groupMemberNumber; + } + + public void setGroupMemberNumber(int groupMemberNumber) { + this.groupMemberNumber = groupMemberNumber; + } + + public int getMaxSpawnDistance() { + return maxSpawnDistance; + } + + public void setMaxSpawnDistance(int maxSpawnDistance) { + this.maxSpawnDistance = maxSpawnDistance; + } + + public Vector getMembersCL() { + return membersCL; + } + + public void setMembersCL(Vector membersCL) { + this.membersCL = membersCL; + } } From e7084fcd0f32580a4b312687e214d1d3cd7195ce Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Fri, 2 May 2014 21:50:56 -0400 Subject: [PATCH 22/27] Bad Odds Ability Now Grants at Correct Levels These are now the correct levels. (checked from game client) --- scripts/expertise/expertise_sm_general_bad_odds_1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/expertise/expertise_sm_general_bad_odds_1.py b/scripts/expertise/expertise_sm_general_bad_odds_1.py index fa70a2fc..5435e2e9 100644 --- a/scripts/expertise/expertise_sm_general_bad_odds_1.py +++ b/scripts/expertise/expertise_sm_general_bad_odds_1.py @@ -1,15 +1,15 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 26: - actor.addAbility("sm_bad_odds_1") if actor.getLevel() >= 34: + actor.addAbility("sm_bad_odds_1") + if actor.getLevel() >= 46: actor.addAbility("sm_bad_odds_2") - if actor.getLevel() >= 48: + if actor.getLevel() >= 58: actor.addAbility("sm_bad_odds_3") - if actor.getLevel() >= 62: + if actor.getLevel() >= 74: actor.addAbility("sm_bad_odds_4") - if actor.getLevel() >= 76: + if actor.getLevel() >= 84: actor.addAbility("sm_bad_odds_5") return From 818bce44fc1b8ca087b8c00f63da42998f9c39c1 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Fri, 2 May 2014 21:56:45 -0400 Subject: [PATCH 23/27] Shoot First Abilities Now Grants at Correct Levels These are now the correct levels. (checked from game client) --- scripts/expertise/expertise_sm_path_shoot_first_1.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/expertise/expertise_sm_path_shoot_first_1.py b/scripts/expertise/expertise_sm_path_shoot_first_1.py index 3cfcce30..3dbc049f 100644 --- a/scripts/expertise/expertise_sm_path_shoot_first_1.py +++ b/scripts/expertise/expertise_sm_path_shoot_first_1.py @@ -1,15 +1,15 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 26: - actor.addAbility("sm_shoot_first_1") if actor.getLevel() >= 34: + actor.addAbility("sm_shoot_first_1") + if actor.getLevel() >= 46: actor.addAbility("sm_shoot_first_2") - if actor.getLevel() >= 48: - actor.addAbility("sm_shoot_first_3") if actor.getLevel() >= 62: + actor.addAbility("sm_shoot_first_3") + if actor.getLevel() >= 74: actor.addAbility("sm_shoot_first_4") - if actor.getLevel() >= 76: + if actor.getLevel() >= 90: actor.addAbility("sm_shoot_first_5") return From 5a012f28b7f6ee731d8725f7864634dc2794a340 Mon Sep 17 00:00:00 2001 From: Mesagoppinmypants Date: Fri, 2 May 2014 22:05:38 -0400 Subject: [PATCH 24/27] Supply Drop Abilities Now Grant at Correct Levels --- scripts/expertise/expertise_of_medical_sup_1.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/expertise/expertise_of_medical_sup_1.py b/scripts/expertise/expertise_of_medical_sup_1.py index fe15a79d..3b3e1915 100644 --- a/scripts/expertise/expertise_of_medical_sup_1.py +++ b/scripts/expertise/expertise_of_medical_sup_1.py @@ -1,17 +1,17 @@ import sys def addAbilities(core, actor, player): - if actor.getLevel() >= 10: + if actor.getLevel() >= 18: actor.addAbility("of_medical_sup_1") - if actor.getLevel() >= 34: + if actor.getLevel() >= 30: actor.addAbility("of_medical_sup_2") - if actor.getLevel() >= 48: + if actor.getLevel() >= 44: actor.addAbility("of_medical_sup_3") - if actor.getLevel() >= 62: + if actor.getLevel() >= 58: actor.addAbility("of_medical_sup_4") - if actor.getLevel() >= 76: + if actor.getLevel() >= 72: actor.addAbility("of_medical_sup_5") - if actor.getLevel() >= 90: + if actor.getLevel() >= 86: actor.addAbility("of_medical_sup_6") return From 488e6692903995a25c68938f7a9e08ee611e511d Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 3 May 2014 04:52:52 +0200 Subject: [PATCH 25/27] More work on parameters of group members --- scripts/mobiles/dantooine/dark_adept.py | 40 +++++++++++ .../dantooine/dark_force_crystal_hunter.py | 37 ++++++++++ scripts/mobiles/dantooine/dark_jedi_knight.py | 62 +++++++++++++++++ scripts/mobiles/dantooine/dark_jedi_master.py | 44 ++++++++++++ scripts/mobiles/dantooine/dark_side_savage.py | 37 ++++++++++ .../force_sensitive_crypt_crawler.py | 37 ++++++++++ .../dantooine/force_sensitive_renegade.py | 37 ++++++++++ .../dantooine/forsaken_force_drifter.py | 37 ++++++++++ .../mobiles/dantooine/novice_force_mystic.py | 37 ++++++++++ .../untrained_wielder_of_the_dark_side.py | 37 ++++++++++ .../dynamicgroups/force_sensitives_wild_1.py | 18 ++--- .../spawnareas/force_sensitives_dynamic_1.py | 2 +- .../mobiles/spawnareas/tuskens_dynamic_1.py | 2 +- src/services/DevService.java | 5 ++ src/services/object/ObjectService.java | 11 --- src/services/spawn/DynamicSpawnArea.java | 68 +++++++++++++------ src/services/spawn/DynamicSpawnGroup.java | 28 ++------ src/services/spawn/MobileTemplate.java | 45 ++++++++++++ src/services/spawn/SpawnService.java | 22 +++++- 19 files changed, 536 insertions(+), 70 deletions(-) create mode 100644 scripts/mobiles/dantooine/dark_adept.py create mode 100644 scripts/mobiles/dantooine/dark_force_crystal_hunter.py create mode 100644 scripts/mobiles/dantooine/dark_jedi_knight.py create mode 100644 scripts/mobiles/dantooine/dark_jedi_master.py create mode 100644 scripts/mobiles/dantooine/dark_side_savage.py create mode 100644 scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py create mode 100644 scripts/mobiles/dantooine/force_sensitive_renegade.py create mode 100644 scripts/mobiles/dantooine/forsaken_force_drifter.py create mode 100644 scripts/mobiles/dantooine/novice_force_mystic.py create mode 100644 scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py diff --git a/scripts/mobiles/dantooine/dark_adept.py b/scripts/mobiles/dantooine/dark_adept.py new file mode 100644 index 00000000..5a0df6df --- /dev/null +++ b/scripts/mobiles/dantooine/dark_adept.py @@ -0,0 +1,40 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('dark_adept') + mobileTemplate.setLevel(70) + mobileTemplate.setMinLevel(60) + mobileTemplate.setMaxLevel(70) + mobileTemplate.setDifficulty(1) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(8) + mobileTemplate.setDeathblow(True) + + + templates = Vector() + templates.add('object/mobile/shared_dressed_dark_jedi_elder_male_human_01.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('dark_adept', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py new file mode 100644 index 00000000..219b5091 --- /dev/null +++ b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('dark_force_crystal_hunter') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_dark_force_crystal_hunter.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('dark_force_crystal_hunter', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/dark_jedi_knight.py b/scripts/mobiles/dantooine/dark_jedi_knight.py new file mode 100644 index 00000000..337b7b82 --- /dev/null +++ b/scripts/mobiles/dantooine/dark_jedi_knight.py @@ -0,0 +1,62 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('dark_jedi_knight') + mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(62) + mobileTemplate.setMaxLevel(70) + mobileTemplate.setDifficulty(1) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(5) + mobileTemplate.setDeathblow(True) + + templates = Vector() + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_03.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_04.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_05.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_human_06.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_twk_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_twk_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_twk_03.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_zab_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_zab_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_male_zab_03.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_human_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_human_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_human_03.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_human_04.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_twk_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_twk_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_twk_03.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_zab_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_zab_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_female_zab_03.iff') + + + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('dark_jedi_knight', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/dark_jedi_master.py b/scripts/mobiles/dantooine/dark_jedi_master.py new file mode 100644 index 00000000..8ad845e3 --- /dev/null +++ b/scripts/mobiles/dantooine/dark_jedi_master.py @@ -0,0 +1,44 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('dark_jedi_master') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(2) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(5) + mobileTemplate.setDeathblow(True) + + templates = Vector() + templates.add('object/mobile/shared_dressed_dark_jedi_master_female_twk_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_female_twk_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_female_zab_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_female_zab_02.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_male_human_01.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_male_human_04.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_male_human_05.iff') + templates.add('object/mobile/shared_dressed_dark_jedi_master_male_human_06.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('dark_jedi_master', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/dark_side_savage.py b/scripts/mobiles/dantooine/dark_side_savage.py new file mode 100644 index 00000000..698c9c9d --- /dev/null +++ b/scripts/mobiles/dantooine/dark_side_savage.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('eow_dark_side_savage') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_dark_side_savage.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('dark_side_savage', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py new file mode 100644 index 00000000..aee43eee --- /dev/null +++ b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('eow_force_sensitive_crypt_crawler') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_force_sensitive_crypt_crawler.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('force_sensitive_crypt_crawler', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/force_sensitive_renegade.py b/scripts/mobiles/dantooine/force_sensitive_renegade.py new file mode 100644 index 00000000..dab96945 --- /dev/null +++ b/scripts/mobiles/dantooine/force_sensitive_renegade.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('Force_sensitive_Renegade') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_force_sensitive_renegade.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('force_sensitive_renegade', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/forsaken_force_drifter.py b/scripts/mobiles/dantooine/forsaken_force_drifter.py new file mode 100644 index 00000000..52e0a5a3 --- /dev/null +++ b/scripts/mobiles/dantooine/forsaken_force_drifter.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('eow_forsaken_force_drifter') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_forsaken_force_drifter.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('forsaken_force_drifter', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/novice_force_mystic.py b/scripts/mobiles/dantooine/novice_force_mystic.py new file mode 100644 index 00000000..b89227fb --- /dev/null +++ b/scripts/mobiles/dantooine/novice_force_mystic.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('novice_force_mystic') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_novice_force_mystic.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('novice_force_mystic', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py new file mode 100644 index 00000000..71623d04 --- /dev/null +++ b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py @@ -0,0 +1,37 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('untrained_wielder_of_the_dark_side') + mobileTemplate.setLevel(90) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + mobileTemplate.setMinSpawnDistance(2) + mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setDeathblow(False) + + templates = Vector() + templates.add('object/mobile/shared_dressed_untrained_wielder_of_the_darkside.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/sword/crafted_saber/shared_sword_lightsaber_one_handed_gen5.iff', 9, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/melee/polearm/crafted_saber/shared_sword_lightsaber_polearm_gen5.iff', 11, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('untrained_wielder_of_the_dark_side', mobileTemplate) + \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py index 6a10889e..2281f370 100644 --- a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py +++ b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py @@ -6,19 +6,13 @@ from java.util import Vector def addDynamicGroup(core): dynamicGroup = DynamicSpawnGroup() mobileTemplates = Vector() - mobileTemplates.add('tusken_raider') - mobileTemplates.add('tusken_raider') - mobileTemplates.add('tusken_raider') + mobileTemplates.add('dark_jedi_master') + mobileTemplates.add('dark_jedi_knight') + mobileTemplates.add('dark_adept') dynamicGroup.setMobiles(mobileTemplates) - memberCLs = Vector() - memberCLs.add(72) - memberCLs.add(90) - memberCLs.add(90) - dynamicGroup.setmemberCLs(memberCLs) - dynamicGroup.setGroupMemberNumber(3) + dynamicGroup.setGroupMembersNumber(3) dynamicGroup.setName('force_sensitives_wild_1') - dynamicGroup.setMaxSpawns(20) - dynamicGroup.setMinSpawnDistance(2) - dynamicGroup.setMaxSpawnDistance(4) + dynamicGroup.setMaxSpawns(-1) + dynamicGroup.setMinSpawnDistance(150) core.spawnService.addDynamicGroup('force_sensitives_wild_1', dynamicGroup) return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py index 608e901c..f2d14b80 100644 --- a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py +++ b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py @@ -1,5 +1,5 @@ import sys def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 3860, -4784, 2048, 'tatooine') + core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 4083, 5780, 2048, 'dantooine') return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py index 3ef2829a..d807e384 100644 --- a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py +++ b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py @@ -1,5 +1,5 @@ import sys def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 3860, -4784, 2048, 'tatooine') + core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 4193, -4724, 200, 'tatooine') return \ No newline at end of file diff --git a/src/services/DevService.java b/src/services/DevService.java index 01d3d532..8f3822bb 100644 --- a/src/services/DevService.java +++ b/src/services/DevService.java @@ -90,6 +90,7 @@ public class DevService implements INetworkDispatch { if(creature.getClient().isGM()) suiOptions.put((long) 125, "Crafting Tools"); if(creature.getClient().isGM()) suiOptions.put((long) 130, "Vehicle Deeds"); if(creature.getClient().isGM()) suiOptions.put((long) 121, "Sandbox City"); + if(creature.getClient().isGM()) suiOptions.put((long) 122, "Jedi Ruins"); break; case 3: // [Items] Weapons @@ -1167,6 +1168,10 @@ public class DevService implements INetworkDispatch { case 121: NGECore.getInstance().playerCityService.buildSandboxTestCity(player); + + case 122: + Point3D position = new Point3D(4086,15,5554); + core.simulationService.transferToPlanet(player, core.terrainService.getPlanetByName("dantooine"), position, player.getOrientation(), null); case 125: TangibleObject genericCraftingTool = (TangibleObject) core.objectService.createObject("object/tangible/crafting/station/shared_generic_tool.iff", planet); diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 4bb58d2e..5d10d7fe 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -23,7 +23,6 @@ package services.object; import java.io.FileNotFoundException; import java.io.IOException; -import java.lang.reflect.Method; import java.nio.ByteOrder; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -576,15 +575,6 @@ public class ObjectService implements INetworkDispatch { while (cursor.hasNext()) { SWGObject object = (SWGObject) cursor.next(); -<<<<<<< HEAD - - if (object == null) { - continue; - } - - if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { - return object; -======= if (object == null) { continue; @@ -592,7 +582,6 @@ public class ObjectService implements INetworkDispatch { if (object.getCustomName() != null && customName.length() > 0 && object.getCustomName().startsWith(customName)) { return object; ->>>>>>> origin/master } } diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index 0f2499aa..76078c99 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -65,12 +65,16 @@ public class DynamicSpawnArea extends SpawnArea { creature.getEventBus().subscribe(this); // spawn some creatures - if (spawnGroup.getGroupMemberNumber()==-1){ + if (spawnGroup.getGroupMembersNumber()==0){ for(int i = 0; i < 5; i++) spawnCreature(creature); } else { - for(int i = 0; i < spawnGroup.getGroupMemberNumber(); i++) // A group with a specified number of members - spawnCreatureMember(creature, i); + Vector groupMembers = new Vector(); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } } } @@ -106,8 +110,18 @@ public class DynamicSpawnArea extends SpawnArea { if(creature.getSlottedObject("ghost") == null) return; - if(new Random().nextFloat() <= 0.25) - spawnCreature(creature); + if (spawnGroup.getGroupMembersNumber()==0){ + if(new Random().nextFloat() <= 0.25) + spawnCreature(creature); + } else + { + Vector groupMembers = new Vector(); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } + } } @@ -167,8 +181,8 @@ public class DynamicSpawnArea extends SpawnArea { } - private void spawnCreatureMember(CreatureObject creature, int spawnIndex) { - + private CreatureObject spawnCreatureMember(CreatureObject creature, Vector groupMembers, int spawnIndex) { + System.out.println("spawnCreatureMember"); NGECore core = NGECore.getInstance(); Iterator it = mobiles.iterator(); @@ -177,21 +191,29 @@ public class DynamicSpawnArea extends SpawnArea { it.remove(); }); - if(mobiles.size() >= spawnGroup.getMaxSpawns()) - return; - - short memberCL = (spawnGroup.getMembersCL().get(spawnIndex)).shortValue(); +// if(mobiles.size() >= spawnGroup.getMaxSpawns()) +// return; boolean foundPos = false; int tries = 0; Point3D randomPosition = null; + String template = spawnGroup.getMobiles().get(spawnIndex); + MobileTemplate mobileTemplate = NGECore.getInstance().spawnService.getMobileTemplate(template); + if (mobileTemplate==null) + return null; - while(!foundPos && ++tries < 10) { - randomPosition = getRandomPosition(creature.getWorldPosition(), spawnGroup.getMinSpawnDistance(), spawnGroup.getMaxSpawnDistance()); + for (CreatureObject cr : groupMembers){ + System.out.println("cr " + cr.getTemplate()); + } + + + while(!foundPos && ++tries < 30) { + + randomPosition = getRandomPosition(creature.getWorldPosition(), mobileTemplate.getMinSpawnDistance(), mobileTemplate.getMaxSpawnDistance()); if(randomPosition == null) - return; + return null; TerrainService terrainSvc = core.terrainService; @@ -199,10 +221,16 @@ public class DynamicSpawnArea extends SpawnArea { randomPosition.y = height; if (mobiles.size()>0){ // Fix, mobiles must be filled first, before doing this check + boolean minDistViolated = false; for(CreatureObject mobile : mobiles) { - if(mobile.getWorldPosition().getDistance(randomPosition) > spawnGroup.getMinSpawnDistance()) - foundPos = true; + if(mobile.getWorldPosition().getDistance(randomPosition) < spawnGroup.getMinSpawnDistance() && ! groupMembers.contains(mobile)){ + minDistViolated = true; + } } + if (minDistViolated) + foundPos = false; + else + foundPos = true; } else {foundPos = true;} if(!terrainSvc.canBuildAtPosition(creature, randomPosition.x, randomPosition.z)) @@ -211,13 +239,15 @@ public class DynamicSpawnArea extends SpawnArea { } if(!foundPos) - return; + return null; - String mobileTemplate = spawnGroup.getMobiles().get(spawnIndex); - CreatureObject spawnedCreature = core.spawnService.spawnCreature(mobileTemplate, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z, memberCL); + + CreatureObject spawnedCreature = core.spawnService.spawnCreature(template, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); if(spawnedCreature != null){ mobiles.add(spawnedCreature); } + + return spawnedCreature; } diff --git a/src/services/spawn/DynamicSpawnGroup.java b/src/services/spawn/DynamicSpawnGroup.java index db5acc5d..da3df12e 100644 --- a/src/services/spawn/DynamicSpawnGroup.java +++ b/src/services/spawn/DynamicSpawnGroup.java @@ -29,9 +29,7 @@ public class DynamicSpawnGroup { private String name; private int maxSpawns; private int minSpawnDistance; - private int maxSpawnDistance; - private int groupMemberNumber = -1; - private Vector membersCL; + private int groupMembersNumber = -1; public Vector getMobiles() { return mobiles; @@ -65,28 +63,12 @@ public class DynamicSpawnGroup { this.minSpawnDistance = minSpawnDistance; } - public int getGroupMemberNumber() { - return groupMemberNumber; + public int getGroupMembersNumber() { + return groupMembersNumber; } - public void setGroupMemberNumber(int groupMemberNumber) { - this.groupMemberNumber = groupMemberNumber; - } - - public int getMaxSpawnDistance() { - return maxSpawnDistance; - } - - public void setMaxSpawnDistance(int maxSpawnDistance) { - this.maxSpawnDistance = maxSpawnDistance; - } - - public Vector getMembersCL() { - return membersCL; - } - - public void setMembersCL(Vector membersCL) { - this.membersCL = membersCL; + public void setGroupMembersNumber(int groupMembersNumber) { + this.groupMembersNumber = groupMembersNumber; } } diff --git a/src/services/spawn/MobileTemplate.java b/src/services/spawn/MobileTemplate.java index 92f19f75..7f02ff25 100644 --- a/src/services/spawn/MobileTemplate.java +++ b/src/services/spawn/MobileTemplate.java @@ -32,6 +32,8 @@ public class MobileTemplate { private int optionBitmask = Options.ATTACKABLE; private int pvpBitmask = PvpStatus.Attackable; private short level; + private short minLevel; + private short maxLevel; private Vector attacks; private String defaultAttack; private int minDamage = 0; @@ -46,6 +48,9 @@ public class MobileTemplate { private int attackRange; private Vector weaponTemplates = new Vector(); private Vector weaponTemplateVector = new Vector(); + private int minSpawnDistance = 0; + private int maxSpawnDistance = 0; + private boolean deathblow = false; public Vector getTemplates() { return templates; @@ -190,4 +195,44 @@ public class MobileTemplate { public void setWeaponTemplateVector(Vector weaponTemplateVector) { this.weaponTemplateVector = weaponTemplateVector; } + + public int getMinSpawnDistance() { + return minSpawnDistance; + } + + public void setMinSpawnDistance(int minSpawnDistance) { + this.minSpawnDistance = minSpawnDistance; + } + + public int getMaxSpawnDistance() { + return maxSpawnDistance; + } + + public void setMaxSpawnDistance(int maxSpawnDistance) { + this.maxSpawnDistance = maxSpawnDistance; + } + + public short getMinLevel() { + return minLevel; + } + + public void setMinLevel(short minLevel) { + this.minLevel = minLevel; + } + + public short getMaxLevel() { + return maxLevel; + } + + public void setMaxLevel(short maxLevel) { + this.maxLevel = maxLevel; + } + + public boolean isDeathblow() { + return deathblow; + } + + public void setDeathblow(boolean deathblow) { + this.deathblow = deathblow; + } } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index 07564577..89d0a8c0 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -107,10 +107,19 @@ public class SpawnService { creature.setHeight(mobileTemplate.getScale()); int difficulty = mobileTemplate.getDifficulty(); creature.setDifficulty((byte) difficulty); + if(level != -1) creature.setLevel(level); - else - creature.setLevel(mobileTemplate.getLevel()); + else { + creature.setLevel(mobileTemplate.getLevel()); + level = mobileTemplate.getLevel(); + } + + if (mobileTemplate.getMinLevel()!=0 && mobileTemplate.getMaxLevel()!=0){ + level = (short) (mobileTemplate.getMinLevel() + (new Random().nextInt(mobileTemplate.getMaxLevel()-mobileTemplate.getMinLevel()))); + creature.setLevel(level); + } + //WeaponObject defaultWeapon = (mobileTemplate.getWeaponTemplates().size() > 0) ? (WeaponObject) core.objectService.createObject(mobileTemplate.getWeaponTemplates().get(new Random().nextInt(mobileTemplate.getWeaponTemplates().size())), creature.getPlanet()) : (WeaponObject) core.objectService.createObject("object/weapon/creature/shared_creature_default_weapon.iff", creature.getPlanet()); @@ -172,6 +181,7 @@ public class SpawnService { creature.setMaxAction((int) (400 + level * 134)); creature.setAction((int) (400 + level * 134)); } else { + System.out.println("HERE"); creature.setMaxHealth(customHealth); creature.setHealth(customHealth); creature.setMaxAction((int) (level * 128)); @@ -368,6 +378,12 @@ public class SpawnService { core.simulationService.addCollidable(collidableCircle, x, z); } - + public Map getMobileTemplates() { + return mobileTemplates; + } + + public MobileTemplate getMobileTemplate(String template) { + return mobileTemplates.get(template); + } } From 87da83614652f1edac8399a3712e1223e8e648f6 Mon Sep 17 00:00:00 2001 From: Treeku Date: Sat, 3 May 2014 06:17:34 +0100 Subject: [PATCH 26/27] Fixed tangibles in weapon-slot issue --- src/services/command/CommandService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index cf14b35a..c778a25f 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -91,9 +91,9 @@ public class CommandService implements INetworkDispatch { return false; } - WeaponObject weapon = (WeaponObject) core.objectService.getObject(actor.getWeaponId()); + TangibleObject weapon = (TangibleObject) core.objectService.getObject(actor.getWeaponId()); - if (weapon != null && weapon.getWeaponType() == command.getInvalidWeapon()) { + if (weapon != null && weapon instanceof WeaponObject && ((WeaponObject) weapon).getWeaponType() == command.getInvalidWeapon()) { return false; } From 05034b4d8387521253029ede0ce6b56e08cb672a Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sat, 3 May 2014 16:31:04 +0200 Subject: [PATCH 27/27] group spawn distances added Force sensitive groups now spawn at a distance to each other in random group member numbers. Loot added to FSs --- .../dantooine/dark_force_crystal_hunter.py | 4 +- scripts/mobiles/dantooine/dark_side_savage.py | 2 +- .../force_sensitive_crypt_crawler.py | 6 +- .../dantooine/force_sensitive_renegade.py | 8 +- .../dantooine/forsaken_force_drifter.py | 6 +- .../mobiles/dantooine/novice_force_mystic.py | 6 +- .../untrained_wielder_of_the_dark_side.py | 6 +- .../mobiles/dynamicgroups/dark_jedi_wild_1.py | 18 +++ .../dynamicgroups/force_sensitives_wild_1.py | 10 +- .../mobiles/dynamicgroups/tuskens_wild_1.py | 2 +- .../spawnareas/force_sensitives_dynamic_1.py | 6 +- .../mobiles/spawnareas/tuskens_dynamic_1.py | 2 +- .../dressed_dark_force_crystal_hunter.py | 25 +++- .../object/mobile/dressed_dark_side_savage.py | 19 ++- .../dressed_force_sensitive_crypt_crawler.py | 25 +++- .../dressed_force_sensitive_renegade.py | 25 +++- .../mobile/dressed_forsaken_force_drifter.py | 25 +++- .../mobile/dressed_novice_force_mystic.py | 25 +++- ...essed_untrained_wielder_of_the_darkside.py | 25 +++- src/services/spawn/DynamicSpawnArea.java | 136 ++++++++++++------ src/services/spawn/SpawnService.java | 21 ++- 21 files changed, 332 insertions(+), 70 deletions(-) create mode 100644 scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py diff --git a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py index 219b5091..0c6ded2a 100644 --- a/scripts/mobiles/dantooine/dark_force_crystal_hunter.py +++ b/scripts/mobiles/dantooine/dark_force_crystal_hunter.py @@ -8,13 +8,15 @@ def addTemplate(core): mobileTemplate.setCreatureName('dark_force_crystal_hunter') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(60) + mobileTemplate.setMaxLevel(69) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) mobileTemplate.setMinSpawnDistance(2) mobileTemplate.setMaxSpawnDistance(4) - mobileTemplate.setDeathblow(False) + mobileTemplate.setDeathblow(True) templates = Vector() templates.add('object/mobile/shared_dressed_dark_force_crystal_hunter.iff') diff --git a/scripts/mobiles/dantooine/dark_side_savage.py b/scripts/mobiles/dantooine/dark_side_savage.py index 698c9c9d..dee96f19 100644 --- a/scripts/mobiles/dantooine/dark_side_savage.py +++ b/scripts/mobiles/dantooine/dark_side_savage.py @@ -7,7 +7,7 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('eow_dark_side_savage') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(85) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) diff --git a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py index aee43eee..a74916a2 100644 --- a/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py +++ b/scripts/mobiles/dantooine/force_sensitive_crypt_crawler.py @@ -8,12 +8,14 @@ def addTemplate(core): mobileTemplate.setCreatureName('eow_force_sensitive_crypt_crawler') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(60) + mobileTemplate.setMaxLevel(70) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(5) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/force_sensitive_renegade.py b/scripts/mobiles/dantooine/force_sensitive_renegade.py index dab96945..8d3d4257 100644 --- a/scripts/mobiles/dantooine/force_sensitive_renegade.py +++ b/scripts/mobiles/dantooine/force_sensitive_renegade.py @@ -6,14 +6,16 @@ from java.util import Vector def addTemplate(core): mobileTemplate = MobileTemplate() - mobileTemplate.setCreatureName('Force_sensitive_Renegade') + mobileTemplate.setCreatureName('force_sensitive_renegade') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(61) + mobileTemplate.setMaxLevel(69) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(7) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/forsaken_force_drifter.py b/scripts/mobiles/dantooine/forsaken_force_drifter.py index 52e0a5a3..1fbc8e26 100644 --- a/scripts/mobiles/dantooine/forsaken_force_drifter.py +++ b/scripts/mobiles/dantooine/forsaken_force_drifter.py @@ -7,13 +7,13 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('eow_forsaken_force_drifter') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(74) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(3) + mobileTemplate.setMaxSpawnDistance(6) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/novice_force_mystic.py b/scripts/mobiles/dantooine/novice_force_mystic.py index b89227fb..d7313ad5 100644 --- a/scripts/mobiles/dantooine/novice_force_mystic.py +++ b/scripts/mobiles/dantooine/novice_force_mystic.py @@ -7,13 +7,13 @@ def addTemplate(core): mobileTemplate = MobileTemplate() mobileTemplate.setCreatureName('novice_force_mystic') - mobileTemplate.setLevel(90) + mobileTemplate.setLevel(63) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(7) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py index 71623d04..65f54e75 100644 --- a/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py +++ b/scripts/mobiles/dantooine/untrained_wielder_of_the_dark_side.py @@ -8,12 +8,14 @@ def addTemplate(core): mobileTemplate.setCreatureName('untrained_wielder_of_the_dark_side') mobileTemplate.setLevel(90) + mobileTemplate.setMinLevel(61) + mobileTemplate.setMaxLevel(70) mobileTemplate.setDifficulty(0) mobileTemplate.setAttackRange(6) mobileTemplate.setAttackSpeed(1.0) mobileTemplate.setWeaponType(9) - mobileTemplate.setMinSpawnDistance(2) - mobileTemplate.setMaxSpawnDistance(4) + mobileTemplate.setMinSpawnDistance(4) + mobileTemplate.setMaxSpawnDistance(6) mobileTemplate.setDeathblow(False) templates = Vector() diff --git a/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py b/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py new file mode 100644 index 00000000..3bf8c043 --- /dev/null +++ b/scripts/mobiles/dynamicgroups/dark_jedi_wild_1.py @@ -0,0 +1,18 @@ +import sys +from services.spawn import DynamicSpawnGroup +from services.spawn import MobileTemplate +from java.util import Vector + +def addDynamicGroup(core): + dynamicGroup = DynamicSpawnGroup() + mobileTemplates = Vector() + mobileTemplates.add('dark_jedi_master') + mobileTemplates.add('dark_jedi_knight') + mobileTemplates.add('dark_adept') + dynamicGroup.setMobiles(mobileTemplates) + dynamicGroup.setGroupMembersNumber(3) + dynamicGroup.setName('dark_jedi_wild_1') + dynamicGroup.setMaxSpawns(-1) + dynamicGroup.setMinSpawnDistance(150) + core.spawnService.addDynamicGroup('dark_jedi_wild_1', dynamicGroup) + return \ No newline at end of file diff --git a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py index 2281f370..9ee91b60 100644 --- a/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py +++ b/scripts/mobiles/dynamicgroups/force_sensitives_wild_1.py @@ -6,11 +6,13 @@ from java.util import Vector def addDynamicGroup(core): dynamicGroup = DynamicSpawnGroup() mobileTemplates = Vector() - mobileTemplates.add('dark_jedi_master') - mobileTemplates.add('dark_jedi_knight') - mobileTemplates.add('dark_adept') + mobileTemplates.add('force_sensitive_crypt_crawler') + mobileTemplates.add('force_sensitive_renegade') + mobileTemplates.add('forsaken_force_drifter') + mobileTemplates.add('novice_force_mystic') + mobileTemplates.add('untrained_wielder_of_the_dark_side') dynamicGroup.setMobiles(mobileTemplates) - dynamicGroup.setGroupMembersNumber(3) + dynamicGroup.setGroupMembersNumber(-3) dynamicGroup.setName('force_sensitives_wild_1') dynamicGroup.setMaxSpawns(-1) dynamicGroup.setMinSpawnDistance(150) diff --git a/scripts/mobiles/dynamicgroups/tuskens_wild_1.py b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py index 4311c189..472747c0 100644 --- a/scripts/mobiles/dynamicgroups/tuskens_wild_1.py +++ b/scripts/mobiles/dynamicgroups/tuskens_wild_1.py @@ -10,6 +10,6 @@ def addDynamicGroup(core): dynamicGroup.setMobiles(mobileTemplates) dynamicGroup.setName('tuskens_wild_1') dynamicGroup.setMaxSpawns(20) - dynamicGroup.setMinSpawnDistance(2) + dynamicGroup.setMinSpawnDistance(25) core.spawnService.addDynamicGroup('tuskens_wild_1', dynamicGroup) return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py index f2d14b80..6c7638ea 100644 --- a/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py +++ b/scripts/mobiles/spawnareas/force_sensitives_dynamic_1.py @@ -1,5 +1,9 @@ import sys +from java.util import Vector def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('force_sensitives_wild_1', 4083, 5780, 2048, 'dantooine') + dynamicGroups = Vector() + dynamicGroups.add('force_sensitives_wild_1') + dynamicGroups.add('dark_jedi_wild_1') + core.spawnService.addDynamicSpawnArea(dynamicGroups, 4083, 5780, 2048, 'dantooine') return \ No newline at end of file diff --git a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py index d807e384..4d9f5915 100644 --- a/scripts/mobiles/spawnareas/tuskens_dynamic_1.py +++ b/scripts/mobiles/spawnareas/tuskens_dynamic_1.py @@ -1,5 +1,5 @@ import sys def addSpawnArea(core): - core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 4193, -4724, 200, 'tatooine') + core.spawnService.addDynamicSpawnArea('tuskens_wild_1', 4310, -4786, 250, 'tatooine') return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_dark_force_crystal_hunter.py b/scripts/object/mobile/dressed_dark_force_crystal_hunter.py index ccad8904..dbbb65df 100644 --- a/scripts/object/mobile/dressed_dark_force_crystal_hunter.py +++ b/scripts/object/mobile/dressed_dark_force_crystal_hunter.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['sithholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_dark_side_savage.py b/scripts/object/mobile/dressed_dark_side_savage.py index ccad8904..70052ae4 100644 --- a/scripts/object/mobile/dressed_dark_side_savage.py +++ b/scripts/object/mobile/dressed_dark_side_savage.py @@ -1,4 +1,21 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py b/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py +++ b/scripts/object/mobile/dressed_force_sensitive_crypt_crawler.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_force_sensitive_renegade.py b/scripts/object/mobile/dressed_force_sensitive_renegade.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_force_sensitive_renegade.py +++ b/scripts/object/mobile/dressed_force_sensitive_renegade.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_forsaken_force_drifter.py b/scripts/object/mobile/dressed_forsaken_force_drifter.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_forsaken_force_drifter.py +++ b/scripts/object/mobile/dressed_forsaken_force_drifter.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_novice_force_mystic.py b/scripts/object/mobile/dressed_novice_force_mystic.py index ccad8904..2c42c975 100644 --- a/scripts/object/mobile/dressed_novice_force_mystic.py +++ b/scripts/object/mobile/dressed_novice_force_mystic.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['jediholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py b/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py index ccad8904..dbbb65df 100644 --- a/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py +++ b/scripts/object/mobile/dressed_untrained_wielder_of_the_darkside.py @@ -1,4 +1,27 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 65 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + lootPoolNames_2 = ['jedi_relic_1'] + lootPoolChances_2 = [100] + lootGroupChance_2 = 85 + object.addToLootGroups(lootPoolNames_2,lootPoolChances_2,lootGroupChance_2) + + lootPoolNames_3 = ['colorcrystals'] + lootPoolChances_3 = [100] + lootGroupChance_3 = 12 + object.addToLootGroups(lootPoolNames_3,lootPoolChances_3,lootGroupChance_3) + + lootPoolNames_4 = ['sithholocrons'] + lootPoolChances_4 = [100] + lootGroupChance_4 = 1 + object.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4) + + + + return \ No newline at end of file diff --git a/src/services/spawn/DynamicSpawnArea.java b/src/services/spawn/DynamicSpawnArea.java index 76078c99..388195c6 100644 --- a/src/services/spawn/DynamicSpawnArea.java +++ b/src/services/spawn/DynamicSpawnArea.java @@ -21,6 +21,7 @@ ******************************************************************************/ package services.spawn; +import java.util.Collections; import java.util.Iterator; import java.util.Random; import java.util.Vector; @@ -42,12 +43,18 @@ import engine.resources.scene.Point3D; public class DynamicSpawnArea extends SpawnArea { private DynamicSpawnGroup spawnGroup; + private Vector spawnGroups; private Vector mobiles = new Vector(); public DynamicSpawnArea(Planet planet, AbstractCollidable area, DynamicSpawnGroup spawnGroup) { super(planet, area); this.spawnGroup = spawnGroup; } + + public DynamicSpawnArea(Planet planet, AbstractCollidable area, Vector spawnGroups) { + super(planet, area); + this.spawnGroups = spawnGroups; + } @Override @Handler @@ -65,13 +72,31 @@ public class DynamicSpawnArea extends SpawnArea { creature.getEventBus().subscribe(this); // spawn some creatures - if (spawnGroup.getGroupMembersNumber()==0){ - for(int i = 0; i < 5; i++) - spawnCreature(creature); + if (spawnGroups==null){ + if (spawnGroup.getGroupMembersNumber()==-1){ + for(int i = 0; i < 5; i++) + spawnCreature(creature); + } else { + Vector groupMembers = new Vector(); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } + } } else { + // select randomly one of the spawngroups -> minimizes number of collidables for areas with multiple different NPC groups + // One spawnarea -> many NPC groups + int index = new Random().nextInt(spawnGroups.size()); + this.spawnGroup = spawnGroups.get(index); Vector groupMembers = new Vector(); - for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members - CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0) + spawnCount = Math.abs(spawnCount) + new Random().nextInt(spawnGroup.getMobiles().size()-Math.abs(spawnCount)); + for(int i = 0; i < spawnCount; i++) {// A group with a specified or random number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); if (spawnedCreature!=null) groupMembers.add(spawnedCreature); } @@ -109,15 +134,33 @@ public class DynamicSpawnArea extends SpawnArea { if(creature.getSlottedObject("ghost") == null) return; - - if (spawnGroup.getGroupMembersNumber()==0){ - if(new Random().nextFloat() <= 0.25) - spawnCreature(creature); - } else - { + + if (spawnGroups==null){ + if (spawnGroup.getGroupMembersNumber()==-1){ + if(new Random().nextFloat() <= 0.25) + spawnCreature(creature); + } else + { + Vector groupMembers = new Vector(); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); + if (spawnedCreature!=null) + groupMembers.add(spawnedCreature); + } + } + } else { + // select randomly one of the spawngroups -> minimizes number of collidables for areas with multiple different NPC groups + // One spawnarea -> many NPC groups + int index = new Random().nextInt(spawnGroups.size()); + this.spawnGroup = spawnGroups.get(index); Vector groupMembers = new Vector(); - for(int i = 0; i < spawnGroup.getGroupMembersNumber(); i++) {// A group with a specified number of members - CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, i); + Point3D randomGroupPosition = getRandomPosition(creature.getWorldPosition(), 32, 100); + int spawnCount = spawnGroup.getGroupMembersNumber(); + if (spawnCount<0) + spawnCount = Math.abs(spawnCount) + new Random().nextInt(spawnGroup.getMobiles().size()-Math.abs(spawnCount)); + for(int i = 0; i < spawnCount; i++) {// A group with a specified or random number of members + CreatureObject spawnedCreature = spawnCreatureMember(creature, groupMembers, randomGroupPosition, i); if (spawnedCreature!=null) groupMembers.add(spawnedCreature); } @@ -130,11 +173,19 @@ public class DynamicSpawnArea extends SpawnArea { NGECore core = NGECore.getInstance(); - Iterator it = mobiles.iterator(); - it.forEachRemaining(mobile -> { - if(mobile.getPosture() == Posture.Dead) - it.remove(); - }); +// Iterator it = mobiles.iterator(); // This stops further execution of this method for some reason +// it.forEachRemaining(mobile -> { +// if(mobile.getPosture() == Posture.Dead) +// it.remove(); +// }); + + mobiles.removeAll(Collections.singleton(null)); + Vector removers = new Vector(); + for (CreatureObject ob : mobiles){ + if (ob.getPosture() == Posture.Dead) + removers.add(ob); + } + mobiles.removeAll(removers); if(mobiles.size() >= spawnGroup.getMaxSpawns()) return; @@ -181,39 +232,45 @@ public class DynamicSpawnArea extends SpawnArea { } - private CreatureObject spawnCreatureMember(CreatureObject creature, Vector groupMembers, int spawnIndex) { - System.out.println("spawnCreatureMember"); + private CreatureObject spawnCreatureMember(CreatureObject creature, Vector groupMembers, Point3D randomGroupPosition, int spawnIndex) { + NGECore core = NGECore.getInstance(); - Iterator it = mobiles.iterator(); - it.forEachRemaining(mobile -> { - if(mobile.getPosture() == Posture.Dead) - it.remove(); - }); - +// Iterator it = mobiles.iterator(); // This stops further execution of this method for some reason +// it.forEachRemaining(mobile -> { +// if(mobile.getPosture() == Posture.Dead) +// it.remove(); +// }); + + mobiles.removeAll(Collections.singleton(null)); + Vector removers = new Vector(); + for (CreatureObject ob : mobiles){ + if (ob.getPosture() == Posture.Dead) + removers.add(ob); + } + mobiles.removeAll(removers); + // if(mobiles.size() >= spawnGroup.getMaxSpawns()) // return; - + boolean foundPos = false; int tries = 0; Point3D randomPosition = null; String template = spawnGroup.getMobiles().get(spawnIndex); MobileTemplate mobileTemplate = NGECore.getInstance().spawnService.getMobileTemplate(template); - if (mobileTemplate==null) + if (mobileTemplate==null){ + System.out.println("mobileTemplate==null"); return null; - - - for (CreatureObject cr : groupMembers){ - System.out.println("cr " + cr.getTemplate()); } - while(!foundPos && ++tries < 30) { - randomPosition = getRandomPosition(creature.getWorldPosition(), mobileTemplate.getMinSpawnDistance(), mobileTemplate.getMaxSpawnDistance()); + randomPosition = getRandomPosition(randomGroupPosition, mobileTemplate.getMinSpawnDistance(), mobileTemplate.getMaxSpawnDistance()); - if(randomPosition == null) + if(randomPosition == null){ + System.out.println("randomPosition == null"); return null; + } TerrainService terrainSvc = core.terrainService; @@ -224,7 +281,7 @@ public class DynamicSpawnArea extends SpawnArea { boolean minDistViolated = false; for(CreatureObject mobile : mobiles) { if(mobile.getWorldPosition().getDistance(randomPosition) < spawnGroup.getMinSpawnDistance() && ! groupMembers.contains(mobile)){ - minDistViolated = true; + minDistViolated = true; // Distance to other nearby groups } } if (minDistViolated) @@ -238,8 +295,9 @@ public class DynamicSpawnArea extends SpawnArea { } - if(!foundPos) + if(!foundPos){ return null; + } CreatureObject spawnedCreature = core.spawnService.spawnCreature(template, getPlanet().getName(), 0, randomPosition.x, randomPosition.y, randomPosition.z); @@ -247,8 +305,6 @@ public class DynamicSpawnArea extends SpawnArea { mobiles.add(spawnedCreature); } - return spawnedCreature; - + return spawnedCreature; } - } diff --git a/src/services/spawn/SpawnService.java b/src/services/spawn/SpawnService.java index 89d0a8c0..4008156d 100644 --- a/src/services/spawn/SpawnService.java +++ b/src/services/spawn/SpawnService.java @@ -368,7 +368,7 @@ public class SpawnService { } public void addDynamicSpawnArea(String dynamicGroup, float x, float z, float radius, String planetName) { - DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates .get(dynamicGroup); + DynamicSpawnGroup dynamicGroupTemplate = dynamicGroupTemplates.get(dynamicGroup); Planet planet = core.terrainService.getPlanetByName(planetName); if(dynamicGroupTemplate == null || planet == null) return; @@ -377,6 +377,25 @@ public class SpawnService { spawnAreas.get(planet).add(dynamicSpawnArea); core.simulationService.addCollidable(collidableCircle, x, z); } + + public void addDynamicSpawnArea(Vector dynamicGroups, float x, float z, float radius, String planetName) { + Vector dynamicSpawnGroups = new Vector(); + for (String template : dynamicGroups){ + if (dynamicGroupTemplates.get(template)==null){ + System.err.println("Dynamic Group template " + template +" not found in spawnservice collection!"); + return; + } + dynamicSpawnGroups.add(dynamicGroupTemplates.get(template)); + } + + Planet planet = core.terrainService.getPlanetByName(planetName); + if(dynamicSpawnGroups == null || dynamicSpawnGroups.size() == 0 || planet == null) + return; + CollidableCircle collidableCircle = new CollidableCircle(new Point3D(x, 0, z), radius, planet); + DynamicSpawnArea dynamicSpawnArea = new DynamicSpawnArea(planet, collidableCircle, dynamicSpawnGroups); + spawnAreas.get(planet).add(dynamicSpawnArea); + core.simulationService.addCollidable(collidableCircle, x, z); + } public Map getMobileTemplates() { return mobileTemplates;