public void Reset() { TPath.Clear(); doInteract = false; interactType = TeleportTargetType.None; interactRoom = 0; interactId = 0; }
public void ManageTele(TeleType type) { if (IsTeleporting) { return; } Level lvl; if (!game.GetPlayerLevel(out lvl)) { return; } if (game.HasSkill(SkillType.Teleport)) { Logger.AutoTele.Log(game, LogType.Warning, "You don't have teleport skill."); return; } var p = TeleportInfo.Vectors[lvl.dwLevelNo * 4 + (uint)type].Clone(); var areas = new List <uint>(); areas.Add(lvl.dwLevelNo); if (lvl.dwLevelNo == (uint)Map.A2_CANYON_OF_THE_MAGI) { if (p.Type == TeleportTargetType.None && p.Id == 0) { var pMisc = lvl.pMisc; if (pMisc != 0) { var misc = game.Debugger.Read <ActMisc>(pMisc); if (misc.dwStaffTombLevel != 0) { p.Type = TeleportTargetType.Exit; p.Id = misc.dwStaffTombLevel; } } } } else if (lvl.dwLevelNo == (uint)Map.A1_COLD_PLAINS) { } else if (lvl.dwLevelNo == (uint)Map.A4_THE_CHAOS_SANCTUARY && p.Id2 >= 1337 && p.Id2 <= 1341) { /*if (CSID == 3) * CSID = 0; * else ++CSID; * * p.Id = */ } if (p.Id == 0) { Logger.AutoTele.Log(game, LogType.Warning, "There is no \"{0}\" path for current level.", type.Name()); return; } if (p.Area != 0) { areas.Add((byte)p.Area); } doInteract = false; if (p.Type == TeleportTargetType.Exit) { var g_collisionMap = game.MapHandler.GetCollisionData(areas.ToArray()); if (!g_collisionMap.m_map.IsCreated()) { return; } var ExitArray = game.MapHandler.GetLevelExits(areas[0]); if (ExitArray.Count == 0) { return; } foreach (var exit in ExitArray) { if (exit.dwTargetLevel == p.Id) { var pLevelTxt = game.Debugger.Call <IntPtr>(D2Common.GetLevelText, MagicConvention.StdCall, p.Id); var lvltext = game.Debugger.Read <LevelTxt>(pLevelTxt); doInteract = false; if (exit.dwType == (uint)ExitType.Tile) { doInteract = true; interactType = TeleportTargetType.Tile; interactRoom = exit.pRoom2; } var nodes = MakePath(exit.ptPos.X, exit.ptPos.Y, areas, exit.dwType == (uint)ExitType.Level); if (nodes != 0) { Logger.AutoTele.Log(game, LogType.None, "Going to {0}, {1} nodes.", lvltext.szName, nodes); } else { Logger.AutoTele.Log(game, LogType.Warning, "Failed to calculate path to {0}.", lvltext.szName); } break; } } return; } if (p.Type == TeleportTargetType.XY) { doInteract = false; if (p.Id == 0 || p.Id2 == 0) { Logger.AutoTele.Log(game, LogType.Warning, "Failed to make path to \"{0}\" point.", type.Name()); return; } var nodes = MakePath((int)p.Id, (int)p.Id2, areas, false); if (nodes != 0) { Logger.AutoTele.Log(game, LogType.None, "Going to \"{0}\" X: {1}, Y: {2}, {3} nodes.", type.Name(), p.Id, p.Id2, nodes); } else { Logger.AutoTele.Log(game, LogType.Warning, "Failed to make path to \"{0}\" point.", type.Name()); } return; } var presetUnit = FindPresetLocation((uint)p.Type, p.Id, areas[areas.Count - 1]); if (!presetUnit.IsEmpty) { if (p.Type == TeleportTargetType.Tile || p.Type == TeleportTargetType.Object && p.Id == 298) { doInteract = true; } else if (p.Type == TeleportTargetType.Object && waypoints.Contains(p.Id)) { doInteract = true; } var nodes = MakePath(presetUnit.X, presetUnit.Y, areas, false); if (nodes != 0) { if (p.Type == TeleportTargetType.Object) { var pObjectTxt = game.Debugger.Call <IntPtr>(D2Common.GetObjectTxt, MagicConvention.StdCall, p.Id); var txt = game.Debugger.Read <ObjectTxt>(pObjectTxt); Logger.AutoTele.Log(game, LogType.None, "Going to {0}, {1} nodes.", txt.szName, nodes); } interactType = p.Type; } else { Logger.AutoTele.Log(game, LogType.Warning, "Failed to make path to \"{0}\" point.", type.Name()); } } else { Logger.AutoTele.Log(game, LogType.Warning, "Failed to make path to \"{0}\" point.", type.Name()); } }
public TeleportInfo(TeleportTargetType Type, uint Id, uint Id2, uint Area) { this.Type = Type; this.Id = Id; this.Id2 = Id2; this.Area = Area; }
protected Point FindPresetLocation(uint dwType, uint dwTxtFileNo, uint Area) { var pLevel = game.MapHandler.GetLevel(Area); if (pLevel == 0) { return(new Point()); } UnitAny unit; if (!game.GetPlayerUnit(out unit)) { return(new Point()); } var path = game.Debugger.Read <Path>(unit.pPath); var lvl = game.Debugger.Read <Level>(pLevel); var loc = new Point(); loc.X = 0; loc.Y = 0; doInteract = false; var bAddedRoom = false; var stoploop = false; for (var pRoom = lvl.pRoom2First; pRoom != 0;) { bAddedRoom = false; var room = game.Debugger.Read <Room2>(pRoom); if (room.pPreset == 0 && room.pRoomTiles == 0 && room.pRoom1 == 0) { game.Debugger.Call <int>(D2Common.AddRoomData, MagicConvention.ThisCall, 0, unit.pAct, lvl.dwLevelNo, room.dwPosX, room.dwPosY, path.pRoom1); bAddedRoom = true; } for (var pUnit = room.pPreset; pUnit != 0;) { var preset = game.Debugger.Read <PresetUnit>(pUnit); //if(pUnit->dwTxtFileNo != 40 && pUnit->dwTxtFileNo != 41 && pUnit->dwTxtFileNo != 42) // PrintText(4, "X: %d, Y: %d, TxtFileNo: %d, Type: %d", pUnit->dwPosX, pUnit->dwPosY, pUnit->dwTxtFileNo, pUnit->dwType); if ((dwType == 0 || dwType == preset.dwType) && dwTxtFileNo == preset.dwTxtFileNo) { if (dwType == (uint)UnitType.Tile || dwType == (uint)UnitType.Object && dwTxtFileNo == 298) { interactRoom = pRoom; interactType = (TeleportTargetType)dwType; //DoInteract = 1; } if (dwType == (uint)UnitType.Object) { for (int i = 0; i < waypoints.Length; ++i) { if (waypoints[i] == dwTxtFileNo) { interactRoom = pRoom; interactType = (TeleportTargetType)dwType; //DoInteract = 1; stoploop = true;//stop looping over the rooms break; } } } loc.X = (int)(preset.dwPosX + room.dwPosX * 5); loc.Y = (int)(preset.dwPosY + room.dwPosY * 5); stoploop = true;//stop looping over the rooms break; } pUnit = preset.pPresetNext; } if (bAddedRoom) { game.Debugger.Call(D2Common.RemoveRoomData, MagicConvention.StdCall, unit.pAct, lvl.dwLevelNo, room.dwPosX, room.dwPosY, path.pRoom1); } if (stoploop) { break; } pRoom = room.pRoom2Next; } return(loc); }
public TeleportInfo(TeleportTargetType Type, uint Id, uint Id2) { this.Type = Type; this.Id = Id; this.Id2 = Id2; }