forked from MagicBane/Server
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.0 KiB
165 lines
4.0 KiB
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); |
|
|
|
} |
|
|
|
} |