Esempio n. 1
0
 public void Reset()
 {
     TPath.Clear();
     doInteract   = false;
     interactType = TeleportTargetType.None;
     interactRoom = 0;
     interactId   = 0;
 }
Esempio n. 2
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());
            }
        }
Esempio n. 3
0
 public TeleportInfo(TeleportTargetType Type, uint Id, uint Id2, uint Area)
 {
     this.Type = Type; this.Id = Id; this.Id2 = Id2; this.Area = Area;
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public TeleportInfo(TeleportTargetType Type, uint Id, uint Id2)
 {
     this.Type = Type; this.Id = Id; this.Id2 = Id2;
 }