public virtual void OnNPCAtJob(BlockJobInstance blockJobInstance, ref NPCState state) { ConstructionJobInstance instance = (ConstructionJobInstance)blockJobInstance; if (BlockTypes.ContainsByReference(instance.BlockType, out int index)) { Vector3 rotate = instance.NPC.Position.Vector; switch (index) { case 1: rotate.x -= 1f; break; case 2: rotate.x += 1f; break; case 3: rotate.z -= 1f; break; case 4: rotate.z += 1f; break; } instance.NPC.LookAt(rotate); } if (instance.ConstructionArea != null && !instance.ConstructionArea.IsValid) { instance.ConstructionArea = null; } if (instance.ConstructionArea == null) { if (AreaJobTracker.ExistingAreaAt(instance.Position.Add(-1, -1, -1), instance.Position.Add(1, 1, 1), out List <IAreaJob> jobs)) { for (int i = 0; i < jobs.Count; i++) { if (jobs[i] is ConstructionArea neighbourArea) { instance.ConstructionArea = neighbourArea; break; } } AreaJobTracker.AreaJobListPool.Return(jobs); } if (instance.ConstructionArea == null) { if (instance.DidAreaPresenceTest) { state.SetCooldown(0.5); ServerManager.TryChangeBlock(instance.Position, instance.BlockType, BuiltinBlocks.Types.air, instance.Owner); } else { state.SetIndicator(new Shared.IndicatorState(Random.NextFloat(3f, 5f), BuiltinBlocks.Indices.erroridle)); instance.DidAreaPresenceTest = true; } return; } } Assert.IsNotNull(instance.ConstructionArea); instance.ConstructionArea.DoJob(instance, ref state); }
public override void OnNPCAtJob(ref NPCBase.NPCState state) { if (constructionArea != null && !constructionArea.IsValid) { constructionArea = null; } if (worldTypeChecked) { Vector3 pos = usedNPC.Position.Vector; if (worldType == BuiltinBlocks.ConstructionJobXP) { usedNPC.LookAt(pos + Vector3.right); } else if (worldType == BuiltinBlocks.ConstructionJobXN) { usedNPC.LookAt(pos + Vector3.left); } else if (worldType == BuiltinBlocks.ConstructionJobZP) { usedNPC.LookAt(pos + Vector3.forward); } else if (worldType == BuiltinBlocks.ConstructionJobZN) { usedNPC.LookAt(pos + Vector3.back); } } if (constructionArea == null) { List <IAreaJob> jobs; if (AreaJobTracker.ExistingAreaAt(position.Add(-1, -1, -1), position.Add(1, 1, 1), out jobs)) { for (int i = 0; i < jobs.Count; i++) { ConstructionArea neighbourArea = jobs[i] as ConstructionArea; if (neighbourArea != null) { constructionArea = neighbourArea; break; } } AreaJobTracker.AreaJobListPool.Return(jobs); } if (constructionArea == null) { if (isAreaPresenceTestDone) { state.SetCooldown(0.5); ServerManager.TryChangeBlock(position, 0); } else { state.SetIndicator(new Shared.IndicatorState(Random.NextFloat(3f, 5f), BuiltinBlocks.ErrorIdle)); isAreaPresenceTestDone = true; } return; } } Assert.IsNotNull(constructionArea); constructionArea.DoJob(this, ref state); }