public static string UpdateTransFormHolder(string roomKey, string userGuid, TransFormHolder transformHolder, SceneAction action, string userPosStr, PostI post, int Timezone_Offset, List <ServerObjectTransform> sot) { lock (thisLock) { Dictionary <string, TransFormHolder> tList = null; if (!TransFormDict.TryGetValue(roomKey, out tList)) { tList = new Dictionary <string, TransFormHolder>(); } foreach (var item in tList.Where(kvp => kvp.Value.TimeStamp < DateTime.Now.AddSeconds(-4)).ToList()) { tList.Remove(item.Key); } //check idlecount if (tList.ContainsKey(userGuid)) { var lastTransform = tList[userGuid]; if (lastTransform != null && lastTransform.Rotation == transformHolder.Rotation) { transformHolder.IdleCount = lastTransform.IdleCount + 1; } } tList[userGuid] = transformHolder; TransFormDict[roomKey] = tList; ActionHolder ah = null; ah = UpdateActionsHolder(roomKey, userGuid, action); List <ServerObjectTransform> sotRes = HandleServerObjects(roomKey, userGuid, sot); SlmControls.Vector3 userPos = SlmControls.Vector3.FromString(userPosStr); return(MakeXml(tList, ah, userPos, post, Timezone_Offset, sotRes)); } }
public static void AppendCloseByUsers(StringBuilder sb, Dictionary <string, TransFormHolder> tList, SlmControls.Vector3 userPos, double mindistance, double maxdistance, ref int counter) { foreach (var i in tList) { string pos = i.Value.Position; SlmControls.Vector3 posv = SlmControls.Vector3.FromString(pos); if (posv != null) { var dist = SlmControls.Vector3.Distance(posv, userPos); if (dist >= mindistance && dist < maxdistance) { AppendUser(sb, i.Key, i.Value); counter++; if (counter > maxUsers) { return; } } } } }
public static string MakeXml(Dictionary <string, TransFormHolder> tList, ActionHolder actionHolder, SlmControls.Vector3 userPos, PostI post, int Timezone_Offset, List <ServerObjectTransform> sotRes) { StringBuilder sb = new StringBuilder(); sb.Append("<?xml version='1.0' encoding='utf-8'?>"); sb.Append("<ro>"); int counter = 0; if (tList != null) { if (tList.Count <= maxUsers || userPos == null) { foreach (var i in tList) { AppendUser(sb, i.Key, i.Value); if (counter > maxUsers) { break; } } } else { AppendCloseByUsers(sb, tList, userPos, 0, 2, ref counter); if (counter < maxUsers) { AppendCloseByUsers(sb, tList, userPos, 2, 4, ref counter); } if (counter < maxUsers) { AppendCloseByUsers(sb, tList, userPos, 4, 10, ref counter); } } if (actionHolder != null && actionHolder.Actions.Count > 0) { sb.Append("<ah>"); foreach (var act in actionHolder.Actions) { sb.Append("<ac>"); sb.Append("<n>"); sb.Append(act.GoName); sb.Append("</n>"); sb.Append("<t>"); sb.Append(act.SceneTime.ToString()); sb.Append("</t>"); sb.Append("</ac>"); } sb.Append("</ah>"); } if (post != null) { sb.Append("<p>"); sb.Append("<dt>"); sb.Append(((DateTime)post.CreationDate).AddHours(Timezone_Offset));//.ToString("yyyy-mm-dd HH:mm") sb.Append("</dt>"); sb.Append("<t>"); sb.Append(post.Text); sb.Append("</t>"); sb.Append("<n>"); sb.Append(post.NickName); sb.Append("</n>"); sb.Append("<g>"); sb.Append(post.Guid); sb.Append("</g>"); sb.Append("</p>"); } if (sotRes != null) { sb.Append("<sol>"); foreach (var t in sotRes) { if (!string.IsNullOrWhiteSpace(t.Guid)) { sb.Append("<so>"); sb.Append("<ug>"); sb.Append(t.UserGuid); sb.Append("</ug>"); sb.Append("<g>"); sb.Append(t.Guid); sb.Append("</g>"); sb.Append("<p>"); if (t.Position != null) { sb.Append(t.Position.ToString()); } sb.Append("</p>"); sb.Append("<r>"); if (t.Rotation != null) { sb.Append(t.Rotation.ToString()); } sb.Append("</r>"); sb.Append("<v>"); if (t.Velocity != null) { sb.Append(t.Velocity.ToString()); } sb.Append("</v>"); sb.Append("<av>"); if (t.Velocity != null) { sb.Append(t.AngularVelocity.ToString()); } sb.Append("</av>"); sb.Append("</so>"); } } sb.Append("</sol>"); } } //if (kbText != null) //{ // sb.Append("<kb>"); // sb.Append(kbText); // sb.Append("</kb>"); //} sb.Append("</ro>"); return(sb.ToString()); }