public static InstanceData Move(MoveMessage msg) { switch (msg.type) { case "node": MoveableNode mnode = new MoveableNode(new InstanceID() { NetNode = (ushort)msg.id }); mnode.MoveCall(msg.position != null ? msg.position.ToUnity() : mnode.position); return(NetLogic.PrepareNode((ushort)msg.id)); case "segment": MoveableSegment seg = new MoveableSegment(new InstanceID() { NetSegment = (ushort)msg.id }); seg.MoveCall(msg.position != null ? msg.position.ToUnity() : seg.position); return(NetLogic.PrepareSegment((ushort)msg.id)); case "building": MoveableBuilding b = new MoveableBuilding(new InstanceID() { Building = (ushort)msg.id }); b.MoveCall(msg.position != null ? msg.position.ToUnity() : b.position, msg.is_angle_defined ? msg.angle : b.angle); return(ManagersLogic.PrepareBuilding((ushort)msg.id)); case "prop": MoveableProp p = new MoveableProp(new InstanceID() { Prop = (ushort)msg.id }); p.MoveCall(msg.position != null ? msg.position.ToUnity() : p.position, msg.is_angle_defined ? msg.angle : p.angle); return(ManagersLogic.PrepareProp((ushort)msg.id)); case "tree": MoveableTree t = new MoveableTree(new InstanceID() { Tree = msg.id }); t.MoveCall(msg.position != null ? msg.position.ToUnity() : t.position); return(ManagersLogic.PrepareTree(msg.id)); default: throw new Exception($"Cannot move {msg.type}"); } }
public static InstanceState Postfix(InstanceState state, ref MoveableBuilding __instance) { List <InstanceState> subSubStates = new List <InstanceState>(); BuildingState buildingState = (BuildingState)state; if (buildingState.subStates != null) { foreach (InstanceState subState in buildingState.subStates) { if (subState != null) { if (subState is BuildingState subBuildingState) { if (subBuildingState.instance != null && subBuildingState.instance.isValid) { BuildingState ss = (BuildingState)subState; MoveableBuilding subInstance = (MoveableBuilding)subBuildingState.instance; subSubStates.Clear(); ushort parent = buildingBuffer[subInstance.id.Building].m_parentBuilding; // Hack to get around Move It's single layer check buildingBuffer[subInstance.id.Building].m_parentBuilding = 0; foreach (Instance subSubInstance in subInstance.subInstances) { if (subSubInstance != null && subSubInstance.isValid) { subSubStates.Add(subSubInstance.GetState()); } } buildingBuffer[subInstance.id.Building].m_parentBuilding = parent; if (subSubStates.Count > 0) { ss.subStates = subSubStates.ToArray(); } } } } } } return(state); }
public static void Postfix(InstanceState state, MoveableBuilding __instance) { if (!(state is BuildingState buildingState)) { return; } //Debug.Log($"SS0 - {buildingState.subStates}"); if (buildingState.subStates != null) { foreach (InstanceState subState in buildingState.subStates) { if (subState != null) { if (subState is BuildingState subBuildingState) { if (subBuildingState.instance != null && subBuildingState.instance.isValid) { BuildingState ss = (BuildingState)subState; MoveableBuilding subInstance = (MoveableBuilding)subBuildingState.instance; if (ss.subStates != null) { foreach (InstanceState subSubState in ss.subStates) { if (subSubState != null) { subSubState.instance.SetState(subSubState); } } } } } } } } }