<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://planeshift.top-ix.org//pswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JeHugawa</id>
	<title>PSwiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://planeshift.top-ix.org//pswiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=JeHugawa"/>
	<link rel="alternate" type="text/html" href="https://planeshift.top-ix.org//pswiki/index.php/Special:Contributions/JeHugawa"/>
	<updated>2026-04-07T17:33:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://planeshift.top-ix.org//pswiki/index.php?title=CS_Code_convertion&amp;diff=21419</id>
		<title>CS Code convertion</title>
		<link rel="alternate" type="text/html" href="https://planeshift.top-ix.org//pswiki/index.php?title=CS_Code_convertion&amp;diff=21419"/>
		<updated>2018-07-07T17:01:05Z</updated>

		<summary type="html">&lt;p&gt;JeHugawa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Code convertion ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Types ===&lt;br /&gt;
&lt;br /&gt;
csArray&amp;lt;&amp;gt; -&amp;gt; TArray&lt;br /&gt;
&lt;br /&gt;
csBox2 -&amp;gt; TArray&amp;lt;FVector2D&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you need to have unique key-value pairs:&lt;br /&gt;
&lt;br /&gt;
csHash&amp;lt;Value&amp;gt; -&amp;gt; TMap&amp;lt;int,Value&amp;gt; (note the swap of Key and Value)&lt;br /&gt;
&lt;br /&gt;
csHash&amp;lt;Value,Key&amp;gt; -&amp;gt; TMap&amp;lt;Key,Value&amp;gt; (note the swap of Key and Value)&lt;br /&gt;
&lt;br /&gt;
If you need have multiple values for the same key:&lt;br /&gt;
&lt;br /&gt;
csHash&amp;lt;Value,Key&amp;gt; -&amp;gt; TMultiMap&amp;lt;Key,Value&amp;gt; (notice the swap of Key and Value)&lt;br /&gt;
&lt;br /&gt;
csHashCompute(string) -&amp;gt; StrUtils::hashCompute(string)&lt;br /&gt;
&lt;br /&gt;
csList -&amp;gt; TDoubleLinkedList&lt;br /&gt;
&lt;br /&gt;
csMD5::Digest -&amp;gt; to be bettere analyzed, for now just temporary&lt;br /&gt;
&lt;br /&gt;
csPDelArray&amp;lt;PhonicEntry&amp;gt; -&amp;gt; TArray&amp;lt;PhonicEntry*&amp;gt;; (note the pointer in UE)&lt;br /&gt;
&lt;br /&gt;
csRandomGen -&amp;gt; FMath::FRandRange(low, high);&lt;br /&gt;
&lt;br /&gt;
psGetRandom() -&amp;gt; FMath::FRandRange(0, 1); // Get a floating-point random number in range 0 &amp;lt;= num &amp;lt; 1&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;GetRandomRange(pos, range) -&amp;gt; (pos - range + FMath::FRandRange(0,1)*range*2)&lt;br /&gt;
&lt;br /&gt;
If you want to generate Integer random then use FMath::RandRange(1,10)&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;rng-&amp;gt;Get(100) -&amp;gt; FMath::FRandRange(0,100);&lt;br /&gt;
&lt;br /&gt;
csRef&amp;lt;iDocumentNode&amp;gt; containerNode -&amp;gt; FXmlNode *containerNode&lt;br /&gt;
&lt;br /&gt;
csRefArray&amp;lt;csString&amp;gt; -&amp;gt; TArray&amp;lt;FString*&amp;gt;&lt;br /&gt;
&lt;br /&gt;
csRegExpMatcher -&amp;gt; FRegexPattern , FRegexMatcher (check msgmanager.cpp:234)&lt;br /&gt;
&lt;br /&gt;
csSet -&amp;gt; TArray (but be careful about insertions as csSet.Add checks for uniqueness)&lt;br /&gt;
&lt;br /&gt;
csString -&amp;gt; psString or FString&lt;br /&gt;
&lt;br /&gt;
csStringSet -&amp;gt; StringSet ( #include &amp;quot;util/strset.h&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
csStringArray -&amp;gt; TArray&amp;lt;FString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
psStringArray -&amp;gt; TArray&amp;lt;FString&amp;gt;&lt;br /&gt;
&lt;br /&gt;
csSquaredDist::PointPoint() -&amp;gt; FVector::Dist(v1,v2)&lt;br /&gt;
&lt;br /&gt;
csTicks -&amp;gt; time_t&lt;br /&gt;
&lt;br /&gt;
CS::Threading::AtomicOperations::Increment(&amp;amp;nextid); -&amp;gt; FThreadSafeCounter.Increment()&lt;br /&gt;
&lt;br /&gt;
CS::Threading::MutexScopedLock ScopeLock(mutex); -&amp;gt;  FCriticalSection mutex; FScopeLock ScopeLock(mutex);&lt;br /&gt;
&lt;br /&gt;
csTuple2 -&amp;gt; TPair&lt;br /&gt;
&lt;br /&gt;
csVector2 -&amp;gt; FIntPoint&lt;br /&gt;
&lt;br /&gt;
csVector3 -&amp;gt; FVector&lt;br /&gt;
&lt;br /&gt;
?? csSet -&amp;gt; TArray ??&lt;br /&gt;
&lt;br /&gt;
uint -&amp;gt; uint32&lt;br /&gt;
&lt;br /&gt;
uint32_t -&amp;gt; #include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
iResultRow -&amp;gt; psResultRow&lt;br /&gt;
&lt;br /&gt;
StringIDValue -&amp;gt; int (is this a correct assumption?)&lt;br /&gt;
&lt;br /&gt;
WordArray -&amp;gt; TArray&amp;lt;FString&amp;gt; with space separator. Verify if this assumption is enough&lt;br /&gt;
  //WordArray words(trigger.GetString());&lt;br /&gt;
  TArray&amp;lt;FString&amp;gt; words;&lt;br /&gt;
  trigger.ParseIntoArray(words, TEXT(&amp;quot; &amp;quot;), true);&lt;br /&gt;
&lt;br /&gt;
iVFS -&amp;gt; not used in UE, just delete the reference.&lt;br /&gt;
&lt;br /&gt;
CS::Utility::PriorityQueue&amp;lt;TaskEntry&amp;gt; -&amp;gt; TArray&amp;lt;TaskEntry&amp;gt; items; use items.Heapify() to order.&lt;br /&gt;
&lt;br /&gt;
=== Types conversion ===&lt;br /&gt;
&lt;br /&gt;
FString to char*  -&amp;gt; const char *myData = TCHAR_TO_ANSI(*NameString);&lt;br /&gt;
&lt;br /&gt;
FString to TCHAR -&amp;gt; *myFString&lt;br /&gt;
&lt;br /&gt;
char* to FString  -&amp;gt; ANSI_TO_TCHAR(NameString);&lt;br /&gt;
&lt;br /&gt;
int to FString -&amp;gt; FString::FromInt(myInt);&lt;br /&gt;
&lt;br /&gt;
float to FString -&amp;gt; FString::SanitizeFloat(myFloat);&lt;br /&gt;
&lt;br /&gt;
int32 MyShinyNewInt = FCString::Atoi(*TheString);&lt;br /&gt;
&lt;br /&gt;
float MyShinyNewFloat = FCString::Atof(*TheString);&lt;br /&gt;
&lt;br /&gt;
=== Functions on csString ===&lt;br /&gt;
&lt;br /&gt;
csString csv.AppendFmt(&amp;quot;,%d,%d&amp;quot;, fs-&amp;gt;faction-&amp;gt;id, fs-&amp;gt;score); -&amp;gt; csv.Append(FString::Printf(TEXT(&amp;quot;,%d,%d&amp;quot;), fs-&amp;gt;faction-&amp;gt;id, fs-&amp;gt;score));&lt;br /&gt;
&lt;br /&gt;
csString.AppendFmtV(fmt, args) -&amp;gt; vsprintf(line, fmt, args); script.Append(line);&lt;br /&gt;
&lt;br /&gt;
csString.Clear() -&amp;gt; Empty()&lt;br /&gt;
&lt;br /&gt;
csString input.Collapse() -&amp;gt; output = StrUtils::Collapse(input)&lt;br /&gt;
&lt;br /&gt;
csString.CompareNoCase() returns TRUE if equal -&amp;gt; FString.Compare(&amp;quot;ADD&amp;quot;, ESearchCase::IgnoreCase)==0 returns 0 if equal &lt;br /&gt;
&lt;br /&gt;
csString.DeleteAt(start) -&amp;gt; FString.RemoveAt(start)&lt;br /&gt;
&lt;br /&gt;
csString.DeleteAt(start,count) -&amp;gt; FString.RemoveAt(start,count)&lt;br /&gt;
&lt;br /&gt;
csString str.Detach() -&amp;gt; TCHAR_TO_ANSI(*str) detaches the data from the csString&lt;br /&gt;
&lt;br /&gt;
csString.Downcase() -&amp;gt; mystring = mystring.ToLower() (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.Find(search, pos, ignore_case) -&amp;gt; FString.Find(search, ESearchCase::IgnoreCase)&lt;br /&gt;
&lt;br /&gt;
csString.FindLast(&#039;-&#039;) -&amp;gt; int pos; csString.FindLastChar(&#039;-&#039;, pos)&lt;br /&gt;
&lt;br /&gt;
csString.FindLast(&#039;-&#039;, startposition) -&amp;gt; pos = csString.Find(&#039;-&#039;, pos)&lt;br /&gt;
&lt;br /&gt;
csString end = resp.Find(&amp;quot;]&amp;quot;, start); -&amp;gt; int end = resp.Find(&amp;quot;]&amp;quot;,ESearchCase::IgnoreCase , ESearchDir::FromStart, start);&lt;br /&gt;
&lt;br /&gt;
csString.Free() -&amp;gt; mystring = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
csString.FindFirst (&#039;a&#039;) -&amp;gt;     int pos; FString.FindChar(&#039; &#039;,pos);&lt;br /&gt;
&lt;br /&gt;
csString pos = script.FindFirst(&#039;;&#039;, start); -&amp;gt; pos = script.Find(&amp;quot;]&amp;quot;,ESearchCase::IgnoreCase , ESearchDir::FromStart, start);&lt;br /&gt;
&lt;br /&gt;
script.FindStr(&amp;quot;string&amp;quot;) -&amp;gt; script.Find(&amp;quot;string&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
mystr.FindReplace (search, replace) -&amp;gt; mystr = mystr.Replace(search, replace); (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.FindSubString() -&amp;gt; FString.Find()&lt;br /&gt;
&lt;br /&gt;
string.Format(&amp;quot;hey %s&amp;quot;, param) -&amp;gt; string = FString::Printf(TEXT(&amp;quot;hey %s&amp;quot;), param) (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.GetAt(0) -&amp;gt; [0]&lt;br /&gt;
&lt;br /&gt;
csString.GetData() -&amp;gt; TCHAR_TO_ANSI(*mystring)&lt;br /&gt;
&lt;br /&gt;
csString.GetDataSafe() -&amp;gt; TCHAR_TO_ANSI(*mystring)&lt;br /&gt;
&lt;br /&gt;
csString.Insert(pos, str) -&amp;gt; FString.InsertAt(pos, string)&lt;br /&gt;
&lt;br /&gt;
csString.Length() -&amp;gt; Len()&lt;br /&gt;
&lt;br /&gt;
csString.LTrim() -&amp;gt; FString.Trim()&lt;br /&gt;
&lt;br /&gt;
csString.Replace(from, to) -&amp;gt; mystr = mystr.Replace(TEXT(&amp;quot;fromtext&amp;quot;), *to);  (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.ReplaceSubString(search, replace) -&amp;gt; mystr = mystr.Replace(search, replace) (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.ReplaceAll(search, replace) -&amp;gt; mystr = mystr.Replace(search, replace) (NOTE the assignment in UE)&lt;br /&gt;
&lt;br /&gt;
csString.Slice(5) -&amp;gt; FString.RightChop(5); if there is only one parameter CS assumes the second to be -1, so the end of the string&lt;br /&gt;
&lt;br /&gt;
csString.Slice(0,5) -&amp;gt; mystr = FString.Left(5);&lt;br /&gt;
&lt;br /&gt;
csString.Slice(a,b) -&amp;gt; mystr = FString.Mid(a,b);&lt;br /&gt;
&lt;br /&gt;
csString.Split(csStringArray&amp;amp; arr, char delim) -&amp;gt; FString.ParseIntoArray(arr,TEXT(&amp;quot;.&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
csString resp.SubString(saySegment,start,numchars); -&amp;gt; FString saySegment = resp.Mid(start, numchars);&lt;br /&gt;
&lt;br /&gt;
csString resp.SubString(saySegment,start); -&amp;gt; FString saySegment = resp.RightChop(start);&lt;br /&gt;
&lt;br /&gt;
csString response.StartsWith(&amp;quot;&amp;lt;Examine&amp;gt;&amp;quot;, true) -&amp;gt; response.StartsWith(&amp;quot;&amp;lt;Examine&amp;gt;&amp;quot;, ESearchCase::IgnoreCase) (true ignore case, false case sensitive)&lt;br /&gt;
&lt;br /&gt;
csString.RTrim() -&amp;gt; FString.TrimTrailing()&lt;br /&gt;
&lt;br /&gt;
csString xxx = mystring.Trim() -&amp;gt; FString.TrimStartAndEnd() (this one does NOT change the string in place)&lt;br /&gt;
&lt;br /&gt;
csString : mystring.Trim() -&amp;gt; FString.TrimStartAndEndInline() (this one changes the string in place)&lt;br /&gt;
&lt;br /&gt;
csString.Truncate(5) -&amp;gt; FString.Left(5)&lt;br /&gt;
&lt;br /&gt;
csString.Upcase() -&amp;gt; FString.ToUpper()&lt;br /&gt;
&lt;br /&gt;
const char *myData = str-&amp;gt;GetData(); -&amp;gt; TArray&amp;lt;TCHAR&amp;gt; myData = str.GetCharArray();&lt;br /&gt;
&lt;br /&gt;
psString.GetLine()  scr.GetLine(start,line); -&amp;gt; line = StrUtils::GetLine(scr,start);&lt;br /&gt;
&lt;br /&gt;
=== Functions other types ===&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;GetRandom() provides a number between 0.0 and 1.0 -&amp;gt; FMath::FRandRange(0.0, 1.0)&lt;br /&gt;
&lt;br /&gt;
csRandomGen.Get() -&amp;gt; FMath::FRandRange(0.0, 1.0)&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;GetRandom(limit) -&amp;gt; provides a number between 0.0 and limit -&amp;gt; FMath::FRandRange(0.0, limit) If provided with float it returns a float, if int then returns int.&lt;br /&gt;
&lt;br /&gt;
csPDelArray.GetSize() -&amp;gt; TArray.Num()&lt;br /&gt;
&lt;br /&gt;
csPDelArray.Push() -&amp;gt; TArray.Add()&lt;br /&gt;
&lt;br /&gt;
csArray.Delete(item) -&amp;gt; TArray.Remove(item)&lt;br /&gt;
&lt;br /&gt;
csArray.DeleteAll() -&amp;gt; TArray.Empty()&lt;br /&gt;
&lt;br /&gt;
csArray.DeleteIndex(i) -&amp;gt; TArray.RemoveAt(i)&lt;br /&gt;
&lt;br /&gt;
csArray.DeleteIndexFast(i) -&amp;gt; TArray.RemoveAt(i)&lt;br /&gt;
&lt;br /&gt;
csArray.Extract(index) -&amp;gt; item = TArray[index]; TArray.RemoveAt(index);&lt;br /&gt;
&lt;br /&gt;
csArray.FindStr(&amp;quot;str&amp;quot;, start) -&amp;gt; end = StrUtils::FindStr(words, &amp;quot;str&amp;quot;, start);&lt;br /&gt;
&lt;br /&gt;
csArray.FormatPush(&amp;quot;%d&amp;quot;,i); -&amp;gt; TArray.Add(FString::Printf(TEXT(&amp;quot;%d&amp;quot;,i));&lt;br /&gt;
&lt;br /&gt;
csArray.GetSize() -&amp;gt; TArray.Num();&lt;br /&gt;
&lt;br /&gt;
csArray myarray.Merge(otherArray) -&amp;gt; TArray.Append(otherArray) &lt;br /&gt;
&lt;br /&gt;
csArray myarray.Get(0) -&amp;gt; TArray myarray[0]&lt;br /&gt;
&lt;br /&gt;
csArray.Insert(index, item) -&amp;gt; TArray.Insert(item, index); (note switch of order)&lt;br /&gt;
&lt;br /&gt;
csArray.InsertSorted(item) -&amp;gt; TArray.Add(item); TArray.Sort();&lt;br /&gt;
&lt;br /&gt;
csArray.IsEmpty() -&amp;gt; TArray.Num()==0&lt;br /&gt;
&lt;br /&gt;
csArray.PushSmart(item) -&amp;gt; int found = TArray.Find(item); if (found == INDEX_NONE) TArray.Add(item);&lt;br /&gt;
&lt;br /&gt;
csArray.Put(index, item) -&amp;gt; TArray.RemoveAt(index); TArray.Insert(item, index); (note switch of order)&lt;br /&gt;
&lt;br /&gt;
csArray.ShrinkBestFit() -&amp;gt; TArray.Shrink();&lt;br /&gt;
&lt;br /&gt;
csArray.SplitString(str, &#039;,&#039;) -&amp;gt; str.ParseIntoArray(array, TEXT(&amp;quot;,&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
csArrayItemNotFound -&amp;gt; INDEX_NONE&lt;br /&gt;
&lt;br /&gt;
csList.Delete(node) -&amp;gt; TDoubleLinkedList.RemoveNode(node)&lt;br /&gt;
&lt;br /&gt;
csList.DeleteAll() -&amp;gt; TDoubleLinkedList.Empty()&lt;br /&gt;
&lt;br /&gt;
csList.Front() -&amp;gt; TDoubleLinkedList.GetHead()&lt;br /&gt;
&lt;br /&gt;
csList.IsEmpty() -&amp;gt; TDoubleLinkedList.Num()==0&lt;br /&gt;
&lt;br /&gt;
csList.PushBack() -&amp;gt; TDoubleLinkedList.AddTail() adds an element at the end of the list&lt;br /&gt;
&lt;br /&gt;
csList.PushFront() -&amp;gt; TDoubleLinkedList.AddHead() adds an element at the beginning of the list&lt;br /&gt;
&lt;br /&gt;
csList attackList.PopFront() -&amp;gt; attackList.RemoveNode(attackList.GetHead()); deletes an element at the beginning&lt;br /&gt;
&lt;br /&gt;
csList attackList.Pop() -&amp;gt; attackList.RemoveNode(attackList.GetTail()); deletes an element at the end of the list&lt;br /&gt;
&lt;br /&gt;
csList values.PopBack() -&amp;gt; values.RemoveNode(values.GetTail());  Deletes the last element of the list&lt;br /&gt;
&lt;br /&gt;
  for(csList&amp;lt;psItem*&amp;gt;::Iterator newitemitr(newitem); newitemitr.HasNext();) -&amp;gt; &lt;br /&gt;
&lt;br /&gt;
  TDoubleLinkedList&amp;lt;ApsItem*&amp;gt;::TIterator i(itemlist.GetHead());&lt;br /&gt;
  while (i) { ....}&lt;br /&gt;
&lt;br /&gt;
csHash.Delete(id, item) -&amp;gt; If not using multimap then TMap.Remove(id);&lt;br /&gt;
&lt;br /&gt;
csHash.DeleteAll() -&amp;gt; TMap.Empty()&lt;br /&gt;
&lt;br /&gt;
csHash.DeleteAll(name) -&amp;gt; If used as TMap (meaning no duplicate keys -&amp;gt; TMap.Remove(name)&lt;br /&gt;
&lt;br /&gt;
csHash.Get(key,fallback) -&amp;gt; TMap.FindRef(key)&lt;br /&gt;
&lt;br /&gt;
csHash.GetAll(key)  example: channelSubscribers.GetAll(key) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    TArray&amp;lt;uint32_t&amp;gt; subscribers;&lt;br /&gt;
    channelSubscribers.GetKeys(subscribers);&lt;br /&gt;
    for(size_t i = 0; i &amp;lt; subscribers.Num(); i++)&lt;br /&gt;
    {&lt;br /&gt;
        // filter subscribers by given channelID&lt;br /&gt;
        if (subscribers[i] == channelID) {&lt;br /&gt;
&lt;br /&gt;
csHash.GetElementPointer(name) -&amp;gt; TMap.Find(name);&lt;br /&gt;
&lt;br /&gt;
csHash.GetSize() -&amp;gt; TMap.Num();&lt;br /&gt;
&lt;br /&gt;
csHash.In() -&amp;gt; TMap.Contains()&lt;br /&gt;
&lt;br /&gt;
CS::IsNaN() -&amp;gt; isnan()&lt;br /&gt;
&lt;br /&gt;
csHash.Put(value, key) -&amp;gt; TMap.Add(value, key) (NOTE NO swap of parameters)&lt;br /&gt;
&lt;br /&gt;
csHash.PutUnique() -&amp;gt; TMap.Add() (we should test if this is ok)&lt;br /&gt;
&lt;br /&gt;
csHash&amp;lt;FactionStanding*, int&amp;gt;::GlobalIterator iter(factionstandings.GetIterator()); -&amp;gt; TMap&amp;lt;int, FactionStanding*&amp;gt;::TIterator iter = factionstandings.CreateIterator();&lt;br /&gt;
&lt;br /&gt;
csHash if(iter.HasNext()) -&amp;gt; if(iter)&lt;br /&gt;
&lt;br /&gt;
csHash iter.Next() -&amp;gt; iter.Value(); iter++;&lt;br /&gt;
&lt;br /&gt;
csGetTicks() -&amp;gt; time(0)  Need to #include &amp;lt;ctime&amp;gt;&lt;br /&gt;
&lt;br /&gt;
csMax(a, b); -&amp;gt; a &amp;gt; b ? a : b;&lt;br /&gt;
&lt;br /&gt;
csMin(a, b); -&amp;gt; a &amp;lt; b ? a : b;&lt;br /&gt;
&lt;br /&gt;
csQsqrt(x) -&amp;gt; FMath::Sqrt(x)&lt;br /&gt;
&lt;br /&gt;
csSet.Add() -&amp;gt; TArray.AddUnique();&lt;br /&gt;
&lt;br /&gt;
csSquaredDist::PointLine() -&amp;gt; psPath::DistPointLine&lt;br /&gt;
&lt;br /&gt;
csStringArray.FindCaseInsensitive() -&amp;gt; Find (but is case sensitive).... no solution atm&lt;br /&gt;
&lt;br /&gt;
csTuple.first -&amp;gt; TPair.Key&lt;br /&gt;
&lt;br /&gt;
csTuple.second -&amp;gt; TPair.Value&lt;br /&gt;
&lt;br /&gt;
csVector.Norm() -&amp;gt; FVector.Size() calculates the magnitude/norm of the vector.&lt;br /&gt;
&lt;br /&gt;
csVector.SquaredNorm() -&amp;gt; FVector.SizeSquared()&lt;br /&gt;
&lt;br /&gt;
csVector v1 * v2 -&amp;gt; FVector::DotProduct(v1,v2)&lt;br /&gt;
&lt;br /&gt;
csVector.Unit() -&amp;gt; FVector.GetSafeNormal()&lt;br /&gt;
&lt;br /&gt;
output.Insert(0, time_buffer) -&amp;gt; output.InsertAt(0, time_buffer)&lt;br /&gt;
&lt;br /&gt;
output.GetAt(output.Length()-1) -&amp;gt; output [ output.Len()-1 ]&lt;br /&gt;
&lt;br /&gt;
Cross platform types are defined in Platform.h , like uint32. Those can be included with #include &amp;quot;EngineMinimal.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CS_ASSERT() -&amp;gt; check()&lt;br /&gt;
&lt;br /&gt;
CS_ASSERT_MSG() -&amp;gt; checkf(expr, TEXT(&amp;quot;%s caused the error&amp;quot;), str);&lt;br /&gt;
&lt;br /&gt;
strcasecmp and strcmp, I added those two defines, so the code can stay as it is&lt;br /&gt;
&lt;br /&gt;
  #define strcasecmp(expr1,expr2) FCString::Strcmp( ANSI_TO_TCHAR(expr1), ANSI_TO_TCHAR(expr2)) == 0&lt;br /&gt;
  #define strcmp(expr1,expr2) FCString::Stricmp( ANSI_TO_TCHAR(expr1), ANSI_TO_TCHAR(expr2)) == 0&lt;br /&gt;
&lt;br /&gt;
time(NULL) -&amp;gt; FString buf = FDateTime().GetDate().ToString();&lt;br /&gt;
&lt;br /&gt;
toString(pos) -&amp;gt; StrUtils::toString(pos);&lt;br /&gt;
&lt;br /&gt;
toString(pos, sector) -&amp;gt; StrUtils::toString(pos, sector);&lt;br /&gt;
&lt;br /&gt;
csArray&amp;lt;csString&amp;gt; splitTarget = psSplit(target, &#039;:&#039;); -&amp;gt; TArray&amp;lt;FString&amp;gt; splitTarget; target.ParseIntoArray(splitTarget, TEXT(&amp;quot;:&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
WordArray.GetInt(1) -&amp;gt; FCString::Atoi(*myarray[1])&lt;br /&gt;
&lt;br /&gt;
WordArray.GetFloat(1) -&amp;gt; FCString::Atof(*myarray[1])&lt;br /&gt;
&lt;br /&gt;
WordArray.GetString(2, str) -&amp;gt; FString str = TArray[2]&lt;br /&gt;
&lt;br /&gt;
WordArray.GetTail(1) -&amp;gt; StrUtils::GetTail(words, 1)&lt;br /&gt;
&lt;br /&gt;
WordArray.GetWords(2, 5) -&amp;gt; StrUtils::GetWords(words, 2, 5)&lt;br /&gt;
&lt;br /&gt;
PI -&amp;gt; PI&lt;br /&gt;
&lt;br /&gt;
TWO_PI -&amp;gt; TWO_PI (added to PSUnreal.h)&lt;br /&gt;
&lt;br /&gt;
Result result(db-&amp;gt;Select(&amp;quot;&amp;quot;)) -&amp;gt; Result result(db-&amp;gt;Query(&amp;quot;&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
result[0].GetUInt32(0); -&amp;gt; result[0].GetInt(0);&lt;br /&gt;
&lt;br /&gt;
client-&amp;gt;GetClientNum() -&amp;gt; client-&amp;gt;GetUniqueID() need to check if this is ok, documentation says the ID lives until the actor lives.&lt;br /&gt;
&lt;br /&gt;
  psserver-&amp;gt;GetConnections()-&amp;gt;Find  -&amp;gt; becomes (to be tested)&lt;br /&gt;
  FConstPlayerControllerIterator iter = actor-&amp;gt;GetWorld()-&amp;gt;GetPlayerControllerIterator();&lt;br /&gt;
  while(iter)&lt;br /&gt;
  {&lt;br /&gt;
     APlayerController* client = *iter;&lt;br /&gt;
     ApsCharacter *actor = (ApsCharacter*)client-&amp;gt;GetPawn();&lt;br /&gt;
&lt;br /&gt;
gemObject.GetPosition(pos, sector) -&amp;gt; ApsCharacter.GetActorLocation()&lt;br /&gt;
&lt;br /&gt;
gemActor.RangeTo(gemActor) -&amp;gt; ApsCharacter.GetDistanceTo(ApsCharacter)&lt;br /&gt;
&lt;br /&gt;
EscpXML(string) -&amp;gt; StrUtils::EscpXML(string)&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;CheckAccess() -&amp;gt; cacheManager-&amp;gt;GetCommandManager()-&amp;gt;CheckAccess()&lt;br /&gt;
&lt;br /&gt;
cel-&amp;gt;FindPlayerEntity(pid) -&amp;gt; ((APlaneshiftBaseGameMode*)GetWorld()-&amp;gt;GetAuthGameMode())-&amp;gt;FindPlayerEntity(pid);&lt;br /&gt;
&lt;br /&gt;
gem-&amp;gt;FindNearbyEntities(iSec, pos, 0, range); -&amp;gt; ((APlaneshiftBaseGameMode*)GetWorld()-&amp;gt;GetAuthGameMode())-&amp;gt;FindNearbyEntities(iSec, pos, 0, range);&lt;br /&gt;
&lt;br /&gt;
gemSupervisor-&amp;gt;FindObject(containerID) -&amp;gt; ((APlaneshiftBaseGameMode*)GetWorld()-&amp;gt;GetAuthGameMode())-&amp;gt;FindObject(containerID)&lt;br /&gt;
&lt;br /&gt;
=== Logging and Error Messages ===&lt;br /&gt;
&lt;br /&gt;
Verbosity levels:&lt;br /&gt;
* Fatal: Always prints s fatal error to console (and log file) and crashes (even if logging is disabled)&lt;br /&gt;
* Error: Prints an error to console (and log file)&lt;br /&gt;
* Warning: Prints a warning to console (and log file)&lt;br /&gt;
* Display: Prints a message to console (and log file)&lt;br /&gt;
* Log: Prints a message to a log file (does not print to console)&lt;br /&gt;
* Verbose: Prints a verbose message to a log file (if Verbose logging is enabled for the given category)&lt;br /&gt;
&lt;br /&gt;
CPrintf(CON_CMDOUTPUT,str.GetDataSafe()); -&amp;gt; UE_LOG(LogTemp, Warning, TEXT(&amp;quot;%s&amp;quot;), str);&lt;br /&gt;
&lt;br /&gt;
CPrintf(CON_CMDOUTPUT,&amp;quot;name: %s&amp;quot;,str.GetDataSafe()); -&amp;gt; UE_LOG(LogTemp, Warning, TEXT(&amp;quot;name: %s&amp;quot;), str);&lt;br /&gt;
&lt;br /&gt;
CPrintf(CON_ERROR, &amp;quot;psItemStats::GetProperty(%s) failed\n&amp;quot;,ptr); -&amp;gt; UE_LOG(LogTemp, Error, TEXT(&amp;quot;psItemStats::GetProperty(%s) failed\n&amp;quot;),ptr);&lt;br /&gt;
&lt;br /&gt;
Notify3(LOG_SPAWN,&amp;quot;Spawning item (%u) in %d &amp;quot;,item-&amp;gt;GetItemID(),triggerticks -csGetTicks()); -&amp;gt; UE_LOG(LogSpawn, Warning, TEXT(&amp;quot;psItemStats::GetProperty(%s) failed\n&amp;quot;),ptr);&lt;br /&gt;
&lt;br /&gt;
Debug3(LOG_ITEM, 0, &amp;quot;Set location in parent %d for %u&amp;quot;, location, GetUID()); -&amp;gt; UE_LOG(LogTemp, Log, TEXT(&amp;quot;psItemStats::GetProperty(%s) failed\n&amp;quot;),ptr);&lt;br /&gt;
&lt;br /&gt;
Error3(&amp;quot;Failed to insert trait &#039;%s&#039;.\n&amp;quot;,t-&amp;gt;name.GetData()); -&amp;gt; UE_LOG(LogTemp, Error, TEXT(&amp;quot;Failed to insert trait &#039;%s&#039; into location table for race %d.\n&amp;quot;), t-&amp;gt;name, t-&amp;gt;raceID);&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;SendSystemError(...) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            FString msg = FString::Printf(TEXT(&amp;quot;You can&#039;t pick up %s.&amp;quot;), *GetName());&lt;br /&gt;
            actor-&amp;gt;ReceiveSystemMessage(msg, ESystemMessageType::MSG_ERROR);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;SendSystemInfo(...) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            FString msg = FString::Printf(TEXT(&amp;quot;You can&#039;t pick up %s.&amp;quot;), *GetName());&lt;br /&gt;
            actor-&amp;gt;ReceiveSystemMessage(msg, ESystemMessageType::MSG_INFO);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;SendSystemOK(...); -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            FString msg = FString::Printf(TEXT(&amp;quot;You can&#039;t pick up %s.&amp;quot;), *GetName());&lt;br /&gt;
            actor-&amp;gt;ReceiveSystemMessage(msg, ESystemMessageType::MSG_OK);&lt;br /&gt;
&lt;br /&gt;
psserver-&amp;gt;SendSystemResult(...); -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            FString msg = FString::Printf(TEXT(&amp;quot;You can&#039;t pick up %s.&amp;quot;), *GetName());&lt;br /&gt;
            actor-&amp;gt;ReceiveSystemMessage(msg, ESystemMessageType::MSG_RESULT);&lt;br /&gt;
&lt;br /&gt;
=== FText and Localization ===&lt;br /&gt;
&lt;br /&gt;
FText is Unreal&#039;s class for user viewable strings. It is localizable. See https://docs.unrealengine.com/latest/INT/Programming/UnrealArchitecture/StringHandling/FText/index.html&lt;br /&gt;
&lt;br /&gt;
=== XML parsing ===&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;XmlParser.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
iDocumentNode -&amp;gt; FXmlNode&lt;br /&gt;
&lt;br /&gt;
    csRef&amp;lt;iDocument&amp;gt; doc=xml-&amp;gt;CreateDocument();&lt;br /&gt;
    const char* error =doc-&amp;gt;Parse(buff);&lt;br /&gt;
&lt;br /&gt;
becomes&lt;br /&gt;
&lt;br /&gt;
    FXmlFile File(FPaths::GameDir() + FString(PHONICS_LIST));&lt;br /&gt;
    FXmlNode* root = File.GetRootNode();&lt;br /&gt;
&lt;br /&gt;
if its parsing a string and not a file, script is an FString&lt;br /&gt;
&lt;br /&gt;
    FXmlFile File(script, EConstructMethod::ConstructFromBuffer);&lt;br /&gt;
    FXmlNode* root = File.GetRootNode();&lt;br /&gt;
&lt;br /&gt;
Finding a specific child node: root-&amp;gt;GetNode(&amp;quot;FAMILY_NAME&amp;quot;); -&amp;gt; FXmlNode *familyName = root-&amp;gt;FindChildNode(&amp;quot;FAMILY_NAME&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    csRef&amp;lt;iDocumentNodeIterator&amp;gt; iter = attitudeNode-&amp;gt;GetNodes(&amp;quot;response&amp;quot;); -&amp;gt; &lt;br /&gt;
&lt;br /&gt;
    TArray&amp;lt;FXmlNode *&amp;gt; responses = attitudeNode-&amp;gt;GetChildrenNodes();&lt;br /&gt;
    for (int i = 0; i &amp;lt; responses.Num(); i++)&lt;br /&gt;
        {&lt;br /&gt;
        FXmlNode *responseNode = responses[i];&lt;br /&gt;
        if (responseNode-&amp;gt;GetTag().Equals(&amp;quot;response&amp;quot;)) {&lt;br /&gt;
&lt;br /&gt;
csRef&amp;lt;iDocumentNodeIterator&amp;gt; iter = topNode-&amp;gt;GetNodes(); -&amp;gt; TArray&amp;lt;FXmlNode*&amp;gt; arr = topNode-&amp;gt;GetChildrenNodes(); TArray&amp;lt;FXmlNode*&amp;gt;::TIterator iter = arr.CreateIterator();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
csRef&amp;lt;iDocumentAttributeIterator&amp;gt; it = top-&amp;gt;GetAttributes(); -&amp;gt; TArray&amp;lt;FXmlAttribute&amp;gt; attrs = top-&amp;gt;GetAttributes(); for (int i=0;attrs.Num();i++)&lt;br /&gt;
&lt;br /&gt;
csString skillName  = tmp-&amp;gt;GetAttributeValue(&amp;quot;name&amp;quot;); -&amp;gt;  tmp-&amp;gt;GetAttribute(&amp;quot;name&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
float value = children[i]-&amp;gt;GetAttributeValueAsFloat(&amp;quot;value&amp;quot;); -&amp;gt; float value = FCString::Atof(*children[i]-&amp;gt;GetAttribute(&amp;quot;value&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
int cstr_id_material = node-&amp;gt;GetAttributeValueAsInt( &amp;quot;mesh&amp;quot; ); -&amp;gt; int cstr_id_material = FCString::Atoi(*node-&amp;gt;GetAttribute(&amp;quot;mesh&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
bool includeInventory = topNode-&amp;gt;GetAttributeValueAsBool(&amp;quot;inventory&amp;quot;, false); -&amp;gt; bool includeInventory = topNode-&amp;gt;GetAttribute(&amp;quot;inventory&amp;quot;).Equals(&amp;quot;true&amp;quot;) ? 1 : 0;&lt;br /&gt;
&lt;br /&gt;
id = node-&amp;gt;GetContentsValueAsInt(); -&amp;gt; id = FCString::Atoi(*node-&amp;gt;GetContent());&lt;br /&gt;
&lt;br /&gt;
meshname = node-&amp;gt;GetContentsValue(); -&amp;gt; meshname = node-&amp;gt;GetContent();&lt;br /&gt;
&lt;br /&gt;
posx = node-&amp;gt;GetContentsValueAsFloat(); -&amp;gt; posx = FCString::Atof(*node-&amp;gt;GetContent());&lt;br /&gt;
&lt;br /&gt;
node-&amp;gt;GetValue() -&amp;gt; node-&amp;gt;GetTag() if applied to an element.&lt;br /&gt;
&lt;br /&gt;
=== Platform specific includes ===&lt;br /&gt;
&lt;br /&gt;
If you want to include some code for a specific platform you can use:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#ifdef PLATFORM_WINDOWS&lt;br /&gt;
your stuff here&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Converting psMessages ===&lt;br /&gt;
&lt;br /&gt;
PlaneShift code is heavily based on messages send from client to server and viceversa. The typical way to communicate is to create a message and send it. Messages are specific classes, example:&lt;br /&gt;
&lt;br /&gt;
  class psCharDeleteMessage : public psMessageCracker&lt;br /&gt;
  {&lt;br /&gt;
  public:&lt;br /&gt;
      psCharDeleteMessage(const char* charNameToDel, uint32_t clientNum);&lt;br /&gt;
      psCharDeleteMessage(MsgEntry* message);&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To convert the messages we use [https://wiki.unrealengine.com/RPC_Client_Server_Messages_Example this technique]&lt;br /&gt;
&lt;br /&gt;
When we have a SystemMessage like this:&lt;br /&gt;
   psSystemMessage newmsg(GetUniqueID(), ESystemMessageType::MSG_INFO_BASE, &amp;quot;%s dropped %s.&amp;quot;, *fullName, *item-&amp;gt;GetQuantityName());&lt;br /&gt;
   newmsg.Multicast(GetMulticastClients(), 0, RANGE_TO_SELECT);&lt;br /&gt;
&lt;br /&gt;
should be changed to :&lt;br /&gt;
&lt;br /&gt;
    FString msg = FString::Printf(TEXT(&amp;quot;%s dropped %s.&amp;quot;), *fullName, *item-&amp;gt;GetQuantityName());&lt;br /&gt;
    pawn-&amp;gt;Multicast(msg, ESystemMessageType::MSG_INFO_BASE, false, RANGE_TO_SELECT);&lt;br /&gt;
&lt;br /&gt;
=== Converting CS coordinates to UE coordinates ===&lt;br /&gt;
&lt;br /&gt;
Note that converted values can throw off up to around 500.&lt;br /&gt;
&lt;br /&gt;
    UEX = 203200 + csX * 100&lt;br /&gt;
    UEY =-329500 - csY * 100&lt;br /&gt;
    UEZ = 10400  + csZ * 100&lt;/div&gt;</summary>
		<author><name>JeHugawa</name></author>
	</entry>
</feed>