Example #1
0
bool GMEventManager::AddNewGMEvent (Client* client, csString eventName, csString eventDescription)
{
    int newEventID, zero=0;
    PID gmID = client->GetPID();
    int clientnum = client->GetClientNum();
    GMEvent* gmEvent;

    // if this GM already has an active event, he/she cant start another
    if ((gmEvent = GetGMEventByGM(gmID, RUNNING, zero)) != NULL)
    {
        psserver->SendSystemInfo(clientnum,
                                 "You are already running the \'%s\' event.",
                                 gmEvent->eventName.GetDataSafe());
        return false;
    }

    if (eventName.Length() > MAX_EVENT_NAME_LENGTH)
    {
        eventName.Truncate(MAX_EVENT_NAME_LENGTH);
        psserver->SendSystemInfo(client->GetClientNum(),
                                 "Event name truncated to \'%s\'.",
                                 eventName.GetDataSafe());
    }


    // GM can register his/her event
    newEventID = GetNextEventID();

    // remove undesirable characters from the name & description
    csString escEventName, escEventDescription;
    db->Escape(escEventName, eventName.GetDataSafe());
    db->Escape(escEventDescription, eventDescription.GetDataSafe());

    // first in the database
    db->Command("INSERT INTO gm_events(id, gm_id, name, description, status) VALUES (%i, %i, '%s', '%s', %i)",
        newEventID,
        gmID.Unbox(),
        escEventName.GetDataSafe(),
        escEventDescription.GetDataSafe(),
        RUNNING);

    // and in the local cache.
    gmEvent = new GMEvent;
    gmEvent->id = newEventID;
    gmEvent->gmID = gmID;
    gmEvent->EndTime = 0;
    gmEvent->eventName = eventName;
    gmEvent->eventDescription = eventDescription;
    gmEvent->status = RUNNING;
    gmEvents.Push(gmEvent);

    // keep psCharacter upto date
    client->GetActor()->GetCharacterData()->AssignGMEvent(gmEvent->id,true);

    psserver->SendSystemInfo(client->GetClientNum(),
                             "You have initiated a new event, \'%s\'.",
                             eventName.GetDataSafe());

    return true;
}
Example #2
0
PID EntityManager::CopyNPCFromDatabase(PID master_id, float x, float y, float z, float angle, const csString & sector, InstanceID instance, const char *firstName, const char *lastName)
{
    psCharacter * npc = NULL;
    PID new_id;

    npc = psServer::CharacterLoader.LoadCharacterData(master_id, false);
    if (npc == NULL)
    {
        return 0;
    }

    psSectorInfo* sectorInfo = CacheManager::GetSingleton().GetSectorInfoByName( sector );
    if (sectorInfo != NULL)
    {
        npc->SetLocationInWorld(instance,sectorInfo,x,y,z,angle);
    }

    if ( firstName && lastName )
    {
        npc->SetFullName( firstName, lastName );
    }

    if (psServer::CharacterLoader.NewNPCCharacterData(0, npc))
    {
        new_id = npc->GetPID();
        db->Command("UPDATE characters SET npc_master_id=%d WHERE id=%d", master_id.Unbox(), new_id.Unbox());
    }

    delete npc;

    return new_id;
}
Example #3
0
bool Tribe::AddMember(PID pid, const char* tribeMemberType)
{
    MemberID mID;
    mID.pid = pid;
    mID.tribeMemberType = tribeMemberType;

    membersId.Push(mID);

    csString flags;
    flags += "DYNAMIC"; // Indicat that the NPC has been created dynamic by the NPC Server.

    // Add to members list in db
    db->Command("INSERT INTO tribe_members (tribe_id,member_id,member_type,flags) "
                "VALUES (%u,%u,'%s','%s')", GetID(), pid.Unbox(),tribeMemberType,flags.GetDataSafe());

    return true;
}
Example #4
0
/**
 * A character is defined to be a trainer if there are
 * trainer item categories for the character.
 *
 * @return Return true if the character is a trainer.
 */
bool psTrainerInfo::Load(PID pid)
{
    bool isTrainer = false;
    
    Result trainerSkills(db->Select("SELECT * from trainer_skills where player_id=%u", pid.Unbox()));
    if (trainerSkills.IsValid())
    {
        int i,count=trainerSkills.Count();

        for (i=0;i<count;i++)
        {
            psSkillInfo * skillInfo = FindSkill(atoi(trainerSkills[i]["skill_id"]));
            if (!skillInfo)
            {
                Error1("Error! Skill could not be loaded. Skipping.\n");
                continue;
            }
            psTrainerSkill * skill = new psTrainerSkill;
            skill->skill = skillInfo;
            skill->max_rank = atoi(trainerSkills[i]["max_rank"]);
            skill->min_rank = atoi(trainerSkills[i]["min_rank"]);
            skill->min_faction = atof(trainerSkills[i]["min_faction"]);
            skills.Push(skill);
            isTrainer = true;
        }
    }

    return isTrainer;
}
Example #5
0
bool GMEventManager::AssumeControlOfGMEvent(Client* client, csString eventName)
{
    int zero=0;
    PID newGMID = client->GetPID();
    int clientnum = client->GetClientNum();
    GMEvent* gmEvent;

    // if this GM already has an active event, he/she cant control another
    if ((gmEvent = GetGMEventByGM(newGMID, RUNNING, zero)))
    {
        psserver->SendSystemInfo(clientnum,
                                 "You are already running the \'%s\' event.",
                                 gmEvent->eventName.GetDataSafe());
        return false;
    }

    // find the requested event
    zero = 0;
    if (!(gmEvent = GetGMEventByName(eventName, RUNNING, zero)))
    {
        psserver->SendSystemInfo(clientnum,
                                 "The \'%s\' event is not recognised or not running.",
                                 eventName.GetDataSafe());
        return false;
    }

    // look for the current GM if there is one
    ClientConnectionSet* clientConnections = psserver->GetConnections();
    Client* target;
    if (gmEvent->gmID != UNDEFINED_GMID)
    {
        if ((target = clientConnections->FindPlayer(gmEvent->gmID)))
        {
            psserver->SendSystemInfo(clientnum,
                                     "The \'%s\' event's GM, %s, is online: you cannot assume control.",
                                     gmEvent->eventName.GetDataSafe(),
                                     target->GetName());
            return false;
        }
    }

    // if the GM is a participant, then remove the reference
    RemovePlayerRefFromGMEvent(gmEvent, client, newGMID);

    // OK, assume control
    gmEvent->gmID = newGMID;
    db->Command("UPDATE gm_events SET gm_id = %d WHERE id = %d", newGMID.Unbox(), gmEvent->id);
    client->GetActor()->GetCharacterData()->AssignGMEvent(gmEvent->id,true);
    psserver->SendSystemInfo(clientnum,
                             "You now control the \'%s\' event.",
                             gmEvent->eventName.GetDataSafe());

    csArray<PlayerData>::Iterator iter = gmEvent->Player.GetIterator();
    while (iter.HasNext())
    {
        if ((target = clientConnections->FindPlayer(iter.Next().PlayerID)))
        {
            psserver->SendSystemInfo(target->GetClientNum(),
                                     "The GM %s is now controlling the \'%s\' event.",
                                     client->GetName(),
                                     gmEvent->eventName.GetDataSafe());
        }
    }

    return true;
}
Example #6
0
bool GMEventManager::RemovePlayerFromGMEvents(PID playerID)
{
    int runningEventIDAsGM;
    int runningEventID, gmEventID;
    csArray<int> completedEventIDsAsGM;
    csArray<int> completedEventIDs;
    GMEvent* gmEvent;
    bool eventsFound = false;

    runningEventID = GetAllGMEventsForPlayer(playerID,
                                             completedEventIDs,
                                             runningEventIDAsGM,
                                             completedEventIDsAsGM);

    // remove if partaking in an ongoing event
    if (runningEventID >= 0)
    {
        gmEvent = GetGMEventByID(runningEventID);
        if (gmEvent)
        {
            size_t PlayerIndex = GetPlayerFromEvent(playerID, gmEvent);
            if(PlayerIndex != SIZET_NOT_FOUND)
            {
                gmEvent->Player.DeleteIndex(PlayerIndex);
                eventsFound = true;
            }
        }
        else
            Error3("Cannot remove player %s from GM Event %d.", ShowID(playerID), runningEventID);
    }
    // remove ref's to old completed events
    csArray<int>::Iterator evIter = completedEventIDs.GetIterator();
    while(evIter.HasNext())
    {
        gmEventID = evIter.Next();
        gmEvent = GetGMEventByID(gmEventID);
        if (gmEvent)
        {
            size_t PlayerIndex = GetPlayerFromEvent(playerID, gmEvent);
            if(PlayerIndex != SIZET_NOT_FOUND)
            {
                gmEvent->Player.DeleteIndex(PlayerIndex);
                eventsFound = true;
            }
         }
         else
            Error3("Cannot remove player %s from GM Event %d.", ShowID(playerID), runningEventID);
    }
    // ...and from the DB too
    if (eventsFound)
        db->Command("DELETE FROM character_events WHERE player_id = %u", playerID.Unbox());

    // if this is a GM thats being deleted, set its GMID to UNDEFINED_GMID.
    if (runningEventIDAsGM >= 0)
    {
        gmEvent = GetGMEventByID(runningEventIDAsGM);
        if (gmEvent)
        {
            gmEvent->gmID = UNDEFINED_GMID;
            db->Command("UPDATE gm_events SET gm_id = %d WHERE id = %d", UNDEFINED_GMID, gmEvent->id);
        }
        else
            Error3("Cannot remove GM %s from Event %d.", ShowID(playerID), runningEventID);
    }
    evIter = completedEventIDsAsGM.GetIterator();
    while(evIter.HasNext())
    {
        gmEventID = evIter.Next();
        gmEvent = GetGMEventByID(gmEventID);
        if (gmEvent)
        {
            gmEvent->gmID = UNDEFINED_GMID;
            db->Command("UPDATE gm_events SET gm_id = %d WHERE id = %d", UNDEFINED_GMID, gmEvent->id);
        }
        else
            Error3("Cannot remove GM %s from Event %d.", ShowID(playerID), gmEventID);
    }

    return true;
}
Example #7
0
bool GMEventManager::RegisterPlayerInGMEvent (Client* client, Client* target)
{
    PID playerID;
    int clientnum = client->GetClientNum();
    int zero=0;
    GMEvent *gmEvent;
    PID gmID = client->GetPID();

    // make sure GM is running (or assisting) an event, the player is valid and available.
    if ((gmEvent = GetGMEventByGM(gmID, RUNNING, zero)) == NULL)
    {
        zero = 0;
        if ((gmEvent = GetGMEventByPlayer(gmID, RUNNING, zero)) == NULL)
        {
            psserver->SendSystemInfo(clientnum, "You are not running/assisting an event.");
            return false;
        }
    }
    if (!target)
    {
        psserver->SendSystemInfo(clientnum, "Invalid target for registering in event.");
        return false;
    }
    if ((playerID = target->GetPID()) == gmID)
    {
        psserver->SendSystemInfo(clientnum, "You cannot register yourself in your own event.");
        return false;
    }
    zero = 0;
    if (GetGMEventByPlayer(playerID, RUNNING, zero) != NULL)
    {
        psserver->SendSystemInfo(clientnum, "%s is already registered in an event.", target->GetName());
        return false;
    }
    if (gmEvent->Player.GetSize() == MAX_PLAYERS_PER_EVENT)
    {
        psserver->SendSystemInfo(clientnum,
                                 "There are already %d players in the \'%s\' event.",
                                 MAX_PLAYERS_PER_EVENT,
                                 gmEvent->eventName.GetDataSafe());
        return false;
    }

    // store the registration in db
    db->Command("INSERT INTO character_events(event_id, player_id) VALUES (%i, %i)", gmEvent->id, playerID.Unbox());
    PlayerData eventPlayer;
    eventPlayer.PlayerID = playerID;
    eventPlayer.CanEvaluate = true;
    gmEvent->Player.Push(eventPlayer);

    // keep psCharacter up to date
    target->GetActor()->GetCharacterData()->AssignGMEvent(gmEvent->id,false);

    // player is available to join the valid GM event
    psserver->SendSystemInfo(clientnum, "%s is registered in the \'%s\' event.",
                             target->GetName(),
                             gmEvent->eventName.GetDataSafe());
    psserver->SendSystemInfo(target->GetClientNum(), "You are registered in the \'%s\' event.",
                             gmEvent->eventName.GetDataSafe());

    // if the player has sufficient security level, they can help administer the event
    if (target->GetSecurityLevel() >= SUPPORT_GM_LEVEL)
    {
        psserver->SendSystemInfo(clientnum, "He/she can assist with running this event.");
        psserver->SendSystemInfo(target->GetClientNum(), "You may assist running this event.");
    }

    return true;
}
Example #8
0
bool GMEventManager::RemovePlayerRefFromGMEvent(GMEvent* gmEvent, Client* client, PID playerID)
{
    size_t PlayerIndex = GetPlayerFromEvent(playerID, gmEvent);

    if (PlayerIndex != SIZET_NOT_FOUND && gmEvent->Player.DeleteIndex(PlayerIndex))
    {
        // ...from the database
        db->Command("DELETE FROM character_events WHERE event_id = %d AND player_id = %d", gmEvent->id, playerID.Unbox());
        // ...from psCharacter
        client->GetActor()->GetCharacterData()->RemoveGMEvent(gmEvent->id);

        return true;
    }

    return false;
}
bool psMerchantInfo::Load(PID pid)
{
    bool is_merchant = false;
    
    Result merchant_categories(db->Select("SELECT * from merchant_item_categories where player_id=%u", pid.Unbox()));
    if (merchant_categories.IsValid())
    {
        int i;
        int count=merchant_categories.Count();

        for (i=0;i<count;i++)
        {
            psItemCategory * category = FindCategory(atoi(merchant_categories[i]["category_id"]));
            if (!category)
            {
                Error1("Error! Category could not be loaded. Skipping.\n");
                continue;
            }
            categories.Push(category);
            is_merchant = true;
        }
    }

    return is_merchant;
}
bool psNPCLoader::WriteToDatabase()
{
    // write npc character data to database
    psCharacterLoader charloader;
    charloader.NewCharacterData(SUPER_CLIENT_ACCOUNT, npc);

    csString name = npc->GetCharName();
    PID      pid  = npc->GetPID();
    csString invulnerable = (npc->GetImperviousToAttack() & ALWAYS_IMPERVIOUS) ? "Y" : "N";
    int kill_exp  = npc->GetKillExperience();

    // add a spawn rule for the npc
    db->Command("UPDATE characters c SET c.npc_spawn_rule=1 WHERE c.id=%u;", pid.Unbox());

    // update factions
    db->Command("UPDATE characters c SET c.faction_standings='%s' WHERE c.id=%i;",
                factionStandings.GetDataSafe(), pid.Unbox());

    // update npc_master_id
    db->Command("UPDATE characters c SET c.npc_master_id=%u WHERE c.id=%u;", pid.Unbox(), pid.Unbox());

    // update invulnerable and kill_exp
    db->Command("UPDATE characters c SET c.npc_impervious_ind='%s', kill_exp=%i WHERE c.id=%u;", invulnerable.GetData(), kill_exp, pid.Unbox());

    // This can only be called after the character has been initialised.
    SetupEquipment();

    // write knowledge areas to database
    for(size_t i=0; i<knowledgeAreas.GetSize(); i++)
    {
        int priority = knowledgeAreasPriority[i];
        db->Command("INSERT INTO npc_knowledge_areas(player_id, area, priority) "
                    "VALUES (%d, '%s', '%d')",
                    pid.Unbox(), knowledgeAreas[i].GetData(), priority);
    }


    // write npcdialog (triggers and (special)responses) to database
    dialogManager->area = name;
    dialogManager->WriteToDatabase();

    // write trainer info to database
    for(size_t i=0; i<trainerSkills.GetSize(); i++)
    {
        db->Command("INSERT INTO trainer_skills(player_id, skill_id, min_rank, max_rank, min_faction) "
                    "VALUES (%i, %i, %i, %i, %f)",
                    pid.Unbox(),
                    trainerSkills[i].skill->id,
                    trainerSkills[i].min_rank,
                    trainerSkills[i].max_rank,
                    trainerSkills[i].min_faction);
    }

    // write merchant info to database
    for(size_t i=0; i<buys.GetSize(); i++)
        db->Command("INSERT INTO merchant_item_categories VALUES(%u,%d)", pid.Unbox(), buys[i]);

    for(size_t i=0; i<sells.GetSize(); i++)
        db->Command("INSERT INTO merchant_item_categories VALUES(%u,%d)", pid.Unbox(), sells[i]);

    CPrintf(CON_DEBUG, "The NPC has been assigned the following id: %u\n", npc->GetPID().Unbox());

    return true;
}