diff --git a/scripts/mobiles/canon/storm_commando.py b/scripts/mobiles/canon/storm_commando.py new file mode 100644 index 00000000..b6bf6523 --- /dev/null +++ b/scripts/mobiles/canon/storm_commando.py @@ -0,0 +1,33 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('storm_commando') + mobileTemplate.setLevel(71) + mobileTemplate.setDifficulty(0) + mobileTemplate.setAttackRange(24) + mobileTemplate.setAttackSpeed(0.4) + mobileTemplate.setWeaponType(1) + + templates = Vector() + templates.add('object/mobile/shared_dressed_scout_trooper_black_black.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/ranged/pistol/shared_pistol_scout_blaster.iff', 0, 1.0) + weaponTemplates.add(weapontemplate) + weapontemplate = WeaponTemplate('object/weapon/ranged/pistol/shared_pistol_dx2.iff', 0, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + + attacks = Vector() + mobileTemplate.setDefaultAttack('rangedShot') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('storm_commando', mobileTemplate) + diff --git a/scripts/mobiles/dathomir/nightsister_slave.py b/scripts/mobiles/dathomir/nightsister_slave.py new file mode 100644 index 00000000..7ce31682 --- /dev/null +++ b/scripts/mobiles/dathomir/nightsister_slave.py @@ -0,0 +1,23 @@ +import sys +from services.spawn import MobileTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('nightsister_slave') + mobileTemplate.setLevel(86) + mobileTemplate.setDifficulty(1) + mobileTemplate.setAttackRange(5) + mobileTemplate.setAttackSpeed(1.0) + + templates = Vector() + templates.add('object/mobile/shared_dressed_dathomir_nightsister_slave.iff') + mobileTemplate.setTemplates(templates) + + + attacks = Vector() + mobileTemplate.setDefaultAttack('meleehit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('nightsister_slave', mobileTemplate) \ No newline at end of file diff --git a/scripts/mobiles/dathomir/rancor.py b/scripts/mobiles/dathomir/rancor.py new file mode 100644 index 00000000..975e6869 --- /dev/null +++ b/scripts/mobiles/dathomir/rancor.py @@ -0,0 +1,22 @@ +import sys +from services.spawn import MobileTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('rancor') + mobileTemplate.setLevel(50) + mobileTemplate.setDifficulty(1) + mobileTemplate.setAttackRange(5) + + templates = Vector() + templates.add('object/mobile/shared_rancor.iff') + mobileTemplate.setTemplates(templates) + + + attacks = Vector() + mobileTemplate.setDefaultAttack('creatureMeleeAttack') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('rancor', mobileTemplate) \ No newline at end of file diff --git a/scripts/mobiles/kashyyyk/general_grievous.py b/scripts/mobiles/kashyyyk/general_grievous.py new file mode 100644 index 00000000..c6b18095 --- /dev/null +++ b/scripts/mobiles/kashyyyk/general_grievous.py @@ -0,0 +1,30 @@ +import sys +from services.spawn import MobileTemplate +from services.spawn import WeaponTemplate +from java.util import Vector + +def addTemplate(core): + mobileTemplate = MobileTemplate() + + mobileTemplate.setCreatureName('ep3_general_grievous') + mobileTemplate.setLevel(80) + mobileTemplate.setDifficulty(2) + mobileTemplate.setAttackRange(6) + mobileTemplate.setAttackSpeed(1.0) + mobileTemplate.setWeaponType(9) + + templates = Vector() + templates.add('object/mobile/ep3/shared_general_grievous.iff') + mobileTemplate.setTemplates(templates) + + weaponTemplates = Vector() + weapontemplate = WeaponTemplate('object/weapon/melee/2h_sword/crafted_saber/shared_sword_lightsaber_two_handed_gen5.iff', 10, 1.0) + weaponTemplates.add(weapontemplate) + mobileTemplate.setWeaponTemplateVector(weaponTemplates) + + attacks = Vector() + mobileTemplate.setDefaultAttack('saberHit') + mobileTemplate.setAttacks(attacks) + + core.spawnService.addMobileTemplate('general_grievous', mobileTemplate) + \ No newline at end of file diff --git a/scripts/object/mobile/dressed_dathomir_nightsister_slave.py b/scripts/object/mobile/dressed_dathomir_nightsister_slave.py index ccad8904..32ec3471 100644 --- a/scripts/object/mobile/dressed_dathomir_nightsister_slave.py +++ b/scripts/object/mobile/dressed_dathomir_nightsister_slave.py @@ -1,4 +1,10 @@ import sys def setup(core, object): + + lootPoolNames_1 = ['rareloot'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 5 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + return \ No newline at end of file diff --git a/scripts/object/mobile/dressed_scout_trooper_black_black.py b/scripts/object/mobile/dressed_scout_trooper_black_black.py index ccad8904..7334127c 100644 --- a/scripts/object/mobile/dressed_scout_trooper_black_black.py +++ b/scripts/object/mobile/dressed_scout_trooper_black_black.py @@ -1,4 +1,10 @@ import sys def setup(core, object): - return \ No newline at end of file + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 90 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + + return diff --git a/scripts/object/mobile/rancor.py b/scripts/object/mobile/rancor.py index ccad8904..8d5d1819 100644 --- a/scripts/object/mobile/rancor.py +++ b/scripts/object/mobile/rancor.py @@ -1,4 +1,10 @@ import sys def setup(core, object): + + lootPoolNames_1 = ['Junk'] + lootPoolChances_1 = [100] + lootGroupChance_1 = 90 + object.addToLootGroups(lootPoolNames_1,lootPoolChances_1,lootGroupChance_1) + return \ No newline at end of file diff --git a/scripts/object/tangible/wearables/robe/robe_jedi_dark_s05.py b/scripts/object/tangible/wearables/robe/robe_jedi_dark_s05.py index f4e46790..80081dce 100644 --- a/scripts/object/tangible/wearables/robe/robe_jedi_dark_s05.py +++ b/scripts/object/tangible/wearables/robe/robe_jedi_dark_s05.py @@ -1,31 +1,22 @@ import sys def setup(core, object): + object.setStfFilename('static_item_n') + object.setStfName('item_jedi_robe_dark_04_05') + object.setDetailFilename('static_item_d') + object.setDetailName('item_jedi_robe_dark_04_05') + + object.setStringAttribute('protection_level', 'Radiant') + object.setStringAttribute('class_required', 'Jedi') + object.setIntAttribute('required_combat_level', 20) + + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:constitution_modified', 250) + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:precision_modified', 250) + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:luck_modified', 250) + + object.setStringAttribute('proc_name', '@ui_buff:proc_old_dark_jedi_gift') + object.setStringAttribute('@set_bonus:piece_bonus_count_2', '@set_bonus:set_bonus_jedi_robe_1') + + object.setAttachment('type', 'jedi_robe') + object.setAttachment('setBonus', 'set_bonus_jedi_robe') return - -def equip(core, actor, target): - core.skillModService.addSkillMod(actor, 'constitution_modified', 250) - core.skillModService.addSkillMod(actor, 'precision_modified', 250) - core.skillModService.addSkillMod(actor, 'luck_modified', 250) - - Buff = actor.getBuffByName('proc_old_dark_jedi_gift') - if actor.getBuffList().contains(Buff): - core.buffService.removeBuffFromCreature(actor, Buff) - return - - if actor: - core.buffService.addBuffToCreature(actor, 'proc_old_dark_jedi_gift') - return - return - -def unequip(core, actor, target): - core.skillModService.deductSkillMod(actor, 'constitution_modified', 250) - core.skillModService.deductSkillMod(actor, 'precision_modified', 250) - core.skillModService.deductSkillMod(actor, 'luck_modified', 250) - - Buff = actor.getBuffByName('proc_old_dark_jedi_gift') - if actor.getBuffList().contains(Buff): - core.buffService.removeBuffFromCreature(actor, Buff) - return - return - diff --git a/scripts/object/tangible/wearables/robe/robe_jedi_light_s05.py b/scripts/object/tangible/wearables/robe/robe_jedi_light_s05.py index 9c60f170..0b850eec 100644 --- a/scripts/object/tangible/wearables/robe/robe_jedi_light_s05.py +++ b/scripts/object/tangible/wearables/robe/robe_jedi_light_s05.py @@ -1,34 +1,26 @@ import sys def setup(core, object): + object.setStfFilename('static_item_n') + object.setStfName('item_jedi_robe_light_04_05') + object.setDetailFilename('static_item_d') + object.setDetailName('item_jedi_robe_light_04_05') + + object.setStringAttribute('protection_level', 'Radiant') + object.setStringAttribute('class_required', 'Jedi') + object.setIntAttribute('required_combat_level', 20) + + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:constitution_modified', 250) + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:strength_modified', 250) + object.setIntAttribute('cat_stat_mod_bonus.@stat_n:agility_modified', 250) + + + object.setStringAttribute('proc_name', '@ui_buff:proc_old_light_jedi_gift') + object.setStringAttribute('@set_bonus:piece_bonus_count_2', '@set_bonus:set_bonus_jedi_robe_1') + + object.setAttachment('type', 'jedi_robe') + object.setAttachment('setBonus', 'set_bonus_jedi_robe') + return - -def equip(core, actor, target): - core.skillModService.addSkillMod(actor, 'agility_modified', 250) - core.skillModService.addSkillMod(actor, 'constitution_modified', 250) - core.skillModService.addSkillMod(actor, 'strength_modified', 250) - - Buff = actor.getBuffByName('proc_old_light_jedi_gift') - if actor.getBuffList().contains(Buff): - core.buffService.removeBuffFromCreature(actor, Buff) - return - - if actor: - core.buffService.addBuffToCreature(actor, 'proc_old_light_jedi_gift') - return - return - -def unequip(core, actor, target): - core.skillModService.deductSkillMod(actor, 'agility_modified', 250) - core.skillModService.deductSkillMod(actor, 'constitution_modified', 250) - core.skillModService.deductSkillMod(actor, 'strength_modified', 250) - - Buff = actor.getBuffByName('proc_old_light_jedi_gift') - if actor.getBuffList().contains(Buff): - core.buffService.removeBuffFromCreature(actor, Buff) - return - return - import sys -def setup(core, object): - return \ No newline at end of file + diff --git a/src/resources/objects/creature/CreatureMessageBuilder.java b/src/resources/objects/creature/CreatureMessageBuilder.java index 8d6a01c6..69e0ef11 100644 --- a/src/resources/objects/creature/CreatureMessageBuilder.java +++ b/src/resources/objects/creature/CreatureMessageBuilder.java @@ -23,8 +23,6 @@ package resources.objects.creature; import java.nio.ByteOrder; - - import org.apache.mina.core.buffer.IoBuffer; import com.sleepycat.persist.model.Persistent; @@ -96,6 +94,8 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { } buffer.putShort((short) 19); // Object Count + + // BaseObject buffer.putFloat(1); buffer.put(getAsciiString(creature.getStfFilename())); buffer.putInt(0); @@ -104,6 +104,8 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { buffer.put(getUnicodeString(creature.getCustomName())); // buffer.putInt(0x000F4240); // volume buffer.putInt(1); + + // TangibleObject buffer.putInt(CRC.StringtoCRC(creature.getFaction())); buffer.putInt(creature.getFactionStatus()); @@ -126,6 +128,8 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { buffer.putInt(0x3A98); buffer.put((byte) 1); + + // CreatureObject buffer.put((byte) creature.getPosture()); buffer.put((byte) 0); @@ -216,20 +220,21 @@ public class CreatureMessageBuilder extends ObjectMessageBuilder { IoBuffer buffer = bufferPool.allocate(100, false).order(ByteOrder.LITTLE_ENDIAN); buffer.setAutoExpand(true); buffer.putShort((short) 0x23); + + // BaseObject buffer.putInt(0x43); // serverId buffer.putShort((short) 0); // detaiLStfFilename buffer.putInt(0); // detailStfSpacer buffer.putShort((short) 0); // detailStfName - // TANO 6 lists TODO: research - + // TangibleObject buffer.put(creature.getCombatFlag()); - buffer.putLong(0); //List possibly defenders list + buffer.putLong(0); //Set cloakViewers (set of objectIds of who can see a cloaked spy) buffer.putInt(0); //Int buffer.putLong(0); //List - buffer.putLong(0); //List + buffer.putLong(0); //List buffer.putLong(0); //List buffer.putShort(creature.getLevel()); diff --git a/src/services/pet/MountService.java b/src/services/pet/MountService.java index 2c0b636d..c7d68706 100644 --- a/src/services/pet/MountService.java +++ b/src/services/pet/MountService.java @@ -393,37 +393,31 @@ public class MountService implements INetworkDispatch { } public void mount(CreatureObject rider, CreatureObject mount) { - // FIXME like above, movement skillmod should be used instead of creo4 vars and never be 0, otherwise it thinks we are always rooted - //if (rider.getSkillModBase("movement") == 0) { - //rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount_rooted"), DisplayType.Broadcast); - //return; - //} + // Check if mount may be mounted // This is already checked in canMount - // Check if mount may be mounted - if (rider == null) - { + if (rider == null) { return; } - if (mount == null) - { + + if (mount == null) { return; } - if (!mount.getOption(Options.MOUNT)) - { + + if (!mount.getOption(Options.MOUNT)) { return; } - if (mount.getOption(Options.DISABLED)) - { + + if (mount.getOption(Options.DISABLED)) { rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount_veh_disabled"), DisplayType.Broadcast); return; } - if (rider.isInStealth()) - { + + if (rider.isInStealth()) { rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:no_mount_stealth"), DisplayType.Broadcast); return; } - if (!canMount(rider, mount)) - { + + if (!canMount(rider, mount)) { rider.sendSystemMessage(OutOfBand.ProsePackage("@pet_menu:cant_mount"), DisplayType.Broadcast); return; } @@ -432,12 +426,10 @@ public class MountService implements INetworkDispatch { mount._add(rider); // Set mount states and stuff - mount.setStateBitmask(mount.getStateBitmask() | State.MountedCreature); mount.setState(State.MountedCreature, true); mount.setPosture(Posture.DrivingVehicle); // Set rider states and stuff - rider.setStateBitmask(rider.getStateBitmask() | State.RidingMount); rider.setState(StateStatus.RidingMount, true); // Notify observers and update quadtree @@ -524,44 +516,20 @@ public class MountService implements INetworkDispatch { return false; } - if(mount.getSlottedObject("rider") == rider) return true; - - if(mount.getAttachment("passenger") == null) return false; - - for(int i = 1; i < (int) mount.getAttachment("passenger"); i++) - { - if (mount.getSlottedObject("rider" + i) != rider) return true; - } - - return false; + return true; } public boolean isMounted(SWGObject actor, CreatureObject mount) { return actor.getContainer() == mount; } - public int getPassengerCount(CreatureObject mount) - { - mount.setAttachment("passengers", 0); - - mount.viewChildren(mount, false, false, new Traverser() - { - public void process(SWGObject passenger) - { - if (passenger instanceof CreatureObject) mount.setAttachment("passengers", (int) mount.getAttachment("passengers") + 1); - } - }); - - return (int)mount.getAttachment("passengers"); - } - public boolean canMount(CreatureObject rider, CreatureObject mount) { if (mount == null) { return false; } if (!mount.getOption(Options.MOUNT)) { - // return false; + return false; } if (isMounted(rider)) { @@ -579,23 +547,28 @@ public class MountService implements INetworkDispatch { return false; } - int passengers = 0; + // Check if there are any passenger slots left - if (mount.getAttachment("passengers") != null){ - passengers = getPassengerCount(mount); - } + LongAdder adder = new LongAdder(); - int passengerSlot = 0; + mount.getSlottedObject("inventory").viewChildren(owner, false, false, (obj) -> adder.increment()); - for (int i = 1; i <= passengers; i++) { - if (mount.getSlottedObject("rider" + i) == null) { - passengerSlot = i; - break; + int passengers = adder.intValue(); + + try { + DatatableVisitor visitor = ClientFileManager.loadFile("datatables/mount/saddle_appearance_map.iff", DatatableVisitor.class); + + for (int i = 0; i < visitor.getRowCount(); i++) { + if (visitor.getObject(i, 2).equals(mount.getAttachment("pcdAppearanceFilename"))) { // saddle_appearance_filename + if (passengers >= (int) visitor.getObject(i, 1)) { // saddle_capacity + return false; + } + + break; + } } - } - - if (passengerSlot == 0) { - // return false; + } catch (Exception e) { + e.printStackTrace(); } CreatureObject owner = (CreatureObject) NGECore.getInstance().objectService.getObject(mount.getOwnerId()); @@ -612,50 +585,31 @@ public class MountService implements INetworkDispatch { return false; } - try - { - DatatableVisitor visitor = ClientFileManager.loadFile("datatables/mount/saddle_appearance_map.iff", DatatableVisitor.class); - for(int i = 0; i < visitor.getRowCount(); i++) - { - if(visitor.getObject(i, 2).equals(mount.getAttachment("pcdAppearanceFilename"))) // saddle_appearance_name - { - if(passengers < (int) visitor.getObject(i, 1)) return true; // saddle_capacity - break; - } - } - } - catch (Exception e) { e.printStackTrace(); } - - if(passengers > 0) return false; - return true; } public void dismount(CreatureObject rider, CreatureObject mount) { + // Check if mount is currently mounted // Not necessary since nobody'll be dismounted if so - // Check if mount is currently mounted - if (rider == null || mount == null) - { + if (rider == null || mount == null) { return; } - if (!isMounted(rider)) - { + + if (!isMounted(rider)) { return; - } - if (!mount.getOption(Options.MOUNT)) - { + } + + if (!mount.getOption(Options.MOUNT)) { return; } // Dismount all passengers - - if (rider.getObjectID() == mount.getOwnerId()) - { + if (rider.getObjectID() == mount.getOwnerId()) { CreatureObject owner = rider; - mount.viewChildren(owner, false, false, new Traverser() - { - public void process(SWGObject passenger) - { + + mount.viewChildren(owner, false, false, new Traverser() { + + public void process(SWGObject passenger) { if (passenger != owner) dismount(rider, mount); } @@ -666,25 +620,23 @@ public class MountService implements INetworkDispatch { mount._remove(rider); // Set mount states and stuff - if (rider.getObjectID() == mount.getOwnerId()) - { - mount.setStateBitmask(0); + if (rider.getObjectID() == mount.getOwnerId()) { + //mount.setStateBitmask(0); mount.setState(State.MountedCreature, false); } // Set rider states and stuff - rider.setStateBitmask(0); + //rider.setStateBitmask(0); rider.setState(StateStatus.RidingMount, false); - rider.setPosture((byte) 0); - + rider.setPosture(Posture.Upright); + // Update observers and quadtree mount.notifyObservers(new UpdateContainmentMessage(rider.getObjectID(), 0, -1), true); core.simulationService.teleport(rider, mount.getWorldPosition(), mount.getOrientation(), 0); core.simulationService.add(rider, mount.getWorldPosition().x, mount.getWorldPosition().z, false); // Store mount if it's a creature - if (!mount.getTemplate().contains("vehicle") && rider.getObjectID() == mount.getOwnerId()) - { + if (!mount.getTemplate().contains("vehicle") && rider.getObjectID() == mount.getOwnerId()) { store(rider, mount); } }