diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllLightsabersValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllLightsabersValidWeaponChecker.kt new file mode 100644 index 000000000..fbc894a62 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllLightsabersValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class AllLightsabersValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return weaponType.isLightsaber + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllValidWeaponChecker.kt new file mode 100644 index 000000000..7af453bec --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/AllValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class AllValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return true + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/CommandLoader.java b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/CommandLoader.java index 4e990bce1..221c3c90d 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/CommandLoader.java +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/CommandLoader.java @@ -67,7 +67,8 @@ public class CommandLoader extends DataLoader { .withCooldownTime2(set.getReal("cooldownTime2")) .withWarmupTime(set.getReal("warmupTime")) .withExecuteTime(set.getReal("executeTime")) - .withTargetType(TargetType.getTargetType(set.getText("targetType"))); + .withTargetType(TargetType.getTargetType(set.getText("targetType"))) + .withValidWeapon(ValidWeapon.Companion.getByNum((int) set.getInt("validWeapon"))); @NotNull Locomotion[] locomotions = Locomotion.values(); diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ForcePowersValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ForcePowersValidWeaponChecker.kt new file mode 100644 index 000000000..15765bc75 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ForcePowersValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class ForcePowersValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return false // Not sure how this works, so just block ability usage until we actually need it + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/MeleeValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/MeleeValidWeaponChecker.kt new file mode 100644 index 000000000..821c92b25 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/MeleeValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class MeleeValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return weaponType.isMelee + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RangedValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RangedValidWeaponChecker.kt new file mode 100644 index 000000000..ed652939a --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/RangedValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class RangedValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return weaponType.isRanged + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ThrownValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ThrownValidWeaponChecker.kt new file mode 100644 index 000000000..036fbb923 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ThrownValidWeaponChecker.kt @@ -0,0 +1,9 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +class ThrownValidWeaponChecker : ValidWeaponChecker { + override fun isValid(weaponType: WeaponType): Boolean { + return weaponType == WeaponType.THROWN + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeapon.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeapon.kt new file mode 100644 index 000000000..dd82dd88f --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeapon.kt @@ -0,0 +1,30 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +enum class ValidWeapon(private val num: Int, private val validWeaponChecker: ValidWeaponChecker) { + FORCE_POWER(-5, ForcePowersValidWeaponChecker()), + ALL_LIGHTSABERS(-4, AllLightsabersValidWeaponChecker()), + ALL(-3, AllValidWeaponChecker()), + MELEE(-2, MeleeValidWeaponChecker()), + RANGED(-1, RangedValidWeaponChecker()), + THROWN(8, ThrownValidWeaponChecker()); + + fun isValid(weaponType: WeaponType): Boolean { + return validWeaponChecker.isValid(weaponType) + } + + companion object { + fun getByNum(num: Int): ValidWeapon { + return when (num) { + FORCE_POWER.num -> FORCE_POWER + ALL_LIGHTSABERS.num -> ALL_LIGHTSABERS + ALL.num -> ALL + MELEE.num -> MELEE + RANGED.num -> RANGED + THROWN.num -> THROWN + else -> ALL + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeaponChecker.kt b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeaponChecker.kt new file mode 100644 index 000000000..9e7e0f876 --- /dev/null +++ b/src/main/java/com/projectswg/holocore/resources/support/data/server_info/loader/ValidWeaponChecker.kt @@ -0,0 +1,7 @@ +package com.projectswg.holocore.resources.support.data.server_info.loader + +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType + +interface ValidWeaponChecker { + fun isValid(weaponType: WeaponType): Boolean +} \ No newline at end of file diff --git a/src/main/java/com/projectswg/holocore/resources/support/global/commands/Command.java b/src/main/java/com/projectswg/holocore/resources/support/global/commands/Command.java index 7532c1321..0e62f1cab 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/global/commands/Command.java +++ b/src/main/java/com/projectswg/holocore/resources/support/global/commands/Command.java @@ -28,6 +28,7 @@ package com.projectswg.holocore.resources.support.global.commands; import com.projectswg.common.data.CRC; import com.projectswg.common.data.combat.TargetType; +import com.projectswg.holocore.resources.support.data.server_info.loader.ValidWeapon; import java.util.HashSet; import java.util.Locale; @@ -49,7 +50,7 @@ public class Command { private final double maxRange; private final int godLevel; private final boolean addToCombatQueue; - private final int validWeapon; + private final ValidWeapon validWeapon; private final int invalidWeapon; private final String cooldownGroup; private final double warmupTime; @@ -146,7 +147,7 @@ public class Command { return addToCombatQueue; } - public int getValidWeapon() { + public ValidWeapon getValidWeapon() { return validWeapon; } @@ -223,7 +224,7 @@ public class Command { private double maxRange; private int godLevel; private boolean addToCombatQueue; - private int validWeapon; + private ValidWeapon validWeapon; private int invalidWeapon; private String cooldownGroup; private double warmupTime; @@ -323,7 +324,7 @@ public class Command { return this; } - public CommandBuilder withValidWeapon(int validWeapon) { + public CommandBuilder withValidWeapon(ValidWeapon validWeapon) { this.validWeapon = validWeapon; return this; } diff --git a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.java b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.java index 54366a9ed..cf9e02b5c 100644 --- a/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.java +++ b/src/main/java/com/projectswg/holocore/services/support/global/commands/CommandQueueService.java @@ -1,14 +1,13 @@ package com.projectswg.holocore.services.support.global.commands; import com.projectswg.common.data.CRC; +import com.projectswg.common.data.RGB; import com.projectswg.common.data.combat.AttackType; import com.projectswg.common.data.combat.HitType; +import com.projectswg.common.data.encodables.oob.StringId; import com.projectswg.common.network.packets.SWGPacket; -import com.projectswg.common.network.packets.swg.zone.object_controller.CommandQueueDequeue; +import com.projectswg.common.network.packets.swg.zone.object_controller.*; import com.projectswg.common.network.packets.swg.zone.object_controller.CommandQueueDequeue.ErrorCode; -import com.projectswg.common.network.packets.swg.zone.object_controller.CommandQueueEnqueue; -import com.projectswg.common.network.packets.swg.zone.object_controller.CommandTimer; -import com.projectswg.common.network.packets.swg.zone.object_controller.IntendedTarget; import com.projectswg.holocore.intents.gameplay.combat.ExitCombatIntent; import com.projectswg.holocore.intents.support.global.command.ExecuteCommandIntent; import com.projectswg.holocore.intents.support.global.command.QueueCommandIntent; @@ -16,6 +15,7 @@ import com.projectswg.holocore.intents.support.global.network.InboundPacketInten import com.projectswg.holocore.intents.support.global.zone.PlayerEventIntent; import com.projectswg.holocore.resources.support.data.server_info.StandardLog; import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader; +import com.projectswg.holocore.resources.support.data.server_info.loader.ValidWeapon; import com.projectswg.holocore.resources.support.global.commands.CombatCommand; import com.projectswg.holocore.resources.support.global.commands.Command; import com.projectswg.holocore.resources.support.global.commands.Locomotion; @@ -23,6 +23,8 @@ import com.projectswg.holocore.resources.support.global.commands.State; import com.projectswg.holocore.resources.support.global.player.PlayerEvent; import com.projectswg.holocore.resources.support.objects.swg.SWGObject; import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponObject; +import com.projectswg.holocore.resources.support.objects.swg.weapon.WeaponType; import com.projectswg.holocore.services.support.objects.ObjectStorageService.ObjectLookup; import me.joshlarson.jlcommon.concurrency.ScheduledThreadPool; import me.joshlarson.jlcommon.control.IntentHandler; @@ -244,6 +246,15 @@ public class CommandQueueService extends Service { } } + ValidWeapon validWeapon = rootCommand.getValidWeapon(); + WeaponObject equippedWeapon = source.getEquippedWeapon(); + WeaponType equippedWeaponType = equippedWeapon.getType(); + + if (!validWeapon.isValid(equippedWeaponType)) { + showInvalidWeaponFlyText(source); + return new CheckCommandResult(ErrorCode.CANCELLED, 0); + } + if (rootCommand instanceof CombatCommand combatCommand) { if (combatCommand.getHitType() == HitType.HEAL && combatCommand.getAttackType() == AttackType.SINGLE_TARGET) { SWGObject target; @@ -275,6 +286,10 @@ public class CommandQueueService extends Service { return new CheckCommandResult(ErrorCode.SUCCESS, 0); } + private void showInvalidWeaponFlyText(CreatureObject source) { + source.sendSelf(new ShowFlyText(source.getObjectId(), new StringId("cbt_spam", "invalid_weapon"), ShowFlyText.Scale.MEDIUM, new RGB(255, 255, 255))); + } + } private static class EnqueuedCommand implements Comparable {