using System; using System.Collections.Generic; using System.Text; using CommonLang.Property; using CommonAI.RTS; using CommonLang.Vector; using CommonAI.Zone.Instance; using CommonAI.Zone.Attributes; using CommonAI.Zone.EventTrigger; // __客户端动作__ namespace CommonAI.Zone.ZoneEditor.EventTrigger { [DescAttribute("客户端")] public abstract class ClientAction : AbstractAction { [DescAttribute("发送给谁(为空表示广播)", "发送者")] public UnitValue Sender = new UnitValue.Trigging(); public abstract ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args); override public void DoAction(EventTriggerAdapter api, EventArguments args) { ClientEvent evt = AsEvent(api, args); if (evt != null) { evt.sender = Sender.GetValue(api, args); api.ZoneAPI.queueEvent(evt); } } } [DescAttribute("客户端动作序列", "客户端 - 动作序列")] public class ClientActionQueue : ClientAction { [DescAttribute("序列")] [ListAttribute(typeof(ClientAction))] public List ActionQueue = new List(); public override string ToString() { StringBuilder sb = new StringBuilder("动作序列: "); foreach (ClientAction ca in ActionQueue) { sb.Append(ca.ToString()); if (ActionQueue[ActionQueue.Count - 1] != ca) { sb.Append(" -> "); } } return sb.ToString(); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { ClientEventQueue queue = new ClientEventQueue(); foreach (ClientAction ca in ActionQueue) { ClientEvent evt = ca.AsEvent(api, args); if (evt != null) { queue.EventQueue.Add(evt); } } return queue; } } [DescAttribute("提示玩家显示箭头(CheckPoint)", "客户端")] public class ShowCheckPoint : ClientAction { [DescAttribute("位置")] public PositionValue Position = new PositionValue.VALUE(); public override string ToString() { return string.Format("提示玩家显示箭头到({0})", Position); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { Vector2 pos = Position.GetValue(api, args); if (pos != null) { return new LookAtEvent("", pos.X, pos.Y); } return null; } } [DescAttribute("改变游戏运行速度", "客户端")] public class ChangeTimeScale : ClientAction { [DescAttribute("时间尺度百分比")] public float TimeScalePct = 100f; public override string ToString() { return string.Format("改变游戏运行速度{0}%", TimeScalePct); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new ChangeTimeScaleEvent(TimeScalePct); } } [DescAttribute("暂停游戏", "客户端")] public class GamePause : ClientAction { [DescAttribute("暂停多少秒,如果为0,则无限暂停")] public float Seconds = 0f; public override string ToString() { if (Seconds > 0) { return string.Format("暂停游戏{0}秒", Seconds); } return string.Format("暂停游戏"); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new GamePauseEvent(Seconds); } } [DescAttribute("继续游戏", "客户端")] public class GameResume : ClientAction { public override string ToString() { return string.Format("继续游戏"); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new GameResumeEvent(); } } [DescAttribute("发送消息到客户端", "客户端")] public class GameNotify : ClientAction { [DescAttribute("消息")] public StringValue Message = new StringValue.VALUE(); public override string ToString() { return string.Format("发送消息到客户端:{0}", Message); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new ClientMsgEvent(Message.GetValue(api, args)); } } [DescAttribute("镜头锁定在某处一段时间", "客户端 - 镜头变换")] public class CameraHold : ClientAction { [DescAttribute("位置")] public PositionValue Position = new PositionValue.VALUE(); [DescAttribute("镜头锁定的总时间(毫秒)")] public IntegerValue TotalTimeMS = new IntegerValue.VALUE(1000); public override string ToString() { return string.Format("锁定镜头到({0})持续({1})毫秒", Position, TotalTimeMS); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { Vector2 pos = Position.GetValue(api, args); int timeMS = TotalTimeMS.GetValue(api, args); if (pos != null) { return new CameraHoldEvent(pos.X, pos.Y, timeMS); } return null; } } [DescAttribute("移动镜头到", "客户端 - 镜头变换")] public class CameraMoveTo : ClientAction { [DescAttribute("位置")] public PositionValue Position = new PositionValue.VALUE(); [DescAttribute("相机高度")] public RealValue Height = new RealValue.VALUE(); [DescAttribute("镜头移动速度(每秒距离)")] public float MoveSpeedSec = 1f; public override string ToString() { return string.Format("移动镜头到({0})", Position); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { Vector2 pos = Position.GetValue(api, args); if (pos != null) { return new CameraMoveToEvent(pos.X, pos.Y, Height.GetValue(api,args), MoveSpeedSec, 0); } return null; } } [DescAttribute("移动镜头到(根据时间)", "客户端 - 镜头变换")] public class CameraMoveToByTime : ClientAction { [DescAttribute("位置")] public PositionValue Position = new PositionValue.VALUE(); [DescAttribute("相机高度")] public RealValue Height = new RealValue.VALUE(); [DescAttribute("镜头移动过去的总时间(毫秒)")] public IntegerValue TotalTimeMS = new IntegerValue.VALUE(1000); public override string ToString() { return string.Format("移动镜头到({0})", Position); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { Vector2 pos = Position.GetValue(api, args); int timeMS = TotalTimeMS.GetValue(api, args); if (pos != null) { return new CameraMoveToEvent(pos.X, pos.Y, Height.GetValue(api, args), 0, timeMS); } return null; } } [DescAttribute("锁定镜头到单位", "客户端 - 镜头变换")] public class CameraFocusUnit : ClientAction { [DescAttribute("单位 - 某个单位")] public UnitValue Unit = new UnitValue.Trigging(); public override string ToString() { return string.Format("锁定镜头到({0})", Unit); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { InstanceUnit unit = Unit.GetValue(api, args); if (unit != null) { return new CameraFocusUnitEvent(unit.ID); } return null; } } [DescAttribute("拉近镜头", "客户端 - 镜头变换")] public class CameraZoomTo : ClientAction { [DescAttribute("镜头拉近距离")] public float ZoomDistance = 10f; [DescAttribute("镜头拉近速度(每秒距离)")] public float ZoomSpeedSec = 1f; public override string ToString() { return string.Format("拉近镜头到({0})", ZoomDistance); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new CameraZoomToEvent(ZoomDistance, ZoomSpeedSec); } } [DescAttribute("旋转镜头", "客户端 - 镜头变换")] public class CameraRotateTo : ClientAction { [DescAttribute("镜头旋转角度(0~360)")] public float RotateAngle = 10f; [DescAttribute("镜头旋转速度(每秒角度)")] public float RotateSpeedSec = 1f; public override string ToString() { return string.Format("旋转镜头到({0})", RotateAngle); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new CameraRotateToEvent(RotateAngle, RotateSpeedSec); } } [DescAttribute("重置镜头", "客户端 - 镜头变换")] public class CameraReset : ClientAction { public override string ToString() { return string.Format("重置镜头"); } public override ClientEvent AsEvent(EventTriggerAdapter api, EventArguments args) { return new CameraResetEvent(); } } }