Рыбалка

Вольт

New member
C#:
using System;
using System.Linq;
using System.Collections.Generic;
using NewWidget.Core;
using NewWidget.Core.Native;
using NewWidget.Core.Scripting;
using NewWidget.Core.Network;
using NewWidget.Core.Chats;


public class Script : ScriptBase {

    Vector[] points = new Vector[]{
        new Vector(),                            //инициализируется при включении галки
        new Vector(-8223, 126647, -3744),        //точки куда будет перебегать персонаж когда на стартовом споте кончится рыба
        new Vector(-7267, 127348, -3736)        //можно посмотреть ПКМ в этом редакторе -> watch-> Me -> Location .
    };
    
    bool LikeMacro = true; //как в макросе
    int GameStartDelay = 500; //Ожидание в релоге перед заходом в игру


    Dictionary<int, int> FishingShots = new Dictionary<int, int>() {
        {6529, 6535}, //ng
        {6530, 6536}, //d
        {6531, 6537}, //c
        {6532, 6538}, //b
        {6533, 6539}, //a
        {6534, 6540}  //s
    };

    bool SkillType;
    int FailCount = 0;
    Vector CurrentPoint;
    State State = State.Inactive;
    bool Disconected;
    public override void OnStart() {
        base.OnStart();
        
        //инициализация
        EnabledChanged(true, () =>{
                           State = State.Inactive;
                           FailCount = 0;
                           points[0] = Me.Location;
                           CurrentPoint = Me.Location;});
        
        //инициализация
        EnabledChanged(false, () =>{
                           if(State == State.Waiting || State == State.Fishing)
                               Client.FUseSkill(1312);
                           State = State.Inactive; });
        
        //забросили удочку
        ServerPacket(packet => packet.Id == 0xFe && packet.ExtendedId == 0x1e, pck => State = State.Waiting);
        
        //началась рыбалка
        ServerPacket(packet => packet.Id == 0xFe && packet.ExtendedId == 0x27, pck => {State = State.Fishing; FailCount = 0;});
        
        //смена скила для атаки рыбы
        ServerPacket(packet => packet.Id == 0xFe && packet.ExtendedId == 0x28, OnFishProp);
        
        //конец рыбалки
        ServerPacket(packet => packet.Id == 0xFe && packet.ExtendedId == 0x1f, pck => State = State.Inactive);
        
        //relog
        ServerPacket(p => p.Id == 0x09, CharList);

        
        //не удалось начать рыбалку/"здесь  рыбы нет"
        SystemMessage(msg => msg.Id == 1452 || msg.Id == 1457, msg => FailCount++);
        
        //спам рыбных скилов
        CreateTimer(150, () => State == State.Fishing, UseFishSkill);
        
        //запуск перебежки
        CreateTimer(200, () => State == State.Inactive && FailCount > 2, ChangeSpot);
        
        //спам  Fishing
        CreateTimer(1000, () => State == State.Inactive, () => Client.UseSkill(1312));
        
        //выход в релог
        CreateTimer(50, () => State != State.InRelog && Mobs.Any(m => m.DistanceToUser < 500 && m.Target == Me), Relog);
        
        //дисконект
        NewDialog(d => d.Text.ToUpper().Contains("have been disconnected from the server".ToUpper()) ||
                  d.Text.ToUpper().Contains("Связь с сервером прервалась".ToUpper()), d => Disconected = true);
        
    }

    void UseFishSkill()
    {
        int skillId = SkillType ? 1314 : 1313;
        if(Me.SkillCooltime(skillId) <= (LikeMacro ? 900 : 0)) {
            var weapon = CommonInventory.FindByObjectId(Me.Equipment.Weapon).Id;
            if (FishingShots.ContainsKey(weapon) && CommonInventory.Any(i => i.Id == FishingShots[weapon]))
                Client.UseItem(FishingShots[weapon]);
            Client.FUseSkill(skillId);
        }
    }

    void Relog()
    {
        try {
            State = State.InRelog;
            Client.Restart();
            ConditionWait(() => Client.State == ClientStates.CharacterSelect, 15000);
            Wait(GameStartDelay);
            ConditionWait(() => Client.IsLoggedIn, 15000);
        }
        finally {
            Disconected = false;
            State = State.Inactive;
        }

    }
    
    void OnFishProp(Packet packet)
    {
        var rdr = packet.GetReader();
        rdr.Current += 12;
        var hpStopRise = rdr.ReadC();
        rdr.Current += 6;
        var BarColor = rdr.ReadC();
        
        SkillType = hpStopRise != 0 ;
        if(BarColor == 1)
            SkillType = !SkillType;
    }
    
    void CharList(Packet pck)
    {
        var rdr = pck.GetReader();
        var count = rdr.ReadD();
        for(int i = 0; i < count; i++)
        {
            rdr.Current += 5;
            var Name = rdr.ReadS();
            rdr.ReadD();
            rdr.ReadS();
            rdr.Current += 0x130;
            if(Name == Client.Name)
            {
                Wait(GameStartDelay);
                Client.GameStart(i);
                return;
            }
        }
    }
    
    void ChangeSpot()
    {
        State = State.Moving;
        var index = Array.IndexOf(points, CurrentPoint) + 1;
        if(index == points.Count())
            index = 0;
        CurrentPoint = points[index];
        Client.MoveToLocation(CurrentPoint, 0, 60000);
        State = State.Inactive;
        FailCount = 0;
    }
    
    
    bool ConditionWait(Func<bool> func, int TimeOut)
    {
        var WaitingTick = Environment.TickCount + TimeOut;
        while(Environment.TickCount < WaitingTick && Client.IsAlive)
        {
            Wait(100);
            if(func())
                return true;
            else if(Disconected)
                throw new Exception("Disconected");
        }
        throw new Exception("Time Out");
    }
}

public enum State {
    Inactive,
    Waiting,
    Fishing,
    Moving,
    InRelog
}
 
Последнее редактирование:

Ar.

New member
привет, работоспособность скрипта на РПГ-клабе известна?
 

jr

Administrator
Команда форума
скрипт ServerPacket юзает, на рпг это не работает
 

Ingvar

New member
Когда забрасывает удочку, тут же пишет что неудачная попытка.
Как это исправить? сервер ИТ
 
Сверху