/*
Thor Server Project
Copyright 2008 Joe Hegarty
This file is part of The Thor Server Project.
The Thor Server Project is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The Thor Server Project is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with The Thor Server Project. If not, see .
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ThorServer.Utilities;
using ThorServer.Core;
using ThorServer.Game.Rooms.Interactor;
namespace ThorServer.Game.Rooms
{
public partial class RoomInstance
{
private ClientMessage mMessage = new ClientMessage();
public void SendUserList(long sessionId)
{
if (mRoomUsers != null && mRoomUsers.Count > 0)
{
Dictionary.Enumerator myEnum = mRoomUsers.GetEnumerator();
while (myEnum.MoveNext())
{
if (myEnum.Current.Value != null)
{
mMessage.Init(28); //@\
mMessage.appendString(GetUserEntryPacket(myEnum.Current.Key));
SendMessage(mMessage, sessionId);
}
}
}
else
{
mMessage.Init(28); //@\
SendMessage(mMessage, sessionId);
}
}
private string GetUserEntryPacket(long sessionId)
{
StringBuilder sb = new StringBuilder();
RoomUser nUser = mRoomUsers[sessionId];
if (nUser != null)
{
sb.Append("i:" + nUser.RoomUserID + Convert.ToChar(13));
sb.Append("n:" + nUser.UserInfo.sUsername + Convert.ToChar(13));
sb.Append("f:" + nUser.UserInfo.sFigure + Convert.ToChar(13));
sb.Append("l:" + nUser.CurrentX + " " + nUser.CurrentY + " " + nUser.CurrentZ + Convert.ToChar(13));
sb.Append("s:" + nUser.UserInfo.sSex + Convert.ToChar(13));
sb.Append("c:" + nUser.UserInfo.sMission + Convert.ToChar(13));
if (nUser.UserInfo.sBadge != "")
{
sb.Append("b:" + nUser.UserInfo.sBadge + Convert.ToChar(13));
}
if (RoomInfo.ReactorType == "PoolReactor" || RoomInfo.ReactorType == "LidoReactor" || RoomInfo.ReactorType == "RooftopReactor")
{
if (nUser.UserInfo.sPoolFigure != "")
{
sb.Append("p:" + nUser.UserInfo.sPoolFigure);
}
}
}
return sb.ToString();
}
public void AnnounceUser(long sessionId)
{
ClientMessage mMessage = new ClientMessage();
string pBody = GetUserEntryPacket(sessionId);
mMessage.Init(28); //@\
mMessage.appendString(pBody);
RoomBroadcast(mMessage);
AnnounceUserStatus(sessionId, true);
}
public void AnnounceUserStatus(long sessionId, bool forceUpdate)
{
string pStatus = BuildUserStatus(sessionId, forceUpdate);
if (pStatus != null)
{
mMessage.Init(34); //@b
mMessage.appendString(pStatus);
RoomBroadcast(mMessage);
}
}
private void SendUserStatus(long sessionId, bool forceUpdate, long sendTo)
{
string pStatus = BuildUserStatus(sessionId, forceUpdate);
if (pStatus != null)
{
mMessage.Init(34); //@b
mMessage.appendString(pStatus);
SendMessage(mMessage, sendTo);
}
}
public void RemoveUniqueStatuses(long sessionId, string exceptions)
{
string[] remove = "dance,wave,carryd,swim".Split(',');
string[] exception = exceptions.Split(',');
foreach (string removeThis in remove)
{
bool isAllowed = false;
foreach (string removeException in exception)
{
if (removeThis == removeException)
{
isAllowed = true;
}
}
if (!isAllowed)
{
RemoveUniqueStatus(sessionId, removeThis);
}
}
}
public void RemoveUniqueStatus(long sessionId, string status)
{
RoomUser user = GetUser(sessionId);
if (user != null)
{
if (user.SpecialStates.ContainsKey(status))
{
user.SpecialStates.Remove(status);
}
user.MustUpdate = true;
}
}
public bool HasUniqueStatus(long sessionId, string status)
{
RoomUser user = GetUser(sessionId);
return user.SpecialStates.ContainsKey(status);
}
public void MakeTalk(long sessionId, string chat)
{
RemoveUniqueStatus(sessionId, "talk");
int talkLen = 1;
int numWords = chat.Split(' ').Length;
if (numWords > 1) talkLen = numWords / 2;
if (talkLen > 5) talkLen = 5;
RoomUser user = GetUser(sessionId);
user.SpecialStates.Add("talk", new RoomUser.RoomUserStatus("talk", true, "", talkLen, 0, 0, null, true));
}
public string BuildUserStatus(long sessionID, bool forceRefresh)
{
bool isUpdate = false;
RoomUser nUser = GetUser(sessionID);
StringBuilder postStatus = new StringBuilder();
if (nUser.IsMoving)
{
postStatus.Append("/mv ");
postStatus.Append(nUser.NextX.ToString());
postStatus.Append(",");
postStatus.Append(nUser.NextY.ToString());
postStatus.Append(",");
postStatus.Append(nUser.NextZ.ToString());
}
if (nUser.SpecialStates.Count > 0)
{
Dictionary.Enumerator myEnum = nUser.SpecialStates.GetEnumerator();
List statusesToRemove = new List();
isUpdate = true;
while (myEnum.MoveNext())
{
if (myEnum.Current.Value.IsStillValid())
{
if (myEnum.Current.Value.IsVisible)
{
if ((nUser.IsMoving == false) || (nUser.IsMoving && myEnum.Current.Value.CanWalkWithStatus))
{
postStatus.Append("/");
postStatus.Append(myEnum.Current.Value.StatusName);
if (myEnum.Current.Value.CustomData != null)
{
postStatus.Append(" ");
postStatus.Append(myEnum.Current.Value.CustomData);
}
}
else
{
statusesToRemove.Add(myEnum.Current.Key);
}
}
}
else
{
statusesToRemove.Add(myEnum.Current.Key);
}
}
foreach (string delStatus in statusesToRemove)
{
nUser.SpecialStates.Remove(delStatus);
}
}
StringBuilder userStatus = new StringBuilder();
userStatus.Append(nUser.RoomUserID.ToString());
userStatus.Append(" ");
userStatus.Append(nUser.CurrentX);
userStatus.Append(",");
userStatus.Append(nUser.CurrentY);
userStatus.Append(",");
userStatus.Append(nUser.CurrentZ.ToString().Replace(',','.'));
userStatus.Append(",");
userStatus.Append(nUser.HeadDirection);
userStatus.Append(",");
userStatus.Append(nUser.BodyDirection);
userStatus.Append(postStatus);
if (isUpdate || forceRefresh || nUser.MustUpdate)
{
nUser.MustUpdate = false;
string newStatus = userStatus.ToString();
if (newStatus != nUser.LastStatus || forceRefresh)
{
nUser.LastStatus = newStatus;
return newStatus;
}
else
{
return null;
}
}
else
{
return null;
}
}
}
}