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; }
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; }
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; }
/** * 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; }
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; }
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; }
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; }
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; }