Merge pull request #1277 from ProjectSWGCore/master

Merge to Experimental
This commit is contained in:
Skorpios0
2014-11-09 03:57:30 +00:00
15 changed files with 517 additions and 76 deletions
+5 -53
View File
@@ -305,7 +305,7 @@ def miscHandler(owner):
returnList = Vector()
returnList.add('List.lstList:SelectedRow')
window.addHandler(0, '', Trigger.TRIGGER_OK, returnList, miscHandlerCallback)
window.addListBoxMenuItem('Backpack', 0)
window.addListBoxMenuItem('Instrument', 0)
window.addListBoxMenuItem('Heroism Jewelry Set', 1)
window.addListBoxMenuItem('Belt of Master Bodo Baas', 2)
window.addListBoxMenuItem('Starter Equipment Box', 3)
@@ -321,7 +321,7 @@ def miscHandlerCallback(owner, window, eventType, returnList):
return
if returnList.get(0)=='0':
backpack(owner, inventory)
instrument(owner, inventory)
return
if returnList.get(0)=='1':
heroismJewelry(owner, inventory)
@@ -595,6 +595,7 @@ def compositeArmor(owner, inventory):
comp_chest.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
comp_boots = core.objectService.createObject("object/tangible/wearables/armor/composite/shared_armor_composite_boots.iff", owner.getPlanet())
comp_gloves = core.objectService.createObject("object/tangible/wearables/armor/composite/shared_armor_composite_gloves.iff", owner.getPlanet())
inventory.add(comp_bicep_r);
inventory.add(comp_bicep_l);
inventory.add(comp_bracer_r);
@@ -610,60 +611,11 @@ def compositeArmor(owner, inventory):
def clonetrooperArmor(owner, inventory):
clonetrooper_bicep_r = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_bicep_r.iff", owner.getPlanet())
clonetrooper_bicep_r.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_bicep_r.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_bicep_r.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_bicep_r.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_bicep_r.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_bicep_r.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_bicep_l = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_bicep_l.iff", owner.getPlanet())
clonetrooper_bicep_l.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_bicep_l.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_bicep_l.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_bicep_l.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_bicep_l.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_bicep_l.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_bracer_r = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_bracer_r.iff", owner.getPlanet())
clonetrooper_bracer_r.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_bracer_r.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_bracer_r.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_bracer_r.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_bracer_r.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_bracer_r.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_bracer_l = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_bracer_l.iff", owner.getPlanet())
clonetrooper_bracer_l.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_bracer_l.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_bracer_l.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_bracer_l.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_bracer_l.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_bracer_l.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_leggings = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_leggings.iff", owner.getPlanet())
clonetrooper_leggings.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_leggings.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_leggings.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_leggings.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_leggings.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_leggings.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_helmet = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_helmet.iff", owner.getPlanet())
clonetrooper_helmet.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_helmet.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_helmet.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_helmet.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_helmet.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_helmet.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_chest = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_chest_plate.iff", owner.getPlanet())
clonetrooper_chest.setIntAttribute("cat_armor_standard_protection.armor_eff_kinetic", 7000);
clonetrooper_chest.setIntAttribute("cat_armor_standard_protection.armor_eff_energy", 5000);
clonetrooper_chest.setIntAttribute("cat_armor_special_protection.special_protection_type_heat", 6000);
clonetrooper_chest.setIntAttribute("cat_armor_special_protection.special_protection_type_cold", 6000);
clonetrooper_chest.setIntAttribute("cat_armor_special_protection.special_protection_type_acid", 6000);
clonetrooper_chest.setIntAttribute("cat_armor_special_protection.special_protection_type_electricity", 6000);
clonetrooper_boots = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_boots.iff", owner.getPlanet())
clonetrooper_gloves = core.objectService.createObject("object/tangible/wearables/armor/clone_trooper/shared_armor_clone_trooper_neutral_s01_gloves.iff", owner.getPlanet())
@@ -1347,8 +1299,8 @@ def jediBelt(owner, inventory):
screenOne(core, owner)
return
def backpack(owner, inventory):
# inventory.add(core.objectService.createObject("object/tangible/wearables/backpack/shared_backpack_s01.iff", owner.getPlanet()))
def instrument(owner, inventory):
inventory.add(core.objectService.createObject("object/tangible/instrument/shared_slitherhorn.iff", owner.getPlanet()))
screenOne(core, owner)
return
+2 -1
View File
@@ -56,7 +56,8 @@ def startDance(core, actor, danceName, visual):
entSvc = core.entertainmentService
if visual <= 0:
visual = entSvc.getDanceVisualId(danceName)
visual = entSvc.getDanceVisualId(danceName)
print("[PYTHON] startdance.visual = " , visual)
if visual <= 0:
actor.sendSystemMessage('@performance:dance_unknown_self',0)
+173
View File
@@ -0,0 +1,173 @@
import sys
from services.sui import SUIWindow
from services.sui import SUIService
from services.sui.SUIWindow import Trigger
from services.sui.SUIService import ListBoxType
from java.util import Vector
from java.util import HashMap
from resources.datatables import Posture
def setup():
return
def run(core, actor, target, commandString):
global suiWindow
global actorObject
global entSvc
actorObject = actor
entSvc = core.entertainmentService
instrumentObj = entSvc.getInstrument(actor)
#TODO: Determine if player has an instrument
if instrumentObj is not None:
#If player does have an instrument then determine what type of instrument the player has
instrumentStfName = instrumentObj.getStfName()
instrumentCode = -1
#If type is traz then audioID is 1
if instrumentStfName == "obj_traz_classic":
instrumentCode = 1
#if type is slitherhorn then audioID is 2
elif instrumentStfName == "obj_slitherhorn_classic":
instrumentCode = 2
#if type is fanfar then audioID is 3
elif instrumentStfName == "obj_fanfar_classic":
instrumentCode = 3
#if type is flutedroopy then audioID is 4
#FIXME: I don't know what this is yet, but I suspect it's "obj_chidinkalu_horn_classic"
#if type is kloohorn then audioID is 5
elif instrumentStfName == "obj_kloo_horn_classic":
instrumentCode = 5
#if type is fizz then audioID is 6
elif instrumentStfName == "obj_fizzz_classic":
instrumentCode = 6
#if type is bandfill then audioID is 7
elif instrumentStfName == "obj_bandfill_classic":
instrumentCode = 7
#if type is omnibox then audioID is 8
#FIXME: This instrument isn't equipped when played
#if type is nalargon then audioID is 9
#FIXME: This instrument isn't equipped when played
#if type is mandoviol then audioID is 10
elif instrumentStfName == "obj_mandoviol_classic":
instrumentCode = 10
#if type is xantha then audioID is 11
elif instrumentStfName == "xantha_n":
instrumentCode = 11
#if type is flangedjessoon then audioID is 12
elif instrumentStfName == "obj_jessoon":
instrumentCode = 12
#if type is valahorn then audioID is 13
elif instrumentStfName == "obj_valahorn":
instrumentCode = 13
#if type is downeybox then audioID is 14
#FIXME: This instrument isn't equipped when played
#TODO: Handle instruments that are placed on the ground
print('instrumentCode: ' , instrumentCode)
if instrumentCode > 0:
#Parse command string
if len(commandString) > 0:
params = commandString.split(" ")
performance = entSvc.getPerformance(params[0], instrumentCode)
print('line number: ', performance.getLineNumber())
if performance is None:
#Not a proper song
actor.sendSystemMessage('@performance:music_invalid_song', 0)
return
#Handle lack of skill
if not entSvc.canPerform(actor, performance):
actor.sendSystemMessage('@performance:music_lack_skill_self',0)
return
startMusic(core, actor, performance.getLineNumber())
else:
availableSongs = entSvc.getAvailableSongs(actor, instrumentCode)
suiSvc = core.suiService
suiWindow = suiSvc.createListBox(ListBoxType.LIST_BOX_OK_CANCEL, "@performance:select_song", "@performance:available_songs", availableSongs, actor, None, 10)
returnList = Vector()
returnList.add("List.lstList:SelectedRow")
suiWindow.addHandler(0, '', Trigger.TRIGGER_OK, returnList, handleStartMusic)
suiSvc.openSUIWindow(suiWindow)
else:
#Equipped item is not an instrument
actor.sendSystemMessage('@performance:music_no_instrument', 0)
pass
else:
#No instrument equipped
actor.sendSystemMessage('@performance:music_no_instrument', 0)
pass
'''
NOTE: animation files are "all_b_dnc_musician_<instrument-name>_loop.ans"
NOTE: flourish animation files are "all_b_dnc_musician_<instrument-name>_sp_8.ans"
This information doesn't seem to be needed...
'''
pass
def handleStartMusic(core, owner, eventType, returnList):
item = suiWindow.getMenuItems().get(int(returnList.get(0)))
print(item.getObjectId())
startMusic(core, actorObject, item.getObjectId())
pass
def startMusic(core, actor, performanceLineNumber):
if actor.getPosture == 0x09:
actor.sendSystemMessage('@performance:already_performing_self', 0)
pass
if not actor.getPerformanceWatchee():
#this also notifies the client with a delta4
actor.setPerformanceWatchee(actor)
actor.addSpectator(actor)
actor.setPosture(0x09)
#Turn on XP gain
playerObject = actor.getSlottedObject('ghost')
if playerObject and playerObject.getProfession() == "entertainer_1a" and actor.getLevel() != 90:
entSvc.startPerformanceExperience(actor)
performance = entSvc.getPerformanceByIndex(performanceLineNumber)#TODO: Refactor to not need this
audioId = performance.getInstrumentAudioId()
songAnim = "music_0"
if audioId < 7:
songAnim = "music_3" #Horns
elif audioId < 8:
songAnim = "music_1" #Bandfill
elif audioId < 9:
songAnim = "music_4" #Omnibox
elif audioId < 10:
songAnim = "music_2" #Nargalon
elif audioId < 12:
songAnim = "music_5" #String instruments
elif audioId < 14:
songAnim = "music_3" #More horns
elif audioId < 15:
songAnim = "music_4" #downeybox (Don't think this was ever added)
print(songAnim)
actor.sendSystemMessage('@performance:music_start_self',0)
#entSvc.startPerformance(actor, performance.getLineNumber(), -842249156, "dance_0", 0)#TODO: Figure out what exactly goes in parameter slots 2 and 3
#entSvc.startPerformance(actor, performance.getLineNumber(), -842249156, anim, 0)#TODO: Figure out what exactly goes in parameter slots 2 and 3
entSvc.startPerformance(actor, performanceLineNumber+1, -842249156, songAnim, 0)#TODO: Figure out what exactly goes in parameter slots 2 and 3
'''
Bandfill = music_1
Nargalon = music_2
(Some flute-ish)[perhaps traz] = music_3
Omnibox = music_4
Mandoviol = music_5
'''
pass
+1 -1
View File
@@ -11,5 +11,5 @@ def run(core, actor, target, commandString):
actor.sendSystemMessage('@performance:dance_not_performing', 0)
return
actor.stopPerformance()
entSvc.stopPerformance(actor)
return
+16
View File
@@ -0,0 +1,16 @@
import sys
def setup():
return
def run(core, actor, target, commandString):
entSvc = core.entertainmentService
perf = entSvc.getPerformanceByIndex(actor.getPerformanceId())
if actor.getPosture() != 0x09 or not perf or perf.getDanceVisualId() < 0:
actor.sendSystemMessage('@performance:music_not_performing', 0)
return
entSvc.stopPerformance(actor)
#actor.sendSystemMessage('@performance:music_stop_self', 0)
return
@@ -0,0 +1,80 @@
import sys
from services.spawn import MobileTemplate
from services.spawn import WeaponTemplate
from resources.datatables import WeaponType
from resources.datatables import Difficulty
from resources.datatables import Options
from java.util import Vector
def addTemplate(core):
mobileTemplate = MobileTemplate()
mobileTemplate.setCreatureName('eow_outbreak_undead_deathtrooper') ##TODO: Needs correct stf name
mobileTemplate.setLevel(5)
mobileTemplate.setDifficulty(Difficulty.NORMAL)
mobileTemplate.setMinSpawnDistance(5)
mobileTemplate.setMaxSpawnDistance(10)
mobileTemplate.setDeathblow(True)
mobileTemplate.setSocialGroup('undead')
mobileTemplate.setAssistRange(15)
mobileTemplate.setRespawnTime(300)
mobileTemplate.setOptionsBitmask(Options.AGGRESSIVE | Options.ATTACKABLE)
templates = Vector()
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_01_f.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_01_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_02_f.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_03_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_04_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_05_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_06_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_07_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_08_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_09_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_10_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_11_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_12_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_13_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_14_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_15_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_16_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_17_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_18_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_19_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_20_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_21_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_22_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_23_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_24_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_25_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_26_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_27_m.iff')
templates.add('object/mobile/shared_outbreak_undead_deathtrooper_28_m.iff')
mobileTemplate.setTemplates(templates)
weaponTemplates = Vector()
weapontemplate = WeaponTemplate('object/weapon/ranged/rifle/shared_rifle_e11.iff', WeaponType.RIFLE, 0.8, 0, 'energy')
weaponTemplates.add(weapontemplate)
weapontemplate = WeaponTemplate('object/weapon/melee/unarmed/shared_unarmed_default.iff', WeaponType.ONEHANDEDMELEE, 1.0, 4, 'kinetic')
weaponTemplates.add(weapontemplate)
mobileTemplate.setWeaponTemplateVector(weaponTemplates)
attacks = Vector()
mobileTemplate.setDefaultAttack('RangedShot')
mobileTemplate.setDefaultAttack('MeleeHit')
mobileTemplate.setAttacks(attacks)
lootPoolNames_1 = ['Junk']
lootPoolChances_1 = [100]
lootGroupChance_1 = 65
mobileTemplate.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1)
lootPoolNames_4 = ['random_stat_jewelry']
lootPoolChances_4 = [100]
lootGroupChance_4 = 8
mobileTemplate.addToLootGroups(lootPoolNames_4,lootPoolChances_4,lootGroupChance_4)
core.spawnService.addMobileTemplate('undead_deathtrooper', mobileTemplate)
return
@@ -0,0 +1,16 @@
import sys
from java.util import Vector
from services.spawn import DynamicSpawnGroup
from services.spawn import MobileTemplate
def addDynamicGroup(core):
dynamicGroup = DynamicSpawnGroup()
mobileTemplates = Vector()
mobileTemplates.add('undead_deathtrooper')
dynamicGroup.setMobiles(mobileTemplates)
dynamicGroup.setGroupMembersNumber(5)
dynamicGroup.setName('dathomir_deathtroopers_1')
dynamicGroup.setMaxSpawns(-1)
dynamicGroup.setMinSpawnDistance(10)
core.spawnService.addDynamicGroup('dathomir_level_5_deathtroopers', dynamicGroup)
return
@@ -0,0 +1,12 @@
import sys
from java.util import Vector
def addSpawnArea(core):
dynamicGroups = Vector()
dynamicGroups.add('dathomir_level_5_deathtroopers')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5700, -6500, 100, 'dathomir')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5640, -6550, 100, 'dathomir')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5850, -6400, 100, 'dathomir')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5800, -6500, 100, 'dathomir')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5600, -6525, 100, 'dathomir')
return
@@ -1,9 +0,0 @@
# Spawn Area file created with PSWG Planetary Spawn Tool
import sys
from java.util import Vector
def addSpawnArea(core):
dynamicGroups = Vector()
dynamicGroups.add('dark_jedi_wild_1')
core.spawnService.addDynamicSpawnArea(dynamicGroups, -5700, -6478, 100, 'dathomir')
return
@@ -1,4 +1,9 @@
import sys
def setup(core, object):
return
object.setStringAttribute('condition', '100/100')
object.setStringAttribute('@obj_attr_n:color', 'Blackwing Bezoar')
object.setAttachment('radial_filename', 'item/tunable')
object.setStringAttribute('@obj_attr_n:crystal_owner", "\\#D1F56F UNTUNED \\#FFFFFF ')
return
@@ -2,6 +2,7 @@ import sys
def setup(core, object):
object.setIntAttribute('no_trade', 1)
object.setIntAttribute('reuse_time', 5)
object.setAttachment('radial_filename', 'object/usable')
object.setStfFilename('static_item_n')
object.setStfName('invasion_gcw_binoculars_01_01')
@@ -368,6 +368,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
if (getPosture() == resources.datatables.Posture.SkillAnimating) {
stopPerformance();
//NGECore.getInstance().entertainmentService.stopPerformance(this);//FIXME: Maximum recursion.
}
if (getPosture() == posture) {
@@ -1050,6 +1051,16 @@ public class CreatureObject extends TangibleObject implements IPersistent {
this.entertainerExperience = entertainerExperience;
}
public void cancelEntertainerExperience()
{
synchronized(objectMutex) {
if (entertainerExperience != null) {
entertainerExperience.cancel(true);
entertainerExperience = null;
}
}
}
public ScheduledFuture<?> getInspirationTick() {
return inspirationTick;
}
@@ -1106,6 +1117,11 @@ public class CreatureObject extends TangibleObject implements IPersistent {
setListenToId((performanceListenee == null) ? 0L : performanceListenee.getObjectID());
}
public ArrayList<CreatureObject> getPerformanceAudience()
{
return new ArrayList<CreatureObject>(performanceAudience);
}
public int getFlourishCount() {
synchronized(objectMutex) {
return this.flourishCount;
@@ -1588,7 +1604,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
}
}
@Deprecated // FIXME Objects aren't meant for functionality
@Deprecated // FIXME Objects aren't meant for functionality. Instead use EntertainmentService.stopPerformance()
public void stopPerformance() {
setPerformanceId(0);
setPerformanceCounter(0);
@@ -1601,7 +1617,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
}
}
sendSystemMessage("@performance:" + getPerformanceType() + "_stop_self", (byte)0);
//sendSystemMessage("@performance:" + getPerformanceType() + "_stop_self", (byte)0);
stopAudience();
if (isPerforming()) {
@@ -1609,7 +1625,7 @@ public class CreatureObject extends TangibleObject implements IPersistent {
}
}
@Deprecated // FIXME Objects aren't meant for functionality
@Deprecated // FIXME Objects aren't meant for functionality. Instead use EntertainmentService.stopAudience()
public void stopAudience() {
synchronized(objectMutex) {
if (performanceAudience == null) {
+182 -5
View File
@@ -1,9 +1,12 @@
package services;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
@@ -13,6 +16,7 @@ import java.util.concurrent.TimeUnit;
import main.NGECore;
import org.apache.commons.collections.iterators.EntrySetMapIterator;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
@@ -49,10 +53,13 @@ public class EntertainmentService implements INetworkDispatch {
private NGECore core;
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
private static final int SONG = 866729052;
private static final int DANCE = -1788534963;
private Vector<BuffBuilder> buffBuilderSkills = new Vector<BuffBuilder>();
//FIXME: create a wrapper class for double key lookup maps
private ConcurrentHashMap<String,Performance> performances = new ConcurrentHashMap<String,Performance>();
private ConcurrentHashMap<PerformanceUID,Performance> performances = new ConcurrentHashMap<PerformanceUID,Performance>();
private ConcurrentHashMap<Integer,Performance> performancesByIndex = new ConcurrentHashMap<Integer,Performance>();
private ConcurrentHashMap<Integer,Performance> danceMap = new ConcurrentHashMap<Integer,Performance>();
@@ -68,6 +75,9 @@ public class EntertainmentService implements INetworkDispatch {
this.core = core;
populateSkillCaps();
populatePerformanceTable();
System.out.printf("[DEBUG] number_of_performances: %d\n", performances.size());
populatePerformanceEffects();
registerCommands();
loadCharacterCustomizationData();
@@ -437,13 +447,21 @@ public class EntertainmentService implements INetworkDispatch {
if (p.getType() == -1788534963) {
danceMap.put(new Integer(p.getDanceVisualId()), p);
}
performances.put(p.getPerformanceName(), p);
performances.put(new PerformanceUID(p.getPerformanceName(), p.getInstrumentAudioId()), p);
performancesByIndex.put(r, p);
}
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
//TODO: Remove
Set<PerformanceUID> debugSet = performances.keySet();
for(PerformanceUID uid : debugSet)
{
System.out.println(uid.toString());
}
}
private void populateSkillCaps() {
@@ -608,13 +626,15 @@ public class EntertainmentService implements INetworkDispatch {
}*/
}
//FIXME: Refactor using new map --Complete--
public int getDanceVisualId(String danceName) {
Performance p = performances.get(danceName);
Performance p = getPerformance(danceName, 0);
//if 0 , then it's no dance. need to handle that in the script.
return ((p == null) ? 0 : p.getDanceVisualId());
}
//FIXME: Refactor using new map ?? Perhaps not ??
public Map<Long,String> getAvailableDances(CreatureObject actor) {
Map<Long,String> dances = new HashMap<Long, String>();
@@ -627,6 +647,23 @@ public class EntertainmentService implements INetworkDispatch {
}
public Map<Long, String> getAvailableSongs(CreatureObject actor, int instrumentCode)
{
Map<Long, String> songs = new HashMap<Long, String>();
for(Performance performance : performances.values())
{
if(performance.getInstrumentAudioId() == instrumentCode)
{
if(canPerform(actor, performance))
{
songs.put(new Long(performance.getLineNumber()), performance.getPerformanceName());
}
}
}
return songs;
}
//FIXME: if visualId > 0 then it is a dance...
public boolean isDance(int visualId) {
return ( danceMap.get(visualId) != null ) ;
}
@@ -638,17 +675,31 @@ public class EntertainmentService implements INetworkDispatch {
return false;
}
public boolean canDance(CreatureObject actor, int visualId) {
if (!isDance(visualId)) { return false; }
return canDance(actor, danceMap.get(visualId));
}
public boolean canPerform(CreatureObject actor, Performance performance)
{
if(performance.getRequiredInstrument() != null)
{
boolean hasInstrument = actor.hasAbility(performance.getRequiredInstrument());
boolean hasSong = actor.hasAbility(performance.getRequiredSong());
return hasInstrument && hasSong;
}
else return actor.hasAbility(performance.getRequiredDance());
}
public Performance getDance(int visualId) {
return danceMap.get(visualId);
}
public Performance getPerformance(String name) {
return performances.get(name);
//FIXME: Refactor using new map -COMPLETE-
//FIXME: Returning null for known combination... - fixed?
public Performance getPerformance(String name, int instrumentAudioId) {
return performances.get(new PerformanceUID(name, instrumentAudioId));
}
public Performance getPerformanceByIndex(int index) {
@@ -670,6 +721,27 @@ public class EntertainmentService implements INetworkDispatch {
}
}
public void stopPerformance(CreatureObject actor)
{
Performance performance = getPerformanceByIndex(actor.getPerformanceId());
actor.setPerformanceId(0);
actor.setPerformanceCounter(0);
actor.setCurrentAnimation("");//I think the animation should be some sort of idle animation.
actor.cancelEntertainerExperience();
String performanceType = (performance.getType() == DANCE)? "dance" : "music";
actor.sendSystemMessage(String.format("@performance:%s_stop_self", performanceType), (byte)0);//FIXME: This hasn't been sending the correct message
stopAudience(actor);
if (actor.isPerforming()) {
actor.setPerforming(false);
}
actor.setPosture((byte) 0x0);
}
public void startPerformanceExperience(final CreatureObject entertainer) {
final ScheduledFuture<?> experienceTask = scheduler.scheduleAtFixedRate(() -> {
try {
@@ -751,12 +823,56 @@ public class EntertainmentService implements INetworkDispatch {
}
public void stopAudience(CreatureObject actor)
{
synchronized(actor.getMutex()) {
if (actor.getPerformanceAudience() == null) {
return;
}
String performanceType = actor.getPerformanceType();
Iterator<CreatureObject> it = actor.getPerformanceAudience().iterator();
while (it.hasNext()) {
CreatureObject next = it.next();
if (((performanceType.equals("dance")) && (next.getPerformanceWatchee() != actor))
|| ((performanceType.equals("music")) && (next.getPerformanceListenee() != actor))) {
continue;
}
if (performanceType.equals("dance")) {
next.setPerformanceWatchee(null);
} else if (performanceType.equals("musci")) {
next.setPerformanceListenee(null);
}
//this may be a bit dodgy.
boolean isEntertained = next.getPerformanceListenee() != null && next.getPerformanceWatchee() != null;
if (!isEntertained) {
next.setMoodAnimation("");
}
if (next == actor) {
continue;
}
next.sendSystemMessage("@performance:" + performanceType + "_stop_other", (byte)0);
}
actor.getPerformanceAudience().clear();
//performanceAudience = new ArrayList<CreatureObject>();
}
}
public void performFlourish(final CreatureObject performer, int flourish) {
// FIXME There wasn't a limit on flourishes; they just queued up.
if (performer.getFlourishCount() > 0 || performer.isPerformingFlourish()) {
performer.sendSystemMessage("@performance:flourish_wait_self", (byte) 0);
return;
}
//FIXME: I don't think this will work.
Performance performance = getPerformanceByIndex(performer.getPerformanceId());
if(performance == null)
@@ -987,9 +1103,70 @@ public class EntertainmentService implements INetworkDispatch {
return 0;
}
/**
* @param actor Player
* @return SWGObject equipped in the player's right hand
*/
public SWGObject getInstrument(CreatureObject actor)
{
return actor.getSlottedObject("hold_r");
}
@Override
public void shutdown() {
}
/**
* @author Glen
* This class serves as a unique id for performances.
* The performance.iff file is structured very similar to a database, and with that idea in mind
* this helper-class will serve as essentially the primary key of each performance.
*/
private class PerformanceUID
{
private final String performanceName;
private final int instrumentAudioId;
public PerformanceUID(String performanceName, int instrumentAudioId)
{
this.performanceName = performanceName;
this.instrumentAudioId = instrumentAudioId;
}
public boolean equals(PerformanceUID other) {
if(other != null)
{
if(this.performanceName == other.performanceName && this.instrumentAudioId == other.instrumentAudioId)
{
return true;
}
}
return false;
}
@Override
public boolean equals(Object obj) {
if(obj != null && this.getClass() == obj.getClass() && this.performanceName.equals(((PerformanceUID)obj).performanceName) && this.instrumentAudioId == ((PerformanceUID)obj).instrumentAudioId)
{
return true;
}
return false;
}
@Override
public int hashCode() {
return this.performanceName != null ? performanceName.hashCode() * 37 + instrumentAudioId: instrumentAudioId;
// int hash = performanceName.hashCode() ^ instrumentAudioId;
// return hash;
}
@Override
public String toString() {
return "PerformanceUID [performanceName=" + performanceName
+ ", instrumentAudioId=" + instrumentAudioId + ", hashCode = " + hashCode() + "]";
}
}
}
+4 -3
View File
@@ -1288,7 +1288,8 @@ public class ObjectService implements INetworkDispatch {
if(! checkIfObjectAlreadyInList(object.getObjectID()))
objectList.put(object.getObjectID(), object);
} else {
Thread.currentThread().dumpStack();
Thread.currentThread();
Thread.dumpStack();
}
});
@@ -1731,12 +1732,12 @@ public class ObjectService implements INetworkDispatch {
}
private void addCellsToBuildings(){
Iterator it = null;
Iterator<?> it = null;
synchronized(buildingMap){
it = buildingMap.entrySet().iterator();
}
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
Map.Entry<?, ?> pairs = (Map.Entry<?, ?>)it.next();
long buildingId = (long) pairs.getKey();
BuildingObject building = (BuildingObject)pairs.getValue();
//System.out.println("We have buildingId " +buildingId);