Being *BeingManager::findBeing(int id) const { for (Beings::const_iterator i = mBeings.begin(), i_end = mBeings.end(); i != i_end; ++i) { Being *being = (*i); if (being->getId() == id) return being; } return NULL; }
void BuySellHandler::handleMessage(Net::MessageIn &msg) { Being *being = actorSpriteManager->findBeing(msg.readInt16()); if (!being || being->getType() != ActorSprite::NPC) { return; } int npcId = being->getId(); switch (msg.getId()) { case GPMSG_NPC_BUY: { BuyDialog* dialog = new BuyDialog(npcId); dialog->reset(); dialog->setMoney(PlayerInfo::getAttribute(MONEY)); while (msg.getUnreadLength()) { int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); dialog->addItem(itemId, amount, value); } break; } case GPMSG_NPC_SELL: { SellDialog* dialog = new SellDialog(npcId); dialog->reset(); dialog->setMoney(PlayerInfo::getAttribute(MONEY)); while (msg.getUnreadLength()) { int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); dialog->addItem(new Item(itemId, amount, false), value); } break; } } }
void BuySellHandler::handleMessage(MessageIn &msg) { Being *being = beingManager->findBeing(msg.readInt16()); if (!being || being->getType() != Being::NPC) { return; } current_npc = being->getId(); switch (msg.getId()) { case GPMSG_NPC_BUY: buyDialog->reset(); buyDialog->setMoney(player_node->getMoney()); buyDialog->setVisible(true); while (msg.getUnreadLength()) { int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); buyDialog->addItem(itemId, amount, value); } break; case GPMSG_NPC_SELL: sellDialog->setMoney(player_node->getMoney()); sellDialog->reset(); sellDialog->setVisible(true); while (msg.getUnreadLength()) { int itemId = msg.readInt16(); int amount = msg.readInt16(); int value = msg.readInt16(); sellDialog->addItem(new Item(itemId, amount, false), value); } break; } }
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; } }
void handle_mouse(Event *evt) { if (!mapEngine->mapLoaded()) return; Point camPos = graphicsEngine->getCamera()->getPosition(); Point pos; pos.x = evt->x + camPos.x; pos.y = evt->y + camPos.y + mapEngine->getTileHeight(); // left mouse button has finished being pressed if (evt->button == SDL_BUTTON_LEFT && evt->type == 1) { // check user clicked on map Node *node = graphicsEngine->getNode(pos.x, pos.y); if (node) { // show name if player/NPC is clicked Being *being = beingManager->findBeing(node->getName()); if (being) { // toggle being name being->toggleName(); if (being->isNPC() && withinReach(being->getPosition(), player->getSelectedCharacter()->getPosition()) && !being->isTalking()) { Packet *p = new Packet(PGMSG_NPC_START_TALK); p->setInteger(being->getId()); networkManager->sendPacket(p); } return; } Point pt = mapEngine->convertPixelToTile(pos.x, pos.y); if (mapEngine->blocked(pt)) return; // send move message Packet *p = new Packet(PGMSG_PLAYER_MOVE); p->setInteger(pt.x); p->setInteger(pt.y); networkManager->sendPacket(p); //logger->logDebug("Sending move request"); // save destination for later player->getSelectedCharacter()->saveDestination(pt); } } if (evt->button == 0) { if (!interfaceManager->getMouse()->cursor) return; // pos.x += mapEngine->getTileWidth() >> 1; int mapWidth = mapEngine->getWidth() * mapEngine->getTileWidth(); int mapHeight = mapEngine->getHeight() * mapEngine->getTileHeight(); if (pos.x > mapWidth || -pos.x > mapWidth) return; if (pos.y > mapHeight || pos.y < 0) return; Point tilePos = mapEngine->convertPixelToTile(pos.x, pos.y); if (tilePos.x < 0 || tilePos.y < 0) return; if (tilePos.x == interfaceManager->getMouse()->cursorPos.x && tilePos.y == interfaceManager->getMouse()->cursorPos.y) return; interfaceManager->getMouse()->cursorPos = tilePos; Point screenPos; screenPos.x = 0.5 * (tilePos.x - tilePos.y) * mapEngine->getTileWidth(); screenPos.y = 0.5 * (tilePos.x + tilePos.y) * mapEngine->getTileHeight(); interfaceManager->getMouse()->cursor->moveNode(&screenPos); } }
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; }