package engine.devcmd.cmds; import engine.devcmd.AbstractDevCmd; import engine.gameManager.ZoneManager; import engine.math.Vector3fImmutable; import engine.objects.AbstractGameObject; import engine.objects.Mob; import engine.objects.PlayerCharacter; import engine.objects.Zone; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @author Summary: Game designer utility command to create multiple * mobiles of a given UUID within a supplied range */ public class SplatMobCmd extends AbstractDevCmd { // Instance variables private int _mobileUUID; private int _mobileCount; private float _targetRange; private Vector3fImmutable _currentLocation; // Concurrency support private ReadWriteLock lock = new ReentrantReadWriteLock(); // Constructor public SplatMobCmd() { super("splatmob"); } // AbstractDevCmd Overridden methods private static boolean validateUserInput(String[] userInput) { // incorrect number of arguments test if (userInput.length != 3) return false; // Test for UUID conversion to int try { Integer.parseInt(userInput[0]); } catch (NumberFormatException | NullPointerException e) { return false; } // Test for Number of Mobs conversion to int try { Integer.parseInt(userInput[1]); } catch (NumberFormatException | NullPointerException e) { return false; } // Test if range argument can convert to a float try { Float.parseFloat(userInput[2]); } catch (NumberFormatException | NullPointerException e) { return false; } return true; } @Override protected void _doCmd(PlayerCharacter pc, String[] args, AbstractGameObject target) { // Member variables Vector3fImmutable mobileLocation; Mob mobile; Zone serverZone; // Concurrency write lock due to instance variable usage lock.writeLock().lock(); try { // Validate user input if (validateUserInput(args) == false) { this.sendUsage(pc); return; } // Parse user input parseUserInput(args); // Arguments have been validated and parsed at this point // Begin creating mobiles _currentLocation = pc.getLoc(); serverZone = ZoneManager.findSmallestZone(_currentLocation); for (int i = 0; i < _mobileCount; i++) { mobile = Mob.createMob(_mobileUUID, Vector3fImmutable.getRandomPointInCircle(_currentLocation, _targetRange), null, true, serverZone, null, 0, "", 1); if (mobile != null) { mobile.updateDatabase(); } } } // End Try Block // Release Reentrant lock finally { lock.writeLock().unlock(); } } @Override protected String _getHelpString() { return "Spawns multiple mobiles with a given range"; } // Class methods @Override protected String _getUsageString() { return "/splatmob UUID [Count <= 100] [range <= 1200]"; } private void parseUserInput(String[] userInput) { // Clear previous values _mobileUUID = 0; _mobileCount = 0; _targetRange = 0f; // Parse first argument into mobile UID. _mobileUUID = Integer.parseInt(userInput[0]); // Parse second argument into mobile count. Cap at 100 mobs. _mobileCount = Integer.parseInt(userInput[1]); _mobileCount = Math.min(_mobileCount, 100); // Parse third argument into range. Cap at 200 units. _targetRange = Float.parseFloat(userInput[2]); _targetRange = Math.min(_targetRange, 1200f); } }