static void Map( this Dictionary <InstanceID, InstanceID> map, SegmentRecord segmentData, ushort nodeID, bool startNode, ushort targetSegmentID) { // node maps to it self. InstanceID instanceID = new InstanceID { NetNode = nodeID }; map[instanceID] = instanceID; // map segment. InstanceID sourceSegment = new InstanceID { NetSegment = segmentData.SegmentID }; InstanceID targetSegment = new InstanceID { NetSegment = targetSegmentID }; map[sourceSegment] = targetSegment; // map segment end. InstanceID sourceInstanceID = InstanceIDExtension.SegmentEnd(segmentData.SegmentID, startNode); bool targetStartNode = targetSegmentID.ToSegment().IsStartNode(nodeID); InstanceID targetInstanceID = InstanceIDExtension.SegmentEnd(targetSegmentID, targetStartNode); map[sourceInstanceID] = targetInstanceID; }
/** * Called from a pellet when we've eaten it. */ protected void addSegment() { // duplicate the last segment but 1 unit behind it GameObject lastSegment; int index; float addDistance = 0; if (_segments.Count == 0) { snapshotTarget(); lastSegment = gameObject; index = _targets.Count - 1; } else { var seggy = _segments[_segments.Count - 1]; lastSegment = seggy.gameObject; index = seggy.targetIndex; addDistance = seggy.waitDistance; } var newGameObject = Instantiate(segment, lastSegment.transform.position, lastSegment.transform.rotation); newGameObject.transform.localScale = _scale; // copy our ID to the segment newGameObject.AddComponent <WormIdentity>().id = _id; var newSeg = new SegmentRecord(newGameObject); newSeg.waitDistance += addDistance; newSeg.targetIndex = index; _segments.Add(newSeg); }
/// <param name="node">output node</param> public static void Postfix(ref ushort node) { if (!InSimulationThread()) { return; } if (SegmentData == null) { Log.Debug($"MoveMiddleNode.Postfix()\n" + Environment.StackTrace, false); if (node == NodeID) { // scenario 1: node did not move // do nothing. } else if (node == NodeID2) { // scenario 3: node merged if (SplitSegmentPatch.SegmentData2 == null) { SplitSegmentPatch.SegmentData2 = SegmentData; } else { SplitSegmentPatch.SegmentData3 = SegmentData; } } else { // scenario 2: node moved. } } SegmentData = null; }
public static void Prefix(ushort segment) { if (!InSimulationThread()) { return; } Log.Info($"SplitSegment.Prefix() segment:{segment}" /*\n" + Environment.StackTrace*/, true); SegmentData = SegmentRecord.Create(segment, man_); }
// pastes segment ends that: // 1- not nullnot null and // 2- its nodeID matches input start/end nodeID. static void PasteSegment( SegmentRecord segmentData, ushort nodeID1, ushort nodeID2, ushort targetSegmentID) { if (segmentData == null) { return; } PasteSegmentEnd(segmentData.SegmenStart, segmentData.StartNodeID, nodeID1, nodeID2, targetSegmentID); PasteSegmentEnd(segmentData.SegmenEnd, segmentData.EndNodeID, nodeID1, nodeID2, targetSegmentID); }
/// <summary> /// scenario 1: no change - returns the input node. /// scenario 2: move node : segment is released and a smaller segment is created - returns the moved node. /// scenario 3: merge node: segment is released and the other node is returned. /// /// How to handle: /// 1: skip (DONE) /// 2: copy segment end for the node that didn't move (moved node cannot have customisations) (DONE) /// 3: when split-segment creates a new segment, that copy segment end to it. /// </summary> /// <param name="node">input/output node</param> public static void Prefix(ref ushort node) // TODO remove ref when in lates harmony. { if (!InSimulationThread()) { return; } NodeID = node; AssertEqual(NodeID.ToNode().CountSegments(), 1, "CountSegments"); ushort segmentID = NetUtil.GetFirstSegment(NodeID); Log.Info($"MoveMiddleNode.Prefix() node:{NodeID} segment:{segmentID}" /*+"\n" + Environment.StackTrace*/, true); SegmentData = SegmentRecord.Create(segmentID, man_); NodeID2 = segmentID.ToSegment().GetOtherNode(NodeID); }
static void Map( this Dictionary <InstanceID, InstanceID> map, SegmentRecord segmentData, ushort nodeID, ushort targetSegmentID) { if (segmentData.StartNodeID == nodeID) { map.Map(segmentData, nodeID, true, targetSegmentID); } else if (segmentData.EndNodeID == nodeID) { map.Map(segmentData, nodeID, false, targetSegmentID); } }
public static void Prefix(ushort segment) { if (UpgradingSegmentData != null) { KianCommons.Log.Error("Unexpected UpgradingSegmentData != null"); UpgradingSegmentData = null; } if (m_upgrading) { UpgradingSegmentData = SegmentRecord.Create(segment, man_); } Log.Debug($"ReleaseSegment.Prefix({segment})\n" + Environment.StackTrace); if (man_ is IReleaser releaser) { releaser.Release(new InstanceID { NetSegment = segment }); releaser.Release(InstanceIDExtension.SegmentEnd(segment, true)); releaser.Release(InstanceIDExtension.SegmentEnd(segment, false)); } }
public bool Purchase(MsgInformationEx MsgDTO) { var segment = SegmentRecord.Get(MsgDTO.FromQQ); if (string.IsNullOrEmpty(segment.Segment)) { MsgSender.PushMsg(MsgDTO, "你尚未持有任何宝藏碎片!"); return(false); } if (segment.IsRare) { MsgSender.PushMsg(MsgDTO, "你的宝藏碎片已经是稀有碎片了!"); return(false); } segment.IsRare = true; segment.Update(); MsgSender.PushMsg(MsgDTO, "升级成功!"); return(true); }