void OnEnable() { instances.Add(this); if (OnGetInReach == null) { OnGetInReach = new UnityEvent(); } if (OnOutOfReach == null) { OnOutOfReach = new UnityEvent(); } if (OnGrab == null) { OnGrab = new UnityEvent(); } if (OnRelease == null) { OnRelease = new UnityEvent(); } if (OnThrow == null) { OnThrow = new SpeedEvent(); } }
void Start() { _anim = GetComponent <Animator>(); deadEvent = new DeadEvent(); deadEvent.onDead += new DeadEvent.deadHandler(onDead); speedEvent = new SpeedEvent(); booLV = bigBooLv = 0; alive = true; }
public void AddSpeedEvent(SpeedEvent speedEvent) { m_events.Add(speedEvent); string name = "事件" + m_events.Count; m_eventNames.Add(name); m_dpdEventList.ClearOptions(); m_dpdEventList.AddOptions(m_eventNames); m_dpdEventList.value = m_events.Count; }
void OnEnable() { instances.Add(this); if (OnPickUp == null) { OnPickUp = new UnityEvent(); } if (OnRelease == null) { OnRelease = new UnityEvent(); } if (OnThrow == null) { OnThrow = new SpeedEvent(); } }
private void WriteEvent(SpeedEvent speedEvent) { int seconds = 0; if (lastEvent == null) { WriteLine((int)speedEvent.Timestamp, 0, SQUARE_FUNCTION); lastEvent = speedEvent; } else { seconds = (int)(speedEvent.Timestamp - lastEvent.Timestamp); if (seconds > 0 && speedEvent.Speed != lastEvent.Speed) { WriteLine(seconds, lastEvent.Speed, NO_CHANGE_FUNCTION); lastEvent = speedEvent; } } }
void Start() { speed = new SpeedEvent(); speed.onSpeed += new SpeedEvent.speedHandler(SpeedUpEvent); deadEvent = new DeadEvent(); }
public void SpeedChanging(int newSpeed) { Speed = newSpeed; SpeedEvent?.Invoke(this, EventArgs.Empty); }
public void OnSpeed(int key) { SpeedEvent?.Invoke(key); }
private bool ParseXml(string filePath) { try { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(filePath); XmlElement eRoot = (XmlElement)xmlDocument.SelectSingleNode("MapData"); foreach (XmlElement element in eRoot.ChildNodes) { //处理地图信息 if (element.Name == "Map") { int len = int.Parse(DecryptAttribute(element, "len")); int wid = int.Parse(DecryptAttribute(element, "wid")); string textureName = (DecryptAttribute(element, "TexturePath")); //int len = int.Parse(element.GetAttribute("len")); //int wid = int.Parse(element.GetAttribute("wid")); //string textureName = element.GetAttribute("TexturePath"); MapManager.Instance.CreateMap(len, wid, textureName); } else if (element.Name == "EntitiesList") { List <Entity> entities = new List <Entity>(); foreach (XmlElement eEntity in element.ChildNodes) { //实体属性 XmlElement eEntityAtr = (XmlElement)eEntity.SelectSingleNode("EntityAtr"); //位置 float x = float.Parse(DecryptAttribute(eEntityAtr, "posX")); float y = float.Parse(DecryptAttribute(eEntityAtr, "posY")); float z = float.Parse(DecryptAttribute(eEntityAtr, "posZ")); //float x = float.Parse(eEntityAtr.GetAttribute("posX")); //float y = float.Parse(eEntityAtr.GetAttribute("posY")); //float z = float.Parse(eEntityAtr.GetAttribute("posZ")); Vector3 pos = new Vector3(x, y, z); //旋转 x = float.Parse(DecryptAttribute(eEntityAtr, "quaX")); y = float.Parse(DecryptAttribute(eEntityAtr, "quaY")); z = float.Parse(DecryptAttribute(eEntityAtr, "quaZ")); float w = float.Parse(DecryptAttribute(eEntityAtr, "quaW")); //x = float.Parse(eEntityAtr.GetAttribute("quaX")); //y = float.Parse(eEntityAtr.GetAttribute("quaY")); //z = float.Parse(eEntityAtr.GetAttribute("quaZ")); //float w = float.Parse(eEntityAtr.GetAttribute("quaW")); Quaternion qua = new Quaternion(x, y, z, w); //模型 string modelName = DecryptAttribute(eEntityAtr, "Model"); //string modelName = eEntityAtr.GetAttribute("Model"); //类型 string temp = DecryptAttribute(eEntityAtr, "Type"); //string temp = eEntityAtr.GetAttribute("Type"); EntityType entityType = EntityType.Zero; if (temp == "NPC") { entityType = EntityType.NPC; } else if (temp == "Monster") { entityType = EntityType.Monster; } else if (temp == "Building") { entityType = EntityType.Building; } //地图块索引 int mapCubeIndex = int.Parse(DecryptAttribute(eEntityAtr, "MapCubeIndex")); //int mapCubeIndex = int.Parse(eEntityAtr.GetAttribute("MapCubeIndex")); //路径索引 int pathIndex = int.Parse(DecryptAttribute(eEntityAtr, "PathIndex")); //int pathIndex = int.Parse(eEntityAtr.GetAttribute("PathIndex")); int eventIndex = int.Parse(DecryptAttribute(eEntityAtr, "EventIndex")); //游戏属性 XmlElement eGameAtr = (XmlElement)eEntity.SelectSingleNode("GameAtr"); float HP = int.Parse(DecryptAttribute(eGameAtr, "HP")); float AtkValue = float.Parse(DecryptAttribute(eGameAtr, "AtkValue")); float DefValue = float.Parse(DecryptAttribute(eGameAtr, "DefValue")); float AtkSpeed = float.Parse(DecryptAttribute(eGameAtr, "AtkSpeed")); float AtkRange = float.Parse(DecryptAttribute(eGameAtr, "AtkRange")); float MoveSpeed = float.Parse(DecryptAttribute(eGameAtr, "MoveSpeed")); bool IsMove = bool.Parse(DecryptAttribute(eGameAtr, "IsMove")); bool IsAtk = bool.Parse(DecryptAttribute(eGameAtr, "IsAtk")); //float HP = int.Parse(eGameAtr.GetAttribute("HP")); //float AtkValue = float.Parse(eGameAtr.GetAttribute("AtkValue")); //float DefValue = float.Parse(eGameAtr.GetAttribute("DefValue")); //float AtkSpeed = float.Parse(eGameAtr.GetAttribute("AtkSpeed")); //float AtkRange = float.Parse(eGameAtr.GetAttribute("AtkRange")); //float MoveSpeed = float.Parse(eGameAtr.GetAttribute("MoveSpeed")); //bool IsMove = bool.Parse(eGameAtr.GetAttribute("IsMove")); //bool IsAtk = bool.Parse(eGameAtr.GetAttribute("IsAtk")); //添加到当前实体管理类 EntityManager.Instance.AddEntity(pos, qua, entityType, modelName, mapCubeIndex, pathIndex, eventIndex, HP, AtkValue, DefValue, AtkSpeed, AtkRange, MoveSpeed, IsMove, IsAtk); //更新地图块的状态 MapManager.Instance.GetMapCube(mapCubeIndex).m_isEmpty = false; } } else if (element.Name == "PathList") { //根据当前地图信息生成寻路数据 PathManager.Instance.GeneratePointMsg(); //读取并加载存档中的路径信息 foreach (XmlElement ePath in element.ChildNodes) { //状态信息 int index = int.Parse(DecryptAttribute(ePath, "Index")); bool isEmpty = bool.Parse(DecryptAttribute(ePath, "IsEmpty")); //int index = int.Parse(ePath.GetAttribute("Index")); //bool isEmpty = bool.Parse(ePath.GetAttribute("IsEmpty")); //关键点信息 XmlElement eKeyPointList = (XmlElement)ePath.SelectSingleNode("KeyPointList"); List <Vector2> tempKeyPointList = new List <Vector2>(); foreach (XmlElement eKeyPoint in eKeyPointList.ChildNodes) { Vector2 tempKeyPoint = new Vector2 { x = int.Parse(DecryptAttribute(eKeyPoint, "x")), y = int.Parse(DecryptAttribute(eKeyPoint, "y")) //x = int.Parse(eKeyPoint.GetAttribute("x")), //y = int.Parse(eKeyPoint.GetAttribute("y")) }; tempKeyPointList.Add(tempKeyPoint); } //点信息 XmlElement ePointList = (XmlElement)ePath.SelectSingleNode("PointList"); List <Vector2> tempPointList = new List <Vector2>(); foreach (XmlElement ePoint in ePointList.ChildNodes) { Vector2 tempPoint = new Vector2 { x = int.Parse(DecryptAttribute(ePoint, "x")), y = int.Parse(DecryptAttribute(ePoint, "y")) //x = int.Parse(ePoint.GetAttribute("x")), //y = int.Parse(ePoint.GetAttribute("y")) }; tempPointList.Add(tempPoint); } //添加到当前路径管理类 PathManager.Instance.AddPath(index, isEmpty, tempKeyPointList, tempPointList); } } else if (element.Name == "EventList") { foreach (XmlElement eEvent in element.ChildNodes) { int index = int.Parse(DecryptAttribute(eEvent, "Index")); string type = DecryptAttribute(eEvent, "Type"); if (type.CompareTo("Birth") == 0) { Debug.Log("BIRTHEVENT: " + type); float cd = float.Parse(DecryptAttribute(eEvent, "CD")); float time = float.Parse(DecryptAttribute(eEvent, "Time")); bool isInfinite = bool.Parse(DecryptAttribute(eEvent, "IsInfinite")); BirthEvent birthEvent = new BirthEvent(cd, time, isInfinite); EventManager.Instance.AddBirthEvent(birthEvent); } else if (type.CompareTo("Bomb") == 0) { float delay = float.Parse(DecryptAttribute(eEvent, "Delay")); float hurt = float.Parse(DecryptAttribute(eEvent, "Hurt")); bool isDetroy = bool.Parse(DecryptAttribute(eEvent, "IsDestroy")); BombEvent bombEvent = new BombEvent(delay, hurt, isDetroy); EventManager.Instance.AddBombEvent(bombEvent); } else if (type.CompareTo("Speed") == 0) { float speed = float.Parse(DecryptAttribute(eEvent, "Speed")); float time = float.Parse(DecryptAttribute(eEvent, "Time")); bool isInfinite = bool.Parse(DecryptAttribute(eEvent, "IsInfinite")); SpeedEvent speedEvent = new SpeedEvent(speed, time, isInfinite); EventManager.Instance.AddSpeedEvent(speedEvent); } else if (type.CompareTo("Telepo") == 0) { int teleportID = int.Parse(DecryptAttribute(eEvent, "TeleportID")); float cd = float.Parse(DecryptAttribute(eEvent, "CD")); float time = float.Parse(DecryptAttribute(eEvent, "Time")); bool isInfinite = bool.Parse(DecryptAttribute(eEvent, "IsInfinite")); TeleportEvent teleportEvent = new TeleportEvent(teleportID, cd, time, isInfinite); EventManager.Instance.AddTeleportEvent(teleportEvent); } } } else if (element.Name == "Music") { if (element.HasAttributes) { string name = DecryptAttribute(element, "Name"); float volume = float.Parse(DecryptAttribute(element, "Volume")); //string name = element.GetAttribute("Name"); //float volume = float.Parse(element.GetAttribute("Volume")); MusicManager.Instance.SetMusic(name, volume); } } } return(true); } catch { LogManager.Instance.Log("加载地图失败!"); return(false); } }
private bool CreateXml(string filePath) { try { XmlDocument xmlDocument = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "UTF-8", null); xmlDocument.AppendChild(xmlDeclaration); XmlElement eRoot = xmlDocument.CreateElement("MapData"); xmlDocument.AppendChild(eRoot); //保存地图信息 XmlElement eMap = xmlDocument.CreateElement("Map"); Map map = MapManager.Instance.m_map; EncryptAttribute(eMap, "TexturePath", map.m_textureName.ToString()); EncryptAttribute(eMap, "wid", map.m_width.ToString()); EncryptAttribute(eMap, "len", map.m_length.ToString()); //eMap.SetAttribute("TexturePath", map.m_textureName.ToString()); //eMap.SetAttribute("wid", map.m_width.ToString()); //eMap.SetAttribute("len", map.m_length.ToString()); eRoot.AppendChild(eMap); //保存实体信息 XmlElement eEntitiesList = xmlDocument.CreateElement("EntitiesList"); foreach (Entity entity in EntityManager.Instance.GetEntities()) { XmlElement eEntity = xmlDocument.CreateElement("Entity"); eEntitiesList.AppendChild(eEntity); //实体属性(逆序设置,顺序输出) XmlElement eEntityAtr = xmlDocument.CreateElement("EntityAtr"); EncryptAttribute(eEntityAtr, "EventIndex", entity.m_eventIndex.ToString()); EncryptAttribute(eEntityAtr, "PathIndex", entity.m_pathIndex.ToString()); EncryptAttribute(eEntityAtr, "MapCubeIndex", entity.m_mapCubeIndex.ToString()); EncryptAttribute(eEntityAtr, "Type", entity.m_type.ToString()); EncryptAttribute(eEntityAtr, "Model", entity.m_modelName); EncryptAttribute(eEntityAtr, "quaW", entity.m_quaternion.w.ToString()); EncryptAttribute(eEntityAtr, "quaZ", entity.m_quaternion.z.ToString()); EncryptAttribute(eEntityAtr, "quaY", entity.m_quaternion.y.ToString()); EncryptAttribute(eEntityAtr, "quaX", entity.m_quaternion.x.ToString()); EncryptAttribute(eEntityAtr, "posZ", entity.m_position.z.ToString()); EncryptAttribute(eEntityAtr, "posY", entity.m_position.y.ToString()); EncryptAttribute(eEntityAtr, "posX", entity.m_position.x.ToString()); //eEntityAtr.SetAttribute("PathIndex", entity.m_pathIndex.ToString()); //eEntityAtr.SetAttribute("MapCubeIndex", entity.m_mapCubeIndex.ToString()); //eEntityAtr.SetAttribute("Type", entity.m_type.ToString()); //eEntityAtr.SetAttribute("Model", entity.m_modelName); //eEntityAtr.SetAttribute("quaW", entity.m_quaternion.w.ToString()); //eEntityAtr.SetAttribute("quaZ", entity.m_quaternion.z.ToString()); //eEntityAtr.SetAttribute("quaY", entity.m_quaternion.y.ToString()); //eEntityAtr.SetAttribute("quaX", entity.m_quaternion.x.ToString()); //eEntityAtr.SetAttribute("posZ", entity.m_position.z.ToString()); //eEntityAtr.SetAttribute("posY", entity.m_position.y.ToString()); //eEntityAtr.SetAttribute("posX", entity.m_position.x.ToString()); //游戏属性 XmlElement eGameAtr = xmlDocument.CreateElement("GameAtr"); EncryptAttribute(eGameAtr, "IsAtk", entity.IsAtk.ToString()); EncryptAttribute(eGameAtr, "IsMove", entity.IsMove.ToString()); EncryptAttribute(eGameAtr, "MoveSpeed", entity.MoveSpeed.ToString()); EncryptAttribute(eGameAtr, "AtkRange", entity.AtkRange.ToString()); EncryptAttribute(eGameAtr, "AtkSpeed", entity.AtkSpeed.ToString()); EncryptAttribute(eGameAtr, "DefValue", entity.DefValue.ToString()); EncryptAttribute(eGameAtr, "AtkValue", entity.HP.ToString()); EncryptAttribute(eGameAtr, "HP", entity.HP.ToString()); //eGameAtr.SetAttribute("IsAtk", entity.IsAtk.ToString()); //eGameAtr.SetAttribute("IsMove", entity.IsMove.ToString()); //eGameAtr.SetAttribute("MoveSpeed", entity.MoveSpeed.ToString()); //eGameAtr.SetAttribute("AtkRange", entity.AtkRange.ToString()); //eGameAtr.SetAttribute("AtkSpeed", entity.AtkSpeed.ToString()); //eGameAtr.SetAttribute("DefValue", entity.DefValue.ToString()); //eGameAtr.SetAttribute("AtkValue", entity.HP.ToString()); //eGameAtr.SetAttribute("HP", entity.HP.ToString()); eEntity.AppendChild(eEntityAtr); eEntity.AppendChild(eGameAtr); } eRoot.AppendChild(eEntitiesList); //保存路径信息 XmlElement ePathList = xmlDocument.CreateElement("PathList"); foreach (Path path in PathManager.Instance.GetPaths()) { //单个路径节点 XmlElement ePath = xmlDocument.CreateElement("Path"); //路径的状态信息 EncryptAttribute(ePath, "IsEmpty", path.m_isEmpty.ToString()); EncryptAttribute(ePath, "Index", path.m_index.ToString()); //ePath.SetAttribute("IsEmpty", path.m_isEmpty.ToString()); //ePath.SetAttribute("Index", path.m_index.ToString()); //路径的关键点信息 XmlElement eKeyPointList = xmlDocument.CreateElement("KeyPointList"); foreach (Point keyPoint in path.m_keyPoints) { XmlElement eKeyPoint = xmlDocument.CreateElement("KeyPoint"); EncryptAttribute(eKeyPoint, "y", keyPoint.m_y.ToString()); EncryptAttribute(eKeyPoint, "x", keyPoint.m_x.ToString()); //eKeyPoint.SetAttribute("y", keyPoint.m_y.ToString()); //eKeyPoint.SetAttribute("x", keyPoint.m_x.ToString()); eKeyPointList.AppendChild(eKeyPoint); } ePath.AppendChild(eKeyPointList); //路径的点信息 XmlElement ePointList = xmlDocument.CreateElement("PointList"); foreach (Point point in path.m_points) { XmlElement ePoint = xmlDocument.CreateElement("Point"); EncryptAttribute(ePoint, "y", point.m_y.ToString()); EncryptAttribute(ePoint, "x", point.m_x.ToString()); //ePoint.SetAttribute("y", point.m_y.ToString()); //ePoint.SetAttribute("x", point.m_x.ToString()); ePointList.AppendChild(ePoint); } ePath.AppendChild(ePointList); ePathList.AppendChild(ePath); } eRoot.AppendChild(ePathList); //保存事件信息 XmlElement eEventList = xmlDocument.CreateElement("EventList"); foreach (Event @event in EventManager.Instance.GetEvents()) { XmlElement eEvent = xmlDocument.CreateElement("Event"); EncryptAttribute(eEvent, "Index", @event.m_index.ToString()); string type = @event.Type; //Debug.Log("事件的类型是: " + type); EncryptAttribute(eEvent, "Type", type); if (type == "Birth") { BirthEvent birthEvent = (BirthEvent)@event; EncryptAttribute(eEvent, "CD", birthEvent.m_cd.ToString()); EncryptAttribute(eEvent, "Time", birthEvent.m_time.ToString()); EncryptAttribute(eEvent, "IsInfinite", birthEvent.m_isInfinite.ToString()); } else if (type == "Bomb") { BombEvent bombEvent = (BombEvent)@event; EncryptAttribute(eEvent, "Delay", bombEvent.m_delay.ToString()); EncryptAttribute(eEvent, "Hurt", bombEvent.m_hurt.ToString()); EncryptAttribute(eEvent, "IsDestroy", bombEvent.m_isDestory.ToString()); } else if (type == "Speed") { SpeedEvent speedEvent = (SpeedEvent)@event; EncryptAttribute(eEvent, "Speed", speedEvent.m_speed.ToString()); EncryptAttribute(eEvent, "Time", speedEvent.m_time.ToString()); EncryptAttribute(eEvent, "IsInfinite", speedEvent.m_isInfinite.ToString()); } else if (type == "Teleport") { TeleportEvent teleportEvent = (TeleportEvent)@event; EncryptAttribute(eEvent, "TeleportID", teleportEvent.m_teleportID.ToString()); EncryptAttribute(eEvent, "CD", teleportEvent.m_cd.ToString()); EncryptAttribute(eEvent, "Time", teleportEvent.m_time.ToString()); EncryptAttribute(eEvent, "IsInfinite", teleportEvent.m_isInfinite.ToString()); } eEventList.AppendChild(eEvent); } eRoot.AppendChild(eEventList); //保存音乐信息 XmlElement eMusic = xmlDocument.CreateElement("Music"); Music music = MusicManager.Instance.m_music; if (music != null) { EncryptAttribute(eMusic, "Volume", music.m_volume.ToString()); EncryptAttribute(eMusic, "Name", music.m_name); //eMusic.SetAttribute("Volume", music.m_volume.ToString()); //eMusic.SetAttribute("Name", music.m_name); } eRoot.AppendChild(eMusic); //保存XML文件 xmlDocument.Save(filePath); return(true); } catch { LogManager.Instance.Log("保存地图失败!"); return(false); } }
//显示事件属性 private void DisplayEvent() { m_objBirthEvent.SetActive(false); m_objBombEvent.SetActive(false); m_objSpeedEvent.SetActive(false); m_objTeleportEvent.SetActive(false); string eventType = m_currEvent.Type; Transform tempTransform; if (eventType == "Birth") { m_objBirthEvent.SetActive(true); BirthEvent birthEvent = (BirthEvent)m_currEvent; tempTransform = m_objBirthEvent.transform.Find("Index"); tempTransform.Find("Text").GetComponent <Text>().text = birthEvent.m_index.ToString(); tempTransform = m_objBirthEvent.transform.Find("CD"); tempTransform.GetComponentInChildren <InputField>().text = birthEvent.m_cd.ToString(); tempTransform = m_objBirthEvent.transform.Find("Time"); tempTransform.GetComponentInChildren <InputField>().text = birthEvent.m_time.ToString(); tempTransform = m_objBirthEvent.transform.Find("IsInfinite"); tempTransform.GetComponentInChildren <Toggle>().isOn = birthEvent.m_isInfinite; } else if (eventType == "Bomb") { m_objBombEvent.SetActive(true); BombEvent bombEvent = (BombEvent)m_currEvent; tempTransform = m_objBombEvent.transform.Find("Index"); tempTransform.Find("Text").GetComponent <Text>().text = bombEvent.m_index.ToString(); tempTransform = m_objBombEvent.transform.Find("Delay"); tempTransform.GetComponentInChildren <InputField>().text = bombEvent.m_delay.ToString(); tempTransform = m_objBombEvent.transform.Find("Hurt"); tempTransform.GetComponentInChildren <InputField>().text = bombEvent.m_hurt.ToString(); tempTransform = m_objBombEvent.transform.Find("IsDestroy"); tempTransform.GetComponentInChildren <Toggle>().isOn = bombEvent.m_isDestory; } else if (eventType == "Speed") { m_objSpeedEvent.SetActive(true); SpeedEvent speedEvent = (SpeedEvent)m_currEvent; tempTransform = m_objSpeedEvent.transform.Find("Index"); tempTransform.Find("Text").GetComponent <Text>().text = speedEvent.m_index.ToString(); tempTransform = m_objSpeedEvent.transform.Find("Speed"); tempTransform.GetComponentInChildren <InputField>().text = speedEvent.m_speed.ToString(); tempTransform = m_objSpeedEvent.transform.Find("Time"); tempTransform.GetComponentInChildren <InputField>().text = speedEvent.m_time.ToString(); tempTransform = m_objSpeedEvent.transform.Find("IsInfinite"); tempTransform.GetComponentInChildren <Toggle>().isOn = speedEvent.m_isInfinite; } else if (eventType == "Teleport") { m_objTeleportEvent.SetActive(true); TeleportEvent teleportEvent = (TeleportEvent)m_currEvent; tempTransform = m_objTeleportEvent.transform.Find("Index"); tempTransform.Find("Text").GetComponent <Text>().text = teleportEvent.m_index.ToString(); tempTransform = m_objTeleportEvent.transform.Find("TeleportID"); tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_teleportID.ToString(); tempTransform = m_objTeleportEvent.transform.Find("CD"); tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_cd.ToString(); tempTransform = m_objTeleportEvent.transform.Find("Time"); tempTransform.GetComponentInChildren <InputField>().text = teleportEvent.m_time.ToString(); tempTransform = m_objTeleportEvent.transform.Find("IsInfinite"); tempTransform.GetComponentInChildren <Toggle>().isOn = teleportEvent.m_isInfinite; } else { LogManager.Instance.Log("事件类型不存在!"); return; } }
private void WriteFinalLine(SpeedEvent lastEvent) { int finalDuration = (int)(session.GetSessionDuration().TotalSeconds - lastEvent.Timestamp); WriteLine(finalDuration, lastEvent.Speed, NO_CHANGE_FUNCTION); }
private void Reset() { lastEvent = null; content = new StringBuilder(); }