int csPixelShaderParser::GetArguments (const csString &str, csString &dest, csString &src1, csString &src2, csString &src3, csString &src4) { size_t start = str.FindFirst (' '); if (start == (size_t)-1) return 0; int argument = 0; size_t len = str.Length (); while(argument < 5 && start < len) { size_t end = str.FindFirst (',', start + 1); if(end == (size_t)-1) end = str.Length (); if(end - start < 1) break;; csString reg; str.SubString (reg, start, end - start); reg.Trim (); switch(argument) { default: break; case 0: dest = reg; break; case 1: src1 = reg; break; case 2: src2 = reg; break; case 3: src3 = reg; break; case 4: src4 = reg; break; } argument ++; start = end + 1; } return argument; }
bool psCharAppearance::Dequip(csString& slotname, csString& mesh, csString& part, csString& subMesh, csString& texture) { //look Equip() for more informations on this: bracers must be managed separately if (slotname == "bracers") { for(unsigned int position = 0; position < bracersSlotCount; position++) Dequip(BracersSlots[position], mesh, part, subMesh, texture); return true; } if ( slotname == "helm" ) { ShowHair(true); } if ( mesh.Length() ) { ClearEquipment(slotname); Detach(slotname); } // This is a part mesh (ie Mesh) set default mesh for that part. if ( subMesh.Length() ) { DefaultMesh(part); } if ( part.Length() ) { if ( texture.Length() ) { ChangeMaterial(part, texture); } else { DefaultMaterial(part); } DefaultMaterial(part); } ClearEquipment(slotname); return true; }
void NameGenerator::GenerateName(csString &namebuffer,int length_low,int length_high) { unsigned int length; PhonicEntry *lastphonic=NULL; namebuffer.Clear(); length=randomgen->Get((length_high-length_low))+length_low; // Pick a beginning lastphonic=GetRandomBeginner(); namebuffer.Append(lastphonic->phonic); // Add phonics to the middle while within length while (namebuffer.Length() < length) { if (lastphonic->flags & PHONIC_POSTJOINER) lastphonic=GetRandomNonPreJoiner(); else lastphonic=GetRandomPreJoiner(); namebuffer.Append(lastphonic->phonic); } // Pick an ending lastphonic=GetRandomEnder(!(lastphonic->flags & PHONIC_POSTJOINER)); namebuffer.Append(lastphonic->phonic); namebuffer.Downcase(); }
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; }
bool ZoneHandler::ForceLoadWindowWidget(bool enable, csString loadWindowName) { if(enable) { //check first if the window name is valid. shouldn't end up here if(loadWindowName.IsEmpty()) { return false; } else //if it's valid we load it and set it as load window for now { PawsManager::GetSingleton().LoadWidget(loadWindowName.GetData()); //request the load window to update the new window if(loadWindow) loadWindow->PublishMOTD(); return FindLoadWindow(true, loadWindowName.GetData()); } } else //restore the pointers to the normal window and removes the specified window from the memory { //restore the ties to the default load window bool result = FindLoadWindow(true); //as we have reloaded the load window we can remove the widget we don't need anymore if(loadWindowName.Length()) PawsManager::GetSingleton().RemoveWidget(loadWindowName.GetData(), false); return result; } return true; }
bool pawsNumbersPromptWindow::TextIsValidForOutput(const csString & text) { if (text.Length() == 0) return false; int number = atoi(text.GetData()); return TextIsValidForEditing(text) && (number >= 0) && (number >= minNumber); }
bool pawsNumbersPromptWindow::TextIsValidForEditing(const csString & text) { if (text.Length() > (unsigned int)maxDigits) return false; for (size_t i=0; i < text.Length(); i++) if (!isdigit(text.GetAt(i)) ) return false; if ( (text.GetData() != NULL) && (atoi(text.GetData()) > maxNumber) ) return false; return true; }
static inline void TestTarget(csString& targetDesc, int32_t targetType, enum TARGET_TYPES type, const char* desc) { if (targetType & type) { if (targetDesc.Length() > 0) { targetDesc.Append((targetType > (type * 2)) ? ", " : ", or "); } targetDesc.Append(desc); } }
// converts hexadecimal string to color in current pixel format int ParseColor(const csString &str, iGraphics2D* g2d) { int r, g, b; if(str.Length() != 6) return false; r = HexToDec8(str.GetAt(0), str.GetAt(1)); g = HexToDec8(str.GetAt(2), str.GetAt(3)); b = HexToDec8(str.GetAt(4), str.GetAt(5)); return g2d->FindRGB(r, g, b); }
void peMenu::OnFileSelected::Execute(const csString & text) { if ( text.Length() == 0 ) return; switch ( buttonID ) { case 101: editApp->OpenWidget( text ); break; case 102: editApp->OpenImageList( text ); break; } }
static inline bool AddToPathEnv (csString dir, csString& pathEnv) { // check if installdir is in the path. bool gotpath = false; size_t dlen = dir.Length(); // csGetInstallDir() might return "" (current dir) if (dlen != 0) { ToLower (dir); if (!pathEnv.IsEmpty()) { csString mypath (pathEnv); ToLower (mypath); const char* ppos = strstr (mypath.GetData(), dir); while (!gotpath && ppos) { const char* npos = strchr (ppos, ';'); size_t len = npos ? npos - ppos : strlen (ppos); if ((len == dlen) || (len == dlen+1)) { if (ppos[len] == '\\') len--; if (!strncmp (ppos, dir, len)) { // found it gotpath = true; } } ppos = npos ? strstr (npos+1, dir) : 0; } } if (!gotpath) { // put CRYSTAL path into PATH environment. csString newpath; newpath.Append (dir); newpath.Append (";"); newpath.Append (pathEnv); pathEnv = newpath; return true; } } return false; }
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); } }
void psCharAppearance::Equip( csString& slotname, csString& mesh, csString& part, csString& subMesh, csString& texture ) { //Bracers must be managed separately as we have two slots in cal3d but only one slot here //To resolve the problem we call recursively this same function with the "corrected" slot names //which are rightarm leftarm if (slotname == "bracers") { for(unsigned int position = 0; position < bracersSlotCount; position++) Equip(BracersSlots[position], mesh, part, subMesh, texture); return; } if ( slotname == "helm" ) { ShowHair(false); } // If it's a new mesh attach that mesh. if ( mesh.Length() ) { if( texture.Length() && !subMesh.Length() ) Attach(slotname, mesh, texture); else Attach(slotname, mesh); } // This is a subMesh on the model change so change the mesh for that part. if ( subMesh.Length() ) { // Change the mesh on the part of the model. ChangeMesh(part, subMesh); // If there is also a new material ( texture ) then place that on as well. if ( texture.Length() ) { ChangeMaterial( ParseStrings(part,subMesh), texture); } } else if ( part.Length() ) { ChangeMaterial(part, texture); } }
static void ToLower (csString& s) { for (size_t i = 0; i < s.Length(); i++) s[i] = tolower (s[i]); }
void psCharAppearance::ApplyEquipment(const csString& equipment) { if ( equipment.Length() == 0 ) { return; } csRef<iDocument> doc = xmlparser->CreateDocument(); const char* error = doc->Parse(equipment); if ( error ) { Error2("Error in XML: %s", error ); return; } csString BaseGroup = baseMesh->GetFactory()->QueryObject()->GetName(); // Do the helm check. csRef<iDocumentNode> helmNode = doc->GetRoot()->GetNode("equiplist")->GetNode("helm"); csString helmGroup(helmNode->GetContentsValue()); if ( helmGroup.Length() == 0 ) helmGroup = BaseGroup; // Do the bracer check. csRef<iDocumentNode> BracerNode = doc->GetRoot()->GetNode("equiplist")->GetNode("bracer"); csString BracerGroup(BracerNode->GetContentsValue()); if ( BracerGroup.Length() == 0 ) BracerGroup = BaseGroup; // Do the belt check. csRef<iDocumentNode> BeltNode = doc->GetRoot()->GetNode("equiplist")->GetNode("belt"); csString BeltGroup(BeltNode->GetContentsValue()); if ( BeltGroup.Length() == 0 ) BeltGroup = BaseGroup; // Do the cloak check. csRef<iDocumentNode> CloakNode = doc->GetRoot()->GetNode("equiplist")->GetNode("cloak"); csString CloakGroup(CloakNode->GetContentsValue()); if ( CloakGroup.Length() == 0 ) CloakGroup = BaseGroup; csRef<iDocumentNodeIterator> equipIter = doc->GetRoot()->GetNode("equiplist")->GetNodes("equip"); while (equipIter->HasNext()) { csRef<iDocumentNode> equipNode = equipIter->Next(); csString slot = equipNode->GetAttributeValue( "slot" ); csString mesh = equipNode->GetAttributeValue( "mesh" ); csString part = equipNode->GetAttributeValue( "part" ); csString partMesh = equipNode->GetAttributeValue("partMesh"); csString texture = equipNode->GetAttributeValue( "texture" ); //If the mesh has a $H it means it's an helm so search for replacement mesh.ReplaceAll("$H",helmGroup); //If the mesh has a $B it means it's a bracer so search for replacement mesh.ReplaceAll("$B",BracerGroup); //If the mesh has a $E it means it's a belt so search for replacement mesh.ReplaceAll("$E", BeltGroup); //If the mesh has a $C it means it's a cloak so search for replacement mesh.ReplaceAll("$C", CloakGroup); Equip(slot, mesh, part, partMesh, texture); } return; }
void AdviceManager::HandleAdviceResponse( Client *advisor, csString sAdvisee, csString message) { if ( !advisor->GetAdvisor() ) { psserver->SendSystemInfo(advisor->GetClientNum(),"You need to be an advisor to use this command."); return; } csString buf; // Source Client Name, Target Client Name, Message buf.Format("%s, %s, \"%s\"", advisor->GetName(), sAdvisee.GetData() , message.GetData()); psserver->GetLogCSV()->Write(CSV_ADVICE, buf); // Find Advisee Client by name if (sAdvisee.Length()) { sAdvisee = NormalizeCharacterName(sAdvisee); } Client *advisee = psserver->GetConnections()->Find(sAdvisee); if (!advisee) { // Create a new message to report TELL error and send // back to original person. csString sMsg("No player named "); sMsg += sAdvisee; sMsg += " is logged on to the system currently."; psserver->SendSystemError(advisor->GetClientNum(), sMsg); return; } // Can't allow you to advise yourself if ( advisee == advisor ) { psserver->SendSystemError(advisor->GetClientNum(), "You are not allowed to advise yourself. Please wait for another advisor."); return; } // find existing Advicee in the List AdviceSession key; key.AdviseeClientNum = advisee->GetClientNum(); AdviceSession *activeSession = AdviseeList.Get(advisee->GetClientNum(), NULL); if (!activeSession || (activeSession && ( !activeSession->requestEvent ) && ( activeSession->GetAdvisor() == NULL ) ) ) { psserver->SendSystemError(advisor->GetClientNum(), "%s has not requested help.", advisee->GetName()); return; } if (activeSession && ( activeSession->AdviseeClientNum != advisee->GetClientNum() ) ) { Debug2( LOG_ANY, advisee->GetClientNum(), "Grabbed wrong advisor session: %d", activeSession->AdviseeClientNum ); } if ( ( activeSession->GetAdvisor() != NULL ) && ( activeSession->AdvisorClientNum != advisor->GetClientNum() ) ) { psserver->SendSystemError(advisor->GetClientNum(), "%s is being advised already, thank you.", advisee->GetName()); return; } if ( message.Length() == 0 && activeSession->status == SESSION_STATUS_UNKNOWN ) // advisor is claiming a session { // check to make sure advisor has only one claimed session. AdviceSession *loopSession; csHash< AdviceSession* >::GlobalIterator loop( AdviseeList.GetIterator() ); while(loop.HasNext()) { loopSession = loop.Next(); if (activeSession->status == SESSION_STATUS_CLAIMED && loopSession->GetAdvisor() == advisor ) { psserver->SendSystemInfo(advisor->GetClientNum(), "You cannot have two messengers waiting for you at the same time, please answer %s's request first." , loopSession->adviseeName.GetData() ); return; } } activeSession->SetAdvisor( advisor ); psserver->SendSystemInfo(advisee->GetClientNum(), "An advisor is preparing an answer to your question, please be patient."); psserver->SendSystemInfo(advisor->GetClientNum(), "You have claimed the session with %s. Please provide an answer." , advisee->GetName() ); for (size_t i = 0; i < advisors.GetSize(); i++) { if ( advisors[i].id != activeSession->AdvisorClientNum ) { psserver->SendSystemInfo(advisors[i].id, "%s has proclaimed they know the answer to %s's question.", advisor->GetName(), advisee->GetName() ); } } activeSession->status = SESSION_STATUS_CLAIMED; } else { if (message.IsEmpty()) { psserver->SendSystemInfo(advisor->GetClientNum(), "Please enter the advice you wish to give."); return; } psChatMessage msgChat(activeSession->AdviseeClientNum, 0, advisor->GetName(), advisee->GetName(), message ,CHAT_ADVISOR,false); if ( activeSession->GetAdvisor() == NULL || activeSession->status != SESSION_STATUS_OWNED ) { // Check to make sure the advice is 'good' // if ( message.Length() < 20 ) // { // psserver->SendSystemInfo(advisor->GetClientNum(), "Please be more specific when answering questions. Your advice has been ignored."); // return; // } //activeSession->AdvisorClientNum = me->clientnum; activeSession->SetAdvisor( advisor ); advisor->IncrementAdvisorPoints(activeSession->advisorPoints); psserver->CharacterLoader.SaveCharacterData( advisor->GetCharacterData(), advisor->GetActor(), true ); // Send Confirmation to advisor psserver->SendSystemInfo( advisor->GetClientNum(), "You are now advising %s.",advisee->GetName()); // Send Confirmation to all other advisors so they know they lost this one. for (size_t i = 0; i < advisors.GetSize(); i++) { if ( advisors[i].id != activeSession->AdvisorClientNum ) { psserver->SendSystemInfo( advisors[i].id, "%s has been assigned to %s.", advisee->GetName(), advisor->GetName() ); if ( advisors[i].GM ) continue; msgChat.msg->clientnum = advisors[i].id; msgChat.SendMessage(); } } activeSession->status = SESSION_STATUS_OWNED; } if ( activeSession->requestEvent ) activeSession->requestEvent->valid = false; // This keeps the cancellation timeout from firing. activeSession->answered = true; // Send Message to Advisee msgChat.msg->clientnum = activeSession->AdviseeClientNum; msgChat.SendMessage(); // Send Message to advisor msgChat.msg->clientnum = activeSession->AdvisorClientNum; msgChat.SendMessage(); // Send message to GM chars as well for (size_t i = 0; i < advisors.GetSize(); i++) { if (!advisors[i].GM || advisors[i].id == activeSession->AdvisorClientNum) continue; msgChat.msg->clientnum = advisors[i].id; msgChat.SendMessage(); } } // Add timeout for Advisor-Advisee relationship // this will allow later questions by the same client to go to a different advisor // spreading the wealth and burden amongst all ;) if ( activeSession->timeoutEvent ) { activeSession->timeoutEvent->valid = false; } psAdviceSessionTimeoutGameEvent *ev = new psAdviceSessionTimeoutGameEvent( this, activeSession->answered?ADVICE_SESSION_TIMEOUT:ADVICE_SESSION_TIMEOUT/2, advisee->GetActor(), activeSession ); activeSession->timeoutEvent = ev; psserver->GetEventManager()->Push(ev); }
void psCharAppearance::ApplyTraits(const csString& traitString) { if ( traitString.Length() == 0 ) { return; } csRef<iDocument> doc = xmlparser->CreateDocument(); const char* traitError = doc->Parse(traitString); if ( traitError ) { Error2("Error in XML: %s", traitError ); return; } csRef<iDocumentNodeIterator> traitIter = doc->GetRoot()->GetNode("traits")->GetNodes("trait"); csPDelArray<Trait> traits; // Build traits table while ( traitIter->HasNext() ) { csRef<iDocumentNode> traitNode = traitIter->Next(); Trait * trait = new Trait; trait->Load(traitNode); traits.Push(trait); } // Build next and prev pointers for trait sets csPDelArray<Trait>::Iterator iter = traits.GetIterator(); while (iter.HasNext()) { Trait * trait = iter.Next(); csPDelArray<Trait>::Iterator iter2 = traits.GetIterator(); while (iter2.HasNext()) { Trait * trait2 = iter2.Next(); if (trait->next_trait_uid == trait2->uid) { trait->next_trait = trait2; trait2->prev_trait = trait; } } } // Find top traits and set them on mesh csPDelArray<Trait>::Iterator iter3 = traits.GetIterator(); while (iter3.HasNext()) { Trait * trait = iter3.Next(); if (trait->prev_trait == NULL) { if (!SetTrait(trait)) { Error2("Failed to set trait %s for mesh.", traitString.GetData()); } } } return; }