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
}
Последнее редактирование: