using System;
using System.Data;
using System.Threading;
using System.Collections.Generic;
using Woodpecker.Storage;
using Woodpecker.Specialized.Text;
using Woodpecker.Net.Game.Messages;
using Woodpecker.Game.Items;
using Woodpecker.Game.Items.Pets;
using Woodpecker.Game.Rooms.Units;
using Woodpecker.Game.Rooms.Pathfinding;
namespace Woodpecker.Game.Rooms.Instances.Interaction
{
public partial class flatReactor : roomReactor
{
///
/// 28 - "@\"
///
public void GETDOORFLAT()
{
int itemID = int.Parse(Request.Content);
Session.roomInstance.startTeleporter(Session.ID, itemID);
}
///
/// 81 - "AQ"
///
public void INTODOOR()
{
int itemID = int.Parse(Request.Content);
Session.roomInstance.enterTeleporter(Session.ID, itemID);
}
///
/// 82 - "AR"
///
public void DOORGOIN()
{
int itemID = int.Parse(Request.Content);
if (itemID == Session.authenticatedTeleporter)
Session.roomInstance.broadcoastTeleportActivity(itemID, Session.User.Username, true);
}
}
}
namespace Woodpecker.Game.Rooms.Instances
{
public partial class roomInstance
{
#region Fields
private delegate void teleporterOperation(uint sessionID, int itemID);
#endregion
#region Methods
#region Interaction
public void enterTeleporter(uint sessionID, int itemID)
{
floorItem pItem = this.getFloorItem(itemID);
if (pItem != null && pItem.Definition.Behaviour.isTeleporter) // Valid item
{
roomUser pUser = this.getRoomUser(sessionID);
if (pItem.Rotation == 2 && !(pUser.X == pItem.X + 1 && pUser.Y == pItem.Y))
return; // Invalid position of room user
if (pItem.Rotation == 4 && !(pUser.X == pItem.X && pUser.Y == pItem.Y + 1))
return; // Invalid position of room user
pUser.Path.Clear();
blisterMoleNode pNode = new blisterMoleNode();
pNode.X = pItem.X;
pNode.Y = pItem.Y;
pUser.Path.Add(pNode);
requestStartRoomUnitWalk(pUser.Session.ID, pNode.X, pNode.Y, true);
}
}
public void startTeleporter(uint sessionID, int itemID)
{
new teleporterOperation(this.operateTeleporter).BeginInvoke(sessionID, itemID, null, null);
}
private void operateTeleporter(uint sessionID, int itemID)
{
floorItem pItem = this.getFloorItem(itemID);
if (pItem != null && pItem.Definition.Behaviour.isTeleporter) // Valid item
{
Thread.Sleep(550); // Wait for room worker thread to locate user into teleporter
roomUser pUser = this.getRoomUser(sessionID);
if (pUser != null && pUser.X == pItem.X && pUser.Y == pItem.Y) // In teleporter
{
int roomID = Engine.Game.Items.getTeleporterRoomID(pItem.teleporterID);
if (roomID == 0)
return;
pUser.Clamped = true;
this.broadcoastTeleportActivity(pItem.ID, pUser.Session.User.Username, true);
this.gridUnit[pItem.X, pItem.Y] = false; // Unblock teleporter
if (roomID == this.roomID)
{
Thread.Sleep(500);
floorItem pTeleporter2 = this.getFloorItem(pItem.teleporterID);
pUser.X = pTeleporter2.X;
pUser.Y = pTeleporter2.Y;
pUser.Z = pTeleporter2.Z;
pUser.rotationHead = pTeleporter2.Rotation;
pUser.rotationBody = pTeleporter2.Rotation;
this.gridUnit[pUser.X, pUser.Y] = true; // Block teleporter 2
this.broadcoastTeleportActivity(pTeleporter2.ID, pUser.Session.User.Username, false);
pUser.Clamped = false;
pUser.requiresUpdate = true;
}
else
{
pUser.Session.authenticatedFlat = roomID;
pUser.Session.authenticatedTeleporter = pItem.teleporterID;
serverMessage Message = new serverMessage(62); // "@~"
Message.appendWired(pItem.teleporterID);
Message.appendWired(roomID);
pUser.Session.gameConnection.sendMessage(Message);
}
}
}
}
#endregion
#region Event broadcoasting
public void broadcoastTeleportActivity(int itemID, string Username, bool disappearUser)
{
floorItem pItem = this.getFloorItem(itemID);
if (pItem != null && pItem.Definition.Behaviour.isTeleporter)
{
serverMessage Message = new serverMessage();
if (disappearUser)
Message.Initialize(89); // "AY"
else
Message.Initialize(92); // "A\"
Message.Append(pItem.ID);
Message.Append("/");
Message.Append(Username);
Message.Append("/");
Message.Append(pItem.Definition.Sprite);
this.sendMessage(Message);
}
}
#endregion
#endregion
}
}