diff --git a/accesslevels/cs.txt b/accesslevels/cs.txt index bd7ffcc4..5bcde6e5 100644 --- a/accesslevels/cs.txt +++ b/accesslevels/cs.txt @@ -1,95 +1,95 @@ -goto -findobject -teleport -teleportto -invulnerable -kill -setspeed -planetwarp -harmfull -harmless -object -searchcorpse -giveitem -sethue -editbank -editbankaccount -editappearance -editstats -snoop -wipeitems -findplayer -findobject -findobjectbytemplate -findcreature -getgametime -getplayerid -getstationname -grantbadge -grantbadgearea -granttitle -revokebadge -revoketitle -gmrevive -getrank -setfaction -settef -setfactionstanding -setrank -killplayer -teleporttarget -planetwarptarget -freezeplayer -unfreezeplayer -squelch -unsquelch -adjustlotcount -credits -editappearance -kick -maxcombatability -maxstats -money -setfirstname -setlastname -setname -setplayerstate -uncityban -setbiographyadmin -activatequest activateinstance -clearcompletedquest -completequest -listactivequests -listcompletedquests -grantskill -revokeskill -setexperience -listguildes -cityinfo +activatequest +addbannedplayer +adjustlotcount broadcast broadcastarea -broadcastplanet broadcastgalaxy -addbannedplayer -emptymailtarget -getaccountinfo -removebannedplayer +broadcastplanet +cityinfo +clearcompletedquest +clearveteranreward +completequest createcreature -createnpc createmissionelement +createnpc createspawningelement createspawningelementwithdifficulty createstaticitem +credits +editappearance +editappearance +editbank +editbankaccount +editstats +emptymailtarget +findcreature +findobject +findobject +findobjectbytemplate +findplayer +freezeplayer +getaccountinfo +getgametime +getplayerid +getrank getspawndelays +getstationname +giveitem +gmrevive +goto +grantbadge +grantbadgearea +grantskill +granttitle +harmfull +harmless +hasveteranreward +invulnerable +kick +kill +killplayer +listactivequests +listcompletedquests +listguildes +maxcombatability +maxstats +money +object +planetwarp +planetwarptarget +removebannedplayer +revokebadge +revokeskill +revoketitle +searchcorpse +setbiographyadmin +setexperience +setfaction +setfactionstanding +setfirstname +sethue +setlastname setmaximumspawntime setminimumspawntime +setname +setplayerstate +setrank +setspeed +settef +setveteranreward +setveteranrewardtimecs showspawnregion +snoop +squelch startspawner starttargetspawner stopspawner stoptargetspawner -clearveteranreward -hasveteranreward -setveteranrewardtimecs -setveteranreward +teleport +teleporttarget +teleportto +uncityban +unfreezeplayer +unsquelch +wipeitems diff --git a/accesslevels/dev.txt b/accesslevels/dev.txt index 5d69130f..7c0c7031 100644 --- a/accesslevels/dev.txt +++ b/accesslevels/dev.txt @@ -1,103 +1,102 @@ -gmforcecommand -goto -findobject -teleport -teleportto -invulnerable -kill -setspeed -planetwarp -harmfull -harmless -object -searchcorpse -giveitem -sethue -editbank -editbankaccount -editappearance -editstats -snoop -wipeitems -findplayer -findobject -findobjectbytemplate -findcreature -getgametime -getplayerid -getstationname -gmrevive -getrank -setfaction -settef -setfactionstanding -setrank -killplayer -teleporttarget -planetwarptarget -adjustlotcount -editappearance -kick -maxcombatability -maxstats -setfirstname -setlastname -setname -setplayerstate -activtequest activateinstance -clearcompletedquest -completequest activatequest -listactivequests -listcompletedquests -grantskill -revokeskill -setexperience -listguildes -cityinfo -createcreature -createnpc -createmissionelement -createspawningelement -createspawningelementwithdifficulty -createstaticitem -getspawndelays -setmaximumspawntime -setminimumspawntime -showspawnregion -startspawner -starttargetspawner -stopspawner -stoptargetspawner -clearveteranreward -hasveteranreward -setveteranrewardtimecs -setveteranreward +adjustlotcount aiignore +cityinfo +clearcompletedquest +clearveteranreward combat -craft -forcecommand -generatecrafteditem -getobjvars -gmcreateclassresource -gmcreatespecificresource -manufacture -showfactioninformation -qatool -startrestussstagetwo -completerestusstageone -spewcommandqueue -combatdatarecord combatdataclear +combatdatarecord combatdatareport combatdatastop combatmodecheck +completequest +completerestusstageone +craft +createcreature +createmissionelement +createnpc +createspawningelement +createspawningelementwithdifficulty +createstaticitem +csdumptarget database destroy dumptargetinformation dumpzoneinformation +editappearance +editappearance +editbank +editbankaccount +editstats +findcreature +findobject +findobject +findobjectbytemplate +findplayer +forcecommand +generatecrafteditem +getgametime +getobjvars +getplayerid +getrank +getspawndelays +getstationname +giveitem +gmcreateclassresource +gmcreatespecificresource +gmforcecommand +gmrevive +goto +grantskill +harmfull +harmless +hasveteranreward initializecomponent -script +invulnerable +kick +kill +killplayer lag -csdumptarget +listactivequests +listcompletedquests +listguildes +manufacture +maxcombatability +maxstats +object +planetwarp +planetwarptarget +qatool +revokeskill +script +searchcorpse +setexperience +setfaction +setfactionstanding +setfirstname +sethue +setlastname +setmaximumspawntime +setminimumspawntime +setname +setplayerstate +setrank +setspeed +settef +setveteranreward +setveteranrewardtimecs +showfactioninformation +showspawnregion +snoop +spewcommandqueue +startrestussstagetwo +startspawner +starttargetspawner +stopspawner +stoptargetspawner +teleport +teleporttarget +teleportto +wipeitems diff --git a/accesslevels/ec.txt b/accesslevels/ec.txt index 9d08ed53..da6939f7 100644 --- a/accesslevels/ec.txt +++ b/accesslevels/ec.txt @@ -1,80 +1,25 @@ -goto -findobject -teleport -teleportto -invulnerable -kill -setspeed -planetwarp -harmfull -harmless -object -searchcorpse -giveitem -sethue -findplayer -findobject -findobjectbytemplate -findcreature -getgametime -getplayerid -getstationname -grantbadge -grantbadgearea -granttitle -revokebadge -revoketitle -gmrevive -getrank -setfaction -settef -setfactionstanding -setrank -killplayer -teleporttarget -planetwarptarget -freezeplayer -unfreezeplayer -squelch -unsquelch -adjustlotcount -credits -editappearance -kick -maxcombatability -maxstats -money -setfirstname -setlastname -setname -setplayerstate -activatequest activateinstance -clearcompletedquest -completequest -listactivequests -listcompletedquests -grantskill -revokeskill -setexperience +activatequest +adjustlotcount broadcast broadcastarea -broadcastplanet broadcastgalaxy +broadcastplanet +clearcompletedquest +completequest +completerestusstageone createcreature -createnpc createmissionelement +createnpc createspawningelement createspawningelementwithdifficulty createstaticitem -getspawndelays -setmaximumspawntime -setminimumspawntime -showspawnregion -startspawner -starttargetspawner -stopspawner -stoptargetspawner +credits +csstorytellerdestroyallobjects +csstorytellerdestroynpcs +csstorytellerdestroyparticles +csstorytellerdestroyprops +editappearance eventbuff eventbuffarea eventbufftarget @@ -88,11 +33,66 @@ eventteftarget eventundomovetome eventvaderchoke eventweapon -setplayerappearance +findcreature +findobject +findobject +findobjectbytemplate +findplayer +freezeplayer +getgametime +getplayerid +getrank +getspawndelays +getstationname +giveitem +gmrevive +goto +grantbadge +grantbadgearea +grantskill +granttitle +harmfull +harmless +invulnerable +kick +kill +killplayer +listactivequests +listcompletedquests +maxcombatability +maxstats +money +object +planetwarp +planetwarptarget +revokebadge revokeplayerappearance -csstorytellerdestroynpcs -csstorytellerdestroyprops -csstorytellerdestroyparticles -csstorytellerdestroyallobjects +revokeskill +revoketitle +searchcorpse +setexperience +setfaction +setfactionstanding +setfirstname +sethue +setlastname +setmaximumspawntime +setminimumspawntime +setname +setplayerappearance +setplayerstate +setrank +setspeed +settef +showspawnregion +squelch startrestussstagetwo -completerestusstageone +startspawner +starttargetspawner +stopspawner +stoptargetspawner +teleport +teleporttarget +teleportto +unfreezeplayer +unsquelch diff --git a/accesslevels/lead.txt b/accesslevels/lead.txt index 5d1056bf..4a32a0aa 100644 --- a/accesslevels/lead.txt +++ b/accesslevels/lead.txt @@ -1,126 +1,49 @@ -gmforcecommand -goto -findobject -teleport -teleportto -invulnerable -kill -setspeed -planetwarp -harmfull -harmless -object -searchcorpse -giveitem -sethue -editbank -editbankaccount -editappearance -editstats -snoop -wipeitems -findplayer -findobject -findobjectbytemplate -findcreature -getgametime -getplayerid -getstationname -grantbadge -grantbadgearea -granttitle -revokebadge -revoketitle -gmrevive -getrank -setfaction -settef -setfactionstanding -setrank -killplayer -teleporttarget -planetwarptarget -freezeplayer -unfreezeplayer -squelch -unsquelch -adjustlotcount -credits -editappearance -kick -maxcombatability -maxstats -money -setfirstname -setlastname -setname -setplayerstate -uncityban -setbiographyadmin -activtequest activateinstance -clearcompletedquest -completequest -listactivequests -listcompletedquests -grantskill -revokeskill -setexperience -listguildes -cityinfo +activatequest +activatequest +addallowedplayer +addbannedplayer +adjustlotcount +aiignore broadcast broadcastarea -broadcastplanet broadcastgalaxy -addbannedplayer -emptymailtarget -getaccountinfo -removebannedplayer -createcreature -createnpc -createmissionelement -createspawningelement -createspawningelementwithdifficulty -createstaticitem -getspawndelays -setmaximumspawntime -setminimumspawntime -showspawnregion -startspawner -starttargetspawner -stopspawner -stoptargetspawner +broadcastplanet +cityinfo +clearcompletedquest clearveteranreward -hasveteranreward -setveteranrewardtimecs -setveteranreward -aiignore combat -craft -forcecommand -generatecrafteditem -getobjvars -gmcreateclassresource -gmcreatespecificresource -manufacture -showfactioninformation -qatool -startrestussstagetwo -completerestusstageone -spewcommandqueue -combatdatarecord combatdataclear +combatdatarecord combatdatareport combatdatastop combatmodecheck +completequest +completerestusstageone +completerestusstageone +craft +createcreature +createmissionelement +createnpc +createspawningelement +createspawningelementwithdifficulty +createstaticitem +credits +csdumptarget +csstorytellerdestroyallobjects +csstorytellerdestroynpcs +csstorytellerdestroyparticles +csstorytellerdestroyprops database destroy dumptargetinformation dumpzoneinformation -initializecomponent -script -lag -csdumptarget +editappearance +editappearance +editbank +editbankaccount +editstats +emptymailtarget eventbuff eventbuffarea eventbufftarget @@ -134,30 +57,107 @@ eventteftarget eventundomovetome eventvaderchoke eventweapon -setplayerappearance -revokeplayerappearance -csstorytellerdestroynpcs -csstorytellerdestroyprops -csstorytellerdestroyparticles -csstorytellerdestroyallobjects -startrestussstagetwo -completerestusstageone -setgodmode -server -addallowedplayer -removeallowedplayer -setlogintitle -setloginmessage -setplanetlimit -resendloginmessagetoall +findcreature +findobject +findobject +findobjectbytemplate +findplayer +findwarden +forcecommand +freezeplayer +generatecrafteditem +getaccountinfo +getgametime +getobjvars +getplayerid +getrank +getspawndelays +getstationname +giveitem +gmcreateclassresource +gmcreatespecificresource +gmforcecommand gmforcerank gmfsvillage gmjedistate +gmrevive +goto +grantbadge +grantbadgearea grantpadawantrialseligibility -overridepadawantrialseligibility -resetjedi -setwardenloginmessage -findwarden -activatequest +grantskill +granttitle grantwarden +harmfull +harmless +hasveteranreward +initializecomponent +invulnerable +kick +kill +killplayer +lag +listactivequests +listcompletedquests +listguildes +manufacture +maxcombatability +maxstats +money +object +overridepadawantrialseligibility +planetwarp +planetwarptarget +qatool +removeallowedplayer +removebannedplayer +resendloginmessagetoall +resetjedi +revokebadge +revokeplayerappearance +revokeskill +revoketitle revokewarden +script +searchcorpse +server +setbiographyadmin +setexperience +setfaction +setfactionstanding +setfirstname +setgodmode +sethue +setlastname +setloginmessage +setlogintitle +setmaximumspawntime +setminimumspawntime +setname +setplanetlimit +setplayerappearance +setplayerstate +setrank +setspeed +settef +setveteranreward +setveteranrewardtimecs +setwardenloginmessage +showfactioninformation +showspawnregion +snoop +spewcommandqueue +squelch +startrestussstagetwo +startrestussstagetwo +startspawner +starttargetspawner +stopspawner +stoptargetspawner +teleport +teleporttarget +teleportto +uncityban +unfreezeplayer +unsquelch +wipeitems diff --git a/accesslevels/qa.txt b/accesslevels/qa.txt index 6127f135..7d4a6c48 100644 --- a/accesslevels/qa.txt +++ b/accesslevels/qa.txt @@ -1,82 +1,82 @@ -goto -findobject -teleport -teleportto -invulnerable -kill -setspeed -planetwarp -harmfull -harmless -object -searchcorpse -giveitem -sethue -findplayer -findobject -findobjectbytemplate -findcreature -getgametime -getplayerid -getstationname -gmrevive -getrank -setfaction -settef -setfactionstanding -setrank -killplayer -teleporttarget -planetwarptarget -setfirstname -setlastname -setname -setplayerstate -activatequest activateinstance -clearcompletedquest -completequest -listactivequests -listcompletedquests -grantskill -revokeskill -setexperience -listguildes +activatequest +aiignore cityinfo +clearcompletedquest +combat +combatdataclear +combatdatarecord +combatdatareport +combatdatastop +combatmodecheck +completequest +completerestusstageone +craft createcreature -createnpc createmissionelement +createnpc createspawningelement createspawningelementwithdifficulty createstaticitem +csdumptarget +destroy +dumptargetinformation +dumpzoneinformation +findcreature +findobject +findobject +findobjectbytemplate +findplayer +forcecommand +generatecrafteditem +getgametime +getobjvars +getplayerid +getrank getspawndelays +getstationname +giveitem +gmcreateclassresource +gmcreatespecificresource +gmrevive +goto +grantskill +harmfull +harmless +invulnerable +kill +killplayer +listactivequests +listcompletedquests +listguildes +manufacture +object +planetwarp +planetwarptarget +qatool +revokeskill +searchcorpse +setexperience +setfaction +setfactionstanding +setfirstname +sethue +setlastname setmaximumspawntime setminimumspawntime +setname +setplayerstate +setrank +setspeed +settef +showfactioninformation showspawnregion +spewcommandqueue +startrestussstagetwo startspawner starttargetspawner stopspawner stoptargetspawner -aiignore -combat -craft -forcecommand -generatecrafteditem -getobjvars -gmcreateclassresource -gmcreatespecificresource -manufacture -showfactioninformation -qatool -startrestussstagetwo -completerestusstageone -spewcommandqueue -combatdatarecord -combatdataclear -combatdatareport -combatdatastop -combatmodecheck -dumptargetinformation -dumpzoneinformation -csdumptarget -destroy +teleport +teleporttarget +teleportto diff --git a/accesslevels/staff.txt b/accesslevels/staff.txt index 9aadf55a..5519c423 100644 --- a/accesslevels/staff.txt +++ b/accesslevels/staff.txt @@ -1,12 +1,12 @@ -gmforcecommand -goto findobject -teleport -teleportto +gmforcecommand +gmrevive +goto +harmfull +harmless invulnerable kill -gmrevive -setspeed planetwarp -harmfull -harmless \ No newline at end of file +setspeed +teleport +teleportto diff --git a/scripts/character_builder_terminal.py b/scripts/character_builder_terminal.py index 6f9faa5a..7fb5ec0b 100644 --- a/scripts/character_builder_terminal.py +++ b/scripts/character_builder_terminal.py @@ -365,30 +365,37 @@ def buff(owner): core.buffService.addBuffToCreature(owner, 'me_buff_health_2', owner) buff = owner.getBuffByName('me_buff_health_2') buff.setDuration(5400) + owner.updateBuff(buff) core.buffService.addBuffToCreature(owner, 'me_buff_action_3', owner) buff1 = owner.getBuffByName('me_buff_action_3') buff1.setDuration(5400) + owner.updateBuff(buff1) core.buffService.addBuffToCreature(owner, 'me_buff_agility_3', owner) buff2 = owner.getBuffByName('me_buff_agility_3') buff2.setDuration(5400) + owner.updateBuff(buff2) core.buffService.addBuffToCreature(owner, 'me_buff_melee_gb_1', owner) buff3 = owner.getBuffByName('me_buff_melee_gb_1') buff3.setDuration(5400) + owner.updateBuff(buff3) core.buffService.addBuffToCreature(owner, 'me_buff_ranged_gb_1', owner) buff4 = owner.getBuffByName('me_buff_ranged_gb_1') buff4.setDuration(5400) + owner.updateBuff(buff4) core.buffService.addBuffToCreature(owner, 'me_buff_precision_3', owner) buff5 = owner.getBuffByName('me_buff_precision_3') buff5.setDuration(5400) + owner.updateBuff(buff5) core.buffService.addBuffToCreature(owner, 'me_buff_strength_3', owner) buff6 = owner.getBuffByName('me_buff_strength_3') buff6.setDuration(5400) + owner.updateBuff(buff6) screenOne(core, owner) return @@ -728,4 +735,4 @@ def bountyDroids(owner, inventory): probe = core.objectService.createObject('object/tangible/mission/shared_mission_bounty_droid_probot.iff', owner.getPlanet()) probe.setUses(20) inventory.add(probe) - return \ No newline at end of file + return diff --git a/scripts/commands/removeBuff.py b/scripts/commands/removeBuff.py index cd63145f..78354992 100644 --- a/scripts/commands/removeBuff.py +++ b/scripts/commands/removeBuff.py @@ -5,11 +5,11 @@ def setup(): def run(core, actor, target, commandString): - buffObj = actor.getBuffByCRC(int(commandString)) + buffObj = actor.getBuffList().get(int(commandString)) if buffObj is None: return if buffObj.isRemovableByPlayer() and buffObj.isDebuff() is False: core.buffService.removeBuffFromCreature(actor, buffObj) - return \ No newline at end of file + return diff --git a/scripts/quests/events/find_majolnir.py b/scripts/quests/events/find_majolnir.py new file mode 100644 index 00000000..50909c6b --- /dev/null +++ b/scripts/quests/events/find_majolnir.py @@ -0,0 +1,22 @@ +def setup(core): + core.questService.addCollisionEvent('find_majolnir', 'task2', 3526, 5, -4619, 10, 'tatooine') + return + +def task2(core, activator, collidable): + print ('called.') + if activator.getPlayerObject() is None: + return + + player = activator.getPlayerObject() + + if player.getQuest('find_majolnir') is None: + print ('not in quest journal') + return + + quest = player.getQuest('find_majolnir') + + if quest.isCompleted() or quest.getActiveStep() != 2: + return + + core.questService.completeActiveTask(activator, quest) + return \ No newline at end of file diff --git a/scripts/quest_rewards/item_deed_landspeeder_x38_02_01.py b/scripts/quests/rewards/item_deed_landspeeder_x38_02_01.py similarity index 97% rename from scripts/quest_rewards/item_deed_landspeeder_x38_02_01.py rename to scripts/quests/rewards/item_deed_landspeeder_x38_02_01.py index 67c43fef..38f51817 100644 --- a/scripts/quest_rewards/item_deed_landspeeder_x38_02_01.py +++ b/scripts/quests/rewards/item_deed_landspeeder_x38_02_01.py @@ -1,4 +1,4 @@ -import sys - -def run(): +import sys + +def run(): return "object/tangible/deed/vehicle_deed/shared_landspeeder_xp38_deed.iff" \ No newline at end of file diff --git a/scripts/static_spawns/tatooine/mos_eisley.py b/scripts/static_spawns/tatooine/mos_eisley.py index e1429082..f6ab63b5 100644 --- a/scripts/static_spawns/tatooine/mos_eisley.py +++ b/scripts/static_spawns/tatooine/mos_eisley.py @@ -157,4 +157,31 @@ def addPlanetSpawns(core, planet): aiSvc.setLoiter(r3m6, float(1), float(3)) aiSvc.setLoiter(eg1, float(1), float(3)) aiSvc.setLoiter(r3j7, float(1), float(3)) + + # Looped Patrol must end in same cell like the start point!!! + #building id: 1105845 Buildingid + cell ! + trehla = stcSvc.spawnObject('trehla', 'tatooine', long(1105845 + 8), float(24.21), float(2.12), float(73.49), float(0.92), float(0), float(-0.38), float(0)) + patrolpointsCells = Vector() # Vector Building reference Patrolpoint CellID + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(25.11), float(2.10), float(50.22)), 7) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(21.25), float(0.6), float(45.51)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-11.78), float(0.59), float(45.78)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-13.67), float(2.6), float(18.27)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-6.63), float(2.6), float(17.87)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-6.74), float(2.6), float(1.60)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-17.92), float(0.6), float(1.88)), 5) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-18.21), float(0.6), float(9.40)), 5) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-24.18), float(0.6), float(9.40)), 5) + + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(-24.50), float(0.6), float(-4.08)), 2) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(0.03), float(0.6), float(-4.36)), 1) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(25.03), float(0.6), float(-4.10)), 3) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(24.38), float(0.6), float(9.42)), 3) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(17.98), float(0.6), float(9.14)), 4) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(5.44), float(2.6), float(2.33)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(9.3), float(2.6), float(18.64)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(14.65), float(0.92), float(40.72)), 6) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(23.9), float(0.93), float(48.22)), 7) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(26.64), float(2.12), float(57.42)), 7) + aiSvc.addPatrolPointCell(patrolpointsCells, trehla.getGrandparent(), Point3D(float(27.64), float(2.12), float(70.07)), 8) + aiSvc.setPatrol(trehla, patrolpointsCells) return \ No newline at end of file diff --git a/src/main/NGECore.java b/src/main/NGECore.java index ea64e5ca..e6ac7704 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -665,8 +665,12 @@ public class NGECore { staticService.spawnStatics(); equipmentService.loadBonusSets(); + playerCityService.loadCityRankCaps(); playerCityService.loadCities(); + + questService.loadEvents(); + retroService.run(); browserService = new BrowserService(this); diff --git a/src/resources/buffs/BuffList.java b/src/resources/buffs/BuffList.java deleted file mode 100644 index dfcbfb4e..00000000 --- a/src/resources/buffs/BuffList.java +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************* - * 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.buffs; - -import java.util.Map.Entry; - -import org.apache.mina.core.buffer.IoBuffer; - -import engine.resources.objects.Delta; -import resources.objects.SWGMap; - -public class BuffList extends Delta { - - private static final long serialVersionUID = 1L; - - private SWGMap list; - - public BuffList(SWGMap list) { - this.list = list; - } - - public BuffList() { - - } - - public SWGMap getList() { - synchronized(objectMutex) { - return list; - } - } - - public byte[] getBytes() { - int size = 8 + ((list.size() > 0) ? 4 : 0); - - for (Buff buff : list.values().toArray(new Buff[] { })) { - size += (25 + ((buff.getBuffName().equals("")) ? 0 : 4)); - } - - IoBuffer buffer = createBuffer(size); - buffer.putInt(list.size()); - buffer.putInt(list.getUpdateCounter()); - for (Entry entry : list.entrySet()) { - int crc = entry.getKey(); - Buff buff = entry.getValue(); - - buffer.put(getBoolean(!buff.getBuffName().equals(""))); - if (!buff.getBuffName().equals("")) { - buffer.putInt(0); - } - buffer.putInt(crc); - if (buff.getDuration() > 0) { - buffer.putInt((int) (buff.getTotalPlayTime() + buff.getRemainingDuration())); - buffer.putInt(0); - buffer.putInt((int) buff.getDuration()); - } else { - buffer.putInt(-1); - buffer.putInt(0); - if (buff.getBuffName().equals("")) { - buffer.putInt(0); - } else { - buffer.putInt(-1); - } - } - buffer.putLong(buff.getOwnerId()); - } - if (list.size() > 0) { - buffer.putInt(1); - } - return buffer.array(); - } - -} diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index eb22ce5a..1d6daf61 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -110,7 +110,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { } public void initAfterDBLoad() { - super.init(); + super.initAfterDBLoad(); System.out.println("Name: " + getCustomName()); System.out.println(" Cash Credits: " + getCashCredits()); System.out.println(" Bank Credits: " + getBankCredits()); @@ -182,8 +182,8 @@ public class CreatureObject extends TangibleObject implements IPersistent { baseline.put("moodId", (byte) 0); baseline.put("performanceCounter", 0); baseline.put("performanceId", 0); - baseline.put("attributes", new SWGList(this, 6, 21, false)); - baseline.put("maxAttributes", new SWGList(this, 6, 22, false)); + baseline.put("attribs", new SWGList(this, 6, 21, false)); + baseline.put("maxAttribs", new SWGList(this, 6, 22, false)); baseline.put("equipmentList", new SWGList(this, 6, 23, false)); baseline.put("appearance", ""); baseline.put("visible", true); @@ -823,7 +823,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { @SuppressWarnings("unchecked") public SWGList getAttribs() { - return (SWGList) getBaseline(6).get("attributes"); + return (SWGList) getBaseline(6).get("attribs"); } public void resetAttribs() { @@ -881,7 +881,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { @SuppressWarnings("unchecked") public SWGList getMaxAttribs() { - return (SWGList) getBaseline(6).get("maxAttributes"); + return (SWGList) getBaseline(6).get("maxAttribs"); } public int getMaxHealth() { @@ -981,20 +981,10 @@ public class CreatureObject extends TangibleObject implements IPersistent { } public void addBuff(Buff buff) { - if (buff == null) { - System.err.println("CreatureObject:addBuff(): Attempting to add a null Buff object. Something is wrong in BuffService!"); - } - - synchronized(objectMutex) { - PlayerObject player = (PlayerObject) getSlottedObject("ghost"); - buff.setTotalPlayTime((int) (player.getTotalPlayTime() + (System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000)); - } - + PlayerObject player = (PlayerObject) getSlottedObject("ghost"); + buff.setTotalPlayTime((player == null) ? 0 : (int) (player.getTotalPlayTime() + (System.currentTimeMillis() - player.getLastPlayTimeUpdate()) / 1000)); + buff.setStartTime(); getBuffList().put(CRC.StringtoCRC(buff.getBuffName().toLowerCase()), buff); - - synchronized(objectMutex) { - buff.setStartTime(); - } } public void removeBuff(Buff buff) { diff --git a/src/resources/objects/player/PlayerObject.java b/src/resources/objects/player/PlayerObject.java index f8d49268..98bb8b9c 100644 --- a/src/resources/objects/player/PlayerObject.java +++ b/src/resources/objects/player/PlayerObject.java @@ -47,6 +47,7 @@ import resources.objects.waypoint.WaypointObject; import resources.quest.Quest; import services.quest.QuestItem; import engine.clients.Client; +import engine.resources.common.CRC; import engine.resources.common.StringUtilities; import engine.resources.objects.Baseline; import engine.resources.scene.Planet; @@ -609,6 +610,10 @@ public class PlayerObject extends IntangibleObject implements Serializable { getBaseline(8).set("activeQuest", questCRC); } + public Quest getQuest(String questName) { + return getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)); + } + public String getProfessionWheelPosition() { return (String) getBaseline(8).get("professionWheelPosition"); } diff --git a/src/resources/quest/Quest.java b/src/resources/quest/Quest.java index 0e49750b..58efc4c9 100644 --- a/src/resources/quest/Quest.java +++ b/src/resources/quest/Quest.java @@ -23,10 +23,12 @@ package resources.quest; import java.io.Serializable; import java.util.BitSet; +import java.util.concurrent.ScheduledFuture; import org.apache.mina.core.buffer.IoBuffer; import engine.resources.common.CRC; +import engine.resources.common.StringUtilities; import engine.resources.objects.Delta; public class Quest extends Delta implements Serializable { @@ -35,6 +37,7 @@ public class Quest extends Delta implements Serializable { private long ownerId; private int activeStep; // Quest starts at step 0 + private BitSet activeStepBitmask = new BitSet(16); private BitSet completedStepBitmask = new BitSet(16); @@ -42,6 +45,7 @@ public class Quest extends Delta implements Serializable { private boolean recievedAward = false; private String name; + private ScheduledFuture timer; private long waypointId; public Quest() {} @@ -120,12 +124,23 @@ public class Quest extends Delta implements Serializable { } public void incrementQuestStep() { - activeStepBitmask.set(activeStep, false); completedStepBitmask.set(activeStep); - this.activeStep++; - activeStepBitmask.set(activeStep); + activeStepBitmask.set(activeStep, false); + + activeStep++; + activeStepBitmask.set(activeStep, true); + + //System.out.println("Active step was "+ (activeStep - 1) + " and is now " + activeStep ); } + public ScheduledFuture getTimer() { + return timer; + } + + public void setTimer(ScheduledFuture timer) { + this.timer = timer; + } + public byte[] getBytes() { byte[] activeStepBytes = activeStepBitmask.toByteArray(); byte[] completedStepBytes = completedStepBitmask.toByteArray(); @@ -175,6 +190,7 @@ public class Quest extends Delta implements Serializable { buffer.flip(); + StringUtilities.printBytes(buffer.array()); return buffer.array(); } diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index 0d3366fe..9b23cec5 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -1067,6 +1067,27 @@ public class SimulationService implements INetworkDispatch { } + public Point3D convertModelSpaceToPoint(Point3D point, SWGObject object) { + + Point3D position = object.getPosition(); + WB_M44 translateMatrix = new WB_M44(1, 0, 0, position.x, 0, 1, 0, position.y, 0, 0, 1, position.z, 0, 0, 0, 1); + + float radians = object.getRadians(); + float sin = (float) Math.sin(radians); + float cos = (float) Math.cos(radians); + + WB_M44 rotationMatrix = new WB_M44(cos, 0, sin, 0, 0, 1, 0, 0, -sin, 0, cos, 0, 0, 0, 0, 1); //non-inverse matrix + + WB_M44 modelSpace = translateMatrix.mult(rotationMatrix); + + float x = (float) (modelSpace.m11 * point.x + modelSpace.m12 * point.y + modelSpace.m13 * point.z + modelSpace.m14); + float y = (float) (modelSpace.m21 * point.x + modelSpace.m22 * point.y + modelSpace.m23 * point.z + modelSpace.m24); + float z = (float) (modelSpace.m31 * point.x + modelSpace.m32 * point.y + modelSpace.m33 * point.z + modelSpace.m34); + + return new Point3D(x, y, z); + + } + /* * Moved this to ConnectionService which will disconnect them * from the server if they don't send packets for 5 minutes or more diff --git a/src/services/ai/AIService.java b/src/services/ai/AIService.java index 162b09b1..6371202b 100644 --- a/src/services/ai/AIService.java +++ b/src/services/ai/AIService.java @@ -35,6 +35,8 @@ import resources.common.SpawnPoint; import resources.datatables.Difficulty; import resources.datatables.FactionStatus; import resources.datatables.GcwType; +import resources.objects.building.BuildingObject; +import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; import resources.objects.group.GroupObject; import resources.objects.player.PlayerObject; @@ -213,6 +215,15 @@ public class AIService { actor.setCurrentState(new IdleState()); } + public void addPatrolPointCell(Vector patrolpoints, BuildingObject building, Point3D position, int cellID){ + if (building==null) + return; + CellObject cellObj = building.getCellByCellNumber(cellID); + if (cellObj!=null) + position.setCell(cellObj); + patrolpoints.add(position); + } + public void setLoiter(CreatureObject creature, float minDist, float maxDist){ AIActor actor = (AIActor) creature.getAttachment("AI"); if (actor==null) diff --git a/src/services/ai/states/AIState.java b/src/services/ai/states/AIState.java index b1f4a93c..021cdbb9 100644 --- a/src/services/ai/states/AIState.java +++ b/src/services/ai/states/AIState.java @@ -76,6 +76,15 @@ public abstract class AIState { NGECore core = NGECore.getInstance(); Point3D currentPosition = creature.getPosition(); Point3D targetPosition = null; + // Cell management + if (creature.getContainer()!=null && creature.getContainer() instanceof CellObject){ + CellObject cellObj1 = (CellObject)creature.getContainer(); + if (cellObj1!=null){ + currentPosition.setCell(cellObj1); + } + } + + float maxDistance = stopDistance; boolean finished = false; float dx, dz, newX = 0, newY = 0, newZ = 0; @@ -85,6 +94,8 @@ public abstract class AIState { //while(!finished && movementPoints.size() != 0) { if ((!(actor.getCurrentState() instanceof FollowState)) && movementPoints.size() == 0 && patrolPoints.size() == 0) { + if (creature.getTemplate().contains("shared_dressed_tutorial_mentor.iff")) + System.out.println("findNewPosition targetPosition null "); DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout1"); return false; } @@ -107,16 +118,31 @@ public abstract class AIState { if (actor.getCurrentState().getClass().equals(FollowState.class)){ targetPosition = actor.getFollowObject().getWorldPosition(); + if (actor.getFollowObject().getContainer()!=null && actor.getFollowObject().getContainer() instanceof CellObject){ + CellObject cellObj1 = (CellObject)actor.getFollowObject().getContainer(); + if (cell!=null) + targetPosition.setCell(cellObj1); + } } Vector path = core.aiService.findPath(creature.getPlanetId(), currentPosition, targetPosition); if (targetPosition==null){ + if (creature.getTemplate().contains("shared_dressed_tutorial_mentor.iff")) + System.out.println("findNewPosition targetPosition null "); DevLog.debugoutai(actor, "Charon", "AI State findnewpos", "Breakout2"); return false; } + float distanceToTarget = targetPosition.getWorldPosition().getDistance(creature.getWorldPosition()); + if (targetPosition.getCell()!=null){ + //Point3D targetWorldPosition = core.simulationService.convertModelSpaceToPoint(targetPosition, creature.getGrandparent()); + Point3D targetWorldPosition = targetPosition.getWorldPosition(); + distanceToTarget = targetWorldPosition.getDistance(creature.getWorldPosition()); + } + + if(distanceToTarget > stopDistance) { maxDistance = Math.min(speed, distanceToTarget - stopDistance); } else { @@ -139,9 +165,7 @@ public abstract class AIState { Point3D oldPosition = null; float pathDistance = 0; - - - + for(int i = 1; i < path.size() && !finished; i++) { Point3D currentPathPosition = path.get(i); @@ -153,7 +177,7 @@ public abstract class AIState { pathDistance += oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); if(pathDistance >= maxDistance || i == path.size() - 1 || currentPathPosition.getCell() != creature.getContainer()) { - + finished = true; if(movementPoints.size() != 0 && currentPosition.getWorldPosition().getDistance(currentPathPosition.getWorldPosition()) <= stopDistance && cell == creature.getContainer()) { @@ -177,6 +201,7 @@ public abstract class AIState { //float distance = oldWorldPos.getDistance(currentPathPosition.getWorldPosition()); float distance = NGECore.getInstance().aiService.distanceSquared(oldWorldPos, currentPathPosition.getWorldPosition()); // Ok to use, as distance is not directly used later float travelDistance = distance - (pathDistance - maxDistance); + // temp fix for melee npcs travelDistance *= 1.3; if(travelDistance <= 0) { @@ -203,7 +228,7 @@ public abstract class AIState { fullong = (int)(tempdz*100); halfshort = ((int)(tempdx*100)) >> 1; } - float deltaDist = (fullong + halfshort)/100; + float deltaDist = (fullong + halfshort)/100; // end of approximation newX = (float) (oldPosition.x + (speed * (dx / deltaDist))); newZ = (float) (oldPosition.z + (speed * (dz / deltaDist))); @@ -226,6 +251,10 @@ public abstract class AIState { } } else { + + if (creature.getTemplate().contains("shared_dressed_tutorial_mentor.iff")) + System.out.println("ELSE CASE"); + newX = currentPathPosition.x; newZ = currentPathPosition.z; newY = core.terrainService.getHeight(creature.getPlanetId(), newX, newZ); @@ -742,8 +771,7 @@ public abstract class AIState { if (creature.isInCombat()){ return; } - - + TangibleObject target = actor.getFollowObject(); float speed = (float) creature.getWalkSpeed(); float maxDistance = 6; @@ -763,82 +791,98 @@ public abstract class AIState { // Manage Patrol points maxDistance = 1; - if (actor.getPatrolPoints().size()==0) + if (actor.getPatrolPoints().size()==0){ return; + } + + + Point3D currentDestination = actor.getPatrolPoints().get(actor.getPatrolPointIndex()); - //System.out.println("currentPosition.getDistance2D(currentDestination) " + currentPosition.getDistance2D(currentDestination)); - if (NGECore.getInstance().aiService.distanceSquared2D(currentPosition, currentDestination)<4){ - //if (currentPosition.getDistance2D(currentDestination)<4){ + + float relDistance = NGECore.getInstance().aiService.distanceSquared2D(currentPosition, currentDestination); + + if (currentDestination.getCell()!=null){ + //Point3D curdestWS = core.simulationService.convertModelSpaceToPoint(currentDestination, creature.getGrandparent()); + Point3D curdestWS = currentDestination.getWorldPosition(); + relDistance = NGECore.getInstance().aiService.distanceSquared2D(currentPosition, curdestWS); + } + + if (relDistance<4){ + if (actor.getPatrolPointIndex()=4 && NGECore.getInstance().invasionService.getInvasionPhase()!=3){ - actor.setAIactive(false); // switch off auto-target-recognition to counter lag - actor.setCurrentState(new IdleState()); - //System.out.println("AI switched off!"); - return; - } - - //actor.setCurrentState(new IdleState()); - // Wait state() Since this state does not require move,recover and all that its simple task + if (isInvader!=null){ - //NGECore.getInstance().aiService.waitForEvent(actor, NGECore.getInstance().invasionService, "isDefendingGeneralAlive", false, WithdrawalState.class); - - return; // Last Patrol point reached and no loop + // If invader check for in weapon range general + if (core.invasionService.getDefensiveGeneral()!=null){ + if (core.invasionService.getInvasionPhase()==3 && core.invasionService.getDefensiveGeneral().getPosture()!=13 && core.invasionService.getDefensiveGeneral().getPosture()!=14 && core.invasionService.getDistanceToDefensiveGeneral(creature)<2500){ + actor.addDefender(core.invasionService.getDefensiveGeneral()); + return; + } + } + + // Check if there are more than 5 invaders at same spot + if (NGECore.getInstance().simulationService.getAllNearSameFactionNPCs(7, creature).size()>=4 && NGECore.getInstance().invasionService.getInvasionPhase()!=3){ + actor.setAIactive(false); // switch off auto-target-recognition to counter lag + actor.setCurrentState(new IdleState()); + //System.out.println("AI switched off!"); + return; + } + + //actor.setCurrentState(new IdleState()); + // Wait state() Since this state does not require move,recover and all that its simple task + + //NGECore.getInstance().aiService.waitForEvent(actor, NGECore.getInstance().invasionService, "isDefendingGeneralAlive", false, WithdrawalState.class); + + return; // Last Patrol point reached and no loop + } } } - } + } else {} Point3D newPosition = new Point3D(); boolean foundNewPos = findNewPosition(actor, speed, maxDistance, newPosition); - - - - + if(!foundNewPos || (newPosition.x == 0 && newPosition.z == 0)) return; + + //Point3D newWorldPos = newPosition.getWorldPosition(); + Point3D newWorldPos = newPosition; + if (newPosition.getCell()==null) + newWorldPos = newPosition.getWorldPosition(); + + currentPosition = creature.getPosition(); - Point3D newWorldPos = newPosition.getWorldPosition(); - float direction = (float) Math.atan2(newWorldPos.x - currentPosition.x, newWorldPos.z - currentPosition.z); + float direction = (float) Math.atan2(newWorldPos.x - currentPosition.x, newWorldPos.z - currentPosition.z); // +0.973F if(direction < 0) - direction = (float) (2 * Math.PI + direction); + direction = (float) (2 * Math.PI + direction); // +0.973F + Quaternion quaternion = new Quaternion((float) Math.cos(direction / 2), 0, (float) Math.sin(direction / 2), 0); if (quaternion.y < 0.0f && quaternion.w > 0.0f) { quaternion.y *= -1; quaternion.w *= -1; } -// if (newPosition.getCell()==null) -// System.out.println("newPosition.getCell() is NULL"); try{ core.simulationService.moveObject(creature, newPosition, quaternion, creature.getMovementCounter(), speed, newPosition.getCell()); } catch (NullPointerException e) { // Just to identify what exactly is null here -// if (creature==null) -// System.out.print("creature==null" ); -// if (newPosition==null) -// System.out.print("newPosition==null" ); -// if (quaternion==null) -// System.out.print("quaternion==null" ); -// if (newPosition.getCell()==null) -// System.out.print("newPosition.getCell()==null" ); -// -// System.out.print("creature.getMovementCounter() " + creature.getMovementCounter()); + // if (creature==null) + // System.out.print("creature==null" ); + // if (newPosition==null) + // System.out.print("newPosition==null" ); + // if (quaternion==null) + // System.out.print("quaternion==null" ); + // if (newPosition.getCell()==null) + // System.out.print("newPosition.getCell()==null" ); + // } } diff --git a/src/services/combat/CombatService.java b/src/services/combat/CombatService.java index fbd5fedf..f979170d 100644 --- a/src/services/combat/CombatService.java +++ b/src/services/combat/CombatService.java @@ -1238,21 +1238,19 @@ public class CombatService implements INetworkDispatch { if(target.hasBuff("incapWeaken")) { if (!attacker.isPlayer()){ - AIActor aiActor = (AIActor)attacker.getAttachment("AI"); - if (aiActor.getMobileTemplate().isDeathblow()) - deathblowPlayer(attacker, target); + deathblowPlayer(attacker, target); } else { deathblowPlayer(attacker, target); } return; - } - - if (!attacker.isPlayer()){ - AIActor aiActor = (AIActor)attacker.getAttachment("AI"); - if (aiActor.getMobileTemplate().isDeathblow()){ - deathblowPlayer(attacker, target); - return; + } else { + if (!attacker.isPlayer()){ + AIActor aiActor = (AIActor)attacker.getAttachment("AI"); + if (aiActor.getMobileTemplate().isDeathblow()){ + deathblowPlayer(attacker, target); + return; + } } } diff --git a/src/services/quest/QuestService.java b/src/services/quest/QuestService.java index fe2c9463..0be11907 100644 --- a/src/services/quest/QuestService.java +++ b/src/services/quest/QuestService.java @@ -22,9 +22,22 @@ package services.quest; import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Map; +import java.util.Random; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import org.apache.mina.core.buffer.IoBuffer; import org.apache.mina.core.session.IoSession; @@ -36,20 +49,24 @@ import protocol.swg.objectControllerObjects.ForceActivateQuest; import protocol.swg.objectControllerObjects.QuestTaskCounterMessage; import protocol.swg.objectControllerObjects.QuestTaskTimerMessage; import protocol.swg.objectControllerObjects.ShowLootBox; +import resources.common.Console; import resources.common.ObjControllerOpcodes; import resources.common.OutOfBand; import resources.common.ProsePackage; +import resources.common.collidables.CollidableCircle; import resources.datatables.DisplayType; import resources.objects.SWGMap; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import resources.objects.tangible.TangibleObject; +import resources.objects.waypoint.WaypointObject; import resources.quest.Quest; import main.NGECore; import engine.clientdata.ClientFileManager; import engine.clientdata.visitors.DatatableVisitor; import engine.resources.common.CRC; import engine.resources.objects.SWGObject; +import engine.resources.scene.Point3D; import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; @@ -58,7 +75,7 @@ public class QuestService implements INetworkDispatch { private NGECore core; private Map questMap = new ConcurrentHashMap(); private Map questRewardMap = new ConcurrentHashMap(); - + public QuestService(NGECore core) { this.core = core; } @@ -75,9 +92,6 @@ public class QuestService implements INetworkDispatch { }); } - @Override - public void shutdown() { } - public boolean doesPlayerHaveQuest(CreatureObject creo, String questName) { PlayerObject ghost = creo.getPlayerObject(); @@ -142,9 +156,6 @@ public class QuestService implements INetworkDispatch { if (player == null) return; - if (quest.getWaypointId() != 0) - core.objectService.destroyObject(quest.getWaypointId()); - int activeStep = quest.getActiveStep(); QuestTask task = qData.getTasks().get(activeStep); @@ -154,6 +165,16 @@ public class QuestService implements INetworkDispatch { switch (type) { + // quest.task.ground.go_to_location + case "go_to_location": + Point3D location = new Point3D(task.getLocationX(), task.getLocationY(), task.getLocationZ()); + WaypointObject wpGoTo = createWaypoint(task.getWaypointName(), location, task.getPlanet()); + player.getWaypoints().put(wpGoTo.getObjectID(), wpGoTo); + + quest.setWaypointId(wpGoTo.getObjectID()); + + break; + // quest.task.ground.comm_player case "comm_player": @@ -169,19 +190,70 @@ public class QuestService implements INetworkDispatch { // TODO: add item count ObjControllerMessage itemCount = new ObjControllerMessage(11, new QuestTaskCounterMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:retrieve_item_counter")); quester.getClient().getSession().write(itemCount.serialize()); + + WaypointObject wpRetrieve = createWaypoint(task.getWaypointName(), new Point3D(task.getLocationX(), task.getLocationY(), task.getLocationZ()), task.getPlanet()); + player.getWaypoints().put(wpRetrieve.getObjectID(), wpRetrieve); + + quest.setWaypointId(wpRetrieve.getObjectID()); break; + // quest.task.ground.timer case "timer": - ObjControllerMessage timer = new ObjControllerMessage(11, new QuestTaskTimerMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:timer_timertext", 20)); - quester.getClient().getSession().write(timer.serialize()); - System.out.println("Sent timer."); + AtomicInteger time = new AtomicInteger(new Random(task.getMaxTime()).nextInt((task.getMaxTime() - task.getMinTime()) + task.getMinTime())); + + ScheduledFuture taskTimer = Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> { + Console.println("Timer is: " + time.get()); + if (time.get() == 0) { + //quest.incrementQuestStep(); + completeActiveTask((CreatureObject) core.objectService.getObject(quester.getObjectID()), quest.getName()); + } else { + ObjControllerMessage timer = new ObjControllerMessage(11, new QuestTaskTimerMessage(quester.getObjectID(), quest.getCrcName(), "@quest/groundquests:timer_timertext", time.getAndDecrement())); + quester.getClient().getSession().write(timer.serialize()); + } + }, 1, 1, TimeUnit.SECONDS); + + quest.setTimer(taskTimer); break; + // quest.task.ground.show_message_box + case "show_message_box": + break; + default: //System.out.println("Don't know what to do for quest task: " + type); break; } + + if (!task.isVisible()) { + completeActiveTask(quester, quest); + return; + } + + } + + public void completeActiveTask(CreatureObject quester, String questName) { + if (quester.getPlayerObject().getQuestJournal().containsKey(CRC.StringtoCRC("quest/" + questName)) && !quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName)).isCompleted()) { + completeActiveTask(quester, quester.getPlayerObject().getQuestJournal().get(CRC.StringtoCRC("quest/" + questName))); + } + } + + public void completeActiveTask(CreatureObject quester, Quest quest) { + PlayerObject player = quester.getPlayerObject(); + if (player == null) + return; + + QuestData qData = getQuestData(quest.getName()); + + int activeStep = quest.getActiveStep(); + + QuestTask task = qData.getTasks().get(activeStep); + + //if (quest.getWaypointId() != 0) + //core.objectService.destroyObject(quest.getWaypointId()); + + if (quest.getTimer() != null) + quest.getTimer().cancel(true); if (activeStep + 1 >= qData.getTasks().size()) { QuestList listItem = questRewardMap.get(quest.getName()); @@ -199,14 +271,12 @@ public class QuestService implements INetworkDispatch { if (task.getGrantQuestOnComplete() != null && !task.getGrantQuestOnComplete().equals("")) activateQuest(quester, task.getGrantQuestOnComplete()); - - quest.incrementQuestStep(); // After handling the quest type, we can now increment the step - if (!task.isVisible()) { - player.getContainer().getClient().getSession().write(player.getBaseline(8).createDelta(7)); - activateNextTask(quester, quest); - return; - } + quest.incrementQuestStep(); + + player.getContainer().getClient().getSession().write(player.getBaseline(8).createDelta(7)); + + activateNextTask(quester, quest); } @@ -265,7 +335,7 @@ public class QuestService implements INetworkDispatch { // Give quest items if (info.getRewardLootName() != null && !info.getRewardLootName().equals("")) { - SWGObject rewardLoot = core.objectService.createObject(core.scriptService.getMethod("scripts/quest_rewards/", info.getRewardLootName(), "run").__call__().asString(), creo.getPlanet()); + SWGObject rewardLoot = core.objectService.createObject(core.scriptService.getMethod("scripts/quests/rewards/", info.getRewardLootName(), "run").__call__().asString(), creo.getPlanet()); inventory.add(rewardLoot); recievedItems.add(rewardLoot.getObjectID()); } @@ -361,12 +431,27 @@ public class QuestService implements INetworkDispatch { return; QuestItem item = player.getQuestRetrieveItemTemplates().get(target.getTemplate()); - activateNextTask(quester, item.getQuestName()); + completeActiveTask(quester, item.getQuestName()); player.getQuestRetrieveItemTemplates().remove(target.getTemplate(), item); } + public WaypointObject createWaypoint(String name, Point3D location, String planet) { + WaypointObject waypoint = (WaypointObject) core.objectService.createObject("object/waypoint/shared_waypoint.iff", core.terrainService.getPlanetByName(planet)); + if (waypoint == null) + return null; + + waypoint.setActive(true); + waypoint.setColor(WaypointObject.BLUE); + waypoint.setName(name); + waypoint.setPlanetCrc(CRC.StringtoCRC(planet)); + waypoint.setStringAttribute("", ""); //This simply allows the attributes to display (nothing else has to be done) + waypoint.setPosition(location); + + return waypoint; + } + public QuestData getQuestData(String questName) { if (questMap.containsKey(questName)) return questMap.get(questName); @@ -391,6 +476,12 @@ public class QuestService implements INetworkDispatch { } } + public void addCollisionEvent(String questName, String method, float x, float y, float z, float radius, String planet) { + CollidableCircle collision = new CollidableCircle(new Point3D(x,y,z), radius, core.terrainService.getPlanetByName(planet)); + collision.setCallback(core.scriptService.getMethod("scripts/quests/events/", questName, method)); + core.simulationService.addCollidable(collision, x, z); + } + public boolean adminActivateQuest(CreatureObject creo, String questName) { PlayerObject ghost = creo.getPlayerObject(); @@ -472,6 +563,8 @@ public class QuestService implements INetworkDispatch { if (visitor.getObjectByColumnNameAndIndex("ITEM_NAME", r) != null) task.setItemName((String) visitor.getObjectByColumnNameAndIndex("ITEM_NAME", r)); if (visitor.getObjectByColumnNameAndIndex("DROP_PERCENT", r) != null) task.setDropPercent((int) visitor.getObjectByColumnNameAndIndex("DROP_PERCENT", r)); if (visitor.getObjectByColumnNameAndIndex("RETRIEVE_MENU_TEXT", r) != null) task.setRetrieveMenuText((String) visitor.getObjectByColumnNameAndIndex("RETRIEVE_MENU_TEXT", r)); + if (visitor.getObjectByColumnNameAndIndex("MIN_TIME", r) != null) task.setMinTime((int) visitor.getObjectByColumnNameAndIndex("MIN_TIME", r)); + if (visitor.getObjectByColumnNameAndIndex("MAX_TIME", r) != null) task.setMaxTime((int) visitor.getObjectByColumnNameAndIndex("MAX_TIME", r)); //if (visitor.getObjectByColumnNameAndIndex("", r)) data.getTasks().add(task); @@ -519,6 +612,19 @@ public class QuestService implements INetworkDispatch { return qList; } + public void loadEvents() { + FileVisitor fv = new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException + { + core.scriptService.callScript("scripts/quests/events/", file.getFileName().toString().replace(".py", ""), "setup", core); + return FileVisitResult.CONTINUE; + } + }; + try { Files.walkFileTree(Paths.get("scripts/quests/events/"), fv); } + catch (IOException e) { e.printStackTrace(); } + } + // useful for custom quest scripts, and for the some of the datatables that are all screwed up /*private QuestData parseXmlQuestData(Quest quest) { try { @@ -554,4 +660,8 @@ public class QuestService implements INetworkDispatch { return template.replace(file, "shared_" + file); } + + @Override + public void shutdown() { } + } diff --git a/src/services/quest/QuestTask.java b/src/services/quest/QuestTask.java index 1934259c..3e53aefe 100644 --- a/src/services/quest/QuestTask.java +++ b/src/services/quest/QuestTask.java @@ -65,6 +65,8 @@ public class QuestTask { private int timeToComplete; private int numRequired; private int dropPercent; + private int minTime; + private int maxTime; private long waitMarkerBuilding; @@ -74,6 +76,7 @@ public class QuestTask { private float waitMarkerX; private float waitMarkerY; private float waitMarkerZ; + private float radius; public QuestTask() {} @@ -451,4 +454,28 @@ public class QuestTask { public void setRetrieveMenuText(String retrieveMenuText) { this.retrieveMenuText = retrieveMenuText; } + + public int getMinTime() { + return minTime; + } + + public void setMinTime(int minTime) { + this.minTime = minTime; + } + + public int getMaxTime() { + return maxTime; + } + + public void setMaxTime(int maxTime) { + this.maxTime = maxTime; + } + + public float getRadius() { + return radius; + } + + public void setRadius(float radius) { + this.radius = radius; + } }