void BeingManager::getPlayerNames(std::vector<std::string> &names, bool npcNames) { Beings::iterator i = mBeings.begin(); names.clear(); while (i != mBeings.end()) { Being *being = (*i); if ((being->getType() == Being::PLAYER || (being->getType() == Being::NPC && npcNames)) && being->getName() != "") { names.push_back(being->getName()); } ++i; } }
void BeingManager::updatePlayerNames() { Beings::iterator i = mBeings.begin(); while (i != mBeings.end()) { Being *being = (*i); if (being->getType() == Being::PLAYER && being->getName() != "") being->updateName(); ++i; } }
Being *BeingManager::findBeingByName(const std::string &name, Being::Type type) const { for (Beings::const_iterator i = mBeings.begin(), i_end = mBeings.end(); i != i_end; ++i) { Being *being = (*i); if (being->getName() == name && (type == Being::UNKNOWN || type == being->getType())) return being; } return NULL; }
void PartyHandler::processPartyInvited(Net::MessageIn &msg) { int id = msg.readInt32(); std::string partyName = msg.readString(24); std::string nick(""); Being *being; if (actorSpriteManager) { if ((being = actorSpriteManager->findBeing(id))) { if (being && being->getType() == Being::PLAYER) nick = being->getName(); } } if (socialWindow) socialWindow->showPartyInvite(partyName, nick); }
void ChatHandler::handleGameChatMessage(Net::MessageIn &msg) { short id = msg.readInt16(); std::string chatMsg = msg.readString(); if (id == 0) { localChatTab->chatLog(chatMsg, BY_SERVER); return; } Being *being = beingManager->findBeing(id); std::string mes; if (being) { mes = being->getName() + " : " + chatMsg; being->setSpeech(chatMsg, SPEECH_TIME); } else mes = "Unknown : " + chatMsg; localChatTab->chatLog(mes, being == player_node ? BY_PLAYER : BY_OTHER); }
/** * Informs a player of what happened around the character. */ static void informPlayer(MapComposite *map, Character *p) { MessageOut moveMsg(GPMSG_BEINGS_MOVE); MessageOut damageMsg(GPMSG_BEINGS_DAMAGE); const Point &pold = p->getOldPosition(), ppos = p->getPosition(); int pid = p->getPublicID(), pflags = p->getUpdateFlags(); int visualRange = Configuration::getValue("game_visualRange", 448); // Inform client about activities of other beings near its character for (BeingIterator it(map->getAroundBeingIterator(p, visualRange)); it; ++it) { Being *o = *it; const Point &oold = o->getOldPosition(), opos = o->getPosition(); int otype = o->getType(); int oid = o->getPublicID(), oflags = o->getUpdateFlags(); int flags = 0; // Check if the character p and the moving object o are around. bool wereInRange = pold.inRangeOf(oold, visualRange) && !((pflags | oflags) & UPDATEFLAG_NEW_ON_MAP); bool willBeInRange = ppos.inRangeOf(opos, visualRange); if (!wereInRange && !willBeInRange) { // Nothing to report: o and p are far away from each other. continue; } if (wereInRange && willBeInRange) { // Send attack messages. if ((oflags & UPDATEFLAG_ATTACK) && oid != pid) { MessageOut AttackMsg(GPMSG_BEING_ATTACK); AttackMsg.writeInt16(oid); AttackMsg.writeInt8(o->getDirection()); AttackMsg.writeInt8(static_cast< Being * >(o)->getAttackId()); gameHandler->sendTo(p, AttackMsg); } // Send action change messages. if ((oflags & UPDATEFLAG_ACTIONCHANGE)) { MessageOut ActionMsg(GPMSG_BEING_ACTION_CHANGE); ActionMsg.writeInt16(oid); ActionMsg.writeInt8(static_cast< Being * >(o)->getAction()); gameHandler->sendTo(p, ActionMsg); } // Send looks change messages. if (oflags & UPDATEFLAG_LOOKSCHANGE) { MessageOut LooksMsg(GPMSG_BEING_LOOKS_CHANGE); LooksMsg.writeInt16(oid); Character * c = static_cast<Character * >(o); serializeLooks(c, LooksMsg); LooksMsg.writeInt16(c->getHairStyle()); LooksMsg.writeInt16(c->getHairColor()); LooksMsg.writeInt16(c->getGender()); gameHandler->sendTo(p, LooksMsg); } // Send emote messages. if (oflags & UPDATEFLAG_EMOTE) { int emoteId = o->getLastEmote(); if (emoteId > -1) { MessageOut EmoteMsg(GPMSG_BEING_EMOTE); EmoteMsg.writeInt16(oid); EmoteMsg.writeInt16(emoteId); gameHandler->sendTo(p, EmoteMsg); } } // Send direction change messages. if (oflags & UPDATEFLAG_DIRCHANGE) { MessageOut DirMsg(GPMSG_BEING_DIR_CHANGE); DirMsg.writeInt16(oid); DirMsg.writeInt8(o->getDirection()); gameHandler->sendTo(p, DirMsg); } // Send damage messages. if (o->canFight()) { Being *victim = static_cast< Being * >(o); const Hits &hits = victim->getHitsTaken(); for (Hits::const_iterator j = hits.begin(), j_end = hits.end(); j != j_end; ++j) { damageMsg.writeInt16(oid); damageMsg.writeInt16(*j); } } if (oold == opos) { // o does not move, nothing more to report. continue; } } if (!willBeInRange) { // o is no longer visible from p. Send leave message. MessageOut leaveMsg(GPMSG_BEING_LEAVE); leaveMsg.writeInt16(oid); gameHandler->sendTo(p, leaveMsg); continue; } if (!wereInRange) { // o is now visible by p. Send enter message. MessageOut enterMsg(GPMSG_BEING_ENTER); enterMsg.writeInt8(otype); enterMsg.writeInt16(oid); enterMsg.writeInt8(static_cast< Being *>(o)->getAction()); enterMsg.writeInt16(opos.x); enterMsg.writeInt16(opos.y); enterMsg.writeInt8(o->getDirection()); enterMsg.writeInt8(o->getGender()); switch (otype) { case OBJECT_CHARACTER: { Character *q = static_cast< Character * >(o); enterMsg.writeString(q->getName()); enterMsg.writeInt8(q->getHairStyle()); enterMsg.writeInt8(q->getHairColor()); serializeLooks(q, enterMsg); } break; case OBJECT_MONSTER: { Monster *q = static_cast< Monster * >(o); enterMsg.writeInt16(q->getSpecy()->getId()); enterMsg.writeString(q->getName()); } break; case OBJECT_NPC: { NpcComponent *npcComponent = o->getComponent<NpcComponent>(); enterMsg.writeInt16(npcComponent->getNpcId()); enterMsg.writeString(o->getName()); } break; default: assert(false); // TODO break; } gameHandler->sendTo(p, enterMsg); } if (opos != oold) { // Add position check coords every 5 seconds. if (currentTick % 50 == 0) flags |= MOVING_POSITION; flags |= MOVING_DESTINATION; } // Send move messages. moveMsg.writeInt16(oid); moveMsg.writeInt8(flags); if (flags & MOVING_POSITION) { moveMsg.writeInt16(oold.x); moveMsg.writeInt16(oold.y); } if (flags & MOVING_DESTINATION) { moveMsg.writeInt16(opos.x); moveMsg.writeInt16(opos.y); // We multiply the sent speed (in tiles per second) by ten // to get it within a byte with decimal precision. // For instance, a value of 4.5 will be sent as 45. moveMsg.writeInt8((unsigned short) (o->getModifiedAttribute(ATTR_MOVE_SPEED_TPS) * 10)); } } // Do not send a packet if nothing happened in p's range. if (moveMsg.getLength() > 2) gameHandler->sendTo(p, moveMsg); if (damageMsg.getLength() > 2) gameHandler->sendTo(p, damageMsg); // Inform client about status change. p->sendStatus(); // Inform client about health change of party members for (CharacterIterator i(map->getWholeMapIterator()); i; ++i) { Character *c = *i; // Make sure its not the same character if (c == p) continue; // make sure they are in the same party if (c->getParty() == p->getParty()) { int cflags = c->getUpdateFlags(); if (cflags & UPDATEFLAG_HEALTHCHANGE) { MessageOut healthMsg(GPMSG_BEING_HEALTH_CHANGE); healthMsg.writeInt16(c->getPublicID()); healthMsg.writeInt16(c->getModifiedAttribute(ATTR_HP)); healthMsg.writeInt16(c->getModifiedAttribute(ATTR_MAX_HP)); gameHandler->sendTo(p, healthMsg); } } } // Inform client about items on the ground around its character MessageOut itemMsg(GPMSG_ITEMS); for (FixedActorIterator it(map->getAroundBeingIterator(p, visualRange)); it; ++it) { Actor *o = *it; assert(o->getType() == OBJECT_ITEM || o->getType() == OBJECT_EFFECT); Point opos = o->getPosition(); int oflags = o->getUpdateFlags(); bool willBeInRange = ppos.inRangeOf(opos, visualRange); bool wereInRange = pold.inRangeOf(opos, visualRange) && !((pflags | oflags) & UPDATEFLAG_NEW_ON_MAP); if (willBeInRange ^ wereInRange) { switch (o->getType()) { case OBJECT_ITEM: { ItemComponent *item = o->getComponent<ItemComponent>(); ItemClass *itemClass = item->getItemClass(); if (oflags & UPDATEFLAG_NEW_ON_MAP) { /* Send a specific message to the client when an item appears out of nowhere, so that a sound/animation can be performed. */ MessageOut appearMsg(GPMSG_ITEM_APPEAR); appearMsg.writeInt16(itemClass->getDatabaseID()); appearMsg.writeInt16(opos.x); appearMsg.writeInt16(opos.y); gameHandler->sendTo(p, appearMsg); } else { itemMsg.writeInt16(willBeInRange ? itemClass->getDatabaseID() : 0); itemMsg.writeInt16(opos.x); itemMsg.writeInt16(opos.y); } } break; case OBJECT_EFFECT: { EffectComponent *e = o->getComponent<EffectComponent>(); e->setShown(); // Don't show old effects if (!(oflags & UPDATEFLAG_NEW_ON_MAP)) break; if (Being *b = e->getBeing()) { MessageOut effectMsg(GPMSG_CREATE_EFFECT_BEING); effectMsg.writeInt16(e->getEffectId()); effectMsg.writeInt16(b->getPublicID()); gameHandler->sendTo(p, effectMsg); } else { MessageOut effectMsg(GPMSG_CREATE_EFFECT_POS); effectMsg.writeInt16(e->getEffectId()); effectMsg.writeInt16(opos.x); effectMsg.writeInt16(opos.y); gameHandler->sendTo(p, effectMsg); } } break; default: break; } // Switch } } // Do not send a packet if nothing happened in p's range. if (itemMsg.getLength() > 2) gameHandler->sendTo(p, itemMsg); }
void PopupMenu::handleLink(const std::string &link) { Being *being = beingManager->findBeing(mBeingId); // Talk To actiondar : if (link == "talk" && being && being->getType() == Being::NPC && current_npc == 0) { dynamic_cast<NPC*>(being)->talk(); } // Trade action else if (link == "trade" && being && being->getType() == Being::PLAYER) { Net::getTradeHandler()->request(being); tradePartnerName = being->getName(); } // Attack action else if (link == "attack" && being) { player_node->attack(being, true); } else if (link == "unignore" && being && being->getType() == Being::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::NEUTRAL); } else if (link == "ignore" && being && being->getType() == Being::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::IGNORED); } else if (link == "disregard" && being && being->getType() == Being::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::DISREGARDED); } else if (link == "friend" && being && being->getType() == Being::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::FRIEND); } #ifdef TMWSERV_SUPPORT // Guild action else if (link == "guild" && being != NULL && being->getType() == Being::PLAYER) { player_node->inviteToGuild(being); } #endif /* // Follow Player action else if (link == "follow") { }*/ /* // Add Buddy action else if ((link == "buddy") && being && being->isPlayer()) { if (!buddyWindow->isVisible()) buddyWindow->setVisible(true); buddyWindow->addBuddy(being->getName()); }*/ // Pick Up Floor Item action else if ((link == "pickup") && mFloorItem) { player_node->pickUp(mFloorItem); } // Look To action else if (link == "look") { } else if (link == "use") { assert(mItem); if (mItem->isEquipment()) { if (mItem->isEquipped()) Net::getInventoryHandler()->unequipItem(mItem); else Net::getInventoryHandler()->equipItem(mItem); } else { Net::getInventoryHandler()->useItem(mItem); } } else if (link == "chat") { chatWindow->addItemText(mItem->getInfo().getName()); } else if (link == "split") { ItemAmountWindow::showWindow(ItemAmountWindow::ItemSplit, inventoryWindow, mItem); } else if (link == "drop") { ItemAmountWindow::showWindow(ItemAmountWindow::ItemDrop, inventoryWindow, mItem); } else if (link == "store") { ItemAmountWindow::showWindow(ItemAmountWindow::StoreAdd, inventoryWindow, mItem); } else if (link == "retrieve") { ItemAmountWindow::showWindow(ItemAmountWindow::StoreRemove, storageWindow, mItem); } else if (link == "party" && being && being->getType() == Being::PLAYER) { Net::getPartyHandler()->invite(dynamic_cast<Player*>(being)); } else if (link == "name" && being) { const std::string &name = being->getName(); chatWindow->addInputText("/w "+name); } else if (link == "admin-kick" && being && (being->getType() == Being::PLAYER || being->getType() == Being::MONSTER)) { Net::getAdminHandler()->kick(being->getId()); } // Unknown actions else if (link != "cancel") { logger->log("PopupMenu: Warning, unknown action '%s'", link.c_str()); } setVisible(false); mBeingId = 0; mFloorItem = NULL; mItem = NULL; }
void TradeHandler::handleMessage(Net::MessageIn &msg) { switch (msg.getId()) { case GPMSG_TRADE_REQUEST: { Being *being = actorSpriteManager->findBeing(msg.readInt16()); if (!being || !mAcceptTradeRequests) { respond(false); break; } mTrading = true; tradePartnerName = being->getName(); tradePartnerID = being->getId(); ConfirmDialog *dlg = new ConfirmDialog(_("Request for Trade"), strprintf(_("%s wants to trade with you, do you accept?"), tradePartnerName.c_str())); dlg->addActionListener(&listener); } break; case GPMSG_TRADE_ADD_ITEM: { int type = msg.readInt16(); int amount = msg.readInt8(); tradeWindow->addItem(type, false, amount); } break; case GPMSG_TRADE_SET_MONEY: tradeWindow->setMoney(msg.readInt32()); break; case GPMSG_TRADE_START: tradeWindow->reset(); tradeWindow->setCaption(strprintf(_("Trading with %s"), tradePartnerName.c_str())); tradeWindow->setVisible(true); break; case GPMSG_TRADE_BOTH_CONFIRM: tradeWindow->receivedOk(false); break; case GPMSG_TRADE_AGREED: tradeWindow->receivedOk(false); break; case GPMSG_TRADE_CANCEL: SERVER_NOTICE(_("Trade canceled.")) tradeWindow->setVisible(false); tradeWindow->reset(); mTrading = false; break; case GPMSG_TRADE_COMPLETE: SERVER_NOTICE(_("Trade completed.")) tradeWindow->setVisible(false); tradeWindow->reset(); mTrading = false; break; } }
static void handleSpawn(Character *player, std::string &args) { MonsterClass *mc; MapComposite *map = player->getMap(); const Point &pos = player->getPosition(); int value = 0; // get the arguments std::string monsterclass = getArgument(args); std::string valuestr = getArgument(args); // check all arguments are there if (monsterclass.empty()) { say("Invalid amount of arguments given.", player); say("Usage: @spawn <monster> [number]", player); return; } // identify the monster type if (utils::isNumeric(monsterclass)) { int id = utils::stringToInt(monsterclass); mc = monsterManager->getMonster(id); } else { mc = monsterManager->getMonsterByName(monsterclass); } // check for valid monster if (!mc) { say("Invalid monster", player); return; } //identify the amount if (valuestr.empty()) { value = 1; } else if (utils::isNumeric(valuestr)) { value = utils::stringToInt(valuestr); } // check for valid amount if (value <= 0) { say("Invalid number of monsters", player); return; } // create the monsters and put them on the map for (int i = 0; i < value; ++i) { Being *monster = new Monster(mc); monster->setMap(map); monster->setPosition(pos); monster->clearDestination(); if (!GameState::insertOrDelete(monster)) { // The map is full. Break out. break; } // log transaction std::string msg = "User created monster " + monster->getName(); accountHandler->sendTransaction(player->getDatabaseID(), TRANS_CMD_SPAWN, msg); } }
void ChatHandler::handleMessage(MessageIn &msg) { Being *being; std::string chatMsg; std::string nick; int chatMsgLength; switch (msg.getId()) { case SMSG_WHISPER_RESPONSE: if (mSentWhispers.empty()) nick = "user"; else { nick = mSentWhispers.front(); mSentWhispers.pop(); } switch (msg.readInt8()) { case 0x00: // Success (don't need to report) break; case 0x01: { Event event(Event::WhisperError); event.setString("nick", nick); event.setString("error", strprintf(_("Whisper could " "not be sent, %s is offline."), nick.c_str())); event.trigger(Event::ChatChannel); } break; case 0x02: { Event event(Event::WhisperError); event.setString("nick", nick); event.setString("error", strprintf(_("Whisper could " "not be sent, ignored by %s."), nick.c_str())); event.Event::trigger(Event::ChatChannel); } break; } break; // Received whisper case SMSG_WHISPER: chatMsgLength = msg.readInt16() - 28; nick = msg.readString(24); if (chatMsgLength <= 0) break; chatMsg = msg.readString(chatMsgLength); // This is a sure sign of some special command, none of which are // supported at the moment. if (chatMsg.compare(0, 3, "\302\202!") == 0) return; if (nick != "Server") { // Ignore the shop commands since this client doesn't support // them at the moment. if (chatMsg.find("!selllist ") == 0 || chatMsg.find("!buylist ") == 0 || chatMsg.find("!buyitem ") == 0 || chatMsg.find("!sellitem ") == 0) return; if (player_relations.hasPermission(nick, PlayerRelation::WHISPER)) { Event event(Event::Whisper); event.setString("nick", nick); event.setString("message", chatMsg); event.trigger(Event::ChatChannel); } } else { SERVER_NOTICE(chatMsg) } break; // Received speech from being case SMSG_BEING_CHAT: { chatMsgLength = msg.readInt16() - 8; int beingId = msg.readInt32(); being = actorSpriteManager->findBeing(beingId); if (!being || chatMsgLength <= 0) break; chatMsg = msg.readString(chatMsgLength); std::string::size_type pos = chatMsg.find(" : ", 0); std::string sender_name = ((pos == std::string::npos) ? "" : chatMsg.substr(0, pos)); if (sender_name != being->getName() && being->getType() == Being::PLAYER) { if (!being->getName().empty()) sender_name = being->getName(); } else { chatMsg.erase(0, pos + 3); } int perms; if (being->getType() == Being::PLAYER) { perms = player_relations.checkPermissionSilently(sender_name, PlayerRelation::SPEECH_LOG | PlayerRelation::SPEECH_FLOAT); } else { perms = player_relations.getDefault() & (PlayerRelation::SPEECH_LOG | PlayerRelation::SPEECH_FLOAT); } trim(chatMsg); std::string reducedMessage = chatMsg; chatMsg = removeColors(sender_name) + " : " + reducedMessage; Event event(Event::Being); event.setString("message", chatMsg); event.setString("text", reducedMessage); event.setString("nick", sender_name); event.setInt("beingId", beingId); event.setInt("permissions", perms); event.trigger(Event::ChatChannel); break; } case SMSG_PLAYER_CHAT: case SMSG_GM_CHAT: { chatMsgLength = msg.readInt16() - 4; if (chatMsgLength <= 0) break; chatMsg = msg.readString(chatMsgLength); if (msg.getId() == SMSG_PLAYER_CHAT) { std::string::size_type pos = chatMsg.find(" : ", 0); std::string mes = chatMsg; if (pos != std::string::npos) chatMsg.erase(0, pos + 3); trim(chatMsg); Event event(Event::Player); event.setString("message", mes); event.setString("text", chatMsg); event.setString("nick", local_player->getName()); event.setInt("beingId", local_player->getId()); event.setInt("permissions", player_relations.getDefault() & (PlayerRelation::SPEECH_LOG | PlayerRelation::SPEECH_FLOAT)); event.trigger(Event::ChatChannel); } else { Event event(Event::Announcement); event.setString("message", chatMsg); event.trigger(Event::ChatChannel); } break; } case SMSG_MVP: // Display MVP player msg.readInt32(); // id SERVER_NOTICE(_("MVP player.")) break; } }
void PartyHandler::handleMessage(MessageIn *msg) { switch (msg->getId()) { case SMSG_PARTY_CREATE: mParty->createResponse(msg->readInt8()); break; case SMSG_PARTY_INFO: break; case SMSG_PARTY_INVITE: { std::string nick = msg->readString(24); int status = msg->readInt8(); mParty->inviteResponse(nick, status); break; } case SMSG_PARTY_INVITED: { int id = msg->readInt32(); Being *being = beingManager->findBeing(id); if (!being) { break; } std::string nick; int gender = 0; std::string partyName = ""; if (being->getType() != Being::PLAYER) { nick = ""; } else { nick = being->getName(); gender = being->getGender(); partyName = msg->readString(24); } mParty->invitedAsk(nick, gender, partyName); break; } case SMSG_PARTY_SETTINGS: break; case SMSG_PARTY_MEMBER_INFO: break; case SMSG_PARTY_LEAVE: { /*int id = */msg->readInt32(); std::string nick = msg->readString(24); /*int fail = */msg->readInt8(); mParty->leftResponse(nick); break; } case SMSG_PARTY_UPDATE_HP: break; case SMSG_PARTY_UPDATE_COORDS: break; case SMSG_PARTY_MESSAGE: { // new block to enable local variables int msgLength = msg->readInt16() - 8; if (msgLength <= 0) return; int id = msg->readInt32(); Being *being = beingManager->findBeing(id); std::string chatMsg = msg->readString(msgLength); mParty->receiveChat(being, chatMsg); } break; } }
void TargetDebugTab::logic() { if (player_node && player_node->getTarget()) { Being *target = player_node->getTarget(); mTargetLabel->setCaption(strprintf("%s %s (%d, %d)", _("Target:"), target->getName().c_str(), target->getTileX(), target->getTileY())); mTargetIdLabel->setCaption(strprintf("%s %d", _("Target Id:"), target->getId())); if (target->getLevel()) { mTargetLevelLabel->setCaption(strprintf("%s %d", _("Target Level:"), target->getLevel())); } else { mTargetLevelLabel->setCaption(strprintf("%s ?", _("Target Level:"))); } mTargetRaceLabel->setCaption(strprintf("%s %s", _("Target race:"), target->getRaceName().c_str())); mTargetPartyLabel->setCaption(strprintf("%s %s", _("Target Party:"), target->getPartyName().c_str())); mTargetGuildLabel->setCaption(strprintf("%s %s", _("Target Guild:"), target->getGuildName().c_str())); mMinHitLabel->setCaption(strprintf("%s %d", _("Minimal hit:"), target->getMinHit())); mMaxHitLabel->setCaption(strprintf("%s %d", _("Maximum hit:"), target->getMaxHit())); mCriticalHitLabel->setCaption(strprintf("%s %d", _("Critical hit:"), target->getCriticalHit())); const int delay = target->getAttackDelay(); if (delay) { mAttackDelayLabel->setCaption(strprintf("%s %d", _("Attack delay:"), delay)); } else { mAttackDelayLabel->setCaption(strprintf( "%s ?", _("Attack delay:"))); } } else { mTargetLabel->setCaption(strprintf("%s ?", _("Target:"))); mTargetIdLabel->setCaption(strprintf("%s ?", _("Target Id:"))); mTargetLevelLabel->setCaption(strprintf("%s ?", _("Target Level:"))); mTargetPartyLabel->setCaption(strprintf("%s ?", _("Target Party:"))); mTargetGuildLabel->setCaption(strprintf("%s ?", _("Target Guild:"))); mAttackDelayLabel->setCaption(strprintf("%s ?", _("Attack delay:"))); mMinHitLabel->setCaption(strprintf("%s ?", _("Minimal hit:"))); mMaxHitLabel->setCaption(strprintf("%s ?", _("Maximum hit:"))); mCriticalHitLabel->setCaption(strprintf("%s ?", _("Critical hit:"))); } mTargetLabel->adjustSize(); mTargetIdLabel->adjustSize(); mTargetLevelLabel->adjustSize(); mTargetPartyLabel->adjustSize(); mTargetGuildLabel->adjustSize(); mAttackDelayLabel->adjustSize(); }
void PopupMenu::handleLink(const std::string &link) { Being *being = actorSpriteManager->findBeing(mBeingId); // Talk To action if (link == "talk" && being && being->canTalk()) { being->talkTo(); } // Trade action else if (link == "trade" && being && being->getType() == ActorSprite::PLAYER) { Net::getTradeHandler()->request(being); tradePartnerName = being->getName(); } // Attack action else if (link == "attack" && being) { player_node->attack(being, true); } else if (link == "whisper" && being) { chatWindow->addInputText("/w \"" + being->getName() + "\" "); } else if (link == "unignore" && being && being->getType() == ActorSprite::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::NEUTRAL); } else if (link == "ignore" && being && being->getType() == ActorSprite::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::IGNORED); } else if (link == "disregard" && being && being->getType() == ActorSprite::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::DISREGARDED); } else if (link == "friend" && being && being->getType() == ActorSprite::PLAYER) { player_relations.setRelation(being->getName(), PlayerRelation::FRIEND); } // Guild action else if (link == "guild" && being && being->getType() == ActorSprite::PLAYER) { player_node->inviteToGuild(being); } // Follow Player action else if (link == "follow" && being) { player_node->setFollow(being->getName()); } // Pick Up Floor Item action else if ((link == "pickup") && mFloorItem) { player_node->pickUp(mFloorItem); } // Look To action else if (link == "look") { } else if (link == "use") { assert(mItem); if (mItem->isEquipment()) { if (mItem->isEquipped()) Net::getInventoryHandler()->unequipItem(mItem); else Net::getInventoryHandler()->equipItem(mItem); } else { Net::getInventoryHandler()->useItem(mItem); } } else if (link == "chat") { if (mItem) chatWindow->addItemText(mItem->getInfo().getName()); else if (mFloorItem) chatWindow->addItemText(mFloorItem->getInfo().getName()); } else if (link == "split") { ItemAmountWindow::showWindow(ItemAmountWindow::ItemSplit, inventoryWindow, mItem); } else if (link == "drop") { ItemAmountWindow::showWindow(ItemAmountWindow::ItemDrop, inventoryWindow, mItem); } else if (link == "store") { ItemAmountWindow::showWindow(ItemAmountWindow::StoreAdd, inventoryWindow, mItem); } else if (link == "retrieve") { ItemAmountWindow::showWindow(ItemAmountWindow::StoreRemove, mWindow, mItem); } else if (link == "party" && being && being->getType() == ActorSprite::PLAYER) { Net::getPartyHandler()->invite(being); } else if (link == "name" && being) { const std::string &name = being->getName(); chatWindow->addInputText(name); } else if (link == "admin-kick" && being && (being->getType() == ActorSprite::PLAYER || being->getType() == ActorSprite::MONSTER)) { Net::getAdminHandler()->kick(being->getId()); } // Unknown actions else if (link != "cancel") { logger->log("PopupMenu: Warning, unknown action '%s'", link.c_str()); } setVisible(false); mBeingId = 0; mFloorItem = NULL; mItem = NULL; }