static void OverseerAbstractAI_AbstractBehavior(On.OverseerAbstractAI.orig_AbstractBehavior orig, OverseerAbstractAI self, int time) { if (self.world.singleRoomWorld && self.parent.pos.room == 0 || self.world.game.Players.Count < 1) { return; } int playerNum = 0; self.targetCreature = self.world.game.Players[playerNum]; if (self.lastRoom == new WorldCoordinate(0, 0, 0, 0)) { self.lastRoom = self.targetCreature.pos; } if (self.parent.realizedCreature == null) { OverseersPlugin.Logger_.LogInfo("MOVE"); self.parent.Move(new WorldCoordinate(self.targetCreature.Room.index, 1, 1, 0)); } else if (self.parent.Room != self.targetCreature.Room) { OverseersPlugin.Logger_.LogInfo($"overseer {self.parent.ID} " + $"teleporting to player {playerNum} in {self.targetCreature.Room.name}"); Overseer overseer = (self.parent.realizedCreature as Overseer); if (self.targetCreature.Room.realizedRoom.readyForAI) { overseer.TeleportingIntoRoom(self.targetCreature.Room.realizedRoom); } else { OverseersPlugin.Logger_.LogInfo($"room {self.targetCreature.Room.name} not ready for AI - dest NoPathing"); self.SetDestinationNoPathing(new WorldCoordinate(self.targetCreature.Room.index, 1, 1, 0), false); } } }
public void ctor(World world, patch_CreatureTemplate creatureTemplate, patch_Creature realizedCreature, WorldCoordinate pos, EntityID ID) { orig_ctor(world, creatureTemplate, realizedCreature, pos, ID); CreatureTemplate.Type type = creatureTemplate.TopAncestor().type; if (creatureTemplate.AI) { type = creatureTemplate.type; switch (type) { case CreatureTemplate.Type.Scavenger: abstractAI = new ScavengerAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.Overseer: abstractAI = new OverseerAbstractAI(world, this); goto IL_2F4; default: switch (type) { case CreatureTemplate.Type.Vulture: break; default: if (type != CreatureTemplate.Type.MirosBird) { abstractAI = new AbstractCreatureAI(world, this); goto IL_2F4; } abstractAI = new MirosBirdAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.CicadaA: case CreatureTemplate.Type.CicadaB: abstractAI = new CicadaAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.BigEel: abstractAI = new BigEelAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.Deer: abstractAI = new DeerAbstractAI(world, this); goto IL_2F4; case (CreatureTemplate.Type)patch_CreatureTemplate.Type.WalkerBeast: abstractAI = new WalkerBeastAbstractAI(world, this); goto IL_2F4; } break; case CreatureTemplate.Type.SmallNeedleWorm: case CreatureTemplate.Type.BigNeedleWorm: abstractAI = new NeedleWormAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.DropBug: abstractAI = new DropBugAbstractAI(world, this); goto IL_2F4; case CreatureTemplate.Type.KingVulture: break; } abstractAI = new VultureAbstractAI(world, this); } IL_2F4: if (pos.abstractNode > -1 && pos.abstractNode < Room.nodes.Length && Room.nodes[pos.abstractNode].type == AbstractRoomNode.Type.Den && !pos.TileDefined) { if (Room.offScreenDen) { remainInDenCounter = 1; } else { remainInDenCounter = UnityEngine.Random.Range(100, 1000); } if (abstractAI != null) { abstractAI.denPosition = new WorldCoordinate?(pos); } spawnDen = pos; } if (creatureTemplate.type == CreatureTemplate.Type.TentaclePlant || creatureTemplate.type == CreatureTemplate.Type.PoleMimic) { remainInDenCounter = 0; } }