using System;
using System.Collections.Generic;
using System.Text;
using CommonLang.IO;
using CommonAI.Zone;
using CommonLang.IO.Attribute;
using CommonAI.Zone.Helper;
using CommonLang;
using CommonAI.Data;
using CommonAI.data;
namespace CommonAI.ZoneClient
{
public static class ClientStruct
{
public struct UnitBuffStatus : IExternalizable
{
public int BuffTemplateID;
public uint SenderID;
public bool IsEquip;
public int TotalTime;
public int PassTime;
public byte OverlayLevel;
public void WriteExternal(IOutputStream output)
{
output.PutS32(BuffTemplateID);
output.PutVU32(SenderID);
output.PutBool(IsEquip);
output.PutVS32(TotalTime);
output.PutVS32(PassTime);
output.PutU8(OverlayLevel);
}
public void ReadExternal(IInputStream input)
{
this.BuffTemplateID = input.GetS32();
this.SenderID = input.GetVU32();
this.IsEquip = input.GetBool();
this.TotalTime = input.GetVS32();
this.PassTime = input.GetVS32();
this.OverlayLevel = input.GetU8();
}
}
public struct UnitSkillStatus : IExternalizable
{
public int SkillTemplateID;
public int PassTime;
public int useTimes;
public void WriteExternal(IOutputStream output)
{
output.PutS32(SkillTemplateID);
output.PutVS32(PassTime);
output.PutS32(useTimes);
}
public void ReadExternal(IInputStream input)
{
this.SkillTemplateID = input.GetS32();
this.PassTime = input.GetVS32();
this.useTimes = input.GetS32();
}
}
public struct UnitItemStatus : IExternalizable
{
public int ItemTemplateID;
public int Count;
public void WriteExternal(IOutputStream output)
{
output.PutS32(ItemTemplateID);
output.PutVS32(Count);
}
public void ReadExternal(IInputStream input)
{
this.ItemTemplateID = input.GetS32();
this.Count = input.GetVS32();
}
}
public class ZoneEnvironmentVar : IExternalizable
{
public string Key;
public bool SyncToClient;
public object Value;
public void WriteExternal(IOutputStream output)
{
output.PutUTF(Key);
output.PutBool(SyncToClient);
output.PutData(Value);
}
public void ReadExternal(IInputStream input)
{
DataType dt;
this.Key = input.GetUTF();
this.SyncToClient = input.GetBool();
this.Value = input.GetData(out dt);
}
}
}
///
/// 单位的客户端显示数据,通常存储横向功能,比如Avatar
///
public interface IUnitVisibleData : IExternalizable
{
void setVisibleName(String name);
void setVisibleCardData(ICardData datas);
}
abstract public class SyncObjectInfo : IExternalizable
{
public uint ObjectID;
public int TemplateID;
public float x;
public float y;
public float direction;
///
/// 用于扩展属性
///
public IExternalizable ExtData;
public abstract bool IsHalf { get; protected set; }
public abstract bool HasExtData { get; protected set; }
public virtual void ReadExternal(IInputStream input)
{
this.ObjectID = input.GetVU32();
this.TemplateID = input.GetS32();
MoveHelper.ReadPosAndDirection(IsHalf, out x, out y, out direction, input);
if (HasExtData)
{
this.ExtData = input.GetExtAny();
}
}
public virtual void WriteExternal(IOutputStream output)
{
output.PutVU32(ObjectID);
output.PutS32(TemplateID);
MoveHelper.WritePosAndDirection(IsHalf, x, y, direction, output);
if (HasExtData)
{
output.PutExt(this.ExtData);
}
}
}
///
/// 场景中同步单位数据
///
[MessageType(0x9010)]
public class SyncUnitInfo : SyncObjectInfo
{
public string Name;
public string Alias;
public int Force;
public int Level;
public string PlayerUUID;
public byte status;
public byte sub_status;
public short sub_flag; //sub_status>0才会有
// 天命属性
public byte fateType;
public UnitFieldChangedEvent fields = new UnitFieldChangedEvent();
public ClientStruct.UnitBuffStatus[] CurrentBuffStatus;
public IUnitVisibleData VisibleInfo;
//---------------------------------------------------
private BitSet8 mask = new BitSet8(0);
public override bool IsHalf
{
get { return mask.Get(0); }
protected set { mask.Set(0, value); }
}
public override bool HasExtData
{
get { return mask.Get(1); }
protected set { mask.Set(1, value); }
}
public bool HasName
{
get { return mask.Get(2); }
private set { mask.Set(2, value); }
}
public bool HasPlayerUUID
{
get { return mask.Get(3); }
private set { mask.Set(3, value); }
}
public bool HasAlias
{
get { return mask.Get(4); }
private set { mask.Set(4, value); }
}
public bool IsTouchObj
{
get { return mask.Get(5); }
set { mask.Set(5, value); }
}
public bool IsTouchMap
{
get { return mask.Get(6); }
set { mask.Set(6, value); }
}
public bool IsStaticBlockable
{
get { return mask.Get(7); }
set { mask.Set(7, value); }
}
//---------------------------------------------------
public SyncUnitInfo(bool is_half) { this.IsHalf = is_half; }
public SyncUnitInfo() { }
public override void ReadExternal(IInputStream input)
{
this.mask.Mask = input.GetU8();
base.ReadExternal(input);
this.Force = input.GetS32();
this.Level = input.GetVS32();
if (HasName) this.Name = input.GetUTF();
if (HasPlayerUUID) this.PlayerUUID = input.GetUTF();
if (HasAlias) this.Alias = input.GetUTF();
this.VisibleInfo = input.GetExtAny() as IUnitVisibleData;
this.CurrentBuffStatus = input.GetStructArray();
this.status = input.GetU8();
this.sub_status = input.GetU8();
this.fateType = input.GetU8();
this.fields.ReadExternal(input);
if(this.sub_status > 0)
{
this.sub_flag = input.GetS16();
}
}
public override void WriteExternal(IOutputStream output)
{
this.HasName = !string.IsNullOrEmpty(Name);
this.HasPlayerUUID = !string.IsNullOrEmpty(PlayerUUID);
this.HasAlias = !string.IsNullOrEmpty(Alias);
this.HasExtData = ExtData != null;
output.PutU8(mask.Mask);
base.WriteExternal(output);
output.PutS32(Force);
output.PutVS32(Level);
if (HasName) output.PutUTF(Name);
if (HasPlayerUUID) output.PutUTF(PlayerUUID);
if (HasAlias) output.PutUTF(Alias);
output.PutExt(VisibleInfo);
output.PutStructArray(this.CurrentBuffStatus);
output.PutU8(status);
output.PutU8(sub_status);
output.PutU8(fateType);
fields.WriteExternal(output);
if(this.sub_status > 0)
{
output.PutS16(this.sub_flag);
}
}
}
///
/// 场景中同步物品数据
///
[MessageType(0x9011)]
public class SyncItemInfo : SyncObjectInfo
{
public bool bDrop;
public string Name;
public string Alias;
public int Force;
public int ItemTotalTimeMS;
public int ItemExpireTimeMS;
public bool showItemLeftTimes;
public bool isCanPick; //是否还能够拾取
//---------------------------------------------------
private BitSet8 mask = new BitSet8(0);
public override bool IsHalf
{
get { return mask.Get(0); }
protected set { mask.Set(0, value); }
}
public override bool HasExtData
{
get { return mask.Get(4); }
protected set { mask.Set(4, value); }
}
public bool HasName
{
get { return mask.Get(1); }
private set { mask.Set(1, value); }
}
public bool HasAlias
{
get { return mask.Get(3); }
private set { mask.Set(3, value); }
}
//---------------------------------------------------
public SyncItemInfo(bool is_half) { this.IsHalf = is_half; bDrop = false; }
public SyncItemInfo() { bDrop = false; }
public override void ReadExternal(IInputStream input)
{
this.mask.Mask = input.GetU8();
base.ReadExternal(input);
this.Force = input.GetVS32();
this.ItemExpireTimeMS = input.GetVS32();
this.ItemTotalTimeMS = input.GetVS32();
if (HasName) this.Name = input.GetUTF();
if (HasAlias) this.Alias = input.GetUTF();
this.showItemLeftTimes = input.GetBool();
this.isCanPick = input.GetBool();
}
public override void WriteExternal(IOutputStream output)
{
this.HasName = !string.IsNullOrEmpty(Name);
this.HasAlias = !string.IsNullOrEmpty(Alias);
this.HasExtData = ExtData != null;
output.PutU8(mask.Mask);
base.WriteExternal(output);
output.PutVS32(Force);
output.PutVS32(ItemExpireTimeMS);
output.PutVS32(ItemTotalTimeMS);
if (HasName) output.PutUTF(Name);
if (HasAlias) output.PutUTF(Alias);
output.PutBool(this.showItemLeftTimes);
output.PutBool(this.isCanPick);
}
}
///
/// 场景中同步法术数据
///
[MessageType(0x9012)]
public class SyncSpellInfo : SyncObjectInfo
{
public int Force;
public float CurSpeed;
//---------------------------------------------------
private BitSet8 mask = new BitSet8(0);
public override bool IsHalf
{
get { return mask.Get(0); }
protected set { mask.Set(0, value); }
}
public override bool HasExtData
{
get { return mask.Get(4); }
protected set { mask.Set(4, value); }
}
public bool HasSpeed
{
get { return mask.Get(4); }
set { mask.Set(4, value); }
}
//---------------------------------------------------
public SyncSpellInfo(bool is_half) { this.IsHalf = is_half; }
public SyncSpellInfo() { }
public override void ReadExternal(IInputStream input)
{
this.mask.Mask = input.GetU8();
base.ReadExternal(input);
this.Force = input.GetVS32();
if (HasSpeed)
{
this.CurSpeed = input.GetF32();
}
}
public override void WriteExternal(IOutputStream output)
{
this.HasExtData = ExtData != null;
output.PutU8(mask.Mask);
base.WriteExternal(output);
output.PutVS32(Force);
if (HasSpeed)
{
output.PutF32(CurSpeed);
}
}
}
/*
///
/// 场景中同步单位数据
///
[MessageType(0x9000)]
public class SyncUnitInfo : IExternalizable
{
public uint ObjectID;
public SyncUnitType ObjectType = SyncUnitType.Unit;
public int TemplateID;
public string Name;
public string Alias;
public byte Force;
public float x;
public float y;
public float direction;
///
/// 用于扩展属性
///
public IExternalizable ExtData;
//---------------------------------------------------
#region units
public int Level;
public string PlayerUUID;
public byte status;
public byte sub_status;
public UnitFieldChangedEvent fields = new UnitFieldChangedEvent();
public ClientStruct.UnitBuffStatus[] CurrentBuffStatus;
///
/// 战斗服玩家属性,通常存储横向功能,比如Avatar
///
public CreateUnitInfoR2B PlayerInfo;
#endregion
//---------------------------------------------------
#region items
public int ItemTotalTimeMS;
public int ItemExpireTimeMS;
#endregion
//---------------------------------------------------
private BitSet8 mask = new BitSet8(0);
public bool IsHalf
{
get { return mask.Get(0); }
private set { mask.Set(0, value); }
}
public bool HasName
{
get { return mask.Get(1); }
private set { mask.Set(1, value); }
}
public bool HasPlayerUUID
{
get { return mask.Get(2); }
private set { mask.Set(2, value); }
}
public bool HasAlias
{
get { return mask.Get(3); }
private set { mask.Set(3, value); }
}
public bool HasExtData
{
get { return mask.Get(4); }
private set { mask.Set(4, value); }
}
//---------------------------------------------------
public SyncUnitInfo(bool is_half) { }
public SyncUnitInfo() { }
public void ReadExternal(IInputStream input)
{
this.mask.Mask = input.GetU8();
this.ObjectType = (SyncUnitType)input.GetU8();
this.ObjectID = input.GetVU32();
this.TemplateID = input.GetS32();
if (HasName)
{
this.Name = input.GetUTF();
}
MoveHelper.ReadPosAndDirection(IsHalf, out x, out y, out direction, input);
if (ObjectType == SyncUnitType.Item)
{
this.Force = input.GetU8();
this.ItemExpireTimeMS = input.GetVS32();
this.ItemTotalTimeMS = input.GetVS32();
if (HasAlias)
{
this.Alias = input.GetUTF();
}
}
else if (ObjectType == SyncUnitType.Unit)
{
this.Force = input.GetU8();
this.Level = input.GetVS32();
if (HasPlayerUUID)
{
this.PlayerUUID = input.GetUTF();
}
if (HasAlias)
{
this.Alias = input.GetUTF();
}
this.PlayerInfo = input.GetExt();
this.CurrentBuffStatus = input.GetStructArray();
this.status = input.GetU8();
this.sub_status = input.GetU8();
this.fields.ReadExternal(input);
}
if (HasExtData)
{
this.ExtData = input.GetExtAny();
}
}
public void WriteExternal(IOutputStream output)
{
this.HasName = !string.IsNullOrEmpty(Name);
this.HasPlayerUUID = !string.IsNullOrEmpty(PlayerUUID);
this.HasAlias = !string.IsNullOrEmpty(Alias);
this.HasExtData = ExtData != null;
output.PutU8(mask.Mask);
output.PutU8((byte)ObjectType);
output.PutVU32(ObjectID);
output.PutS32(TemplateID);
if (HasName)
{
output.PutUTF(Name);
}
MoveHelper.WritePosAndDirection(IsHalf, x, y, direction, output);
if (ObjectType == SyncUnitType.Item)
{
output.PutU8(Force);
output.PutVS32(ItemExpireTimeMS);
output.PutVS32(ItemTotalTimeMS);
if (HasAlias)
{
output.PutUTF(Alias);
}
}
else if (ObjectType == SyncUnitType.Unit)
{
output.PutU8(Force);
output.PutVS32(Level);
if (HasPlayerUUID)
{
output.PutUTF(PlayerUUID);
}
if (HasAlias)
{
output.PutUTF(Alias);
}
output.PutExt(PlayerInfo);
output.PutStructArray(this.CurrentBuffStatus);
output.PutU8(status);
output.PutU8(sub_status);
fields.WriteExternal(output);
}
if (HasExtData)
{
output.PutExt(ExtData);
}
}
}
*/
///
/// 同步场景中所有单位
///
[MessageType(0x9001)]
public class SyncObjectsEvent : ZoneEvent
{
public List Objects;
public SyncObjectsEvent() { }
public SyncObjectsEvent(int count)
{
this.Objects = new List(count);
}
override public void WriteExternal(IOutputStream output)
{
int len = Objects.Count;
output.PutVS32(len);
for (int i = 0; i < len; i++)
{
output.PutExt(Objects[i]);
}
}
override public void ReadExternal(IInputStream input)
{
int len = input.GetVS32();
this.Objects = new List(len);
for (int i = 0; i < len; i++)
{
SyncObjectInfo add = input.GetExtAny() as SyncObjectInfo;
Objects.Add(add);
}
}
}
///
/// 玩家登陆到服务器后,服务器分配对应的单位ID
///
[MessageType(0x9002)]
public class LockActorEvent : ZoneEvent
{
///
/// 当前房间单位信息
///
public SyncUnitInfo UnitData;
///
/// 服务端传过来的单位信息
///
public IUnitProperties GameServerProp;
///
/// 服务端更新速度/秒
///
public int ServerUpdateInterval;
///
/// 客户端同步范围
///
public float ClientSyncObjectRange;
///
/// 客户端同步范围
///
public float ClientSyncObjectOutRange;
public PlayerSkillChangedEvent Skills;
public ClientStruct.UnitSkillStatus[] CurrentSkillStatus;
public ClientStruct.UnitItemStatus[] CurrentItemStatus;
public ClientStruct.ZoneEnvironmentVar[] CurrentZoneVars;
public ClientStruct.ZoneEnvironmentVar[] CurrentPlayerVars;
override public void WriteExternal(IOutputStream output)
{
output.PutExt(this.UnitData);
output.PutExt(this.GameServerProp);
output.PutVS32(this.ServerUpdateInterval);
output.PutF32(this.ClientSyncObjectRange);
output.PutF32(this.ClientSyncObjectOutRange);
output.PutExt(this.Skills);
output.PutStructArray(this.CurrentSkillStatus);
output.PutStructArray(this.CurrentItemStatus);
output.PutExtArray(this.CurrentZoneVars);
output.PutExtArray(this.CurrentPlayerVars);
}
override public void ReadExternal(IInputStream input)
{
this.UnitData = input.GetExt();
this.GameServerProp = input.GetExtAny() as IUnitProperties;
this.ServerUpdateInterval = input.GetVS32();
this.ClientSyncObjectRange = input.GetF32();
this.ClientSyncObjectOutRange = input.GetF32();
this.Skills = input.GetExt();
this.CurrentSkillStatus = input.GetStructArray();
this.CurrentItemStatus = input.GetStructArray();
this.CurrentZoneVars = input.GetExtArray();
this.CurrentPlayerVars = input.GetExtArray();
}
}
///
/// 连接到代理服务器
///
[MessageType(0x9003)]
public class ConnectToProxy : ZoneEvent
{
public string ConnectString;
public ConnectToProxy() { }
public ConnectToProxy(string connect_string)
{
this.ConnectString = connect_string;
}
override public void WriteExternal(IOutputStream output)
{
output.PutUTF(ConnectString);
}
override public void ReadExternal(IInputStream input)
{
this.ConnectString = input.GetUTF();
}
}
///
/// 从代理服务器断开
///
[MessageType(0x9004)]
public class DisconnectFromProxy : ZoneEvent
{
override public void WriteExternal(IOutputStream output)
{
}
override public void ReadExternal(IInputStream input)
{
}
}
///
/// 同步场景中所有Flag状态
///
[MessageType(0x9005)]
public class SyncFlagsEvent : ZoneEvent
{
public List ClosedDecorations = new List();
public HashMap ChangedTags = new HashMap();
public SyncFlagsEvent()
{
}
override public void WriteExternal(IOutputStream output)
{
output.PutList(ClosedDecorations, output.PutUTF);
output.PutMap(ChangedTags, output.PutUTF, output.PutUTF);
}
override public void ReadExternal(IInputStream input)
{
this.ClosedDecorations = input.GetUTFList();
this.ChangedTags = input.GetMap(input.GetUTF, input.GetUTF);
}
}
[MessageType(0x9006)]
public class ClientEnterScene : ZoneEvent
{
///
/// 场景ID
///
public int sceneID;
///
/// 分割大小
///
public int spaceDiv;
///
/// 资源版本
///
public string resVersion;
public ClientEnterScene() { }
public ClientEnterScene(int sceneID, int spaceDiv, string resVer)
{
this.sceneID = sceneID;
this.spaceDiv = spaceDiv;
this.resVersion = resVer;
}
override public void WriteExternal(IOutputStream output)
{
output.PutS32(sceneID);
output.PutVS32(spaceDiv);
output.PutUTF(resVersion);
}
override public void ReadExternal(IInputStream input)
{
this.sceneID = input.GetS32();
this.spaceDiv = input.GetVS32();
this.resVersion = input.GetUTF();
}
}
///
/// 玩家离开场景.
///
[MessageType(0x9007)]
public class PlayerLeaveScene : PlayerEvent
{
public PlayerLeaveScene() { }
public PlayerLeaveScene(uint oid) : base(oid)
{
}
override public void WriteExternal(IOutputStream output)
{
base.WriteExternal(output);
}
override public void ReadExternal(IInputStream input)
{
base.ReadExternal(input);
}
}
[MessageType(0x9008)]
public class AddEffectEvent2 : ZoneEvent, PositionMessage
{
public enum EffectType
{
None,
MoveToTarget,
MoveToPlayer
}
public uint hostId = 0;
public float x;
public float y;
public float direction;
private uint effect_sn = 0;
private EffectType et;
private float targetX;
private float targetY;
private bool followActor;
public LaunchEffect effect { get; set; }
public AddEffectEvent2() { }
public AddEffectEvent2(uint hostId, float x, float y, float dir, LaunchEffect effect, EffectType et, float targetX, float targetY, bool followActor = false)
{
this.hostId = hostId;
this.x = x;
this.y = y;
this.direction = dir;
this.effect = effect;
this.et = et;
this.targetX = targetX;
this.targetY = targetY;
this.followActor = followActor;
}
override public void WriteExternal(IOutputStream output)
{
output.PutVU32(hostId);
output.PutF32(x);
output.PutF32(y);
output.PutF32(direction);
output.PutVU32(effect_sn);
}
override public void ReadExternal(IInputStream input)
{
this.hostId = input.GetVU32();
this.x = input.GetF32();
this.y = input.GetF32();
this.direction = input.GetF32();
this.effect_sn = input.GetVU32();
}
public override void BeforeWrite(TemplateManager templates)
{
if (effect != null)
{
this.effect_sn = effect.SerialNumber;
}
}
public override void EndRead(TemplateManager templates)
{
this.effect = templates.GetSnData(effect_sn);
}
public float X { get { return x; } }
public float Y { get { return y; } }
public float TargetX
{
get { return targetX; }
}
public float TargetY
{
get { return targetY; }
}
public bool FollowActor
{
get { return followActor; }
}
public EffectType ET
{
get { return et; }
}
}
}