Index: src/server/chat/ChatManager.cpp =================================================================== --- src/server/chat/ChatManager.cpp (revision 5340) +++ src/server/chat/ChatManager.cpp (working copy) @@ -30,7 +30,7 @@ * ChatManagerStub */ -enum {RPC_FINALIZE__ = 6,RPC_INITIATEROOMS__,RPC_DESTROYROOMS__,RPC_CREATEROOM__STRING_CHATROOM_,RPC_ADDROOM__CHATROOM_,RPC_REMOVEROOM__CHATROOM_,RPC_POPULATEROOMLISTMESSAGE__CHATROOM_CHATROOMLIST_,RPC_SENDROOMLIST__CREATUREOBJECT_,RPC_ADDPLAYER__CREATUREOBJECT_,RPC_GETPLAYER__STRING_,RPC_REMOVEPLAYER__STRING_,RPC_BROADCASTMESSAGE__BASEMESSAGE_,RPC_BROADCASTMESSAGE__CREATUREOBJECT_UNICODESTRING_LONG_INT_INT_,RPC_HANDLESPATIALCHATINTERNALMESSAGE__CREATUREOBJECT_UNICODESTRING_,RPC_HANDLEGROUPCHAT__CREATUREOBJECT_UNICODESTRING_,RPC_CREATEROOMBYFULLPATH__STRING_,RPC_GETCHATROOMBYFULLPATH__STRING_,RPC_GETCHATROOMBYGAMEPATH__CHATROOM_STRING_,RPC_HANDLECHATROOMMESSAGE__CREATUREOBJECT_UNICODESTRING_INT_INT_,RPC_HANDLECHATENTERROOMBYID__CREATUREOBJECT_INT_INT_,RPC_HANDLESOCIALINTERNALMESSAGE__CREATUREOBJECT_UNICODESTRING_,RPC_DESTROYROOM__CHATROOM_,RPC_CREATEGROUPROOM__LONG_CREATUREOBJECT_,RPC_LOADMAIL__CREATUREOBJECT_,RPC_SENDMAIL__STRING_UNICODESTRING_UNICODESTRING_STRING_,RPC_HANDLEREQUESTPERSISTENTMSG__CREATUREOBJECT_INT_,RPC_DELETEPERSISTENTMESSAGE__CREATUREOBJECT_INT_,RPC_BROADCASTGALAXY__CREATUREOBJECT_STRING_,RPC_SETPLAYERMANAGER__PLAYERMANAGER_,RPC_GETCHATROOM__INT_,RPC_GETGAMEROOM__STRING_,RPC_GETNEXTROOMID__,RPC_GETPLAYERCOUNT__,RPC_GETGUILDROOM__,RPC_GETGROUPROOM__}; +enum {RPC_FINALIZE__ = 6,RPC_INITIATEROOMS__,RPC_DESTROYROOMS__,RPC_CREATEROOM__STRING_CHATROOM_,RPC_ADDROOM__CHATROOM_,RPC_REMOVEROOM__CHATROOM_,RPC_POPULATEROOMLISTMESSAGE__CHATROOM_CHATROOMLIST_,RPC_SENDROOMLIST__CREATUREOBJECT_,RPC_ADDPLAYER__CREATUREOBJECT_,RPC_GETPLAYER__STRING_,RPC_REMOVEPLAYER__STRING_,RPC_BROADCASTMESSAGE__BASEMESSAGE_,RPC_BROADCASTMESSAGE__CREATUREOBJECT_UNICODESTRING_LONG_INT_INT_,RPC_HANDLESPATIALCHATINTERNALMESSAGE__CREATUREOBJECT_UNICODESTRING_,RPC_HANDLEGROUPCHAT__CREATUREOBJECT_UNICODESTRING_,RPC_CREATEROOMBYFULLPATH__STRING_,RPC_GETCHATROOMBYFULLPATH__STRING_,RPC_GETCHATROOMBYGAMEPATH__CHATROOM_STRING_,RPC_HANDLECHATROOMMESSAGE__CREATUREOBJECT_UNICODESTRING_INT_INT_,RPC_HANDLECHATENTERROOMBYID__CREATUREOBJECT_INT_INT_,RPC_HANDLESOCIALINTERNALMESSAGE__CREATUREOBJECT_UNICODESTRING_,RPC_DESTROYROOM__CHATROOM_,RPC_CREATEGROUPROOM__LONG_CREATUREOBJECT_,RPC_LOADMAIL__CREATUREOBJECT_,RPC_SENDMAIL__STRING_UNICODESTRING_UNICODESTRING_STRING_,RPC_HANDLEREQUESTPERSISTENTMSG__CREATUREOBJECT_INT_,RPC_DELETEPERSISTENTMESSAGE__CREATUREOBJECT_INT_,RPC_BROADCASTGALAXY__CREATUREOBJECT_STRING_,RPC_BROADCASTGALAXY__CREATUREOBJECT_STRING_STRING_,RPC_SETPLAYERMANAGER__PLAYERMANAGER_,RPC_GETCHATROOM__INT_,RPC_GETGAMEROOM__STRING_,RPC_GETNEXTROOMID__,RPC_GETPLAYERCOUNT__,RPC_GETGUILDROOM__,RPC_GETGROUPROOM__}; ChatManager::ChatManager(ZoneServer* serv, int initsize) : ManagedService(DummyConstructorParameter::instance()) { ChatManagerImplementation* _implementation = new ChatManagerImplementation(serv, initsize); @@ -473,6 +473,22 @@ _implementation->broadcastGalaxy(player, message); } +void ChatManager::broadcastGalaxy(CreatureObject* player, const String& message, const String& faction) { + ChatManagerImplementation* _implementation = static_cast(_getImplementation()); + if (_implementation == NULL) { + if (!deployed) + throw ObjectNotDeployedException(this); + + DistributedMethod method(this, RPC_BROADCASTGALAXY__CREATUREOBJECT_STRING_STRING_); + method.addObjectParameter(player); + method.addAsciiParameter(message); + method.addAsciiParameter(faction); + + method.executeWithVoidReturn(); + } else + _implementation->broadcastGalaxy(player, message, faction); +} + void ChatManager::setPlayerManager(PlayerManager* manager) { ChatManagerImplementation* _implementation = static_cast(_getImplementation()); if (_implementation == NULL) { @@ -1014,6 +1030,12 @@ broadcastGalaxy(static_cast(inv->getObjectParameter()), inv->getAsciiParameter(message)); } break; + case RPC_BROADCASTGALAXY__CREATUREOBJECT_STRING_STRING_: + { + String message; String faction; + broadcastGalaxy(static_cast(inv->getObjectParameter()), inv->getAsciiParameter(message), inv->getAsciiParameter(faction)); + } + break; case RPC_SETPLAYERMANAGER__PLAYERMANAGER_: { setPlayerManager(static_cast(inv->getObjectParameter())); @@ -1167,6 +1189,10 @@ (static_cast(stub))->broadcastGalaxy(player, message); } +void ChatManagerAdapter::broadcastGalaxy(CreatureObject* player, const String& message, const String& faction) { + (static_cast(stub))->broadcastGalaxy(player, message, faction); +} + void ChatManagerAdapter::setPlayerManager(PlayerManager* manager) { (static_cast(stub))->setPlayerManager(manager); } Index: src/server/chat/ChatManager.h =================================================================== --- src/server/chat/ChatManager.h (revision 5340) +++ src/server/chat/ChatManager.h (working copy) @@ -254,6 +254,8 @@ void broadcastGalaxy(CreatureObject* player, const String& message); + void broadcastGalaxy(CreatureObject* player, const String& message, const String& faction); + void setPlayerManager(PlayerManager* manager); ChatRoom* getChatRoom(unsigned int id); @@ -388,6 +390,8 @@ void broadcastGalaxy(CreatureObject* player, const String& message); + void broadcastGalaxy(CreatureObject* player, const String& message, const String& faction); + void setPlayerManager(PlayerManager* manager); ChatRoom* getChatRoom(unsigned int id); @@ -501,6 +505,8 @@ void broadcastGalaxy(CreatureObject* player, const String& message); + void broadcastGalaxy(CreatureObject* player, const String& message, const String& faction); + void setPlayerManager(PlayerManager* manager); ChatRoom* getChatRoom(unsigned int id); Index: src/server/chat/ChatManager.idl =================================================================== --- src/server/chat/ChatManager.idl (revision 5340) +++ src/server/chat/ChatManager.idl (working copy) @@ -162,6 +162,7 @@ public native void deletePersistentMessage(CreatureObject player, unsigned int mailID); public native void broadcastGalaxy(CreatureObject player, final string message); + public native void broadcastGalaxy(CreatureObject player, final string message, final string faction); /*public native void sendMailBody(CreatureObject receiver, unsigned int mailid); public native void listMail(CreatureObject ply); Index: src/server/chat/ChatManagerImplementation.cpp =================================================================== --- src/server/chat/ChatManagerImplementation.cpp (revision 5340) +++ src/server/chat/ChatManagerImplementation.cpp (working copy) @@ -353,23 +353,25 @@ } void ChatManagerImplementation::broadcastGalaxy(CreatureObject* player, const String& message) { - String firstName = "SKYNET"; + Locker locker(_this.get()); - if (player != NULL) - firstName = player->getFirstName(); + playerMap->resetIterator(false); - StringBuffer fullMessage; - fullMessage << "[" << firstName << "] " << message; + while (playerMap->hasNext(false)) { + ManagedReference playerObject = playerMap->getNextValue(false); + playerObject->sendSystemMessage(message); + } +} +void ChatManagerImplementation::broadcastGalaxy(CreatureObject* player, const String& message, const String& faction) { Locker locker(_this.get()); - //playerMap->lock(); playerMap->resetIterator(false); while (playerMap->hasNext(false)) { ManagedReference playerObject = playerMap->getNextValue(false); - - playerObject->sendSystemMessage(fullMessage.toString()); + if (playerObject->getFaction() == faction.hashCode() || playerObject->getPlayerObject()->isPrivileged()) + playerObject->sendSystemMessage(message); } } Index: src/server/zone/objects/creature/commands/BroadcastAreaCommand.h =================================================================== --- src/server/zone/objects/creature/commands/BroadcastAreaCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/BroadcastAreaCommand.h (working copy) @@ -66,9 +66,171 @@ ManagedReference ghost = creature->getPlayerObject(); + //Check privileges if (ghost == NULL || !ghost->isPrivileged()) return INSUFFICIENTPERMISSION; + StringTokenizer args(arguments.toString()); + + //Explain syntax + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("Syntax: /broadcastArea [range] [-event | -rebel | -imperial] "); + return INVALIDPARAMETERS; + } + + ChatManager* chatManager = server->getZoneServer()->getChatManager(); + + //Get nearby objects from player + SortedVector >* closeObjects = creature->getCloseObjects(); + + //The first argument is the message type, which displays different versions of a broadcast, or the range of the broadcast + String messageType; + args.getStringToken(messageType); + + //Default range of broadcast + float range = 64; + + //Test for range if first argument's character is a number + if (Character::isDigit(messageType.charAt(0))) { + try { + //Test if value is integer + for (int i = 0; i < messageType.length(); i++) { + if (!Character::isDigit(messageType.charAt(i))) + throw Exception("Invalid broadcast range."); + } + + range = Integer::valueOf(messageType); + if (range <= 5 || range > 5000) { + throw Exception("Range must be between 5 and 5000."); + } + args.getStringToken(messageType); + } + catch (Exception e) { + creature->sendSystemMessage(e.getMessage()); + return INVALIDPARAMETERS; + } + } + + //Command Options + if (messageType.charAt(0) == '-') { + //Help syntax + if (messageType.toLowerCase() == "-help" || messageType == "-H") { + creature->sendSystemMessage("Syntax: /broadcastArea [range] [-event | -imperial | -rebel] "); + return GENERALERROR; + } + + //Creates an event broadcast + if (messageType.toLowerCase() == "-event" || messageType == "-e") { + String type = " \\#FFA500[Event]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + //Broadcast to all nearby players + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + + if (targetObject->isPlayerCreature() && creature->isInRange(targetObject, range)) { + CreatureObject* targetPlayer = cast(targetObject); + targetPlayer->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + + //Creates an Imperial-only broadcast + else if (messageType.toLowerCase() == "-imperial" || messageType == "-i") { + String type = " \\#0000FF[Imperial]\\#FFFFFF "; + String message; + String faction = "imperial"; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + //Broadcast to all nearby imperial players and staff + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + + if (targetObject->isPlayerCreature() && creature->isInRange(targetObject, range)) { + CreatureObject* targetPlayer = cast(targetObject); + + if (targetPlayer->getFaction() == faction.hashCode() || targetPlayer->getPlayerObject()->isPrivileged()) + targetPlayer->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + + //Creates a Rebel-only broadcast + else if (messageType.toLowerCase() == "-rebel" || messageType == "-r") { + String type = " \\#800000[Rebel]\\#FFFFFF "; + String message; + String faction = "rebel"; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + //Broadcast to all nearby rebel players and staff + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + + if (targetObject->isPlayerCreature() && creature->isInRange(targetObject, range)) { + CreatureObject* targetPlayer = cast(targetObject); + + if (targetPlayer->getFaction() == faction.hashCode() || targetPlayer->getPlayerObject()->isPrivileged()) + targetPlayer->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + else { + creature->sendSystemMessage("Invalid option " + messageType); + return INVALIDPARAMETERS; + } + } + + //If no message type is specified, the rest of the arguments are broadcast as a string + String message = messageType + " "; + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + //Broadcast to all nearby players + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + + if (targetObject->isPlayerCreature() && creature->isInRange(targetObject, range)) { + CreatureObject* targetPlayer = cast(targetObject); + targetPlayer->sendSystemMessage(message); + } + } return SUCCESS; } Index: src/server/zone/objects/creature/commands/BroadcastCommand.h =================================================================== --- src/server/zone/objects/creature/commands/BroadcastCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/BroadcastCommand.h (working copy) @@ -66,9 +66,106 @@ ManagedReference ghost = creature->getPlayerObject(); + //Check privileges if (ghost == NULL || !ghost->isPrivileged()) return INSUFFICIENTPERMISSION; + StringTokenizer args(arguments.toString()); + + //Explain syntax + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("Syntax: /broadcast [-event | -imperial | -rebel] "); + return INVALIDPARAMETERS; + } + + ChatManager* chatManager = server->getZoneServer()->getChatManager(); + + //The first argument is the message type, which displays different versions of a broadcast + String messageType; + args.getStringToken(messageType); + + //Command Options + if (messageType.charAt(0) == '-') { + //Help syntax + if (messageType.toLowerCase() == "-help" || messageType == "-H") { + creature->sendSystemMessage("Syntax: /broadcast [-event | -imperial | -rebel] "); + return GENERALERROR; + } + + //Creates an event broadcast + if (messageType.toLowerCase() == "-event" || messageType == "-e") { + String type = " \\#FFA500[Event]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message); + return SUCCESS; + } + + //Creates an Imperial-only broadcast + else if (messageType.toLowerCase() == "-imperial" || messageType == "-i") { + String type = " \\#0000FF[Imperial]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message, "imperial"); + return SUCCESS; + } + + //Creates a Rebel-only broadcast + else if (messageType.toLowerCase() == "-rebel" || messageType == "-r") { + String type = " \\#800000[Rebel]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message, "rebel"); + return SUCCESS; + } + else { + creature->sendSystemMessage("Invalid option " + messageType); + return INVALIDPARAMETERS; + } + } + + //If no option is specified, the rest of the arguments are broadcast as a string + String message = messageType + " "; + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), message); return SUCCESS; } Index: src/server/zone/objects/creature/commands/BroadcastGalaxyCommand.h =================================================================== --- src/server/zone/objects/creature/commands/BroadcastGalaxyCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/BroadcastGalaxyCommand.h (working copy) @@ -66,17 +66,108 @@ if (!checkInvalidLocomotions(creature)) return INVALIDLOCOMOTION; - if (!creature->isPlayerCreature()) - return GENERALERROR; - ManagedReference ghost = creature->getPlayerObject(); + //Check privileges if (ghost == NULL || !ghost->isPrivileged()) return INSUFFICIENTPERMISSION; + StringTokenizer args(arguments.toString()); + + //Explain syntax + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("Syntax: /broadcastGalaxy [-event | -imperial | -rebel] "); + return INVALIDPARAMETERS; + } + ChatManager* chatManager = server->getZoneServer()->getChatManager(); - chatManager->broadcastGalaxy(cast(creature), arguments.toString()); + //The first argument is the message type, which displays different versions of a broadcast + String messageType; + args.getStringToken(messageType); + + //Command Options + if (messageType.charAt(0) == '-') { + //Help syntax + if (messageType.toLowerCase() == "-help" || messageType == "-H") { + creature->sendSystemMessage("Syntax: /broadcastGalaxy [-event | -imperial | -rebel] "); + return GENERALERROR; + } + + //Creates an event broadcast + if (messageType.toLowerCase() == "-event" || messageType == "-e") { + String type = " \\#FFA500[Event]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message); + return SUCCESS; + } + + //Creates an Imperial-only broadcast + else if (messageType.toLowerCase() == "-imperial" || messageType == "-i") { + String type = " \\#0000FF[Imperial]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message, "imperial"); + return SUCCESS; + } + + //Creates a Rebel-only broadcast + else if (messageType.toLowerCase() == "-rebel" || messageType == "-r") { + String type = " \\#800000[Rebel]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), type + message, "rebel"); + return SUCCESS; + } + else { + creature->sendSystemMessage("Invalid option " + messageType); + return INVALIDPARAMETERS; + } + } + + //If no message type is specified, the rest of the arguments are broadcast as a string + String message = messageType + " "; + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + chatManager->broadcastGalaxy(cast(creature), message); return SUCCESS; } Index: src/server/zone/objects/creature/commands/BroadcastPlanetCommand.h =================================================================== --- src/server/zone/objects/creature/commands/BroadcastPlanetCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/BroadcastPlanetCommand.h (working copy) @@ -66,9 +66,137 @@ ManagedReference ghost = creature->getPlayerObject(); + //Check privileges if (ghost == NULL || !ghost->isPrivileged()) return INSUFFICIENTPERMISSION; + StringTokenizer args(arguments.toString()); + + //Explain syntax + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("Syntax: /broadcastPlanet [-event | -imperial | -rebel] "); + return INVALIDPARAMETERS; + } + + ChatManager* chatManager = server->getZoneServer()->getChatManager(); + + PlayerMap* playerMap = chatManager->getPlayerMap(); + playerMap->resetIterator(false); + + //The first argument is the message type, which displays different versions of a broadcast + String messageType; + args.getStringToken(messageType); + + //Command Options + if (messageType.charAt(0) == '-') { + //Help syntax + if (messageType.toLowerCase() == "-help" || messageType == "-H") { + creature->sendSystemMessage("Syntax: /broadcastPlanet [-event | -imperial | -rebel] "); + return GENERALERROR; + } + + //Creates an event broadcast + if (messageType.toLowerCase() == "-event" || messageType == "-e") { + String type = " \\#FFA500[Event]\\#FFFFFF "; + String message; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + while (playerMap->hasNext(false)) { + ManagedReference playerObject = playerMap->getNextValue(false); + + if (creature->getPlanetCRC() == playerObject->getPlanetCRC()) { + playerObject->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + + //Creates an Imperial-only broadcast + else if (messageType.toLowerCase() == "-imperial" || messageType == "-i") { + String type = " \\#0000FF[Imperial]\\#FFFFFF "; + String message; + String faction = "imperial"; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + while (playerMap->hasNext(false)) { + ManagedReference playerObject = playerMap->getNextValue(false); + + if (creature->getPlanetCRC() == playerObject->getPlanetCRC()) { + if (playerObject->getFaction() == faction.hashCode() || playerObject->getPlayerObject()->isPrivileged()) + playerObject->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + + //Creates a Rebel-only broadcast + else if (messageType.toLowerCase() == "-rebel" || messageType == "-r") { + String type = " \\#800000[Rebel]\\#FFFFFF "; + String message; + String faction = "rebel"; + + if (!args.hasMoreTokens()) { + creature->sendSystemMessage("You must include a message!"); + return GENERALERROR; + } + + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + while (playerMap->hasNext(false)) { + ManagedReference playerObject = playerMap->getNextValue(false); + + if (creature->getPlanetCRC() == playerObject->getPlanetCRC()) { + if (playerObject->getFaction() == faction.hashCode() || playerObject->getPlayerObject()->isPrivileged()) + playerObject->sendSystemMessage(type + message); + } + } + return SUCCESS; + } + else { + creature->sendSystemMessage("Invalid option " + messageType); + return INVALIDPARAMETERS; + } + } + + //If no message type is specified, the rest of the arguments are broadcast as a string + String message = messageType + " "; + while (args.hasMoreTokens()) { + String messageParts; + args.getStringToken(messageParts); + message = message + messageParts + " "; + } + + while (playerMap->hasNext(false)) { + ManagedReference playerObject = playerMap->getNextValue(false); + + if (creature->getPlanetCRC() == playerObject->getPlanetCRC()) { + playerObject->sendSystemMessage(message); + } + } return SUCCESS; } Index: src/server/zone/objects/creature/commands/KillCommand.h =================================================================== --- src/server/zone/objects/creature/commands/KillCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/KillCommand.h (working copy) @@ -64,22 +64,170 @@ if (!checkInvalidLocomotions(creature)) return INVALIDLOCOMOTION; - if (!creature->isPlayerCreature()) + ManagedReference ghost = creature->getPlayerObject(); + + //Check privileges + if (ghost == NULL || !ghost->isPrivileged()) + return INSUFFICIENTPERMISSION; + + //Explain syntax + if (arguments.isEmpty() && creature->getTargetID() == 0) { + creature->sendSystemMessage("Syntax: /kill [-area [range]] [ [action] [mind]]"); return GENERALERROR; + } - ManagedReference targetToKill = NULL; + ManagedReference targetCreature = NULL; + ManagedReference targetLair = NULL; + ManagedReference targetObject = server->getZoneServer()->getObject(target); - ManagedReference obj = server->getZoneServer()->getObject(target); + if (targetObject != NULL) { + if (targetObject->isCreatureObject()) + targetCreature = cast(targetObject.get()); + else if (targetObject->isTangibleObject()) + targetLair = cast(targetObject.get()); + else { + creature->sendSystemMessage("Invalid target."); + return INVALIDTARGET; + } + } - if (obj == NULL || !obj->isTangibleObject()) - return INVALIDTARGET; + StringTokenizer args(arguments.toString()); - targetToKill = cast( obj.get()); + //Initialize default damage amount + int healthDamage = 9999999; + int actionDamage = healthDamage; + int mindDamage = healthDamage; - Locker clocker(targetToKill, creature); + //Initialize components used to kill nearby creatures + bool area = false; + float range = 64; - targetToKill->inflictDamage(creature, 0, 99999999, true, true); + while (args.hasMoreTokens()) { + String arg; + args.getStringToken(arg); + bool validOption = false; + + //Command Options + if (arg.charAt(0) == '-') { + //Help Syntax + if (arg.toLowerCase() == "-help" || arg == "-H") { + validOption = true; + creature->sendSystemMessage("Syntax: /kill [-area [range]] [ [action] [mind]]"); + return GENERALERROR; + } + + //Make command area affect with optional range + if (arg.toLowerCase() == "-area" || arg == "-a") { + validOption = true; + area = true; + + if (args.hasMoreTokens()) { + range = args.getFloatToken(); + if (range <= 0) { + creature->sendSystemMessage("Invalid range."); + return INVALIDPARAMETERS; + } + } + } + + if (!validOption) { + creature->sendSystemMessage("Invalid option " + arg); + return INVALIDPARAMETERS; + } + } + + else { + //Override default damage amount + try { + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid damage amount."); + } + + healthDamage = Integer::valueOf(arg); + actionDamage = healthDamage; + mindDamage = healthDamage; + + if (args.hasMoreTokens()) { + args.getStringToken(arg); + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid action damage amount."); + } + + actionDamage = Integer::valueOf(arg); + mindDamage = 0; + + if (args.hasMoreTokens()) { + args.getStringToken(arg); + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid mind damage amount."); + } + + mindDamage = Integer::valueOf(arg); + + if (args.hasMoreTokens()) + throw Exception("Too many arguments."); + } + } + } + catch (Exception e) { + creature->sendSystemMessage(e.getMessage()); + return INVALIDPARAMETERS; + } + } + } + + //Deal area damage if specified + if (area) { + //Retrieve nearby objects + SortedVector >* closeObjects = creature->getCloseObjects(); + + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + if (targetObject->isCreatureObject()) { + targetCreature = cast(targetObject); + + //Deal damage if target is an attackable creature, in range, and not a player + if (targetCreature->isAttackableBy(creature) && creature->isInRange(targetObject, range) && !targetObject->isPlayerCreature()) { + Locker locker(targetCreature, creature); + + targetCreature->inflictDamage(creature, 0, healthDamage, true, true); + targetCreature->inflictDamage(creature, 3, actionDamage, true, true); + targetCreature->inflictDamage(creature, 6, mindDamage, true, true); + } + } + } + return SUCCESS; + } + + //Deal damage to selected target + else { + //Deal damage if target is not a player + if (targetCreature != NULL) { + if (!targetCreature->isPlayerCreature()) { + Locker locker(targetCreature, creature); + + targetCreature->inflictDamage(creature, 0, healthDamage, true, true); + targetCreature->inflictDamage(creature, 3, actionDamage, true, true); + targetCreature->inflictDamage(creature, 6, mindDamage, true, true); + return SUCCESS; + } + } + //Deal damage if target is a lair + else if (targetLair != NULL) { + Locker locker(targetLair, creature); + + targetLair->inflictDamage(creature, 0, healthDamage, true, true); + return SUCCESS; + } + } + return SUCCESS; } Index: src/server/zone/objects/creature/commands/KillPlayerCommand.h =================================================================== --- src/server/zone/objects/creature/commands/KillPlayerCommand.h (revision 5340) +++ src/server/zone/objects/creature/commands/KillPlayerCommand.h (working copy) @@ -64,26 +64,219 @@ if (!checkInvalidLocomotions(creature)) return INVALIDLOCOMOTION; - ManagedReference targetToKill = NULL; + ManagedReference ghost = creature->getPlayerObject(); + //Check privileges + if (ghost == NULL || !ghost->isPrivileged()) + return INSUFFICIENTPERMISSION; + + //Explain syntax + if (arguments.isEmpty() && target == 0) { + creature->sendSystemMessage("Syntax: /killPlayer [player name] [-area [range]] [ [action] [mind]]"); + return GENERALERROR; + } + + ManagedReference targetPlayer = NULL; + ManagedReference targetObject = server->getZoneServer()->getObject(target); + PlayerManager* playerManager = server->getZoneServer()->getPlayerManager(); - if (!arguments.isEmpty()) { - targetToKill = playerManager->getPlayer(arguments.toString()); - } else { - ManagedReference obj = server->getZoneServer()->getObject(target); + if (targetObject != NULL) { + if (targetObject->isPlayerCreature()) + targetPlayer = cast(targetObject.get()); + else { + creature->sendSystemMessage("Invalid target."); + return INVALIDTARGET; + } + } - if (obj != NULL && obj->isPlayerCreature()) - targetToKill = cast( obj.get()); + StringTokenizer args(arguments.toString()); + + //Initialize default damage amount + int healthDamage = 9999999; + int actionDamage = healthDamage; + int mindDamage = healthDamage; + + //Initialize components used to kill nearby creatures + bool area = false; + bool damage = false; + float range = 64; + + while (args.hasMoreTokens()) { + + String arg; + args.getStringToken(arg); + bool validOption = false; + + //If first argument is player name, break loop and kill player + ManagedReferencefindPlayer = playerManager->getPlayer(arg); + if (findPlayer != NULL) { + targetPlayer = findPlayer; + break; + } + + //Command Options + if (arg.charAt(0) == '-') { + //Help Syntax + if (arg.toLowerCase() == "-help" || arg == "-H") { + validOption = true; + creature->sendSystemMessage("Syntax: /kill [-area [range]] [ [action] [mind]]"); + return GENERALERROR; + } + + //Make command area affect with optional range + if (arg.toLowerCase() == "-area" || arg == "-a") { + validOption = true; + area = true; + + if (args.hasMoreTokens()) { + range = args.getFloatToken(); + if (range <= 0) { + creature->sendSystemMessage("Invalid range."); + return INVALIDPARAMETERS; + } + } + } + + if (!validOption) { + creature->sendSystemMessage("Invalid option " + arg); + return INVALIDPARAMETERS; + } + } + + else { + //Override default damage amount + try { + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid damage amount."); + } + + damage = true; + healthDamage = Integer::valueOf(arg); + actionDamage = healthDamage; + mindDamage = healthDamage; + + if (args.hasMoreTokens()) { + args.getStringToken(arg); + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid action damage amount."); + } + + actionDamage = Integer::valueOf(arg); + mindDamage = 0; + + if (args.hasMoreTokens()) { + args.getStringToken(arg); + //Test if value is integer + for (int i = 0; i < arg.length(); i++) { + if (!Character::isDigit(arg.charAt(i))) + throw Exception("Invalid mind damage amount."); + } + + mindDamage = Integer::valueOf(arg); + + if (args.hasMoreTokens()) + throw Exception("Too many arguments."); + } + } + } + catch (Exception e) { + creature->sendSystemMessage(e.getMessage()); + return INVALIDPARAMETERS; + } + } } - if (targetToKill == NULL) - return INVALIDTARGET; + //Deal area damage if specified + if (area) { + //Retrieve nearby objects + SortedVector >* closeObjects = creature->getCloseObjects(); + int count = 0; - Locker clocker(targetToKill, creature); + //Deal area damage if specified + if (damage) { + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + if (targetObject->isPlayerCreature()) { + targetPlayer = cast(targetObject); - playerManager->killPlayer(creature, targetToKill, 1); + //Deal damage if target is in range, a player + if (creature->isInRange(targetPlayer, range) && targetPlayer->isPlayerCreature() && targetPlayer != creature) { + Locker locker(targetPlayer, creature); + targetPlayer->inflictDamage(creature, 0, healthDamage, true, true); + targetPlayer->inflictDamage(creature, 3, actionDamage, true, true); + targetPlayer->inflictDamage(creature, 6, mindDamage, true, true); + targetPlayer->sendSystemMessage("You have been damaged!"); + + ++count; + } + } + } + creature->sendSystemMessage(String::valueOf(count) + " players damaged."); + return SUCCESS; + } + + //Kill players in area + else { + for (int i = 0; i < closeObjects->size(); i++) { + SceneObject* targetObject = cast(closeObjects->get(i).get()); + if (targetObject->isPlayerCreature()) { + targetPlayer = cast(targetObject); + + if (targetPlayer->isPlayerCreature() && targetPlayer != creature) { + Locker locker (targetPlayer, creature); + + playerManager->killPlayer(creature, targetPlayer, 1); + + ++count; + } + } + } + creature->sendSystemMessage(String::valueOf(count) + " players killed."); + return SUCCESS; + } + } + + //Deal damage to single target + else if (damage) { + if (targetPlayer != NULL) { + if (targetPlayer->isPlayerCreature()) { + Locker locker(targetPlayer, creature); + + targetPlayer->inflictDamage(creature, 0, healthDamage, true, true); + targetPlayer->inflictDamage(creature, 3, actionDamage, true, true); + targetPlayer->inflictDamage(creature, 6, mindDamage, true, true); + + creature->sendSystemMessage(targetPlayer->getFirstName() + " damaged."); + return SUCCESS; + } + } + else { + creature->sendSystemMessage("Invalid target."); + return INVALIDTARGET; + } + } + + //Kill single target + else { + if (targetPlayer != NULL) { + if (targetPlayer->isPlayerCreature()) { + Locker locker(targetPlayer, creature); + + playerManager->killPlayer(creature, targetPlayer, 1); + } + } + else { + creature->sendSystemMessage("Invalid target."); + return INVALIDTARGET; + } + } + return SUCCESS; }