mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-09-25 10:12:52 -04:00
Added serverGame library
This commit is contained in:
@@ -0,0 +1,321 @@
|
||||
// ======================================================================
|
||||
//
|
||||
// ConsoleCommandParserSpaceAi.cpp
|
||||
// Copyright (c) 2004 Sony Online Entertainment
|
||||
//
|
||||
// ======================================================================
|
||||
|
||||
#include "serverGame/FirstServerGame.h"
|
||||
#include "serverGame/ConsoleCommandParserSpaceAi.h"
|
||||
|
||||
#include "serverGame/AiServerShipObjectInterface.h"
|
||||
#include "serverGame/AiShipBehaviorAttackFighter.h"
|
||||
#include "serverGame/AiShipBehaviorAttackFighter_Maneuver.h"
|
||||
#include "serverGame/AiShipBehaviorBase.h"
|
||||
#include "serverGame/AiShipController.h"
|
||||
#include "serverGame/AiShipPilotData.h"
|
||||
#include "serverGame/Chat.h"
|
||||
#include "serverGame/CreatureObject.h"
|
||||
#include "serverGame/SpacePath.h"
|
||||
#include "serverGame/SpaceAttackSquad.h"
|
||||
#include "sharedFoundation/FormattedString.h"
|
||||
#include "sharedFoundation/NetworkId.h"
|
||||
#include "sharedGame/AiDebugString.h"
|
||||
#include "sharedNetworkMessages/GenericValueTypeMessage.h"
|
||||
#include "sharedObject/NetworkIdManager.h"
|
||||
#include "UnicodeUtils.h"
|
||||
|
||||
// ======================================================================
|
||||
|
||||
static const CommandParser::CmdInfo cmds[] =
|
||||
{
|
||||
{"war", 0, "", "Sets all AI to resume attacking"},
|
||||
{"peace", 0, "", "Sets all AI to stop attacking."},
|
||||
{"path", 1, "", "Sends the pathing points for the specified AI to the client."},
|
||||
{"reloaddata", 0, "", "Reloads pilottype.tab"},
|
||||
#ifdef _DEBUG
|
||||
{"clientDebug", 0, "", "Toggles client AI debugging."},
|
||||
{"serverDebug", 0, "", "Toggles the server to send AI debugging."},
|
||||
{"clientDebugText", 0, "", "Toggles the client AI debugging text."},
|
||||
{"maneuver", 1, "", "Forces the target ship to use evade, leash, or attack maneuvers."},
|
||||
{"fastAxis", 0, "", "Ships rotate toward the target along the fast axis of rotation."},
|
||||
//{"logall", 0, "", "Logs all AI to the server output log file."},
|
||||
//{"log", 0, "", "Logs the specified objectIds to the server output log file."},
|
||||
#endif // _DEBUG
|
||||
{"", 0, "", ""} // this must be last
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
|
||||
ConsoleCommandParserSpaceAi::ConsoleCommandParserSpaceAi()
|
||||
: CommandParser("spaceai", 0, "...", "Space Ai related commands.", 0)
|
||||
{
|
||||
createDelegateCommands (cmds);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
|
||||
bool ConsoleCommandParserSpaceAi::performParsing(const NetworkId & userId, const StringVector_t & argv, const String_t & originalCommand, String_t & result, const CommandParser * node)
|
||||
{
|
||||
NOT_NULL (node);
|
||||
UNREF (userId);
|
||||
UNREF(originalCommand);
|
||||
|
||||
if (isAbbrev(argv[0], "war"))
|
||||
{
|
||||
AiShipController::setAttackingEnabled(true);
|
||||
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[WAR] AI will now attack."), Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "peace"))
|
||||
{
|
||||
AiShipController::setAttackingEnabled(false);
|
||||
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[PEACE] AI will no longer attack."), Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "path"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if ( (serverObject != NULL)
|
||||
&& (argv.size () > 1))
|
||||
{
|
||||
NetworkId networkId(Unicode::wideToNarrow(argv[1]));
|
||||
|
||||
AiShipController * const aiShipController = AiShipController::getAiShipController(networkId);
|
||||
|
||||
if (aiShipController != NULL)
|
||||
{
|
||||
SpacePath * const spacePath = aiShipController->getPath();
|
||||
|
||||
if (spacePath != NULL)
|
||||
{
|
||||
SpacePath::TransformList const & transformList = spacePath->getTransformList();
|
||||
SpacePath::TransformList::const_iterator iterTransformList = transformList.begin();
|
||||
FormattedString<512> formattedString;
|
||||
int index = 1;
|
||||
std::string message;
|
||||
|
||||
message += formattedString.sprintf("Path of size(%u) for unit(%s)\n", transformList.size(), networkId.getValueString().c_str());
|
||||
|
||||
for (; iterTransformList != transformList.end(); ++iterTransformList)
|
||||
{
|
||||
Vector const & position_w = iterTransformList->getPosition_p();
|
||||
|
||||
message += formattedString.sprintf("[%d] %.2f, %.2f, %.2f%s", index++, position_w.x, position_w.y, position_w.z, (index < static_cast<int>(transformList.size())) ? "\n" : "");
|
||||
}
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide(message.c_str()), Unicode::emptyString);
|
||||
}
|
||||
else
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("NULL path"), Unicode::emptyString);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[ERROR] Unable to resolve the obj_id for a path."), Unicode::emptyString);
|
||||
}
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "reloaddata"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
AiShipPilotData::reload();
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[RELOAD DATA] pilottype.tab was reloaded"), Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
else if (isAbbrev(argv[0], "clientDebug"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
int temp;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
if ( serverObject->getObjVars().getItem("ai_debug_string", temp)
|
||||
&& (temp > 0))
|
||||
{
|
||||
if (!AiShipController::isClientDebugEnabled())
|
||||
{
|
||||
AiShipController::setClientDebugEnabled(true);
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[ENABLED] Your client is requesting ai debugging."), Unicode::emptyString);
|
||||
}
|
||||
else
|
||||
{
|
||||
IGNORE_RETURN(serverObject->setObjVarItem("ai_debug_string", 0));
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[DISABLED] Your client is NO LONGER requesting ai debugging."), Unicode::emptyString);
|
||||
|
||||
// Tell the client to remove all ai debugging
|
||||
|
||||
Client * const client = serverObject->getClient();
|
||||
|
||||
if (client != NULL)
|
||||
{
|
||||
AiDebugString aiDebugString;
|
||||
aiDebugString.enableClearClientFlag();
|
||||
bool const reliable = true;
|
||||
GenericValueTypeMessage<std::pair<NetworkId, std::string> > message("AiDebugString", std::make_pair(serverObject->getNetworkId(), aiDebugString.toString()));
|
||||
|
||||
client->send(message, reliable);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
IGNORE_RETURN(serverObject->setObjVarItem("ai_debug_string", 1));
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("[ENABLED] Your client is requesting ai debugging."), Unicode::emptyString);
|
||||
|
||||
if (!AiShipController::isClientDebugEnabled())
|
||||
{
|
||||
AiShipController::setClientDebugEnabled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "serverDebug"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
AiShipController::setClientDebugEnabled(!AiShipController::isClientDebugEnabled());
|
||||
|
||||
Unicode::String systemMessage;
|
||||
systemMessage = Unicode::narrowToWide(AiShipController::isClientDebugEnabled() ? "[ENABLED] Server is sending debug ai to requesting clients." : "[DISABLED] Server is NO LONGER sending debug ai to requesting clients.");
|
||||
Chat::sendSystemMessage(*serverObject, systemMessage, Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "clientDebugText"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
AiDebugString::setTextEnabled(!AiDebugString::isTextEnabled());
|
||||
|
||||
Unicode::String systemMessage;
|
||||
systemMessage = Unicode::narrowToWide(AiDebugString::isTextEnabled() ? "[ENABLED] Client-side debug text is enabled." : "[DISABLED] Client-side debug text is disabled.");
|
||||
Chat::sendSystemMessage(*serverObject, systemMessage, Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "maneuver"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
CreatureObject const * const creatureObject = serverObject ? serverObject->asCreatureObject() : NULL;
|
||||
|
||||
if (serverObject)
|
||||
{
|
||||
if ((creatureObject != NULL) && (argv.size () > 1))
|
||||
{
|
||||
AiShipController const * const lookAtAiShipController = AiShipController::getAiShipController(creatureObject->getLookAtTarget());
|
||||
|
||||
if (lookAtAiShipController)
|
||||
{
|
||||
SpaceAttackSquad const & attackSquad = lookAtAiShipController->getAttackSquad();
|
||||
AiShipController * const squadLeaderAiShipController = AiShipController::getAiShipController(attackSquad.getLeader());
|
||||
|
||||
bool success = false;
|
||||
|
||||
if (isAbbrev(argv[1], "evade"))
|
||||
{
|
||||
success = squadLeaderAiShipController->debug_forceFighterAttackManeuver(static_cast<int>(AiShipBehaviorAttackFighter::Maneuver::FM_evade));
|
||||
}
|
||||
else if (isAbbrev(argv[1], "chase"))
|
||||
{
|
||||
success = squadLeaderAiShipController->debug_forceFighterAttackManeuver(static_cast<int>(AiShipBehaviorAttackFighter::Maneuver::FM_chase));
|
||||
}
|
||||
else if (isAbbrev(argv[1], "leash"))
|
||||
{
|
||||
success = squadLeaderAiShipController->debug_forceFighterAttackManeuver(static_cast<int>(AiShipBehaviorAttackFighter::Maneuver::FM_leash));
|
||||
}
|
||||
else if (isAbbrev(argv[1], "none"))
|
||||
{
|
||||
success = squadLeaderAiShipController->debug_forceFighterAttackManeuver(static_cast<int>(AiShipBehaviorAttackFighter::Maneuver::FM_none));
|
||||
}
|
||||
else
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("Valid parameters are: [evade], [attack] or [chase], [leash], and [none]."), Unicode::emptyString);
|
||||
}
|
||||
|
||||
if (!success)
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("Failed to set the maneuver on the target. The target must be in the AiShipBehaviorAttackFighter state. This fails on a bomber or capship behavior."), Unicode::emptyString);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Chat::sendSystemMessage(*serverObject, Unicode::narrowToWide("Incorrect number of arguments."), Unicode::emptyString);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
else if (isAbbrev(argv[0], "fastAxis"))
|
||||
{
|
||||
Object * const object = NetworkIdManager::getObjectById(userId);
|
||||
ServerObject * const serverObject = (object != NULL) ? object->asServerObject() : NULL;
|
||||
|
||||
if (serverObject != NULL)
|
||||
{
|
||||
Unicode::String systemMessage;
|
||||
|
||||
AiServerShipObjectInterface::setFastAxisEnabled(!AiServerShipObjectInterface::isFastAxisEnabled());
|
||||
|
||||
systemMessage += Unicode::narrowToWide(AiServerShipObjectInterface::isFastAxisEnabled() ? "[ENABLED] AI ships now use the fast axis." : "[DISABLED] AI ships are no longer using the fast axis.");
|
||||
|
||||
Chat::sendSystemMessage(*serverObject, systemMessage, Unicode::emptyString);
|
||||
}
|
||||
|
||||
result += getErrorMessage(argv[0], ERR_SUCCESS);
|
||||
}
|
||||
#endif //_DEBUG
|
||||
else
|
||||
{
|
||||
result += getErrorMessage(argv[0], ERR_NO_HANDLER);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
Reference in New Issue
Block a user