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; }
unsigned int psEffectManager::RenderEffect(const csString & effectName, iSector * sector, const csVector3 & pos, iMeshWrapper * attachTarget, const csVector3 & up, const unsigned int uniqueIDOverride, const float* scale) { #ifndef DONT_DO_EFFECTS // check if it's a single effect psEffect * currEffect = FindEffect(effectName); if (currEffect != 0) { currEffect = currEffect->Clone(); if (scale != NULL) { if (!currEffect->SetFrameParamScalings(scale)) { Error2("Received scale factor for effect %s that don't use param scaling",effectName.GetDataSafe()); } } unsigned int uniqueID = currEffect->Render(sector, pos, 0, attachTarget, up.Unit(), uniqueIDOverride); actualEffects.Put(uniqueID, currEffect); return uniqueID; } Error2("Failed to find effect with name: %s",effectName.GetDataSafe()); #endif return 0; }
bool LoadPrerequisiteXML(csRef<psQuestPrereqOp>& prerequisite, psQuest * self, csString script) { csRef<iDocumentSystem> xml = csPtr<iDocumentSystem>(new csTinyDocumentSystem); csRef<iDocument> doc = xml->CreateDocument(); const char* error = doc->Parse( script ); if ( error ) { Error3("%s\n%s",error, script.GetDataSafe() ); return false; } csRef<iDocumentNode> root = doc->GetRoot(); if(!root) { Error1("No XML root in prerequisite script"); return false; } csRef<iDocumentNode> topNode = root->GetNode("pre"); if (topNode) { return LoadPrerequisiteXML(topNode,self,prerequisite); } else { Error3("Could not find <pre> tag in prerequisite script '%s' for quest '%s'!", script.GetData(),(self?self->GetName():"(null)")); return false; } return true; }
csString Tribe::GetBuffer(const csString &bufferName) { csString value = tribeBuffer.Get(bufferName,""); RDebug(this, 5, "Get Buffer(%s) return: '%s'",bufferName.GetDataSafe(),value.GetDataSafe()); return value; }
void Profiler::WriteLogEntry (const csString& entry, bool flush /* = false */) { if (logfile) { logfile->Write (entry.GetDataSafe (), entry.Length ()); if (flush) logfile->Flush (); } if (nativeLogfile) { fprintf (nativeLogfile, "%s", entry.GetDataSafe ()); if (flush) fflush (nativeLogfile); } }
bool LocationManager::RemoveLocationType(iDataConnection* db, const csString &locationName) { int res =db->Command("delete from sc_location_type where name='%s'", locationName.GetDataSafe()); if(res != 1) { return false; } RemoveLocationType(locationName); return true; }
void pawsBuddyWindow::ChangeAlias(const csString & name, const csString &oldAlias, const csString & newAlias) { // Check for duplicates if (!IsUniqueAlias(newAlias)) { psSystemMessage err(0, MSG_ERROR, "%s '%s' %s", PawsManager::GetSingleton().Translate("Buddy with the name").GetData(), newAlias.GetDataSafe(), PawsManager::GetSingleton().Translate("already exists.").GetData()); err.FireEvent(); return; } bool found = false; // Find the old alias in both lists and replace with the new alias. size_t loc = offlineBuddies.Find(oldAlias); if (loc != csArrayItemNotFound) { found = true; offlineBuddies.DeleteIndex(loc); offlineBuddies.Push(newAlias); } loc = onlineBuddies.Find(oldAlias); if (loc != csArrayItemNotFound) { found = true; onlineBuddies.DeleteIndex(loc); onlineBuddies.Push(newAlias); } if (!found) { // Old alias not found, perhaps the buddy was removed from the list psSystemMessage err(0, MSG_ERROR, "%s '%s' %s", PawsManager::GetSingleton().Translate("Buddy with the name").GetData(), name.GetDataSafe(), PawsManager::GetSingleton().Translate("cannot be found. Perhaps it was removed.").GetData()); err.FireEvent(); return; } // Add/replace in the aliases table and save it. aliases.PutUnique(name, newAlias); SaveAliases(psengine->GetMainPlayerName()); // Update the listbox FillBuddyList(); }
void Tribe::SaveKnowledge(csString knowHow) { const char* fields[] = { "tribe_id", "knowledge" }; psStringArray values; values.FormatPush("%d", GetID()); values.FormatPush("%s", knowHow.GetDataSafe()); int result = db->GenericInsertWithID("sc_tribe_knowledge",fields,values); if(result == 0) { CPrintf(CON_ERROR, "Failed to save knowledge for tribe. Reason: %s.\n", db->GetLastError()); return; } }
csRef<iDocument> ParseString(const csString & str, bool notify) { csRef<iDocumentSystem> xml; xml.AttachNew(new csTinyDocumentSystem); CS_ASSERT(xml != NULL); csRef<iDocument> doc = xml->CreateDocument(); const char* error = doc->Parse(str); if (error) { if (notify) { Error3("Error in XML: %s\nString was: %s", error, str.GetDataSafe()); } return NULL; } return doc; }
unsigned int psEffectManager::RenderEffect(const csString & effectName, const csVector3 & offset, iMeshWrapper * attachPos, iMeshWrapper * attachTarget, const csVector3 & up, const unsigned int uniqueIDOverride, bool rotateWithMesh, const float* scale) { #ifndef DONT_DO_EFFECTS if (!attachPos) return 0; // check if it's a single effect psEffect * currEffect = FindEffect(effectName); if (currEffect != 0) { currEffect = currEffect->Clone(); if (scale != NULL) { if (!currEffect->SetFrameParamScalings(scale)) { Error2("Received scale factor for effect %s that don't use param scaling",effectName.GetDataSafe()); } } const unsigned int uniqueID = currEffect->Render(attachPos->GetMovable()->GetSectors(), offset, attachPos, attachTarget, up.Unit(), uniqueIDOverride, rotateWithMesh); actualEffects.Put(uniqueID, currEffect); return uniqueID; } #endif return 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; }
bool GMEventManager::RewardPlayersInGMEvent (Client* client, RangeSpecifier rewardRecipient, float range, Client* target, short stackCount, csString itemName) { GMEvent* gmEvent; int clientnum = client->GetClientNum(), zero = 0; WordArray rewardDesc(itemName); RewardType rewardType = REWARD_ITEM; PID gmID = client->GetPID(); // make sure GM is running (or assisting) an event 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; } } // check range is within max permissable if (rewardRecipient == IN_RANGE && (range <= 0.0 || range > MAX_REGISTER_RANGE)) { psserver->SendSystemInfo(clientnum, "Range should be greater than 0m upto %.2fm to reward participants.", MAX_REGISTER_RANGE); return false; } // identify reward type: experience, faction points or an item if (rewardDesc[0] == "exp" && rewardDesc.GetCount() == 1) rewardType = REWARD_EXPERIENCE; else if (rewardDesc[0] == "faction" && rewardDesc.GetCount() > 1) rewardType = REWARD_FACTION_POINTS; // retrieve base stats item psItemStats *basestats; if (rewardType == REWARD_ITEM) { basestats = CacheManager::GetSingleton().GetBasicItemStatsByName(itemName.GetDataSafe()); if (basestats == NULL) { psserver->SendSystemInfo(clientnum, "Reward \'%s\' not recognised.", itemName.GetDataSafe()); Error2("'%s' was not found as a valid base item.", itemName.GetDataSafe()); return false; } if (stackCount <= 0) { psserver->SendSystemInfo(clientnum, "You must reward at least 1 item to participant(s)."); return false; } if (stackCount >= 65 && !basestats->IsMoney()) { psserver->SendSystemInfo(clientnum, "You can't reward that amount of items to partecipant(s)."); return false; } // cant reward personalised or unique items if (basestats->GetBuyPersonalise() || basestats->GetUnique()) { psserver->SendSystemInfo(clientnum, "You cannot reward personalised / unique items."); return false; } } else basestats = NULL; if (rewardRecipient == INDIVIDUAL) { if (!target) psserver->SendSystemInfo(clientnum, "Invalid target for reward."); else { zero = 0; GMEvent* playersEvent = GetGMEventByPlayer(target->GetPID(), RUNNING, zero); if (playersEvent && playersEvent->id == gmEvent->id) { if (rewardType == REWARD_EXPERIENCE) psserver->GetAdminManager()->AwardExperienceToTarget(clientnum, target, target->GetName(), stackCount); else if (rewardType == REWARD_FACTION_POINTS) psserver->GetAdminManager()->AdjustFactionStandingOfTarget(clientnum, target, rewardDesc.GetTail(1), stackCount); else RewardPlayer(clientnum, target, stackCount, basestats); } else { psserver->SendSystemInfo(clientnum, "%s is not registered in your \'%s\' event.", target->GetName(), gmEvent->eventName.GetDataSafe()); } } } else { // reward ALL players (incl. within range) ClientConnectionSet* clientConnections = psserver->GetConnections(); gemActor* clientActor = client->GetActor(); for (size_t p = 0; p < gmEvent->Player.GetSize(); p++) { if ((target = clientConnections->FindPlayer(gmEvent->Player[p].PlayerID))) { if (rewardRecipient == ALL || clientActor->RangeTo(target->GetActor()) <= range) { if (rewardType == REWARD_EXPERIENCE) psserver->GetAdminManager()->AwardExperienceToTarget(clientnum, target, target->GetName(), stackCount); else if (rewardType == REWARD_FACTION_POINTS) psserver->GetAdminManager()->AdjustFactionStandingOfTarget(clientnum, target, rewardDesc.GetTail(1), stackCount); else RewardPlayer(clientnum, target, stackCount, basestats); } } } } return true; }
void SpellManager::Cast(gemActor* caster, const csString &spellName, float kFactor, Client* client) { psSpell* spell = NULL; if( spellName=="" ) { //this is a request to send the current active magic list caster->SendActiveSpells(); return; } // Allow developers to cast any spell bool canCastAllSpells; if(client) { canCastAllSpells = cacheManager->GetCommandManager()->Validate(client->GetSecurityLevel(), "cast all spells"); } else { canCastAllSpells = true; // For now grant the NPC client the same priveledge as game masters and developers. } // Allow developers to cast any spell, even if unknown to the character. if(canCastAllSpells) { spell = cacheManager->GetSpellByName(spellName); } else { spell = client->GetCharacterData()->GetSpellByName(spellName); } //spells with empty glyphlists are not enabled if(!spell || spell->GetGlyphList().IsEmpty()) { if(client) { psserver->SendSystemInfo(client->GetClientNum(), "You don't know a spell called %s.",spellName.GetData()); } else { Debug3(LOG_SUPERCLIENT,caster->GetEID().Unbox(),"%s don't know a spell called %s.",caster->GetName(),spellName.GetDataSafe()); } return; } // Clamp kFactor to sane values. if(kFactor < 0.0) { kFactor = 0.0; } if(kFactor > 100.0) { kFactor = 100.0; } csString reason; if(!spell->CanCast(caster, kFactor, reason, canCastAllSpells)) { if(client) { psserver->SendSystemInfo(client->GetClientNum(), reason.GetData()); } else { Debug3(LOG_SUPERCLIENT,caster->GetEID().Unbox(),"%s: %s.",caster->GetName(),reason.GetDataSafe()); } return; } spell->Cast(caster, kFactor, client); }
void Tribe::RemoteDebugReport(uint32_t clientNum, const csString &debugString) { npcclient->GetNetworkMgr()->QueueSystemInfoCommand(clientNum,"%s (%d)> %s", GetName(), id, debugString.GetDataSafe()); }
void Tribe::LocalDebugReport(const csString &debugString) { CPrintf(CON_CMDOUTPUT, "%s (%d)> %s\n", GetName(), id, debugString.GetDataSafe()); }
void Tribe::SetBuffer(const csString &bufferName, const csString &value) { RDebug(this, 5, "Set Buffer(%s,%s)",bufferName.GetDataSafe(),value.GetDataSafe()); tribeBuffer.PutUnique(bufferName,value); }