Beispiel #1
0
bool GuildManager::afterRemove()
{
    Guild *guild = createGuild();
    if (!guild)
        return false;
    guild->removeFromMembers();
    guild->clearMembers();
    if (player_node)
    {
        player_node->setGuildName("");
        player_node->clearGuilds();
    }
    SERVER_NOTICE(_("You have left the guild."))
    delete mTab;
    mTab = nullptr;

    if (socialWindow)
        socialWindow->removeTab(guild);
    if (actorSpriteManager)
    {
        actorSpriteManager->updatePlayerGuild();
        actorSpriteManager->updatePlayerColors();
    }
    reload();
    return true;
}
Beispiel #2
0
void PartyHandler::processPartyCreate(Net::MessageIn &msg)
{
    if (msg.readInt8())
        SERVER_NOTICE(_("Could not create party."))
    else
        SERVER_NOTICE(_("Party successfully created."))
}
Beispiel #3
0
void PlayerHandler::processPlayerStatUpdate2(Net::MessageIn &msg)
{
    int type = msg.readInt16();
    switch (type)
    {
        case 0x0001:
            PlayerInfo::setAttribute(EXP, msg.readInt32());
            break;
        case 0x0002:
            PlayerInfo::setStatExperience(EA_JOB, msg.readInt32(),
            PlayerInfo::getStatExperience(EA_JOB).second);
            break;
        case 0x0014:
        {
                int oldMoney = PlayerInfo::getAttribute(MONEY);
                int newMoney = msg.readInt32();
                if (newMoney > oldMoney)
                {
                    SERVER_NOTICE(strprintf(_("You picked up %s."),
                                  Units::formatCurrency(newMoney -
                                  oldMoney).c_str()))
                }
                else if (newMoney < oldMoney)
                {
                    SERVER_NOTICE(strprintf(_("You spent %s."),
                                  Units::formatCurrency(oldMoney -
                                  newMoney).c_str()))
                }

                PlayerInfo::setAttribute(MONEY, newMoney);
            break;
        }
        case 0x0016:
            PlayerInfo::setAttribute(EXP_NEEDED, msg.readInt32());
            break;
        case 0x0017:
            PlayerInfo::setStatExperience(EA_JOB,
                PlayerInfo::getStatExperience(EA_JOB).first,
                msg.readInt32());
            break;
        default:
            logger->log("QQQQ PLAYER_STAT_UPDATE_2 " + toString(type));
            break;
    }
}
Beispiel #4
0
void BuySellHandler::processNpcBuyResponse(Net::MessageIn &msg)
{
    if (msg.readInt8() == 0)
    {
        SERVER_NOTICE(_("Thanks for buying."))
    }
    else
    {
        // Reset player money since buy dialog already assumed purchase
        // would go fine
        if (mBuyDialog)
            mBuyDialog->setMoney(PlayerInfo::getAttribute(MONEY));
        SERVER_NOTICE(_("Unable to buy."))
    }
}
Beispiel #5
0
void NpcPostDialog::action(const gcn::ActionEvent &event)
{
    if (event.getId() == "send")
    {
        if (mSender->getText().empty() || mText->getText().empty())
        {
            SERVER_NOTICE(_("Failed to send as sender or letter invalid."))
        }
        else
        {
            Net::getNpcHandler()->sendLetter(mNpcId,
                                             mSender->getText(),
                                             mText->getText());
        }
        setVisible(false);
    }
    else if (event.getId() == "cancel")
Beispiel #6
0
void PartyHandler::processPartyLeave(Net::MessageIn &msg)
{
    int id = msg.readInt32();
    std::string nick = msg.readString(24);
    msg.readInt8();     // fail
    if (!player_node)
        return;

    if (id == player_node->getId())
    {
        if (Ea::taParty)
        {
            Ea::taParty->removeFromMembers();
            Ea::taParty->clearMembers();
        }
        SERVER_NOTICE(_("You have left the party."))
        delete Ea::partyTab;
        Ea::partyTab = nullptr;

        if (socialWindow && Ea::taParty)
            socialWindow->removeTab(Ea::taParty);
        player_node->setPartyName("");
    }
    else
    {
        if (Ea::partyTab)
        {
            Ea::partyTab->chatLog(strprintf(
                _("%s has left your party."),
                nick.c_str()), BY_SERVER);
        }
        if (actorSpriteManager)
        {
            Being *b = actorSpriteManager->findBeing(id);
            if (b && b->getType() == Being::PLAYER)
            {
                b->setParty(nullptr);
                b->setPartyName("");
            }
        }
        if (Ea::taParty)
            Ea::taParty->removeMember(id);
    }
}
Beispiel #7
0
void AdminHandler::handleMessage(Net::MessageIn &msg)
{
    int id;
    switch (msg.getId())
    {
        case SMSG_ADMIN_KICK_ACK:
            id = msg.readInt32();
            if (id == 0)
                SERVER_NOTICE(_("Kick failed!"))
            else
                SERVER_NOTICE(_("Kick succeeded!"))
            break;
        case SMSG_ADMIN_IP:
            id = msg.readInt32();
            int ip = msg.readInt32();
            if (Being *player = actorSpriteManager->findBeing(id))
            {
                player->setIp(ip);
                player->updateName();
            }
            break;
    }
}
Beispiel #8
0
void TradeHandler::handleMessage(Net::MessageIn &msg)
{
    switch (msg.getId())
    {
    case SMSG_TRADE_REQUEST:
    {
        // If a trade window or request window is already open, send a
        // trade cancel to any other trade request.
        //
        // Note that it would be nice if the server would prevent this
        // situation, and that the requesting player would get a
        // special message about the player being occupied.
        std::string tradePartnerNameTemp = msg.readString(24);

        if (player_relations.hasPermission(tradePartnerName,
                                           PlayerRelation::TRADE))
        {
            if (PlayerInfo::isTrading() || confirmDlg)
            {
                Net::getTradeHandler()->respond(false);
                break;
            }

            tradePartnerName = tradePartnerNameTemp;
            PlayerInfo::setTrading(true);
            confirmDlg = new ConfirmDialog(_("Request for Trade"),
                                           strprintf(_("%s wants to trade with you, do you "
                                                   "accept?"), tradePartnerName.c_str()));
            confirmDlg->addActionListener(&listener);
        }
        else
        {
            Net::getTradeHandler()->respond(false);
            break;
        }
    }
    break;

    case SMSG_TRADE_RESPONSE:
        switch (msg.readInt8())
        {
        case 0: // Too far away
            SERVER_NOTICE(_("Trading isn't possible. Trade "
                            "partner is too far away."))
            break;
        case 1: // Character doesn't exist
            SERVER_NOTICE(_("Trading isn't possible. Character "
                            "doesn't exist."))
            break;
        case 2: // Invite request check failed...
            SERVER_NOTICE(_("Trade cancelled due to an unknown "
                            "reason."))
            break;
        case 3: // Trade accepted
            tradeWindow->reset();
            tradeWindow->setCaption(strprintf(_("Trade: You and %s"),
                                              tradePartnerName.c_str()));
            tradeWindow->setVisible(true);
            break;
        case 4: // Trade cancelled
            if (player_relations.hasPermission(tradePartnerName,
                                               PlayerRelation::SPEECH_LOG))
                SERVER_NOTICE(strprintf(_("Trade with %s cancelled."),
                                        tradePartnerName.c_str()))
                // otherwise ignore silently

                tradeWindow->setVisible(false);
            PlayerInfo::setTrading(false);
            break;
        default: // Shouldn't happen as well, but to be sure
            SERVER_NOTICE(_("Unhandled trade cancel packet."))
            break;
        }
        break;

    case SMSG_TRADE_ITEM_ADD:
    {
        int amount = msg.readInt32();
        int type = msg.readInt16();
        msg.readInt8();  // identified flag
        msg.readInt8();  // attribute
        msg.readInt8();  // refine
        msg.skip(8);     // card (4 shorts)

        // TODO: handle also identified, etc
        if (type == 0)
            tradeWindow->setMoney(amount);
        else
            tradeWindow->addItem(type, false, amount);
    }
    break;

    case SMSG_TRADE_ITEM_ADD_RESPONSE:
        // Trade: New Item add response (was 0x00ea, now 01b1)
    {
        const int index = msg.readInt16() - INVENTORY_OFFSET;
        Item *item = PlayerInfo::getInventory()->getItem(index);
        if (!item)
        {
            tradeWindow->receivedOk(true);
            return;
        }
        int quantity = msg.readInt16();

        switch (msg.readInt8())
        {
        case 0:
            // Successfully added item
            if (item->isEquippable() && item->isEquipped())
            {
                item->doEvent(Event::DoUnequip);
            }
            tradeWindow->addItem(item->getId(), true, quantity);

            item->increaseQuantity(-quantity);
            break;
        case 1:
            // Add item failed - player overweighted
            SERVER_NOTICE(_("Failed adding item. Trade "
                            "partner is over weighted."))
            break;
        case 2:
            // Add item failed - player has no free slot
            SERVER_NOTICE(_("Failed adding item. Trade "
                            "partner has no free slot."))
            break;
        default:
            SERVER_NOTICE(_("Failed adding item for "
                            "unknown reason."))
            break;
        }
    }
    break;

    case SMSG_TRADE_OK:
        // 0 means ok from myself, 1 means ok from other;
        tradeWindow->receivedOk(msg.readInt8() == 0);
        break;

    case SMSG_TRADE_CANCEL:
        SERVER_NOTICE(_("Trade canceled."))
        tradeWindow->setVisible(false);
        tradeWindow->reset();
        PlayerInfo::setTrading(false);
        break;

    case SMSG_TRADE_COMPLETE:
        SERVER_NOTICE(_("Trade completed."))
        tradeWindow->setVisible(false);
        tradeWindow->reset();
        PlayerInfo::setTrading(false);
        break;
    }
}
Beispiel #9
0
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;
    }
}
Beispiel #10
0
void PlayerHandler::handleMessage(Net::MessageIn &msg)
{
    if (!player_node)
        return;

    switch (msg.getId())
    {
        case SMSG_WALK_RESPONSE:
            /*
             * This client assumes that all walk messages succeed,
             * and that the server will send a correction notice
             * otherwise.
             */
            break;

        case SMSG_PLAYER_WARP:
            {
                std::string mapPath = msg.readString(16);
                int x = msg.readInt16();
                int y = msg.readInt16();

                logger->log("Warping to %s (%d, %d)", mapPath.c_str(), x, y);

                /*
                 * We must clear the local player's target *before* the call
                 * to changeMap, as it deletes all beings.
                 */
                player_node->stopAttack();

                Game *game = Game::instance();

                const std::string &currentMapName = game->getCurrentMapName();
                bool sameMap = (currentMapName == mapPath);

                // Switch the actual map, deleting the previous one if necessary
                mapPath = mapPath.substr(0, mapPath.rfind("."));
                game->changeMap(mapPath);

                float scrollOffsetX = 0.0f;
                float scrollOffsetY = 0.0f;

                /* Scroll if necessary */
                Map *map = game->getCurrentMap();
                int tileX = player_node->getTileX();
                int tileY = player_node->getTileY();
                if (!sameMap
                    || (abs(x - tileX) > MAP_TELEPORT_SCROLL_DISTANCE)
                    || (abs(y - tileY) > MAP_TELEPORT_SCROLL_DISTANCE))
                {
                    scrollOffsetX = (x - tileX) * map->getTileWidth();
                    scrollOffsetY = (y - tileY) * map->getTileHeight();
                }

                player_node->setAction(Being::STAND);
                Vector pos = map->getTileCenter(x, y);
                player_node->setPosition(pos);
                // Stop movement
                player_node->setDestination(pos.x, pos.y);

                logger->log("Adjust scrolling by %d:%d", (int) scrollOffsetX,
                           (int) scrollOffsetY);

                viewport->scrollBy(scrollOffsetX, scrollOffsetY);
            }
            break;

        case SMSG_PLAYER_STAT_UPDATE_1:
            {
                if (!player_node)
                    break;
                int type = msg.readInt16();
                int value = msg.readInt32();

                switch (type)
                {
                    case 0x0000:
                      player_node->setMoveSpeed(Vector(value / 10,
                                                       value / 10, 0));
                    break;
                    case 0x0004: break; // manner
                    case 0x0005: PlayerInfo::setAttribute(HP, value); break;
                    case 0x0006: PlayerInfo::setAttribute(MAX_HP, value); break;
                    case 0x0007: PlayerInfo::setAttribute(MP, value); break;
                    case 0x0008: PlayerInfo::setAttribute(MAX_MP, value); break;
                    case 0x0009: PlayerInfo::setAttribute(CHAR_POINTS, value); break;
                    case 0x000b: PlayerInfo::setAttribute(LEVEL, value); break;
                    case 0x000c: PlayerInfo::setAttribute(SKILL_POINTS, value); break;
                    case 0x0018:
                                 if (value >= PlayerInfo::getAttribute(MAX_WEIGHT) / 2 &&
                                         PlayerInfo::getAttribute(TOTAL_WEIGHT) <
                                         PlayerInfo::getAttribute(MAX_WEIGHT) / 2)
                                 {
                                     weightNotice = new OkDialog(_("Message"),
                                             _("You are carrying more than "
                                               "half your weight. You are "
                                               "unable to regain health."));
                                     weightNotice->addActionListener(
                                             &weightListener);
                                 }
                                 PlayerInfo::setAttribute(TOTAL_WEIGHT, value);
                                 break;
                    case 0x0019: PlayerInfo::setAttribute(MAX_WEIGHT, value); break;

                    case 0x0029: PlayerInfo::setStatBase(ATK, value); break;
                    case 0x002a: PlayerInfo::setStatMod(ATK, value); break;

                    case 0x002b: PlayerInfo::setStatBase(MATK, value); break;
                    case 0x002c: PlayerInfo::setStatMod(MATK, value); break;

                    case 0x002d: PlayerInfo::setStatBase(DEF, value); break;
                    case 0x002e: PlayerInfo::setStatMod(DEF, value); break;

                    case 0x002f: PlayerInfo::setStatBase(MDEF, value); break;
                    case 0x0030: PlayerInfo::setStatMod(MDEF, value); break;

                    case 0x0031: PlayerInfo::setStatBase(HIT, value); break;

                    case 0x0032: PlayerInfo::setStatBase(FLEE, value); break;
                    case 0x0033: PlayerInfo::setStatMod(FLEE, value); break;

                    case 0x0034: PlayerInfo::setStatBase(CRIT, value); break;

                    case 0x0035: player_node->setAttackSpeed(value); break;

                    case 0x0037: PlayerInfo::setStatBase(JOB, value); break;

                    case 500: player_node->setGMLevel(value); break;
                }

                if (PlayerInfo::getAttribute(HP) == 0 && !deathNotice)
                {
                    viewport->shakeScreen(100);
                    deathNotice = new OkDialog(_("Message"),
                                               randomDeathMessage(),
                                               false);
                    deathNotice->addActionListener(&deathListener);
                    player_node->setAction(Being::DEAD);
                }
            }

            if (statusWindow)
                statusWindow->updateAttrs();

            break;

        case SMSG_PLAYER_STAT_UPDATE_2:
            switch (msg.readInt16())
            {
                case 0x0001:
                    PlayerInfo::setAttribute(EXP, msg.readInt32());
                    break;
                case 0x0002:
                    PlayerInfo::setStatExperience(JOB, msg.readInt32(),
                                                  PlayerInfo::getStatExperience(JOB).second);
                    break;

                case 0x0014:
                    {
                        int oldMoney = PlayerInfo::getAttribute(MONEY);
                        int newMoney = msg.readInt32();
                        std::string money = Units::formatCurrency(
                                            newMoney - oldMoney);
                        PlayerInfo::setAttribute(MONEY, newMoney);
                        if (newMoney > oldMoney)
                        {
                            if (config.getBoolValue("showpickupchat"))
                                SERVER_NOTICE(strprintf(_("You picked up %s."),
                                            Units::formatCurrency(newMoney -
                                            oldMoney).c_str()))
                            if (config.getBoolValue("showpickupparticle"))
                                player_node->addMessageToQueue(money,
                                                      UserPalette::PICKUP_INFO);
                        }
                    }
                    break;
                case 0x0016:
                    PlayerInfo::setAttribute(EXP_NEEDED, msg.readInt32());
                    break;
                case 0x0017:
                    PlayerInfo::setStatExperience(JOB,
                                                  PlayerInfo::getStatExperience(JOB).first,
                                                  msg.readInt32());
                    break;
            }
            break;

        case SMSG_PLAYER_STAT_UPDATE_3: // Update a base attribute
            {
                int type = msg.readInt32();
                int base = msg.readInt32();
                int bonus = msg.readInt32();

                PlayerInfo::setStatBase(type, base, false);
                PlayerInfo::setStatMod(type, bonus);
            }
            break;

        case SMSG_PLAYER_STAT_UPDATE_4: // Attribute increase ack
            {
                int type = msg.readInt16();
                int ok = msg.readInt8();
                int value = msg.readInt8();

                if (ok != 1)
                {
                    SERVER_NOTICE(_("Cannot raise skill!"))
                }

                PlayerInfo::setStatBase(type, value);
            }
            break;

        // Updates stats and status points
        case SMSG_PLAYER_STAT_UPDATE_5:
            PlayerInfo::setAttribute(CHAR_POINTS, msg.readInt16());

            {
                int val = msg.readInt8();
                PlayerInfo::setStatBase(STR, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(STR, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(STR, msg.readInt8());
                }

                val = msg.readInt8();
                PlayerInfo::setStatBase(AGI, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(AGI, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(AGI, msg.readInt8());
                }

                val = msg.readInt8();
                PlayerInfo::setStatBase(VIT, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(VIT, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(VIT, msg.readInt8());
                }

                val = msg.readInt8();
                PlayerInfo::setStatBase(INT, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(INT, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(INT, msg.readInt8());
                }

                val = msg.readInt8();
                PlayerInfo::setStatBase(DEX, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(DEX, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(DEX, msg.readInt8());
                }

                val = msg.readInt8();
                PlayerInfo::setStatBase(LUK, val);
                if (val >= 99)
                {
                    statusWindow->setPointsNeeded(LUK, 0);
                    msg.readInt8();
                }
                else
                {
                    statusWindow->setPointsNeeded(LUK, msg.readInt8());
                }

                PlayerInfo::setStatBase(ATK, msg.readInt16(), false);
                PlayerInfo::setStatMod(ATK, msg.readInt16());

                PlayerInfo::setStatBase(MATK, msg.readInt16(), false);
                PlayerInfo::setStatMod(MATK, msg.readInt16());


                PlayerInfo::setStatBase(DEF, msg.readInt16(), false);
                PlayerInfo::setStatMod(DEF, msg.readInt16());

                PlayerInfo::setStatBase(MDEF, msg.readInt16(), false);
                PlayerInfo::setStatMod(MDEF, msg.readInt16());

                PlayerInfo::setStatBase(HIT, msg.readInt16());

                PlayerInfo::setStatBase(FLEE, msg.readInt16(), false);
                PlayerInfo::setStatMod(FLEE, msg.readInt16());

                PlayerInfo::setStatBase(CRIT, msg.readInt16());
            }

            msg.readInt16();  // manner
            break;

        case SMSG_PLAYER_STAT_UPDATE_6:
            switch (msg.readInt16())
            {
                case 0x0020:
                    statusWindow->setPointsNeeded(STR, msg.readInt8());
                    break;
                case 0x0021:
                    statusWindow->setPointsNeeded(AGI, msg.readInt8());
                    break;
                case 0x0022:
                    statusWindow->setPointsNeeded(VIT, msg.readInt8());
                    break;
                case 0x0023:
                    statusWindow->setPointsNeeded(INT, msg.readInt8());
                    break;
                case 0x0024:
                    statusWindow->setPointsNeeded(DEX, msg.readInt8());
                    break;
                case 0x0025:
                    statusWindow->setPointsNeeded(LUK, msg.readInt8());
                    break;
            }
            break;

        case SMSG_PLAYER_ARROW_MESSAGE:
            {
                int type = msg.readInt16();

                switch (type)
                {
                    case 0:
                        {
                            SERVER_NOTICE(_("Equip arrows first."))
                        }
                        break;
                    default:
                        logger->log("0x013b: Unhandled message %i", type);
                        break;
                }
            }
            break;
    }
}
Beispiel #11
0
}

void ChatHandler::privateMessage(const std::string &recipient,
                                 const std::string &text)
{
    MessageOut outMsg(CMSG_CHAT_WHISPER);
    outMsg.writeInt16(text.length() + 28);
    outMsg.writeString(recipient, 24);
    outMsg.writeString(text, text.length());

    mSentWhispers.push(recipient);
}

void ChatHandler::channelList()
{
    SERVER_NOTICE(_("Channels are not supported!"))
}

void ChatHandler::enterChannel(const std::string &channel,
                               const std::string &password)
{
    SERVER_NOTICE(_("Channels are not supported!"))
}

void ChatHandler::quitChannel(int channelId)
{
    SERVER_NOTICE(_("Channels are not supported!"))
}

void ChatHandler::sendToChannel(int channelId, const std::string &text)
{