Merge pull request #595 from madsboddum/valid_weapon

You must now have a supported weapon type equipped in order to execut…
This commit is contained in:
Josh Larson
2022-07-04 13:16:23 -05:00
committed by GitHub
11 changed files with 117 additions and 9 deletions
@@ -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
}
}
@@ -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
}
}
@@ -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();
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
@@ -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
}
}
}
}
@@ -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
}
@@ -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;
}
@@ -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<EnqueuedCommand> {