// EXAMPLES: // So, ALL syncing shall happen on the integer ticks, and the integer ticks only. // OpNetGS stuff: // Player uses playerTime for its timing here. // Server uses playerTime for its timing as well. // Client uses Interp.getLifeTime() based on tick #s from the server. // This is for stuff that needs to exist at all times. public void InitAll(PlayerMove parentPlayerMove) { firedAt = new FrameTrigger(); secondaryFiredAt = new FrameTrigger(); reloadedAt = new FrameTrigger(); equippedAt = new FrameTrigger(); this.parentPlayerMove = parentPlayerMove; SetUnlockObject(); // This is actually everything that needs to be set with unlocks. Unlocks are already within the character. (This INCLUDES trap placing modules, they all use the same object!) }
public MotionTrigger(Stream stream) { if (!stream.CanRead || !stream.CanSeek) { throw new InvalidDataException($"Read or seek must be supported."); } BinaryReader reader = new BinaryReader(stream); byte rangeTriggerCount = reader.ReadByte(); byte frameTriggerCount = reader.ReadByte(); short frameTriggerOffset = reader.ReadInt16(); RangeTriggerList = new List <RangeTrigger>(); for (int i = 0; i < rangeTriggerCount; i++) { RangeTrigger rangeTrigger = new RangeTrigger(); rangeTrigger.StartFrame = reader.ReadInt16(); rangeTrigger.EndFrame = reader.ReadInt16(); rangeTrigger.Trigger = reader.ReadByte(); rangeTrigger.ParamSize = reader.ReadByte(); rangeTrigger.Param = new List <short>(); for (int j = 0; j < rangeTrigger.ParamSize; j++) { rangeTrigger.Param.Add(reader.ReadInt16()); } RangeTriggerList.Add(rangeTrigger); } FrameTriggerList = new List <FrameTrigger>(); for (int i = 0; i < frameTriggerCount; i++) { FrameTrigger frameTrigger = new FrameTrigger(); frameTrigger.Frame = reader.ReadInt16(); frameTrigger.Trigger = reader.ReadByte(); frameTrigger.ParamSize = reader.ReadByte(); frameTrigger.Param = new List <short>(); for (int j = 0; j < frameTrigger.ParamSize; j++) { frameTrigger.Param.Add(reader.ReadInt16()); } FrameTriggerList.Add(frameTrigger); } }