int NameManager::validateName(CreatureObject* obj) { StringId* objectName = obj->getObjectName(); UnicodeString name = obj->getCustomObjectName(); int species = obj->getSpecies(); return validateName(name.toString(), species); }
void ObjectController::handleSpatialChat(SceneObject* object, Message* pack) { uint64 sender = pack->parseLong(); uint64 target = pack->parseLong(); UnicodeString message; pack->parseUnicode(message); SceneObject* senderObject = zone->getObject(sender); if (senderObject != NULL) senderObject->info("says " + message.toString(), true); }
void LoginPacketHandler::handleEnumerateCharacterId(Message* pack) { BaseClient* client = (BaseClient*) pack->getClient(); client->info("received EnumerateCharacterId"); uint32 characters = pack->parseInt(); if (loginSession == NULL) return; if (characters == 0) { client->info("no characters found"); loginSession->setSelectedCharacter(-1); return; } for (int i = 0; i < characters; ++i) { UnicodeString name; pack->parseUnicode(name); uint32 crc = pack->parseInt(); uint64 oid = pack->parseLong(); uint32 galaxy = pack->parseInt(); uint32 serverStatus = pack->parseInt(); StringBuffer player; player << "Character [" << i << "]: [" << name.toString() << "]"; client->info(player.toString()); loginSession->addCharacter(oid); } client->info("please enter character to login... -1 to create a new one", true); char characterID[32]; auto res = fgets(characterID, sizeof(characterID), stdin); if (!res) return; String selected = characterID; selected = selected.replaceFirst("\n", ""); int selectedInt = Integer::valueOf(selected); client->info("selected character " + String::valueOf(selectedInt)); loginSession->setSelectedCharacter(selectedInt); }
void ZonePacketHandler::handleChatInstantMessageToClient(Message* pack) { BaseClient* client = (BaseClient*) pack->getClient(); String game, galaxy, name; UnicodeString message; pack->parseAscii(game); pack->parseAscii(galaxy); pack->parseAscii(name); pack->parseUnicode(message); StringBuffer infoMsg; infoMsg << "instant message from [" << name << "] : " << message.toString(); client->info(infoMsg.toString()); }
void ZonePacketHandler::handleChatSystemMessage(Message* pack) { BaseClient* client = (BaseClient*) pack->getClient(); uint8 type = pack->parseByte(); if (type == 1) { UnicodeString message; pack->parseUnicode(message); StringBuffer systemMessage; systemMessage << "SystemMessage:[" << message.toString() << "]"; client->info(systemMessage.toString()); } }
SceneObject* ObjectManager::getObject(const UnicodeString& customName) { Locker _locker(this); HashTableIterator<uint64, Reference<SceneObject*> > iterator(objectMap); while (iterator.hasNext()) { SceneObject* object = iterator.next(); StringId name = object->getObjectName(); UnicodeString cust = name.getCustomString(); if (cust.toString() == customName.toString()) return object; } return NULL; }
void ObjectController::doSayCommand(const UnicodeString& msg) { PlayerCreature* object = zone->getSelfPlayer(); Locker _locker(object); StringBuffer full; full << "0 " << "0 " << "0 " << "0 " << "0 " << msg.toString(); BaseMessage* message = new ObjectControllerMessage(object->getObjectID(), 0x23, 0x116); message->insertInt(object->getNewActionCount()); message->insertInt(String("spatialchatinternal").hashCode()); message->insertLong(0); message->insertUnicode(full.toString()); object->getClient()->sendMessage(message); }
void ObjectControllerImplementation::logAdminCommand(SceneObject* object, const QueueCommand* queueCommand, uint64 targetID, const UnicodeString& arguments) { String name = "unknown"; Reference<SceneObject*> targetObject = Core::getObjectBroker()->lookUp(targetID).castTo<SceneObject*>(); if(targetObject != NULL) { name = targetObject->getDisplayedName(); if(targetObject->isPlayerCreature()) name += "(Player)"; else name += "(NPC)"; } else { name = "(null)"; } StringBuffer logEntry; logEntry << object->getDisplayedName() << " used '/" << queueCommand->getQueueCommandName() << "' on " << name << " with params '" << arguments.toString() << "'"; adminLog.info(logEntry.toString()); }
CreatureAttackData::CreatureAttackData(const UnicodeString& dataString, CombatQueueCommand* base) { baseCommand = base; fillFromBase(); StringTokenizer data(dataString.toString()); data.setDelimeter(";"); while (data.hasMoreTokens()) { String varString; data.getStringToken(varString); int pos = varString.indexOf("="); if (pos == -1) continue; String key = varString.subString(0,pos); String value = varString.subString(pos + 1, varString.length()); setVariable(key, value); } }
void ChatManagerImplementation::broadcastMessage(CreatureObject* player, const UnicodeString& message, uint64 target, uint32 moodid, uint32 mood2) { Zone* zone = player->getZone(); PlayerObject* myGhost = NULL; bool godMode = false; if (zone == NULL) return; int language = 0; String firstName; if (player->isPlayerCreature() /*|| !((Player *)player)->isChatMuted() */) { CreatureObject* playerCreature = cast<CreatureObject*>(player); if (playerCreature) { firstName = playerCreature->getFirstName().toLowerCase(); myGhost = playerCreature->getPlayerObject(); } if (myGhost) language = myGhost->getLanguageID(); } if (myGhost) { if (myGhost->hasGodMode()) godMode = true; } StringIdChatParameter* param = NULL; if (message[0] == '@' && message.indexOf(":") != -1) { param = new StringIdChatParameter(message.toString()); } CloseObjectsVector* closeObjects = (CloseObjectsVector*) player->getCloseObjects(); SortedVector<QuadTreeEntry*> closeEntryObjects(200, 50); if (closeObjects != NULL) { closeObjects->safeCopyTo(closeEntryObjects); } else { player->info("Null closeobjects vector in ChatManager::broadcastMessage", true); zone->getInRangeObjects(player->getWorldPositionX(), player->getWorldPositionY(), 128, &closeEntryObjects, true); } float range = defaultSpatialChatDistance; float specialRange = spatialChatDistances.get(mood2); if (specialRange != -1) { range = specialRange; } try { for (int i = 0; i < closeEntryObjects.size(); ++i) { SceneObject* object = cast<SceneObject*>(closeEntryObjects.get(i)); if (player->isInRange(object, range)) { //Notify observers that are expecting spatial chat. if (object->getObserverCount(ObserverEventType::SPATIALCHATRECEIVED)) { ManagedReference<ChatMessage*> chatMessage = new ChatMessage(); chatMessage->setString(message.toString()); EXECUTE_TASK_3(object, chatMessage, player, { if (player_p == NULL || object_p == NULL) return; Locker locker(object_p); SortedVector<ManagedReference<Observer*> > observers = object_p->getObservers(ObserverEventType::SPATIALCHATRECEIVED); for (int oc = 0; oc < observers.size(); oc++) { Observer* observer = observers.get(oc); Locker clocker(observer, object_p); if (observer->notifyObserverEvent(ObserverEventType::SPATIALCHATRECEIVED, object_p, chatMessage_p, player_p->getObjectID()) == 1) object_p->dropObserver(ObserverEventType::SPATIALCHATRECEIVED, observer); } }); } if (object->isPlayerCreature()) { CreatureObject* creature = cast<CreatureObject*>(object); PlayerObject* ghost = creature->getPlayerObject(); if (ghost == NULL) continue; if (!ghost->isIgnoring(firstName) || godMode) { SpatialChat* cmsg = NULL; if (param == NULL) { cmsg = new SpatialChat(player->getObjectID(), creature->getObjectID(), message, target, moodid, mood2, language); } else { cmsg = new SpatialChat(player->getObjectID(), creature->getObjectID(), *param, target, moodid, mood2); } creature->sendMessage(cmsg); } } else if( object->isPet() ){ AiAgent* pet = cast<AiAgent*>(object); if (pet == NULL ) continue; if( pet->isDead() || pet->isIncapacitated() ) continue; PetManager* petManager = server->getPetManager(); Locker clocker(pet, player); petManager->handleChat( player, pet, message.toString() ); } } }
void ChatManagerImplementation::handleSocialInternalMessage(CreatureObject* sender, const UnicodeString& arguments) { if (sender->isPlayerCreature()) { ManagedReference<PlayerObject*> senderGhost = sender->getPlayerObject(); if (senderGhost == NULL) return; if (senderGhost->isMuted()) { String reason = senderGhost->getMutedReason(); if (reason != "") sender->sendSystemMessage("Your chat abilities are currently disabled by Customer Support for '" + reason + "'."); else sender->sendSystemMessage("Your chat abilities are currently disabled by Customer Support."); return; } } Zone* zone = sender->getZone(); if (zone == NULL) return; StringTokenizer tokenizer(arguments.toString()); uint64 targetid; uint32 emoteid, unkint, unkint2; try { targetid = tokenizer.getLongToken(); emoteid = tokenizer.getIntToken(); unkint = tokenizer.getIntToken(); unkint2 = tokenizer.getIntToken(); } catch (const Exception& e) { return; } //bool readlock = !zone->isLockedByCurrentThread(); bool showtext = true; if (unkint2 == 0) showtext = false; String firstName; if (sender->isPlayerCreature()) firstName = (cast<CreatureObject*>(sender))->getFirstName().toLowerCase(); CloseObjectsVector* vec = (CloseObjectsVector*) sender->getCloseObjects(); SortedVector<QuadTreeEntry* > closeEntryObjects(200, 50); if (vec != NULL) { vec->safeCopyTo(closeEntryObjects); } else { sender->info("Null closeobjects vector in ChatManager::handleSocialInternalMessage", true); zone->getInRangeObjects(sender->getWorldPositionX(), sender->getWorldPositionX(), 128, &closeEntryObjects, true); } float range = defaultSpatialChatDistance; for (int i = 0; i < closeEntryObjects.size(); ++i) { SceneObject* object = cast<SceneObject*>(closeEntryObjects.get(i)); if (object->isPlayerCreature()) { CreatureObject* creature = cast<CreatureObject*>(object); Reference<PlayerObject*> ghost = creature->getSlottedObject("ghost").castTo<PlayerObject*>(); if (ghost == NULL) continue; if (!ghost->isIgnoring(firstName) && creature->isInRange(sender, range)) { Emote* emsg = new Emote(creature, sender, targetid, emoteid, showtext); creature->sendMessage(emsg); } } } }
float ObjectControllerImplementation::activateCommand(CreatureObject* object, unsigned int actionCRC, unsigned int actionCount, uint64 targetID, const UnicodeString& arguments) { // Pre: object is wlocked // Post: object is wlocked QueueCommand* queueCommand = getQueueCommand(actionCRC); float durationTime = 0.f; if (queueCommand == NULL) { StringBuffer msg; msg << "unregistered queue command 0x" << hex << actionCRC << " arguments: " << arguments.toString(); object->error(msg.toString()); return 0.f; } /*StringBuffer infoMsg; infoMsg << "activating queue command 0x" << hex << actionCRC << " " << queueCommand->getQueueCommandName() << " arguments='" << arguments.toString() << "'"; object->info(infoMsg.toString(), true);*/ String characterAbility = queueCommand->getCharacterAbility(); if (characterAbility.length() > 1) { object->info("activating characterAbility " + characterAbility); if (object->isPlayerCreature()) { Reference<PlayerObject*> playerObject = object->getSlottedObject("ghost").castTo<PlayerObject*>(); if (!playerObject->hasAbility(characterAbility)) { object->clearQueueAction(actionCount, 0, 2); return 0.f; } } } uint32 commandGroup = queueCommand->getCommandGroup(); if (commandGroup != 0) { if (commandGroup == 0xe1c9a54a && queueCommand->getQueueCommandName() != "attack") { if (!object->isAiAgent()) { object->clearQueueAction(actionCount, 0, 2); return 0.f; } } } if(queueCommand->requiresAdmin()) { try { if(object->isPlayerCreature()) { Reference<PlayerObject*> ghost = object->getSlottedObject("ghost").castTo<PlayerObject*>(); if (ghost == NULL || !ghost->isPrivileged() || !ghost->hasAbility(queueCommand->getQueueCommandName())) { StringBuffer logEntry; logEntry << object->getDisplayedName() << " attempted to use the '/" << queueCommand->getQueueCommandName() << "' command without permissions"; adminLog.warning(logEntry.toString()); object->sendSystemMessage("@error_message:insufficient_permissions"); object->clearQueueAction(actionCount, 0, 2); return 0.f; } } else { return 0.f; } String name = "unknown"; Reference<SceneObject*> targetObject = Core::getObjectBroker()->lookUp(targetID).castTo<SceneObject*>(); if(targetObject != NULL) { name = targetObject->getDisplayedName(); if(targetObject->isPlayerCreature()) name += "(Player)"; else name += "(NPC)"; } else { name = "(null)"; } StringBuffer logEntry; logEntry << object->getDisplayedName() << " used '/" << queueCommand->getQueueCommandName() << "' on " << name << " with params '" << arguments.toString() << "'"; adminLog.info(logEntry.toString()); } catch (Exception& e) { Logger::error("Unhandled Exception logging admin commands" + e.getMessage()); } } /// Add Skillmods if any for(int i = 0; i < queueCommand->getSkillModSize(); ++i) { String skillMod; int value = queueCommand->getSkillMod(i, skillMod); object->addSkillMod(SkillModManager::ABILITYBONUS, skillMod, value, false); } int errorNumber = queueCommand->doQueueCommand(object, targetID, arguments); /// Remove Skillmods if any for(int i = 0; i < queueCommand->getSkillModSize(); ++i) { String skillMod; int value = queueCommand->getSkillMod(i, skillMod); object->addSkillMod(SkillModManager::ABILITYBONUS, skillMod, -value, false); } //onFail onComplete must clear the action from client queue if (errorNumber != QueueCommand::SUCCESS) queueCommand->onFail(actionCount, object, errorNumber); else { if (queueCommand->getDefaultPriority() != QueueCommand::IMMEDIATE) durationTime = queueCommand->getCommandDuration(object, arguments); queueCommand->onComplete(actionCount, object, durationTime); } /*if (actionCRC == String("stand").hashCode()) { Time start; for (int i = 0; i < 10000; ++i) { LuaFunction func(L, "runScript", 0); func << object; callFunction(&func); //int cred = object->getBankCredits(); } info("time elapsed " + String::valueOf(start.miliDifference()), true); }*/ return durationTime; }
float ObjectControllerImplementation::activateCommand(CreatureObject* object, unsigned int actionCRC, unsigned int actionCount, uint64 targetID, const UnicodeString& arguments) { // Pre: object is wlocked // Post: object is wlocked QueueCommand* queueCommand = getQueueCommand(actionCRC); float durationTime = 0.f; if (queueCommand == NULL) { StringBuffer msg; msg << "unregistered queue command 0x" << hex << actionCRC << " arguments: " << arguments.toString(); object->error(msg.toString()); return 0.f; } /*StringBuffer infoMsg; infoMsg << "activating queue command 0x" << hex << actionCRC << " " << queueCommand->getQueueCommandName() << " arguments='" << arguments.toString() << "'"; object->info(infoMsg.toString(), true);*/ const String& characterAbility = queueCommand->getCharacterAbility(); if (characterAbility.length() > 1) { object->info("activating characterAbility " + characterAbility); if (object->isPlayerCreature()) { Reference<PlayerObject*> playerObject = object->getSlottedObject("ghost").castTo<PlayerObject*>(); if (!playerObject->hasAbility(characterAbility)) { object->clearQueueAction(actionCount, 0, 2); return 0.f; } } } uint32 commandGroup = queueCommand->getCommandGroup(); if (commandGroup != 0) { if (commandGroup == 0xe1c9a54a && queueCommand->getQueueCommandName() != "attack") { if (!object->isAiAgent()) { object->clearQueueAction(actionCount, 0, 2); return 0.f; } } } if (queueCommand->requiresAdmin()) { try { if(object->isPlayerCreature()) { Reference<PlayerObject*> ghost = object->getSlottedObject("ghost").castTo<PlayerObject*>(); if (ghost == NULL || !ghost->hasGodMode() || !ghost->hasAbility(queueCommand->getQueueCommandName())) { StringBuffer logEntry; logEntry << object->getDisplayedName() << " attempted to use the '/" << queueCommand->getQueueCommandName() << "' command without permissions"; adminLog.warning(logEntry.toString()); object->sendSystemMessage("@error_message:insufficient_permissions"); object->clearQueueAction(actionCount, 0, 2); return 0.f; } } else { return 0.f; } logAdminCommand(object, queueCommand, targetID, arguments); } catch (Exception& e) { Logger::error("Unhandled Exception logging admin commands" + e.getMessage()); } } /// Add Skillmods if any for(int i = 0; i < queueCommand->getSkillModSize(); ++i) { String skillMod; int value = queueCommand->getSkillMod(i, skillMod); object->addSkillMod(SkillModManager::ABILITYBONUS, skillMod, value, false); } int errorNumber = queueCommand->doQueueCommand(object, targetID, arguments); /// Remove Skillmods if any for(int i = 0; i < queueCommand->getSkillModSize(); ++i) { String skillMod; int value = queueCommand->getSkillMod(i, skillMod); object->addSkillMod(SkillModManager::ABILITYBONUS, skillMod, -value, false); } //onFail onComplete must clear the action from client queue if (errorNumber != QueueCommand::SUCCESS) queueCommand->onFail(actionCount, object, errorNumber); else { if (queueCommand->getDefaultPriority() != QueueCommand::IMMEDIATE) durationTime = queueCommand->getCommandDuration(object, arguments); queueCommand->onComplete(actionCount, object, durationTime); } return durationTime; }