// Prints information about all of the universes in the array
// to a given player.
void CHSUniverseDBDef::PrintInfo(int player)
{
    if (m_mapUniverses.empty())
    {
        hsInterface.Notify(player, "No universes currently loaded.");
        return;
    }

    hsInterface.Notify(player,
                       "[Room#] Name                            Objects    Active");

    CSTLUniverseMap::iterator iter;
    for (iter = m_mapUniverses.begin(); iter != m_mapUniverses.end(); iter++)
    {
        CHSUniverse *pUniverse = iter->second;
        if (pUniverse)
        {
            hsInterface.Notify(player,
                               hsInterface.
                               HSPrintf("[%5d] %-32s%4d       %4d",
                                        pUniverse->GetID(),
                                        pUniverse->GetName(),
                                        pUniverse->GetNumObjects(),
                                        pUniverse->GetNumActiveObjects()));
        }
    }
}
void CHSHandlerUniverse::HandleGetUniverseList(CHSPacket * pPacket)
{
    hs_log("ADMIN SERVER: Handle packet GetUniverseList");
    CHSPGetUniverseList *cmdGetList =
        static_cast < CHSPGetUniverseList * >(pPacket);

    // Create a class list packet as a response.
    CHSPUniverseList cmdList;
    cmdList.SetPacketAddress(cmdGetList->GetPacketAddress());

    THSUniverseIterator tIter;
    HS_BOOL8 bContinue;

    for (bContinue = CHSUniverseDB::GetInstance().GetFirstUniverse(tIter);
         bContinue;
         bContinue = CHSUniverseDB::GetInstance().GetNextUniverse(tIter))
    {
        if (tIter.pValue != NULL)
        {
            CHSUniverse *pUniverse = (CHSUniverse *) tIter.pValue;

            CHSPUniverseList::THSUniverse tEntry;

            tEntry.uiID = pUniverse->GetID();
            tEntry.strName = pUniverse->GetName();
            tEntry.uiNumObjects = pUniverse->GetNumObjects();
            tEntry.uiNumActiveObjects = pUniverse->GetNumActiveObjects();

            cmdList.AddUniverse(tEntry);
        }
    }

    HSNetwork.SendPacket(cmdList);
}
Exemple #3
0
void CHSMTube::AttackObject(CHS3DObject * cSource,
                            CHS3DObject * cTarget,
                            CHSConsole * cConsole,
                            HS_INT32 iSysType, HS_INT32 hit_flag)
{
    HS_DBREF dbUser;

    // Grab the user of the console.
    dbUser = hsInterface.ConsoleUser(cConsole->m_objnum);

    if (cSource->GetType() == HST_SHIP)
    {
        CHSSysCloak *cCloak;
        CHSShip *ptr;

        ptr = (CHSShip *) cSource;

        // Look for the cloaking device.
        cCloak = (CHSSysCloak *) ptr->GetEngSystem(HSS_CLOAK);
        if (cCloak)
            if (cCloak->GetEngaged())
            {
                if (dbUser != HSNOTHING)
                    hsStdError(dbUser, "You cannot fire while cloaked.");
                return;
            }
    }

    // Can we attack that object?
    if (!CanAttackObject(cTarget))
    {
        if (dbUser != HSNOTHING)
            hsStdError(dbUser,
                       "You cannot attack that target with that weapon.");
    }

    // Create a missile object, and put it in space
    CHSMissile *cMiss;
    cMiss = new CHSMissile;
    cMiss->SetUID(cSource->GetUID());

    if (hit_flag == 0)
    {
        cMiss->SetAutoMiss();
    }

    // Add it to the universe
    CHSUniverse *uDest;
    uDest = cMiss->GetUniverse();
    if (!uDest)
    {
        if (dbUser != HSNOTHING)
        {
            hsInterface.Notify(dbUser,
                               "Error finding a universe to put the missile in.");
        }
        delete cMiss;
        return;
    }
    uDest->AddObject(cMiss);

    // Set missile coords
    cMiss->SetX(cSource->GetX());
    cMiss->SetY(cSource->GetY());
    cMiss->SetZ(cSource->GetZ());

    // Set missile heading
    cMiss->SetHeading(cConsole->GetXYHeading(), cConsole->GetZHeading());

    // Set missile type
    cMiss->SetWeaponData(this);

    // Set source info
    cMiss->SetSourceConsole(cConsole);
    cMiss->SetSourceObject(cSource);
    cMiss->SetTargetObject(cTarget);


#ifdef PENNMUSH
    HS_DBREF obj_num = hsInterface.CreateNewGameObject();
#else
    HS_DBREF obj_num = hsInterface.CreateNewGameObject(TYPE_THING);
#endif

    if (hsInterface.ValidObject(obj_num))
    {
        cMiss->SetDbref(obj_num);

        // Try to set the name of the missile properly but default
        // just in case
        if (NULL == m_pWeaponData)
        {
            hsInterface.SetObjectName(obj_num, "Missile");
        }
        else
        {
            hsInterface.SetObjectName(obj_num,
                                      static_cast < CHSMissileData * >(m_pWeaponData)->Name());
        }

        hsInterface.MoveObject(obj_num, uDest->GetID());
        hsInterface.SetToggle(obj_num, THING_HSPACE_OBJECT);
        hsInterface.SetObjectOwner(obj_num, hsInterface.GetGodDbref());

        // Missile objects are temporary, clear them if the game
        // is restarted while the missile is still in existance
        hsInterface.AtrAdd(obj_num, "STARTUP", "@destroy me",
                           hsInterface.GetGodDbref());
    }
    else
    {
        // Set missile HS_DBREF to some very high number that's
        // probably not duplicated.
        cMiss->SetDbref(hsInterface.GetRandom(10000) + 28534);
        hs_log("CHSMTube::AttackObject() -- Deprecated fake dbref method \
                utilized.");
    }

    if (dbUser != HSNOTHING)
    {
        hsStdError(dbUser, "Missile launched.");
    }

    m_loaded = false;
}